@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.
@@ -1,28 +1,28 @@
1
1
  #!/usr/bin/env node
2
2
  "use strict";
3
- var Ce = Object.create;
3
+ var Fe = Object.create;
4
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) => {
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 l of Oe(t))
11
- !Me.call(e, l) && l !== r && K(e, l, { get: () => t[l], enumerable: !(s = De(t, l)) || s.enumerable });
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 $ = (e, t, r) => (r = e != null ? Ce(Fe(e)) : {}, _e(
15
- t || !e || !e.__esModule ? K(r, "default", { value: e, enumerable: !0 }) : r,
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 Ne = $(require("yargs"), 1), Se = require("yargs/helpers");
19
+ var Se = C(require("yargs"), 1), De = require("yargs/helpers");
20
20
  // packages/cli/src/commands/add.ts
21
- var ie = require("child_process"), se = require("fs"), C = require("fs/promises"), D = require("path"), oe = require("util");
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 G = {
23
+ var U = {
24
24
  name: "@asterflow/cli",
25
- version: "2.0.2",
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 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);
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(`${Ge}/${encodeURIComponent(e)}`, {
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 l = await s.json();
91
- return Object.keys(l.versions ?? {});
90
+ let o = await s.json();
91
+ return Object.keys(o.versions ?? {});
92
92
  } catch {
93
93
  return [];
94
94
  } finally {
95
- clearTimeout(r);
95
+ clearTimeout(n);
96
96
  }
97
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)));
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 w = {
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
- }, it = Object.keys(w);
142
+ }, st = Object.keys(b);
127
143
  // packages/cli/src/utils/log.ts
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}`))
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 Z = require("fs"), ee = require("path"), Be = {
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 U(e) {
144
- for (let [t, r] of Object.entries(Be))
145
- if ((0, Z.existsSync)((0, ee.join)(e, t))) return r;
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 te(e, t) {
149
- return e ?? U(t);
164
+ function ie(e, t) {
165
+ return e ?? B(t);
150
166
  }
151
- function re(e) {
167
+ function se(e) {
152
168
  return e === "yarn" ? "yarn" : `${e} install`;
153
169
  }
154
- function ne(e, t) {
155
- let r = t.join(" ");
170
+ function oe(e, t) {
171
+ let n = t.join(" ");
156
172
  switch (e) {
157
173
  case "bun":
158
- return `bun add ${r}`;
174
+ return `bun add ${n}`;
159
175
  case "pnpm":
160
- return `pnpm add ${r}`;
176
+ return `pnpm add ${n}`;
161
177
  case "yarn":
162
- return `yarn add ${r}`;
178
+ return `yarn add ${n}`;
163
179
  case "npm":
164
- return `npm install ${r}`;
180
+ return `npm install ${n}`;
165
181
  }
166
182
  }
167
183
  // packages/cli/src/commands/add.ts
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);
171
- if (l.length === 0) {
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 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;
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, se.existsSync)(s)) {
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 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})...`);
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 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));
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
- 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);
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 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 () => {
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, pe.generateRouteManifest)({ routesDir: s, outFile: l }), m.success(`Generated ${(0, E.join)(t ?? le)}`);
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)), r || (process.exitCode = 1);
228
+ m.error(c instanceof Error ? c.message : String(c)), n || (process.exitCode = 1);
213
229
  }
214
230
  };
215
- if (await y(), !r) return;
231
+ if (await f(), !n) return;
216
232
  m.info(`Watching ${s} for changes...`);
