@miyaoka/fsss 0.3.1 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cli.d.ts CHANGED
@@ -1,16 +1,21 @@
1
1
  interface AutoEnvConfig {
2
2
  prefix: string;
3
3
  }
4
+ interface VersionConfig {
5
+ number: string;
6
+ alias?: string | false;
7
+ }
4
8
  interface CLIOptions {
5
9
  name: string;
6
10
  commandsDir?: string;
7
11
  autoEnv?: AutoEnvConfig;
8
12
  defaultCommand?: string;
13
+ version?: string | VersionConfig;
9
14
  }
10
15
  interface CLI {
11
16
  run: () => Promise<void>;
12
17
  }
13
18
  declare function createCLI(options: CLIOptions): CLI;
14
19
  export { createCLI };
15
- export type { CLI, CLIOptions };
20
+ export type { CLI, CLIOptions, VersionConfig };
16
21
  //# sourceMappingURL=cli.d.ts.map
package/dist/cli.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAkBA,UAAU,aAAa;IACrB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,UAAU,UAAU;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,aAAa,CAAC;IACxB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,UAAU,GAAG;IACX,GAAG,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1B;AAgFD,iBAAS,SAAS,CAAC,OAAO,EAAE,UAAU,GAAG,GAAG,CAgJ3C;AAED,OAAO,EAAE,SAAS,EAAE,CAAC;AACrB,YAAY,EAAE,GAAG,EAAE,UAAU,EAAE,CAAC"}
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAkBA,UAAU,aAAa;IACrB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,UAAU,aAAa;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC;CACxB;AAED,UAAU,UAAU;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,aAAa,CAAC;IACxB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,OAAO,CAAC,EAAE,MAAM,GAAG,aAAa,CAAC;CAClC;AAED,UAAU,GAAG;IACX,GAAG,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1B;AAwGD,iBAAS,SAAS,CAAC,OAAO,EAAE,UAAU,GAAG,GAAG,CAkK3C;AAED,OAAO,EAAE,SAAS,EAAE,CAAC;AACrB,YAAY,EAAE,GAAG,EAAE,UAAU,EAAE,aAAa,EAAE,CAAC"}
package/dist/codegen.js CHANGED
@@ -2,6 +2,7 @@
2
2
  import { join as e, relative as t } from "node:path";
3
3
  import { mkdir as n, readFile as r, readdir as i, writeFile as a } from "node:fs/promises";
4
4
  import { parseArgs as o } from "node:util";
5
+ //#region src/codegen.ts
5
6
  var s = "_plugins", c = ".ts", l = /export\s+interface\s+(\w+)/g;
