@asterflow/cli 2.0.1 → 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.
@@ -1,30 +1,115 @@
1
1
  #!/usr/bin/env node
2
2
  "use strict";
3
- var Ae = Object.create;
4
- var q = Object.defineProperty;
5
- var Re = Object.getOwnPropertyDescriptor;
6
- var Ne = Object.getOwnPropertyNames;
7
- var Te = Object.getPrototypeOf, Ce = Object.prototype.hasOwnProperty;
8
- var De = (e, t, r, o) => {
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 Ne(t))
11
- !Ce.call(e, l) && l !== r && q(e, l, { get: () => t[l], enumerable: !(o = Re(t, l)) || o.enumerable });
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 ? Ae(Te(e)) : {}, De(
15
- t || !e || !e.__esModule ? q(r, "default", { value: e, enumerable: !0 }) : r,
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 Ie = $(require("yargs"), 1), Ee = require("yargs/helpers");
19
+ var Ne = $(require("yargs"), 1), Se = require("yargs/helpers");
20
20
  // packages/cli/src/commands/add.ts
21
- var ee = require("child_process"), te = require("fs"), T = require("fs/promises"), C = require("path"), re = require("util");
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 b = {
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
- }, Je = Object.keys(b);
126
+ }, it = Object.keys(w);
43
127
  // packages/cli/src/utils/log.ts