217
- let d;
218
- (0, ce.watch)(s, { recursive: !0 }, () => {
219
- clearTimeout(d), d = setTimeout(y, 100);
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 = $(require("@clack/prompts"), 1), q = $(require("ci-info"), 1), Ie = require("child_process"), k = require("fs/promises"), g = require("path"), Ae = require("util");
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 me({ adapter: e, plugins: t, stub: r }) {
226
- let s = t.some((c) => c.id === "fs"), l = [
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
- ], y = [
248
+ ], f = [
233
249
  ...t.map((c) => c.useSnippet.replace(/^\./, "")),
234
- ...!s && r ? [`method('get', {
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
- ], d = e.preamble ? `${e.preamble}
257
+ ], p = e.preamble ? `${e.preamble}
242
258
  ` : "";
243
- return `${l.join(`
259
+ return `${o.join(`
244
260
  `)}
245
- ${d}export default new AsterFlow({ driver: ${e.driverExpression} })
246
- .${y.join(`
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 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,
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 && (p[t.dependency] = "latest"), r.forEach((u, f) => {
263
- p[u.packageName] = c[f];
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 x = Object.fromEntries(Object.entries(p).sort(([u], [f]) => u.localeCompare(f))), h = s ? {
266
- predev: "asterflow generate",
267
- dev: "bun run src/index.ts",
268
- prebuild: "asterflow generate"
269
- } : { dev: "bun run src/index.ts" }, v = {
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 && d && (v["@asterflow/cli"] = d), `${JSON.stringify({
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: h,
279
- dependencies: x,
280
- devDependencies: v
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 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");
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 W(e, t) {
290
- let r = await B(e);
291
- await (0, O.writeFile)(t, r);
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 ge = {
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
- }, R = Object.keys(ge);
309
- function F(e) {
328
+ }, T = Object.keys(he);
329
+ function L(e) {
310
330
  let t = new Set(e);
311
- return R.map((r) => ge[r]).filter((r) => !r.plugin || t.has(r.plugin));
331
+ return T.map((n) => he[n]).filter((n) => !n.plugin || t.has(n.plugin));
312
332
  }
313
- function fe(e) {
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 ye({ pluginIds: e, templateIds: t }) {
338
+ async function be({ pluginIds: e, templateIds: t }) {
319
339
  if (!e.includes("fs")) return [];
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)
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 P = require("child_process"), he = require("fs"), be = require("path");
328
- function qe(e) {
347
+ var I = require("child_process"), xe = require("fs"), ke = require("path");
348
+ function ze(e) {
329
349
  try {
330
- return (0, P.execSync)("git rev-parse --is-inside-work-tree", { cwd: e, stdio: "ignore" }), !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 ze(e) {
355
+ function He(e) {
336
356
  try {
337
- return (0, P.execSync)("git config init.defaultBranch", { cwd: e, stdio: "ignore" }), !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 we(e) {
362
+ function ve(e) {
343
363
  let t = !1;
344
364
  try {
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);
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, he.rmSync)((0, be.join)(e, ".git"), { recursive: !0, force: !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 M = require("fs"), ke = require("path"), Y = $(require("chalk"), 1), He = new Set([
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 xe(e, t) {
372
- let r = (0, M.readdirSync)(e).filter((s) => !He.has(s) && !s.endsWith(".iml"));
373
- if (r.length === 0) return !0;
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 ? "/" : ""}`);
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 ve = require("fs"), je = require("fs/promises");
383
- async function Pe(e) {
402
+ var Pe = require("fs"), Ie = require("fs/promises");
403
+ async function Ae(e) {
384
404
  try {
385
- return await (0, je.access)(e, ve.constants.W_OK), !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 $e = $(require("validate-npm-package-name"), 1);
392
- function J(e) {
393
- let t = (0, $e.default)(e);
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 Ke = (0, Ae.promisify)(Ie.exec), j = {
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 Ee(e) {
489
+ async function Te(e) {
466
490
  i.intro("Create a new AsterFlow project");
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))) {
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, k.mkdir)(t, { recursive: !0 }), !xe(t, (0, g.basename)(t))) {
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((n) => n.startsWith("--")), l = q.default.isCI || !!e.yes || s, y = s && !e.yes && !q.default.isCI;
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 n = J(e.name);
479
- if (!n.valid) {
502
+ let r = q(e.name);
503
+ if (!r.valid) {
480
504
  i.cancel(`Invalid project name "${e.name}":
481
- ${n.problems.map((a) => ` - ${a}`).join(`
505
+ ${r.problems.map((l) => ` - ${l}`).join(`
482
506
  `)}`), process.exitCode = 1;
483
507
  return;
484
508
  }
485
509
  }
486
- let d = e.name;
487
- if (d === void 0)
488
- if (l)
489
- d = r;
510
+ let p = e.name;
511
+ if (p === void 0)
512
+ if (o)
513
+ p = n;
490
514
  else {
491
- let n = await i.text({
515
+ let r = await i.text({
492
516
  message: "Project name",
493
- placeholder: r,
494
- defaultValue: r,
495
- validate: (a) => {
496
- let b = J(a || r);
497
- return b.valid ? void 0 : `Invalid project name: ${b.problems[0]}`;
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(n)) return i.cancel("Cancelled.");
501
- d = n;
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 (l)
510
- c = j.adapter;
533
+ if (o)
534
+ c = $.adapter;
511
535
  else {
512
- let n = await i.select({
536
+ let r = await i.select({
513
537
  message: "Which adapter do you want to use?",
514
- options: Object.values(N).map((a) => ({ value: a.id, label: a.label })),
515
- initialValue: j.adapter
538
+ options: Object.values(N).map((l) => ({ value: l.id, label: l.label })),
539
+ initialValue: $.adapter
516
540
  });
517
- if (i.isCancel(n)) return i.cancel("Cancelled.");
518
- c = n;
541
+ if (i.isCancel(r)) return i.cancel("Cancelled.");
542
+ c = r;
519
543
  }
520
- let p;
544
+ let d;
521
545
  if (e.plugins !== void 0) {
522
- p = e.plugins.split(",").map((a) => a.trim()).filter(Boolean);
523
- let n = p.filter((a) => !w[a]);
524
- if (n.length > 0) {
525
- i.cancel(`Unknown plugin${n.length > 1 ? "s" : ""}: ${n.join(", ")}. Available: ${Object.keys(w).join(", ")}`), process.exitCode = 1;
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 (l)
529
- p = j.plugins;
552
+ } else if (o)
553
+ d = $.plugins;
530
554
  else {
531
- let n = await i.multiselect({
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(w).map((a) => ({ value: a.id, label: a.packageName, hint: a.description })),
534
- initialValues: j.plugins,
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(n)) return i.cancel("Cancelled.");
538
- p = n;
561
+ if (i.isCancel(r)) return i.cancel("Cancelled.");
562
+ d = r;
539
563
  }
540
- p.length === 0 && (p = j.plugins);
541
- let x = F(p), h;
564
+ d.length === 0 && (d = $.plugins);
565
+ let k = L(d), g;
542
566
  if (e.routes !== void 0) {
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;
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 (l)
551
- h = x.map((n) => n.id);
574
+ } else if (o)
575
+ g = k.map((r) => r.id);
552
576
  else {
553
- let n = await i.multiselect({
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: x.map((a) => ({ value: a.id, label: a.path, hint: a.summary })),
556
- initialValues: x.map((a) => a.id),
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(n)) return i.cancel("Cancelled.");
560
- h = n;
583
+ if (i.isCancel(r)) return i.cancel("Cancelled.");
584
+ g = r;
561
585
  }
562
- let v = e.install;
563
- if (v === void 0)
564
- if (l)
565
- v = j.install;
586
+ let j = e.install;
587
+ if (j === void 0)
588
+ if (o)
589
+ j = $.install;
566
590
  else {
567
- let n = await i.confirm({ message: "Install dependencies now?", initialValue: j.install });
568
- if (i.isCancel(n)) return i.cancel("Cancelled.");
569
- v = n;
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 o = e.git;
572
- if (o === void 0)
573
- if (l)
574
- o = j.git;
595
+ let a = e.git;
596
+ if (a === void 0)
597
+ if (o)
598
+ a = $.git;
575
599
  else {
576
- let n = await i.confirm({ message: "Initialize a git repository?", initialValue: j.git });
577
- if (i.isCancel(n)) return i.cancel("Cancelled.");
578
- o = n;
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
- y && Qe({
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: p, templateIds: h, install: v, git: o });
587
- let u = N[c], f = p.map((n) => w[n]), z = i.spinner();
588
- z.start("Scaffolding project");
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
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 ye({ pluginIds: p, templateIds: h });
616
+ let H = await be({ pluginIds: d, templateIds: g });
593
617
  if (H.length > 0) {
594
- let n = (0, g.join)(_, "routes");
595
- await (0, k.mkdir)(n, { recursive: !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);
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
- z.stop("Project scaffolded");
602
- let L = te(e.packageManager, t);
603
- if (v) {
604
- let n = re(L), a = i.spinner();
605
- a.start(`Installing dependencies (${n})`);
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 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));
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
- o && we(t) && i.log.success("Initialized a git repository.");
613
- for (let n of f)
614
- i.log.info(`${n.packageName}: ${n.usageNote}`);
615
- Xe({ name: d, targetDir: t, packageManager: L, useYarn: L === "yarn" });
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 Qe(e, t) {
618
- let r = [];
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(`
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 Xe({ name: e, targetDir: t, packageManager: r, useYarn: s }) {
623
- let l = `${r} ${s ? "" : "run "}dev`;
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
- ${l}`, "Next steps"), i.outro(`Success! Created ${e} at ${t}`);
649
+ ${o}`, "Next steps"), i.outro(`Success! Created ${e} at ${t}`);
626
650
  }
627
651
  // packages/cli/src/commands/list.ts
628
- var T = $(require("chalk"), 1);
629
- function Re() {
630
- console.log(T.default.bold(`
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(w))
634
- console.log(` ${T.default.cyan(e.id.padEnd(12))} ${T.default.gray(e.packageName)}`), console.log(` ${" ".repeat(12)} ${e.description}
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(T.default.gray(`Install with: asterflow add <name>[,<name>...]
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, Ne.default)((0, Se.hideBin)(process.argv)).scriptName("asterflow").command(
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" (${R.join(", ")})`
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 Ee({
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 ae({ names: e.names, directory: e.directory });
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
- () => Re()
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 de({ directory: e.directory, out: e.out, watch: e.watch });
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) => {