6
7
  async function u(t) {
7
8
  let n = [];
@@ -55,3 +56,4 @@ var { values: p } = o({ options: {
55
56
  outDir: { type: "string" }
56
57
  } });
57
58
  (p.commandsDir === void 0 || p.outDir === void 0) && (console.error("Usage: bun run codegen.ts --commandsDir <path> --outDir <path>"), process.exit(1)), await f(p.commandsDir, p.outDir);
59
+ //#endregion
package/dist/help.d.ts CHANGED
@@ -6,6 +6,8 @@ interface HelpConfig {
6
6
  description?: string;
7
7
  argsDefs?: ArgsDefs;
8
8
  envPrefix?: string;
9
+ showVersion: boolean;
10
+ versionAlias?: string;
9
11
  }
10
12
  declare function generateHelp(config: HelpConfig): string;
11
13
  interface SubcommandHelpConfig {
@@ -22,6 +24,8 @@ interface DefaultCommandHelpConfig {
22
24
  description?: string;
23
25
  argsDefs?: ArgsDefs;
24
26
  envPrefix?: string;
27
+ showVersion: boolean;
28
+ versionAlias?: string;
25
29
  availableEntries: AvailableEntry[];
26
30
  }
27
31
  declare function generateDefaultCommandHelp(config: DefaultCommandHelpConfig): string;
@@ -1 +1 @@
1
- {"version":3,"file":"help.d.ts","sourceRoot":"","sources":["../src/help.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAC/C,OAAO,KAAK,EAAU,QAAQ,EAAE,MAAM,SAAS,CAAC;AAGhD,UAAU,UAAU;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAkED,iBAAS,YAAY,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,CA8DhD;AAGD,UAAU,oBAAoB;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,gBAAgB,EAAE,cAAc,EAAE,CAAC;CACpC;AAED,iBAAS,sBAAsB,CAAC,MAAM,EAAE,oBAAoB,GAAG,MAAM,CAuBpE;AAID,iBAAS,2BAA2B,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,CAG/E;AAID,UAAU,wBAAwB;IAChC,WAAW,EAAE,MAAM,CAAC;IACpB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gBAAgB,EAAE,cAAc,EAAE,CAAC;CACpC;AAED,iBAAS,0BAA0B,CAAC,MAAM,EAAE,wBAAwB,GAAG,MAAM,CAiE5E;AAED,OAAO,EACL,0BAA0B,EAC1B,YAAY,EACZ,sBAAsB,EACtB,2BAA2B,GAC5B,CAAC;AACF,YAAY,EAAE,wBAAwB,EAAE,UAAU,EAAE,oBAAoB,EAAE,CAAC"}
1
+ {"version":3,"file":"help.d.ts","sourceRoot":"","sources":["../src/help.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAC/C,OAAO,KAAK,EAAU,QAAQ,EAAE,MAAM,SAAS,CAAC;AAGhD,UAAU,UAAU;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,OAAO,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAwFD,iBAAS,YAAY,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,CAkFhD;AAGD,UAAU,oBAAoB;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,gBAAgB,EAAE,cAAc,EAAE,CAAC;CACpC;AAED,iBAAS,sBAAsB,CAAC,MAAM,EAAE,oBAAoB,GAAG,MAAM,CAuBpE;AAID,iBAAS,2BAA2B,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,CAG/E;AAID,UAAU,wBAAwB;IAChC,WAAW,EAAE,MAAM,CAAC;IACpB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,OAAO,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,gBAAgB,EAAE,cAAc,EAAE,CAAC;CACpC;AAED,iBAAS,0BAA0B,CAAC,MAAM,EAAE,wBAAwB,GAAG,MAAM,CAkE5E;AAED,OAAO,EACL,0BAA0B,EAC1B,YAAY,EACZ,sBAAsB,EACtB,2BAA2B,GAC5B,CAAC;AACF,YAAY,EAAE,wBAAwB,EAAE,UAAU,EAAE,oBAAoB,EAAE,CAAC"}
package/dist/index.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  export { createCLI } from './cli';
2
2
  export { definePlugin } from './plugin';
3
3
  export { defineCommand } from './types';
4
- export type { CLI, CLIOptions } from './cli';
4
+ export type { CLI, CLIOptions, VersionConfig } from './cli';
5
5
  export type { ArgDef, ArgDefBase, ArgsDefs, CommandConfig, Extensions, InferArgs, Middleware, MiddlewareContext, Params, PluginConfig, PluginContext, PluginSetup, RunContext, } from './types';
6
6
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAClC,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AACxC,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACxC,YAAY,EAAE,GAAG,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AAC7C,YAAY,EACV,MAAM,EACN,UAAU,EACV,QAAQ,EACR,aAAa,EACb,UAAU,EACV,SAAS,EACT,UAAU,EACV,iBAAiB,EACjB,MAAM,EACN,YAAY,EACZ,aAAa,EACb,WAAW,EACX,UAAU,GACX,MAAM,SAAS,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAClC,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AACxC,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACxC,YAAY,EAAE,GAAG,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAC5D,YAAY,EACV,MAAM,EACN,UAAU,EACV,QAAQ,EACR,aAAa,EACb,UAAU,EACV,SAAS,EACT,UAAU,EACV,iBAAiB,EACjB,MAAM,EACN,YAAY,EACZ,aAAa,EACb,WAAW,EACX,UAAU,GACX,MAAM,SAAS,CAAC"}
package/dist/index.js CHANGED
@@ -2,6 +2,7 @@ import { join as e, relative as t, resolve as n } from "node:path";
2
2
  import { ZodBoolean as r, ZodError as i, ZodNumber as a, z as o } from "zod";
3
3
  import { readFile as s, readdir as c, stat as l } from "node:fs/promises";
4
4
  import { homedir as u } from "node:os";
5
+ //#region src/config.ts
5
6
  function d(e) {
6
7
  return typeof e == "object" && !!e;
7
8
  }
@@ -37,7 +38,7 @@ function h(t, n) {
37
38
  let r = [];
38
39
  return r.push(e(u(), ".config", t, "config.json")), r.push(e(process.cwd(), `${t}.config.json`)), n !== void 0 && r.push(n), r;
39
40
  }
40
- async function ee(e, t) {
41
+ async function g(e, t) {
41
42
  let n = h(e, t), r;
42
43
  for (let e of n) {
43
44
  let t = await p(e);
@@ -51,124 +52,161 @@ async function ee(e, t) {
51
52
  }
52
53
  return r;
53
54
  }
54
- function g(e, t, n) {
55
+ //#endregion
56
+ //#region src/auto-mapping.ts
57
+ function _(e, t, n) {
55
58
  return [
56
59
  e,
57
60
  ...t,
58
61
  n
59
62
  ].join("_").toUpperCase();
60
63
  }
61
- function _(e, t) {
64
+ function v(e, t) {
62
65
  return [...e, t].join(".");
63
66
  }
64
- function v(e) {
67
+ //#endregion
68
+ //#region src/zod-utils.ts
69
+ function y(e) {
65
70
  return e instanceof r;
66
71
  }
67
- function te(e) {
72
+ function ee(e) {
68
73
  return e instanceof a;
69
74
  }
70
- var y = " ", b = 2;
71
- function x(e, t, n, r) {
75
+ //#endregion
76
+ //#region src/help.ts
77
+ var b = " ", x = 2;
78
+ function S(e, t, n, r) {
72
79
  if (e.env !== void 0) return e.env;
73
- if (t !== void 0) return g(t, n, r);
80
+ if (t !== void 0) return _(t, n, r);
81
+ }
82
+ function te(e) {
83
+ switch (typeof e) {
84
+ case "string":
85
+ case "number":
86
+ case "boolean":
87
+ case "bigint": return String(e);
88
+ default: return JSON.stringify(e);
89
+ }
74
90
  }
75
- function S(e, t) {
91
+ function C(e, t) {
76
92
  let n = [];
77
- return t !== void 0 && n.push(`env: ${t}`), "default" in e && e.default !== void 0 && n.push(`default: ${String(e.default)}`), n.length === 0 ? "" : ` (${n.join(", ")})`;
93
+ return t !== void 0 && n.push(`env: ${t}`), "default" in e && e.default !== void 0 && n.push(`default: ${te(e.default)}`), n.length === 0 ? "" : ` (${n.join(", ")})`;
78
94
  }
79
- function C(e, t, n, r) {
80
- let i = v(t.type) ? "" : ` <${e}>`, a = `${t.alias === void 0 ? " " : `-${t.alias}, `}--${e}${i}`, o = x(t, n, r, e);
95
+ function w(e, t, n, r) {
96
+ let i = y(t.type) ? "" : ` <${e}>`, a = `${t.alias === void 0 ? " " : `-${t.alias}, `}--${e}${i}`, o = S(t, n, r, e);
81
97
  return {
82
98
  left: a,
83
- right: `${t.description}${S(t, o)}`
99
+ right: `${t.description}${C(t, o)}`
84
100
  };
85
101
  }
86
- function w() {
102
+ function T() {
87
103
  return {
88
104
  left: "-h, --help",
89
105
  right: "ヘルプを表示する"
90
106
  };
91
107
  }
92
- function T(e) {
93
- let { programName: t, commandPath: n, description: r, argsDefs: i, envPrefix: a } = e, o = [];
94
- r !== void 0 && (o.push(r), o.push(""));
95
- let s = [t, ...n];
108
+ function E(e) {
109
+ return {
110
+ left: `${e === void 0 ? " " : `-${e}, `}--version`,
111
+ right: "バージョンを表示する"
112
+ };
113
+ }
114
+ function D(e) {
115
+ let { programName: t, commandPath: n, description: r, argsDefs: i, envPrefix: a, showVersion: o, versionAlias: s } = e, c = [];
116
+ r !== void 0 && (c.push(r), c.push(""));
117
+ let l = [t, ...n];
96
118
  if (i !== void 0) {
97
119
  let e = Object.entries(i), t = e.some(([, e]) => e.positional === !0), n = e.some(([, e]) => e.positional !== !0);
98
120
  if (t) {
99
121
  let t = e.filter(([, e]) => e.positional === !0).map(([e]) => `<${e}>`);
100
- s.push(...t);
122
+ l.push(...t);
123
+ }
124
+ n && l.push("[options]");
125
+ }
126
+ if (c.push(`Usage: ${l.join(" ")}`), c.push(""), i === void 0) {
127
+ if (o) {
128
+ c.push("Options:");
129
+ let e = [T(), E(s)], t = Math.max(...e.map((e) => e.left.length));
130
+ for (let n of e) {
131
+ let e = " ".repeat(t - n.left.length + x);
132
+ c.push(`${b}${n.left}${e}${n.right}`);
133
+ }
101
134
  }
102
- n && s.push("[options]");
135
+ return c.join("\n");
103
136
  }
104
- if (o.push(`Usage: ${s.join(" ")}`), o.push(""), i === void 0) return o.join("\n");
105
- let c = Object.entries(i).filter(([, e]) => e.positional !== !0);
106
- if (c.length === 0) {
107
- o.push("Options:");
108
- let e = w();
109
- return o.push(`${y}${e.left} ${e.right}`), o.join("\n");
137
+ let u = Object.entries(i).filter(([, e]) => e.positional !== !0);
138
+ if (u.length === 0) {
139
+ c.push("Options:");
140
+ let e = [T()];
141
+ o && e.push(E(s));
142
+ let t = Math.max(...e.map((e) => e.left.length));
143
+ for (let n of e) {
144
+ let e = " ".repeat(t - n.left.length + x);
145
+ c.push(`${b}${n.left}${e}${n.right}`);
146
+ }
147
+ return c.join("\n");
110
148
  }
111
- o.push("Options:");
112
- let l = c.map(([e, t]) => C(e, t, a, n));
113
- l.push(w());
114
- let u = Math.max(...l.map((e) => e.left.length));
115
- for (let e of l) {
116
- let t = " ".repeat(u - e.left.length + b);
117
- o.push(`${y}${e.left}${t}${e.right}`);
149
+ c.push("Options:");
150
+ let d = u.map(([e, t]) => w(e, t, a, n));
151
+ d.push(T()), o && d.push(E(s));
152
+ let f = Math.max(...d.map((e) => e.left.length));
153
+ for (let e of d) {
154
+ let t = " ".repeat(f - e.left.length + x);
155
+ c.push(`${b}${e.left}${t}${e.right}`);
118
156
  }
119
- return o.join("\n");
157
+ return c.join("\n");
120
158
  }
121
- function E(e) {
159
+ function ne(e) {
122
160
  let { programName: t, commandPath: n, availableEntries: r } = e, i = [], a = [t, ...n].join(" ");
123
161
  if (i.push(`Usage: ${a} <command>`), i.push(""), r.length === 0) return i.push("No available commands."), i.join("\n");
124
162
  i.push("Available commands:");
125
163
  for (let e of r) {
126
164
  if (e.isDynamic) {
127
- i.push(`${y}<${e.paramName}>`);
165
+ i.push(`${b}<${e.paramName}>`);
128
166
  continue;
129
167
  }
130
- i.push(`${y}${e.name}`);
168
+ i.push(`${b}${e.name}`);
131
169
  }
132
170
  return i.join("\n");
133
171
  }
134
- function D(e, t) {
172
+ function O(e, t) {
135
173
  return [
136
174
  `Error: ${t.join(", ")}`,
137
175
  "",
138
176
  e
139
177
  ].join("\n");
140
178
  }
141
- function O(e) {
142
- let { programName: t, defaultCommandName: n, commandPath: r, description: i, argsDefs: a, envPrefix: o, availableEntries: s } = e, c = [];
143
- if (i !== void 0 && (c.push(i), c.push("")), a !== void 0 && Object.entries(a).some(([, e]) => e.positional !== !0) ? c.push(`Usage: ${t} [options]`) : c.push(`Usage: ${t}`), c.push(` ${t} <command>`), c.push(""), a !== void 0) {
179
+ function re(e) {
180
+ let { programName: t, defaultCommandName: n, commandPath: r, description: i, argsDefs: a, envPrefix: o, showVersion: s, versionAlias: c, availableEntries: l } = e, u = [];
181
+ i !== void 0 && (u.push(i), u.push("")), a !== void 0 && Object.entries(a).some(([, e]) => e.positional !== !0) ? u.push(`Usage: ${t} [options]`) : u.push(`Usage: ${t}`), u.push(` ${t} <command>`), u.push("");
182
+ let d = [];
183
+ if (a !== void 0) {
144
184
  let e = Object.entries(a).filter(([, e]) => e.positional !== !0);
145
- if (e.length > 0) {
146
- c.push("Options:");
147
- let t = e.map(([e, t]) => C(e, t, o, r));
148
- t.push(w());
149
- let n = Math.max(...t.map((e) => e.left.length));
150
- for (let e of t) {
151
- let t = " ".repeat(n - e.left.length + b);
152
- c.push(`${y}${e.left}${t}${e.right}`);
153
- }
154
- c.push("");
155
- }
185
+ d.push(...e.map(([e, t]) => w(e, t, o, r)));
186
+ }
187
+ d.push(T()), s && d.push(E(c)), u.push("Options:");
188
+ let f = Math.max(...d.map((e) => e.left.length));
189
+ for (let e of d) {
190
+ let t = " ".repeat(f - e.left.length + x);
191
+ u.push(`${b}${e.left}${t}${e.right}`);
156
192
  }
157
- if (s.length > 0) {
158
- c.push("Available commands:");
159
- for (let e of s) {
193
+ if (u.push(""), l.length > 0) {
194
+ u.push("Available commands:");
195
+ for (let e of l) {
160
196
  if (e.isDynamic) {
161
- c.push(`${y}<${e.paramName}>`);
197
+ u.push(`${b}<${e.paramName}>`);
162
198
  continue;
163
199
  }
164
200
  let t = e.name === n ? " (default)" : "";
165
- c.push(`${y}${e.name}${t}`);
201
+ u.push(`${b}${e.name}${t}`);
166
202
  }
167
203
  }
168
- return c.join("\n");
204
+ return u.join("\n");
169
205
  }
170
- var k = "--", A = "-", ne = "--", re = "--no-", j = "true", M = "false";
171
- function N(e, t, n) {
206
+ //#endregion
207
+ //#region src/parser.ts
208
+ var k = "--", A = "-", j = "--", M = "--no-", N = "true", ie = "false";
209
+ function P(e, t, n) {
172
210
  let r = e.get(t);
173
211
  if (r) {
174
212
  r.push(n);
@@ -176,51 +214,51 @@ function N(e, t, n) {
176
214
  }
177
215
  e.set(t, [n]);
178
216
  }
179
- function P(e, t) {
217
+ function F(e, t) {
180
218
  return t + 1 >= e.length ? !1 : !e[t + 1].startsWith(A);
181
219
  }
182
- function F(e, t) {
183
- let n = new Map(), r = [], i = [], a = 0;
220
+ function I(e, t) {
221
+ let n = /* @__PURE__ */ new Map(), r = [], i = [], a = 0;
184
222
  for (; a < e.length;) {
185
223
  let o = e[a];
186
- if (o === ne) {
224
+ if (o === j) {
187
225
  i = e.slice(a + 1);
188
226
  break;
189
227
  }
190
- if (o.startsWith(re)) {
191
- N(n, o.slice(5), M), a++;
228
+ if (o.startsWith(M)) {
229
+ P(n, o.slice(5), ie), a++;
192
230
  continue;
193
231
  }
194
232
  if (o.startsWith(k) && o.includes("=")) {
195
233
  let e = o.indexOf("=");
196
- N(n, o.slice(2, e), o.slice(e + 1)), a++;
234
+ P(n, o.slice(2, e), o.slice(e + 1)), a++;
197
235
  continue;
198
236
  }
199
237
  if (o.startsWith(k)) {
200
238
  let r = o.slice(2);
201
239
  if (t.booleanFlags.has(r)) {
202
- N(n, r, j), a++;
240
+ P(n, r, N), a++;
203
241
  continue;
204
242
  }
205
- if (P(e, a)) {
206
- N(n, r, e[a + 1]), a += 2;
243
+ if (F(e, a)) {
244
+ P(n, r, e[a + 1]), a += 2;
207
245
  continue;
208
246
  }
209
247
  throw Error(`Flag --${r} requires a value`);
210
248
  }
211
249
  if (o.startsWith(A) && !o.startsWith(k) && o.includes("=")) {
212
250
  let e = o.indexOf("="), r = o.slice(1, e), i = o.slice(e + 1);
213
- N(n, t.aliases.get(r) ?? r, i), a++;
251
+ P(n, t.aliases.get(r) ?? r, i), a++;
214
252
  continue;
215
253
  }
216
254
  if (o.startsWith(A) && !o.startsWith(k)) {
217
255
  let r = o.slice(1), i = t.aliases.get(r) ?? r;
218
256
  if (t.booleanFlags.has(i)) {
219
- N(n, i, j), a++;
257
+ P(n, i, N), a++;
220
258
  continue;
221
259
  }
222
- if (P(e, a)) {
223
- N(n, i, e[a + 1]), a += 2;
260
+ if (F(e, a)) {
261
+ P(n, i, e[a + 1]), a += 2;
224
262
  continue;
225
263
  }
226
264
  throw Error(`Flag -${r} requires a value`);
@@ -233,11 +271,13 @@ function F(e, t) {
233
271
  doubleDashArgs: i
234
272
  };
235
273
  }
236
- var I = "_plugins", L = ".ts";
237
- function R(e) {
274
+ //#endregion
275
+ //#region src/plugin.ts
276
+ var L = "_plugins", R = ".ts";
277
+ function z(e) {
238
278
  return e;
239
279
  }
240
- async function z(e, t) {
280
+ async function B(e, t) {
241
281
  let n = {}, r = [];
242
282
  for (let i of e) {
243
283
  let e = await i(t);
@@ -248,7 +288,7 @@ async function z(e, t) {
248
288
  middlewares: r
249
289
  };
250
290
  }
251
- function B(e, t) {
291
+ function V(e, t) {
252
292
  let n = t;
253
293
  for (let t = e.length - 1; t >= 0; t--) {
254
294
  let r = e[t], i = n;
@@ -256,29 +296,31 @@ function B(e, t) {
256
296
  }
257
297
  return n;
258
298
  }
259
- async function V(t, n) {
299
+ async function H(t, n) {
260
300
  let r = [];
261
301
  for (let n of t) {
262
- let t = e(n, I), i;
302
+ let t = e(n, L), i;
263
303
  try {
264
304
  i = await c(t, { withFileTypes: !0 });
265
305
  } catch {
266
306
  continue;
267
307
  }
268
- let a = i.filter((e) => e.isFile() && e.name.endsWith(L)).sort((e, t) => e.name.localeCompare(t.name));
308
+ let a = i.filter((e) => e.isFile() && e.name.endsWith(R)).sort((e, t) => e.name.localeCompare(t.name));
269
309
  for (let n of a) {
270
310
  let i = e(t, n.name), a = (await import(i)).default;
271
311
  if (a === void 0) throw Error(`Plugin file ${i} does not have a default export`);
272
312
  r.push(a);
273
313
  }
274
314
  }
275
- return z(r, n);
315
+ return B(r, n);
276
316
  }
277
- function H(e, t, n, r) {
317
+ //#endregion
318
+ //#region src/resolver.ts
319
+ function U(e, t, n, r) {
278
320
  if (e !== void 0) return e;
279
- if (t !== void 0) return g(t, n, r);
321
+ if (t !== void 0) return _(t, n, r);
280
322
  }
281
- function U(e) {
323
+ function W(e) {
282
324
  let { argsDefs: t, parsedTokens: n, env: r, config: i, commandPath: a, envPrefix: o } = e, s = {}, c = 0;
283
325
  for (let [e, l] of Object.entries(t)) {
284
326
  let t = n.flags.get(e);
@@ -294,7 +336,7 @@ function U(e) {
294
336
  s[e] = n.positionals[c], c++;
295
337
  continue;
296
338
  }
297
- let u = H(l.env, o, a, e);
339
+ let u = U(l.env, o, a, e);
298
340
  if (u !== void 0) {
299
341
  let t = r[u];
300
342
  if (t !== void 0) {
@@ -303,7 +345,7 @@ function U(e) {
303
345
  }
304
346
  }
305
347
  if (i !== void 0) {
306
- let t = f(i, l.config ?? _(a, e));
348
+ let t = f(i, l.config ?? v(a, e));
307
349
  if (t !== void 0) {
308
350
  s[e] = t;
309
351
  continue;
@@ -316,29 +358,39 @@ function U(e) {
316
358
  }
317
359
  return s;
318
360
  }
319
- var W = /^\[(.+)]$/, G = ".ts", K = "index", q = "_";
320
- async function J(e) {
361
+ //#endregion
362
+ //#region src/router.ts
363
+ var G = /^\[(.+)]$/, K = [".ts", ".js"], q = "index", J = "_";
364
+ function Y(e) {
365
+ return K.find((t) => e.endsWith(t));
366
+ }
367
+ function ae(e, t) {
368
+ return e.slice(0, -t.length);
369
+ }
370
+ async function oe(e) {
321
371
  try {
322
372
  return (await l(e)).isFile();
323
373
  } catch {
324
374
  return !1;
325
375
  }
326
376
  }
327
- async function Y(e) {
377
+ async function se(e) {
328
378
  try {
329
- let t = await c(e, { withFileTypes: !0 }), n = [];
330
- for (let e of t) if (!e.name.startsWith(q)) {
331
- if (e.isFile() && e.name.endsWith(G)) {
332
- let t = e.name.slice(0, -3);
333
- if (t === K) continue;
334
- n.push({
335
- name: t,
379
+ let t = (await c(e, { withFileTypes: !0 })).toSorted((e, t) => (e.isFile() ? K.indexOf(Y(e.name) ?? "") : -1) - (t.isFile() ? K.indexOf(Y(t.name) ?? "") : -1)), n = [], r = /* @__PURE__ */ new Set();
380
+ for (let e of t) {
381
+ if (e.name.startsWith(J)) continue;
382
+ let t = e.isFile() ? Y(e.name) : void 0;
383
+ if (t !== void 0) {
384
+ let i = ae(e.name, t);
385
+ if (i === q || r.has(i)) continue;
386
+ r.add(i), n.push({
387
+ name: i,
336
388
  isDynamic: !1
337
389
  });
338
390
  continue;
339
391
  }
340
392
  if (e.isDirectory()) {
341
- let t = e.name.match(W);
393
+ let t = e.name.match(G);
342
394
  if (t !== null) {
343
395
  n.push({
344
396
  name: e.name,
@@ -363,52 +415,56 @@ async function X(t, r) {
363
415
  for (let t = 0; t < r.length; t++) {
364
416
  let n = r[t];
365
417
  if (n.startsWith("-")) break;
366
- let l = await c(i, { withFileTypes: !0 }), u = n + G, d = l.find((e) => e.isFile() && e.name === u);
367
- if (d) return s = t + 1, {
418
+ let l = await c(i, { withFileTypes: !0 }), u = K.reduce((e, t) => e ?? l.find((e) => e.isFile() && e.name === n + t), void 0);
419
+ if (u) return s = t + 1, {
368
420
  kind: "resolved",
369
- filePath: e(i, d.name),
421
+ filePath: e(i, u.name),
370
422
  params: a,
371
423
  remainingTokens: r.slice(s),
372
424
  traversedDirs: o
373
425
  };
374
- let f = l.find((e) => e.isDirectory() && e.name === n);
375
- if (f) {
376
- i = e(i, f.name), o.push(i), s = t + 1;
426
+ let d = l.find((e) => e.isDirectory() && e.name === n);
427
+ if (d) {
428
+ i = e(i, d.name), o.push(i), s = t + 1;
377
429
  continue;
378
430
  }
379
- let p, m = l.find((e) => {
431
+ let f, p = l.find((e) => {
380
432
  if (!e.isDirectory()) return !1;
381
- let t = e.name.match(W);
382
- return t === null ? !1 : (p = t[1], !0);
433
+ let t = e.name.match(G);
434
+ return t === null ? !1 : (f = t[1], !0);
383
435
  });
384
- if (m && p !== void 0) {
385
- a[p] = n, i = e(i, m.name), o.push(i), s = t + 1;
436
+ if (p && f !== void 0) {
437
+ a[f] = n, i = e(i, p.name), o.push(i), s = t + 1;
386
438
  continue;
387
439
  }
388
440
  break;
389
441
  }
390
- let l = e(i, K + G);
391
- if (await J(l)) return {
392
- kind: "resolved",
393
- filePath: l,
394
- params: a,
395
- remainingTokens: r.slice(s),
396
- traversedDirs: o
397
- };
398
- let u = await Y(i);
442
+ for (let t of K) {
443
+ let n = e(i, q + t);
444
+ if (await oe(n)) return {
445
+ kind: "resolved",
446
+ filePath: n,
447
+ params: a,
448
+ remainingTokens: r.slice(s),
449
+ traversedDirs: o
450
+ };
451
+ }
452
+ let l = await se(i);
399
453
  return {
400
454
  kind: "unresolved",
401
455
  stoppedDir: i,
402
- availableEntries: u
456
+ availableEntries: l
403
457
  };
404
458
  }
405
- function ie(e) {
406
- return v(e) ? o.preprocess((e) => typeof e == "string" ? e === "true" || e === "1" : e, e) : te(e) ? o.preprocess((e) => typeof e == "string" ? Number(e) : e, e) : e;
459
+ //#endregion
460
+ //#region src/validator.ts
461
+ function ce(e) {
462
+ return y(e) ? o.preprocess((e) => typeof e == "string" ? e === "true" || e === "1" : e, e) : ee(e) ? o.preprocess((e) => typeof e == "string" ? Number(e) : e, e) : e;
407
463
  }
408
- function ae(e, t) {
464
+ function le(e, t) {
409
465
  let n = {};
410
466
  for (let [t, r] of Object.entries(e)) {
411
- let e = ie(r.type);
467
+ let e = ce(r.type);
412
468
  if (r.multiple === !0) {
413
469
  n[t] = o.array(e);
414
470
  continue;
@@ -417,10 +473,21 @@ function ae(e, t) {
417
473
  }
418
474
  return o.object(n).parse(t);
419
475
  }
420
- var oe = "commands", se = 2, Z = 1;
421
- function Q(e) {
422
- let t = new Set(), n = new Map();
423
- for (let [r, i] of Object.entries(e)) v(i.type) && t.add(r), i.alias !== void 0 && n.set(i.alias, r);
476
+ //#endregion
477
+ //#region src/cli.ts
478
+ var ue = "commands", de = 2, Z = 1, Q = "V";
479
+ function fe(e) {
480
+ return typeof e == "string" ? {
481
+ number: e,
482
+ alias: Q
483
+ } : {
484
+ number: e.number,
485
+ alias: e.alias === !1 ? void 0 : e.alias ?? Q
486
+ };
487
+ }
488
+ function pe(e) {
489
+ let t = /* @__PURE__ */ new Set(), n = /* @__PURE__ */ new Map();
490
+ for (let [r, i] of Object.entries(e)) y(i.type) && t.add(r), i.alias !== void 0 && n.set(i.alias, r);
424
491
  return {
425
492
  booleanFlags: t,
426
493
  aliases: n
@@ -429,11 +496,11 @@ function Q(e) {
429
496
  function $(e, r) {
430
497
  return t(n(e), r).replace(/\.ts$/, "").split("/").filter((e) => e !== "index" && !e.startsWith("["));
431
498
  }
432
- function ce(e, r) {
499
+ function me(e, r) {
433
500
  let i = t(n(e), r);
434
501
  return i === "" || i === "." ? [] : i.split("/").filter((e) => !e.startsWith("["));
435
502
  }
436
- function le(e) {
503
+ function he(e) {
437
504
  let t, n = [];
438
505
  for (let r = 0; r < e.length; r++) {
439
506
  let i = e[r];
@@ -454,84 +521,101 @@ function le(e) {
454
521
  remainingTokens: n
455
522
  };
456
523
  }
457
- function ue(e) {
458
- let t = e.commandsDir ?? oe, r = e.name, a = e.autoEnv?.prefix, o = e.defaultCommand;
459
- async function s() {
460
- let { configPath: e, remainingTokens: s } = le(process.argv.slice(se)), c = await X(t, s);
461
- if (c.kind === "unresolved") if (n(c.stoppedDir) === n(t) && o !== void 0) {
462
- if (s.includes("--help") || s.includes("-h")) {
463
- let e = await X(t, [o]);
524
+ function ge(e, t) {
525
+ return e.some((e) => e === "--version" || t !== void 0 && e === `-${t}`);
526
+ }
527
+ function _e(e) {
528
+ let t = e.commandsDir ?? ue, r = e.name, a = e.autoEnv?.prefix, o = e.defaultCommand, s = e.version === void 0 ? void 0 : fe(e.version);
529
+ async function c() {
530
+ let { configPath: e, remainingTokens: c } = he(process.argv.slice(de)), l = await X(t, c);
531
+ if (l.kind === "unresolved") {
532
+ let e = n(l.stoppedDir) === n(t), i = c.some((e) => !e.startsWith("-"));
533
+ if (e && !i && s !== void 0 && ge(c, s.alias)) {
534
+ console.log(s.number);
535
+ return;
536
+ }
537
+ if (e && o !== void 0) {
538
+ if (c.includes("--help") || c.includes("-h")) {
539
+ let e = await X(t, [o]);
540
+ if (e.kind === "unresolved") throw Error(`defaultCommand "${o}" does not match any command file`);
541
+ let n = (await import(e.filePath)).default, i = n.args ?? {}, c = re({
542
+ programName: r,
543
+ defaultCommandName: o,
544
+ commandPath: $(t, e.filePath),
545
+ description: n.description,
546
+ argsDefs: Object.keys(i).length > 0 ? i : void 0,
547
+ envPrefix: a,
548
+ showVersion: s !== void 0,
549
+ versionAlias: s?.alias,
550
+ availableEntries: l.availableEntries
551
+ });
552
+ console.log(c);
553
+ return;
554
+ }
555
+ let e = await X(t, [o, ...c]);
464
556
  if (e.kind === "unresolved") throw Error(`defaultCommand "${o}" does not match any command file`);
465
- let n = (await import(e.filePath)).default, i = n.args ?? {}, s = O({
557
+ l = e;
558
+ } else {
559
+ let e = ne({
466
560
  programName: r,
467
- defaultCommandName: o,
468
- commandPath: $(t, e.filePath),
469
- description: n.description,
470
- argsDefs: Object.keys(i).length > 0 ? i : void 0,
471
- envPrefix: a,
472
- availableEntries: c.availableEntries
561
+ commandPath: me(t, l.stoppedDir),
562
+ availableEntries: l.availableEntries
473
563
  });
474
- console.log(s);
564
+ console.log(e);
475
565
  return;
476
566
  }
477
- let e = await X(t, [o, ...s]);
478
- if (e.kind === "unresolved") throw Error(`defaultCommand "${o}" does not match any command file`);
479
- c = e;
480
- } else {
481
- let e = E({
482
- programName: r,
483
- commandPath: ce(t, c.stoppedDir),
484
- availableEntries: c.availableEntries
485
- });
486
- console.log(e);
487
- return;
488
567
  }
489
- let l = (await import(c.filePath)).default, u = l.args ?? {}, d = $(t, c.filePath), f = T({
568
+ let u = (await import(l.filePath)).default, d = u.args ?? {}, f = $(t, l.filePath), p = D({
490
569
  programName: r,
491
- commandPath: d,
492
- description: l.description,
493
- argsDefs: Object.keys(u).length > 0 ? u : void 0,
494
- envPrefix: a
570
+ commandPath: f,
571
+ description: u.description,
572
+ argsDefs: Object.keys(d).length > 0 ? d : void 0,
573
+ envPrefix: a,
574
+ showVersion: s !== void 0,
575
+ versionAlias: s?.alias
495
576
  });
496
- if (c.remainingTokens.includes("--help") || c.remainingTokens.includes("-h")) {
497
- console.log(f);
577
+ if (l.remainingTokens.includes("--help") || l.remainingTokens.includes("-h")) {
578
+ console.log(p);
498
579
  return;
499
580
  }
500
- let p = Q(u), m;
581
+ let m = pe(d), h;
501
582
  try {
502
- let t = F(c.remainingTokens, p), n = await ee(r, e);
503
- m = ae(u, U({
504
- argsDefs: u,
583
+ let t = I(l.remainingTokens, m), n = await g(r, e);
584
+ h = le(d, W({
585
+ argsDefs: d,
505
586
  parsedTokens: t,
506
587
  env: process.env,
507
588
  config: n,
508
- commandPath: d,
589
+ commandPath: f,
509
590
  envPrefix: a
510
591
  }));
511
592
  } catch (e) {
512
593
  if (e instanceof i) {
513
594
  let t = e.issues.map((e) => `${e.path.join(".")}: ${e.message}`);
514
- console.error(D(f, t)), process.exit(Z);
595
+ console.error(O(p, t)), process.exit(Z);
515
596
  }
516
- throw e instanceof Error && (console.error(D(f, [e.message])), process.exit(Z)), e;
597
+ throw e instanceof Error && (console.error(O(p, [e.message])), process.exit(Z)), e;
517
598
  }
518
- let { extensions: h, middlewares: g } = await V(c.traversedDirs, { cliName: r }), _ = {
519
- commandPath: d,
520
- params: c.params,
521
- args: m,
522
- extensions: h
599
+ let { extensions: _, middlewares: v } = await H(l.traversedDirs, { cliName: r }), y = {
600
+ commandPath: f,
601
+ params: l.params,
602
+ args: h,
603
+ extensions: _
523
604
  };
524
- await B(g, async (e) => {
525
- await l.run({
605
+ await V(v, async (e) => {
606
+ await u.run({
526
607
  params: e.params,
527
608
  args: e.args,
528
609
  extensions: e.extensions
529
610
  });
530
- })(_);
611
+ })(y);
531
612
  }
532
- return { run: s };
613
+ return { run: c };
533
614
  }
534
- function de(e) {
615
+ //#endregion
616
+ //#region src/types.ts
617
+ function ve(e) {
535
618
  return e;
536
619
  }
537
- export { ue as createCLI, de as defineCommand, R as definePlugin };
620
+ //#endregion
621
+ export { _e as createCLI, ve as defineCommand, z as definePlugin };
@@ -1 +1 @@
1
- {"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../src/router.ts"],"names":[],"mappings":"AAQA,UAAU,aAAa;IACrB,IAAI,EAAE,UAAU,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,aAAa,EAAE,MAAM,EAAE,CAAC;CACzB;AAED,UAAU,eAAe;IACvB,IAAI,EAAE,YAAY,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,gBAAgB,EAAE,cAAc,EAAE,CAAC;CACpC;AAED,UAAU,cAAc;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,KAAK,WAAW,GAAG,aAAa,GAAG,eAAe,CAAC;AAqDnD,iBAAe,YAAY,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,WAAW,CAAC,CAmFvF;AAED,OAAO,EAAE,YAAY,EAAE,CAAC;AACxB,YAAY,EAAE,cAAc,EAAE,aAAa,EAAE,WAAW,EAAE,eAAe,EAAE,CAAC"}
1
+ {"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../src/router.ts"],"names":[],"mappings":"AAiBA,UAAU,aAAa;IACrB,IAAI,EAAE,UAAU,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,aAAa,EAAE,MAAM,EAAE,CAAC;CACzB;AAED,UAAU,eAAe;IACvB,IAAI,EAAE,YAAY,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,gBAAgB,EAAE,cAAc,EAAE,CAAC;CACpC;AAED,UAAU,cAAc;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,KAAK,WAAW,GAAG,aAAa,GAAG,eAAe,CAAC;AAsEnD,iBAAe,YAAY,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,WAAW,CAAC,CAuFvF;AAED,OAAO,EAAE,YAAY,EAAE,CAAC;AACxB,YAAY,EAAE,cAAc,EAAE,aAAa,EAAE,WAAW,EAAE,eAAe,EAAE,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@miyaoka/fsss",
3
- "version": "0.3.1",
3
+ "version": "0.4.0",
4
4
  "description": "A CLI framework where your file structure becomes your command structure, and a single schema gives you typed values whether they come from flags, env vars, or config files.",
5
5
  "type": "module",
6
6
  "author": "miyaoka",
@@ -38,12 +38,12 @@
38
38
  "devDependencies": {
39
39
  "@tsconfig/node24": "24.0.4",
40
40
  "@types/bun": "1.3.10",
41
- "oxfmt": "0.36.0",
42
- "oxlint": "1.51.0",
41
+ "oxfmt": "0.37.0",
42
+ "oxlint": "1.52.0",
43
43
  "oxlint-tsgolint": "0.16.0",
44
44
  "typescript": "5.9.3",
45
45
  "unplugin-dts": "1.0.0-beta.6",
46
- "vite": "8.0.0-beta.16"
46
+ "vite": "8.0.0-beta.18"
47
47
  },
48
48
  "scripts": {
49
49
  "build": "vite build",