44
- var j = $(require("chalk"), 1), d = {
45
- info: (e) => console.log(j.default.cyan(e)),
46
- success: (e) => console.log(j.default.green(e)),
47
- warn: (e) => console.log(j.default.yellow(e)),
48
- error: (e) => console.error(j.default.red(e)),
49
- step: (e) => console.log(j.default.gray(` ${e}`))
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 K = require("fs"), H = require("path"), Oe = {
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 G(e) {
60
- for (let [t, r] of Object.entries(Oe))
61
- if ((0, K.existsSync)((0, H.join)(e, t))) return r;
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 Q(e, t) {
65
- return e ?? G(t);
148
+ function te(e, t) {
149
+ return e ?? U(t);
66
150
  }
67
- function X(e) {
151
+ function re(e) {
68
152
  return e === "yarn" ? "yarn" : `${e} install`;
69
153
  }
70
- function Z(e, t) {
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 Fe = (0, re.promisify)(ee.exec);
85
- async function ne({ names: e, directory: t }) {
86
- let r = (0, C.resolve)(t ?? "."), o = (0, C.join)(r, "package.json"), l = e.split(",").map((a) => a.trim()).filter(Boolean);
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
- d.error("No plugin names given. Usage: asterflow add fs,multipart"), process.exitCode = 1;
172
+ m.error("No plugin names given. Usage: asterflow add fs,multipart"), process.exitCode = 1;
89
173
  return;
90
174
  }
91
- let h = l.filter((a) => !b[a]);
92
- if (h.length > 0) {
93
- d.error(`Unknown plugin${h.length > 1 ? "s" : ""}: ${h.join(", ")}`), d.step(`Available plugins: ${Object.keys(b).join(", ")}`), process.exitCode = 1;
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, te.existsSync)(o)) {
97
- d.error(`No package.json found at ${o}. Run this from an AsterFlow project (or \`asterflow init\` first).`), process.exitCode = 1;
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 u = l.map((a) => b[a]), p = await (0, T.readFile)(o, "utf-8"), c = JSON.parse(p);
101
- c.dependencies ??= {};
102
- let g = u.filter((a) => c.dependencies[a.packageName]), y = u.filter((a) => !c.dependencies[a.packageName]);
103
- for (let a of y) c.dependencies[a.packageName] = a.version;
104
- if (c.dependencies = Object.fromEntries(Object.entries(c.dependencies).sort(([a], [w]) => a.localeCompare(w))), y.length > 0) {
105
- await (0, T.writeFile)(o, `${JSON.stringify(c, null, 2)}
106
- `), d.success(`Added to package.json: ${y.map((x) => x.packageName).join(", ")}`);
107
- let a = G(r), w = Z(a, y.map((x) => x.packageName));
108
- d.info(`Installing (${w})...`);
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 Fe(w, { cwd: r }), d.success("Dependencies installed.");
111
- } catch (x) {
112
- d.error(`Install failed - run manually: ${w}`), d.step(x instanceof Error ? x.message : String(x));
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
- g.length > 0 && d.warn(`Already present, skipped: ${g.map((a) => a.packageName).join(", ")}`), d.info("Wire it up:");
116
- for (let a of u)
117
- d.step(`import { ${a.importName} } from '${a.packageName}'`), d.step(`app${a.useSnippet}`), d.step(a.usageNote);
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 oe = require("@asterflow/fs"), se = require("fs"), I = require("path");
121
- var Me = "src/routes", ie = "src/routes.gen.ts";
122
- async function ae({ directory: e, out: t, watch: r }) {
123
- let o = (0, I.resolve)(e ?? Me), l = (0, I.resolve)(t ?? ie), h = async () => {
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, oe.generateRouteManifest)({ routesDir: o, outFile: l }), d.success(`Generated ${(0, I.join)(t ?? ie)}`);
126
- } catch (p) {
127
- d.error(p instanceof Error ? p.message : String(p)), r || (process.exitCode = 1);
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 h(), !r) return;
131
- d.info(`Watching ${o} for changes...`);
132
- let u;
133
- (0, se.watch)(o, { recursive: !0 }, () => {
134
- clearTimeout(u), u = setTimeout(h, 100);
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), V = $(require("ci-info"), 1), ve = require("child_process"), k = require("fs/promises"), m = require("path"), Pe = require("util");
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 le({ adapter: e, plugins: t, stub: r }) {
141
- let o = t.some((p) => p.id === "fs"), l = [
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((p) => `import { ${p.importName} } from '${p.packageName}'`),
146
- ...o ? ["import routes from './routes.gen'"] : []
147
- ], h = [
148
- ...t.map((p) => p.useSnippet.replace(/^\./, "")),
149
- ...!o && r ? [`method('get', {
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
- ], u = e.preamble ? `${e.preamble}
241
+ ], d = e.preamble ? `${e.preamble}
157
242
  ` : "";
158
243
  return `${l.join(`
159
244
  `)}
160
- ${u}export default new AsterFlow({ driver: ${e.driverExpression} })
161
- .${h.join(`
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 pe({ name: e, adapter: t, plugins: r }) {
167
- let o = r.some((g) => g.id === "fs"), l = {
168
- asterflow: "^0.0.5",
169
- "@asterflow/adapter": "^1.0.0",
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 && (l[t.dependency] = "latest");
173
- for (let g of r) l[g.packageName] = g.version;
174
- let h = Object.fromEntries(Object.entries(l).sort(([g], [y]) => g.localeCompare(y))), u = o ? {
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" }, p = {
269
+ } : { dev: "bun run src/index.ts" }, v = {
179
270
  typescript: "^5.8.3",
180
271
  "@types/bun": "latest"
181
272
  };
182
- return o && (p["@asterflow/cli"] = "^0.1.0"), `${JSON.stringify({
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: u,
188
- dependencies: h,
189
- devDependencies: p
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 D = require("fs/promises"), L = require("path"), _e = (0, L.join)(__dirname, "..", "..", "templates");
195
- async function U(e) {
196
- return (0, D.readFile)((0, L.join)(_e, e), "utf-8");
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 B(e, t) {
199
- let r = await U(e);
200
- await (0, D.writeFile)(t, r);
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 ce = {
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
- }, E = Object.keys(ce);
218
- function O(e) {
308
+ }, R = Object.keys(ge);
309
+ function F(e) {
219
310
  let t = new Set(e);
220
- return E.map((r) => ce[r]).filter((r) => !r.plugin || t.has(r.plugin));
311
+ return R.map((r) => ge[r]).filter((r) => !r.plugin || t.has(r.plugin));
221
312
  }
222
- function de(e) {
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 me({ pluginIds: e, templateIds: t }) {
318
+ async function ye({ pluginIds: e, templateIds: t }) {
228
319
  if (!e.includes("fs")) return [];
229
- let r = O(e).filter((o) => t.includes(o.id));
230
- return Promise.all(r.map(async (o) => ({
231
- fileName: de(o),
232
- content: await U(o.source)
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"), ue = require("fs"), ge = require("path");
237
- function Ge(e) {
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 Le(e) {
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 fe(e) {
342
+ function we(e) {
252
343
  let t = !1;
253
344
  try {
254
- return (0, P.execSync)("git --version", { stdio: "ignore" }), Ge(e) ? !1 : ((0, P.execSync)("git init", { cwd: e, stdio: "ignore" }), t = !0, Le(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);
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, ue.rmSync)((0, ge.join)(e, ".git"), { recursive: !0, force: !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 F = require("fs"), ye = require("path"), W = $(require("chalk"), 1), Ue = new Set([
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 be(e, t) {
281
- let r = (0, F.readdirSync)(e).filter((o) => !Ue.has(o) && !o.endsWith(".iml"));
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 ${W.default.green(t)} contains files that could conflict:`), console.log();
284
- for (let o of r) {
285
- let l = (0, F.lstatSync)((0, ye.join)(e, o)).isDirectory();
286
- console.log(` ${W.default.cyan(o)}${l ? "/" : ""}`);
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 he = require("fs"), we = require("fs/promises");
292
- async function ke(e) {
382
+ var ve = require("fs"), je = require("fs/promises");
383
+ async function Pe(e) {
293
384
  try {
294
- return await (0, we.access)(e, he.constants.W_OK), !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 xe = $(require("validate-npm-package-name"), 1);
301
- function Y(e) {
302
- let t = (0, xe.default)(e);
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 S = {
400
+ var N = {
310
401
  bun: {
311
402
  id: "bun",
312
403
  label: "Bun (native Bun.serve)",
@@ -363,191 +454,191 @@ var S = {
363
454
  console.log('Server listening on http://localhost:3333')
364
455
  })`
365
456
  }
366
- }, A = Object.keys(S);
457
+ }, S = Object.keys(N);
367
458
  // packages/cli/src/commands/init.ts
368
- var Be = (0, Pe.promisify)(ve.exec), v = {
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 $e(e) {
465
+ async function Ee(e) {
375
466
  i.intro("Create a new AsterFlow project");
376
- let t = (0, m.resolve)(e.directory ?? "."), r = (0, m.basename)(t) === "." ? "my-asterflow-app" : (0, m.basename)(t);
377
- if (!await ke((0, m.dirname)(t))) {
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 }), !be(t, (0, m.basename)(t))) {
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 o = process.argv.some((n) => n.startsWith("--")), l = V.default.isCI || !!e.yes || o, h = o && !e.yes && !V.default.isCI;
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 = Y(e.name);
478
+ let n = J(e.name);
388
479
  if (!n.valid) {
389
480
  i.cancel(`Invalid project name "${e.name}":
390
- ${n.problems.map((s) => ` - ${s}`).join(`
481
+ ${n.problems.map((a) => ` - ${a}`).join(`
391
482
  `)}`), process.exitCode = 1;
392
483
  return;
393
484
  }
394
485
  }
395
- let u = e.name;
396
- if (u === void 0)
486
+ let d = e.name;
487
+ if (d === void 0)
397
488
  if (l)
398
- u = r;
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: (s) => {
405
- let f = Y(s || r);
406
- return f.valid ? void 0 : `Invalid project name: ${f.problems[0]}`;
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
- u = n;
501
+ d = n;
411
502
  }
412
- if (e.adapter && !S[e.adapter]) {
413
- i.cancel(`Unknown adapter "${e.adapter}". Available: ${A.join(", ")}`), process.exitCode = 1;
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 p = e.adapter;
417
- if (!p)
507
+ let c = e.adapter;
508
+ if (!c)
418
509
  if (l)
419
- p = v.adapter;
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(S).map((s) => ({ value: s.id, label: s.label })),
424
- initialValue: v.adapter
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
- p = n;
518
+ c = n;
428
519
  }
429
- let c;
520
+ let p;
430
521
  if (e.plugins !== void 0) {
431
- c = e.plugins.split(",").map((s) => s.trim()).filter(Boolean);
432
- let n = c.filter((s) => !b[s]);
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(b).join(", ")}`), process.exitCode = 1;
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
- c = v.plugins;
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(b).map((s) => ({ value: s.id, label: s.packageName, hint: s.description })),
443
- initialValues: v.plugins,
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
- c = n;
538
+ p = n;
448
539
  }
449
- c.length === 0 && (c = v.plugins);
450
- let g = O(c), y;
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((f) => f.trim()).filter(Boolean);
453
- y = n.includes("none") ? [] : n;
454
- let s = y.filter((f) => !g.some((Se) => Se.id === f));
455
- if (s.length > 0) {
456
- i.cancel(`Unknown route template${s.length > 1 ? "s" : ""}: ${s.join(", ")}. Available: ${g.map((f) => f.id).join(", ")}`), process.exitCode = 1;
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
- y = g.map((n) => n.id);
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: g.map((s) => ({ value: s.id, label: s.path, hint: s.summary })),
465
- initialValues: g.map((s) => s.id),
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
- y = n;
560
+ h = n;
470
561
  }
471
- let a = e.install;
472
- if (a === void 0)
562
+ let v = e.install;
563
+ if (v === void 0)
473
564
  if (l)
474
- a = v.install;
565
+ v = j.install;
475
566
  else {
476
- let n = await i.confirm({ message: "Install dependencies now?", initialValue: v.install });
567
+ let n = await i.confirm({ message: "Install dependencies now?", initialValue: j.install });
477
568
  if (i.isCancel(n)) return i.cancel("Cancelled.");
478
- a = n;
569
+ v = n;
479
570
  }
480
- let w = e.git;
481
- if (w === void 0)
571
+ let o = e.git;
572
+ if (o === void 0)
482
573
  if (l)
483
- w = v.git;
574
+ o = j.git;
484
575
  else {
485
- let n = await i.confirm({ message: "Initialize a git repository?", initialValue: v.git });
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
- w = n;
578
+ o = n;
488
579
  }
489
- h && We({
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: p, pluginIds: c, templateIds: y, install: a, git: w });
496
- let x = S[p], N = c.map((n) => b[n]), z = i.spinner();
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 M = (0, m.join)(t, "src");
499
- await (0, k.mkdir)(M, { recursive: !0 }), await (0, k.writeFile)((0, m.join)(t, "package.json"), pe({ name: u, adapter: x, plugins: N })), await B("tsconfig.json", (0, m.join)(t, "tsconfig.json")), await (0, k.writeFile)((0, m.join)(M, "index.ts"), le({ adapter: x, plugins: N, stub: y.length > 0 })), await B("gitignore", (0, m.join)(t, ".gitignore")), N.some((n) => n.id === "fs") && await (0, k.appendFile)((0, m.join)(t, ".gitignore"), `src/routes.gen.ts
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 J = await me({ pluginIds: c, templateIds: y });
502
- if (J.length > 0) {
503
- let n = (0, m.join)(M, "routes");
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 s of J) {
506
- let f = (0, m.join)(n, s.fileName);
507
- await (0, k.mkdir)((0, m.dirname)(f), { recursive: !0 }), await (0, k.writeFile)(f, s.content);
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 _ = Q(e.packageManager, t);
512
- if (a) {
513
- let n = X(_), s = i.spinner();
514
- s.start(`Installing dependencies (${n})`);
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 Be(n, { cwd: t }), s.stop("Dependencies installed");
517
- } catch (f) {
518
- s.stop("Failed to install dependencies"), i.log.error(f instanceof Error ? f.message : String(f));
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
- w && fe(t) && i.log.success("Initialized a git repository.");
522
- for (let n of N)
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
- Ye({ name: u, targetDir: t, packageManager: _, useYarn: _ === "yarn" });
615
+ Xe({ name: d, targetDir: t, packageManager: L, useYarn: L === "yarn" });
525
616
  }
526
- function We(e, t) {
617
+ function Qe(e, t) {
527
618
  let r = [];
528
- e.adapter && r.push(` --adapter <id> ${t.adapterId} (available: ${A.join(", ")})`), e.plugins && r.push(` --plugins <ids> ${t.pluginIds.length > 0 ? t.pluginIds.join(",") : "none"} (available: ${Object.keys(b).join(", ")})`), e.routes && r.push(` --routes <ids> ${t.templateIds.length > 0 ? t.templateIds.join(",") : "none"} (available: ${E.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(`
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 Ye({ name: e, targetDir: t, packageManager: r, useYarn: o }) {
532
- let l = `${r} ${o ? "" : "run "}dev`;
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 R = $(require("chalk"), 1);
538
- function je() {
539
- console.log(R.default.bold(`
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(b))
543
- console.log(` ${R.default.cyan(e.id.padEnd(12))} ${R.default.gray(e.packageName)}`), console.log(` ${" ".repeat(12)} ${e.description}
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(R.default.gray(`Install with: asterflow add <name>[,<name>...]
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, Ie.default)((0, Ee.hideBin)(process.argv)).scriptName("asterflow").command(
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 (${A.join(", ")})`
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" (${E.join(", ")})`
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 $e({
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 ne({ names: e.names, directory: e.directory });
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
- () => je()
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 ae({ directory: e.directory, out: e.out, watch: e.watch });
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) => {