@miyaoka/fsss 0.3.0 → 0.3.1

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.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,CAoJ3C;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,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"}
package/dist/codegen.js CHANGED
@@ -1,18 +1,18 @@
1
1
  #!/usr/bin/env node
2
- import { join, relative } from "node:path";
3
- import { mkdir, readFile, readdir, writeFile } from "node:fs/promises";
4
- import { parseArgs } from "node:util";
5
- var PLUGINS_DIR_NAME = "_plugins", PLUGIN_FILE_EXTENSION = ".ts", INTERFACE_NAME_PATTERN = /export\s+interface\s+(\w+)/g;
6
- async function findAllPluginFiles(t) {
2
+ import { join as e, relative as t } from "node:path";
3
+ import { mkdir as n, readFile as r, readdir as i, writeFile as a } from "node:fs/promises";
4
+ import { parseArgs as o } from "node:util";
5
+ var s = "_plugins", c = ".ts", l = /export\s+interface\s+(\w+)/g;
6
+ async function u(t) {
7
7
  let n = [];
8
8
  async function r(t) {
9
- let a = await readdir(t, { withFileTypes: !0 });
9
+ let a = await i(t, { withFileTypes: !0 });
10
10
  for (let o of a) {
11
11
  if (!o.isDirectory()) continue;
12
- let a = join(t, o.name);
13
- if (o.name === PLUGINS_DIR_NAME) {
14
- let t = await readdir(a, { withFileTypes: !0 });
15
- for (let r of t) r.isFile() && r.name.endsWith(PLUGIN_FILE_EXTENSION) && n.push(join(a, r.name));
12
+ let a = e(t, o.name);
13
+ if (o.name === s) {
14
+ let t = await i(a, { withFileTypes: !0 });
15
+ for (let r of t) r.isFile() && r.name.endsWith(c) && n.push(e(a, r.name));
16
16
  continue;
17
17
  }
18
18
  await r(a);
@@ -20,17 +20,17 @@ async function findAllPluginFiles(t) {
20
20
  }
21
21
  return await r(t), n.sort();
22
22
  }
23
- async function extractInterfaceNames(e) {
24
- let t = await readFile(e, "utf-8"), n = [], i = INTERFACE_NAME_PATTERN.exec(t);
25
- for (; i !== null;) n.push(i[1]), i = INTERFACE_NAME_PATTERN.exec(t);
23
+ async function d(e) {
24
+ let t = await r(e, "utf-8"), n = [], i = l.exec(t);
25
+ for (; i !== null;) n.push(i[1]), i = l.exec(t);
26
26
  return n;
27
27
  }
28
- async function generateExtensionsType(r, i) {
29
- let o = await findAllPluginFiles(r), s = [];
28
+ async function f(r, i) {
29
+ let o = await u(r), s = [];
30
30
  for (let e of o) {
31
- let n = await extractInterfaceNames(e);
31
+ let n = await d(e);
32
32
  if (n.length === 0) continue;
33
- let r = relative(i, e).replace(/\.ts$/, ""), a = r.startsWith(".") ? r : `./${r}`;
33
+ let r = t(i, e).replace(/\.ts$/, ""), a = r.startsWith(".") ? r : `./${r}`;
34
34
  s.push({
35
35
  importPath: a,
36
36
  interfaceNames: n
@@ -46,12 +46,12 @@ async function generateExtensionsType(r, i) {
46
46
  let e = s.flatMap((e) => e.interfaceNames);
47
47
  c.push("", "declare module \"@miyaoka/fsss\" {", ` interface Extensions extends ${e.join(", ")} {}`, "}", "");
48
48
  }
49
- await mkdir(i, { recursive: !0 });
50
- let l = join(i, "extensions.d.ts");
51
- await writeFile(l, c.join("\n"), "utf-8"), console.log(`Generated ${l}`);
49
+ await n(i, { recursive: !0 });
50
+ let l = e(i, "extensions.d.ts");
51
+ await a(l, c.join("\n"), "utf-8"), console.log(`Generated ${l}`);
52
52
  }
53
- var { values } = parseArgs({ options: {
53
+ var { values: p } = o({ options: {
54
54
  commandsDir: { type: "string" },
55
55
  outDir: { type: "string" }
56
56
  } });
57
- (values.commandsDir === void 0 || values.outDir === void 0) && (console.error("Usage: bun run codegen.ts --commandsDir <path> --outDir <path>"), process.exit(1)), await generateExtensionsType(values.commandsDir, values.outDir);
57
+ (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);
package/dist/index.js CHANGED
@@ -1,95 +1,95 @@
1
- import { join, relative, resolve } from "node:path";
2
- import { ZodBoolean, ZodError, ZodNumber, z } from "zod";
3
- import { readFile, readdir, stat } from "node:fs/promises";
4
- import { homedir } from "node:os";
5
- function isRecord(e) {
1
+ import { join as e, relative as t, resolve as n } from "node:path";
2
+ import { ZodBoolean as r, ZodError as i, ZodNumber as a, z as o } from "zod";
3
+ import { readFile as s, readdir as c, stat as l } from "node:fs/promises";
4
+ import { homedir as u } from "node:os";
5
+ function d(e) {
6
6
  return typeof e == "object" && !!e;
7
7
  }
8
- function getByDotPath(e, t) {
8
+ function f(e, t) {
9
9
  let n = t.split("."), r = e;
10
10
  for (let e of n) {
11
- if (!isRecord(r)) return;
11
+ if (!d(r)) return;
12
12
  r = r[e];
13
13
  }
14
14
  return r;
15
15
  }
16
- async function loadConfig(e) {
16
+ async function p(e) {
17
17
  try {
18
- let t = await readFile(e, "utf-8");
18
+ let t = await s(e, "utf-8");
19
19
  return JSON.parse(t);
20
20
  } catch {
21
21
  return;
22
22
  }
23
23
  }
24
- function deepMerge(e, t) {
24
+ function m(e, t) {
25
25
  let n = { ...e };
26
26
  for (let [e, r] of Object.entries(t)) {
27
27
  let t = n[e];
28
- if (isRecord(t) && isRecord(r)) {
29
- n[e] = deepMerge(t, r);
28
+ if (d(t) && d(r)) {
29
+ n[e] = m(t, r);
30
30
  continue;
31
31
  }
32
32
  n[e] = r;
33
33
  }
34
34
  return n;
35
35
  }
36
- function resolveConfigPaths(t, n) {
36
+ function h(t, n) {
37
37
  let r = [];
38
- return r.push(join(homedir(), ".config", t, "config.json")), r.push(join(process.cwd(), `${t}.config.json`)), n !== void 0 && r.push(n), r;
38
+ 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
39
  }
40
- async function loadMergedConfig(e, t) {
41
- let n = resolveConfigPaths(e, t), r;
40
+ async function ee(e, t) {
41
+ let n = h(e, t), r;
42
42
  for (let e of n) {
43
- let t = await loadConfig(e);
43
+ let t = await p(e);
44
44
  if (t !== void 0) {
45
45
  if (r === void 0) {
46
46
  r = t;
47
47
  continue;
48
48
  }
49
- r = deepMerge(r, t);
49
+ r = m(r, t);
50
50
  }
51
51
  }
52
52
  return r;
53
53
  }
54
- function deriveEnvName(e, t, n) {
54
+ function g(e, t, n) {
55
55
  return [
56
56
  e,
57
57
  ...t,
58
58
  n
59
59
  ].join("_").toUpperCase();
60
60
  }
61
- function deriveConfigPath(e, t) {
61
+ function _(e, t) {
62
62
  return [...e, t].join(".");
63
63
  }
64
- function isBooleanSchema(e) {
65
- return e instanceof ZodBoolean;
64
+ function v(e) {
65
+ return e instanceof r;
66
66
  }
67
- function isNumberSchema(e) {
68
- return e instanceof ZodNumber;
67
+ function te(e) {
68
+ return e instanceof a;
69
69
  }
70
- var INDENT = " ", COLUMN_GAP = 2;
71
- function resolveEnvNameForHelp(e, t, n, r) {
70
+ var y = " ", b = 2;
71
+ function x(e, t, n, r) {
72
72
  if (e.env !== void 0) return e.env;
73
- if (t !== void 0) return deriveEnvName(t, n, r);
73
+ if (t !== void 0) return g(t, n, r);
74
74
  }
75
- function formatOptionMeta(e, t) {
75
+ function S(e, t) {
76
76
  let n = [];
77
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(", ")})`;
78
78
  }
79
- function formatOptionLine(e, t, n, r) {
80
- let i = isBooleanSchema(t.type) ? "" : ` <${e}>`, a = `${t.alias === void 0 ? " " : `-${t.alias}, `}--${e}${i}`, o = resolveEnvNameForHelp(t, n, r, e);
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);
81
81
  return {
82
82
  left: a,
83
- right: `${t.description}${formatOptionMeta(t, o)}`
83
+ right: `${t.description}${S(t, o)}`
84
84
  };
85
85
  }
86
- function formatHelpLine() {
86
+ function w() {
87
87
  return {
88
88
  left: "-h, --help",
89
89
  right: "ヘルプを表示する"
90
90
  };
91
91
  }
92
- function generateHelp(e) {
92
+ function T(e) {
93
93
  let { programName: t, commandPath: n, description: r, argsDefs: i, envPrefix: a } = e, o = [];
94
94
  r !== void 0 && (o.push(r), o.push(""));
95
95
  let s = [t, ...n];
@@ -105,51 +105,51 @@ function generateHelp(e) {
105
105
  let c = Object.entries(i).filter(([, e]) => e.positional !== !0);
106
106
  if (c.length === 0) {
107
107
  o.push("Options:");
108
- let e = formatHelpLine();
109
- return o.push(`${INDENT}${e.left} ${e.right}`), o.join("\n");
108
+ let e = w();
109
+ return o.push(`${y}${e.left} ${e.right}`), o.join("\n");
110
110
  }
111
111
  o.push("Options:");
112
- let l = c.map(([e, t]) => formatOptionLine(e, t, a, n));
113
- l.push(formatHelpLine());
112
+ let l = c.map(([e, t]) => C(e, t, a, n));
113
+ l.push(w());
114
114
  let u = Math.max(...l.map((e) => e.left.length));
115
115
  for (let e of l) {
116
- let t = " ".repeat(u - e.left.length + COLUMN_GAP);
117
- o.push(`${INDENT}${e.left}${t}${e.right}`);
116
+ let t = " ".repeat(u - e.left.length + b);
117
+ o.push(`${y}${e.left}${t}${e.right}`);
118
118
  }
119
119
  return o.join("\n");
120
120
  }
121
- function generateSubcommandHelp(e) {
121
+ function E(e) {
122
122
  let { programName: t, commandPath: n, availableEntries: r } = e, i = [], a = [t, ...n].join(" ");
123
123
  if (i.push(`Usage: ${a} <command>`), i.push(""), r.length === 0) return i.push("No available commands."), i.join("\n");
124
124
  i.push("Available commands:");
125
125
  for (let e of r) {
126
126
  if (e.isDynamic) {
127
- i.push(`${INDENT}<${e.paramName}>`);
127
+ i.push(`${y}<${e.paramName}>`);
128
128
  continue;
129
129
  }
130
- i.push(`${INDENT}${e.name}`);
130
+ i.push(`${y}${e.name}`);
131
131
  }
132
132
  return i.join("\n");
133
133
  }
134
- function generateValidationErrorHelp(e, t) {
134
+ function D(e, t) {
135
135
  return [
136
136
  `Error: ${t.join(", ")}`,
137
137
  "",
138
138
  e
139
139
  ].join("\n");
140
140
  }
141
- function generateDefaultCommandHelp(e) {
141
+ function O(e) {
142
142
  let { programName: t, defaultCommandName: n, commandPath: r, description: i, argsDefs: a, envPrefix: o, availableEntries: s } = e, c = [];
143
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) {
144
144
  let e = Object.entries(a).filter(([, e]) => e.positional !== !0);
145
145
  if (e.length > 0) {
146
146
  c.push("Options:");
147
- let t = e.map(([e, t]) => formatOptionLine(e, t, o, r));
148
- t.push(formatHelpLine());
147
+ let t = e.map(([e, t]) => C(e, t, o, r));
148
+ t.push(w());
149
149
  let n = Math.max(...t.map((e) => e.left.length));
150
150
  for (let e of t) {
151
- let t = " ".repeat(n - e.left.length + COLUMN_GAP);
152
- c.push(`${INDENT}${e.left}${t}${e.right}`);
151
+ let t = " ".repeat(n - e.left.length + b);
152
+ c.push(`${y}${e.left}${t}${e.right}`);
153
153
  }
154
154
  c.push("");
155
155
  }
@@ -158,17 +158,17 @@ function generateDefaultCommandHelp(e) {
158
158
  c.push("Available commands:");
159
159
  for (let e of s) {
160
160
  if (e.isDynamic) {
161
- c.push(`${INDENT}<${e.paramName}>`);
161
+ c.push(`${y}<${e.paramName}>`);
162
162
  continue;
163
163
  }
164
164
  let t = e.name === n ? " (default)" : "";
165
- c.push(`${INDENT}${e.name}${t}`);
165
+ c.push(`${y}${e.name}${t}`);
166
166
  }
167
167
  }
168
168
  return c.join("\n");
169
169
  }
170
- var LONG_FLAG_PREFIX = "--", SHORT_FLAG_PREFIX = "-", DOUBLE_DASH = "--", NEGATION_PREFIX = "--no-", BOOLEAN_TRUE = "true", BOOLEAN_FALSE = "false";
171
- function addFlag(e, t, n) {
170
+ var k = "--", A = "-", ne = "--", re = "--no-", j = "true", M = "false";
171
+ function N(e, t, n) {
172
172
  let r = e.get(t);
173
173
  if (r) {
174
174
  r.push(n);
@@ -176,51 +176,51 @@ function addFlag(e, t, n) {
176
176
  }
177
177
  e.set(t, [n]);
178
178
  }
179
- function isNextTokenAvailable(e, t) {
180
- return t + 1 >= e.length ? !1 : !e[t + 1].startsWith(SHORT_FLAG_PREFIX);
179
+ function P(e, t) {
180
+ return t + 1 >= e.length ? !1 : !e[t + 1].startsWith(A);
181
181
  }
182
- function parseTokens(e, t) {
183
- let n = /* @__PURE__ */ new Map(), r = [], i = [], a = 0;
182
+ function F(e, t) {
183
+ let n = new Map(), r = [], i = [], a = 0;
184
184
  for (; a < e.length;) {
185
185
  let o = e[a];
186
- if (o === DOUBLE_DASH) {
186
+ if (o === ne) {
187
187
  i = e.slice(a + 1);
188
188
  break;
189
189
  }
190
- if (o.startsWith(NEGATION_PREFIX)) {
191
- addFlag(n, o.slice(5), BOOLEAN_FALSE), a++;
190
+ if (o.startsWith(re)) {
191
+ N(n, o.slice(5), M), a++;
192
192
  continue;
193
193
  }
194
- if (o.startsWith(LONG_FLAG_PREFIX) && o.includes("=")) {
194
+ if (o.startsWith(k) && o.includes("=")) {
195
195
  let e = o.indexOf("=");
196
- addFlag(n, o.slice(2, e), o.slice(e + 1)), a++;
196
+ N(n, o.slice(2, e), o.slice(e + 1)), a++;
197
197
  continue;
198
198
  }
199
- if (o.startsWith(LONG_FLAG_PREFIX)) {
199
+ if (o.startsWith(k)) {
200
200
  let r = o.slice(2);
201
201
  if (t.booleanFlags.has(r)) {
202
- addFlag(n, r, BOOLEAN_TRUE), a++;
202
+ N(n, r, j), a++;
203
203
  continue;
204
204
  }
205
- if (isNextTokenAvailable(e, a)) {
206
- addFlag(n, r, e[a + 1]), a += 2;
205
+ if (P(e, a)) {
206
+ N(n, r, e[a + 1]), a += 2;
207
207
  continue;
208
208
  }
209
209
  throw Error(`Flag --${r} requires a value`);
210
210
  }
211
- if (o.startsWith(SHORT_FLAG_PREFIX) && !o.startsWith(LONG_FLAG_PREFIX) && o.includes("=")) {
211
+ if (o.startsWith(A) && !o.startsWith(k) && o.includes("=")) {
212
212
  let e = o.indexOf("="), r = o.slice(1, e), i = o.slice(e + 1);
213
- addFlag(n, t.aliases.get(r) ?? r, i), a++;
213
+ N(n, t.aliases.get(r) ?? r, i), a++;
214
214
  continue;
215
215
  }
216
- if (o.startsWith(SHORT_FLAG_PREFIX) && !o.startsWith(LONG_FLAG_PREFIX)) {
216
+ if (o.startsWith(A) && !o.startsWith(k)) {
217
217
  let r = o.slice(1), i = t.aliases.get(r) ?? r;
218
218
  if (t.booleanFlags.has(i)) {
219
- addFlag(n, i, BOOLEAN_TRUE), a++;
219
+ N(n, i, j), a++;
220
220
  continue;
221
221
  }
222
- if (isNextTokenAvailable(e, a)) {
223
- addFlag(n, i, e[a + 1]), a += 2;
222
+ if (P(e, a)) {
223
+ N(n, i, e[a + 1]), a += 2;
224
224
  continue;
225
225
  }
226
226
  throw Error(`Flag -${r} requires a value`);
@@ -233,11 +233,11 @@ function parseTokens(e, t) {
233
233
  doubleDashArgs: i
234
234
  };
235
235
  }
236
- var PLUGINS_DIR_NAME = "_plugins", PLUGIN_FILE_EXTENSION = ".ts";
237
- function definePlugin(e) {
236
+ var I = "_plugins", L = ".ts";
237
+ function R(e) {
238
238
  return e;
239
239
  }
240
- async function resolvePlugins(e, t) {
240
+ async function z(e, t) {
241
241
  let n = {}, r = [];
242
242
  for (let i of e) {
243
243
  let e = await i(t);
@@ -248,7 +248,7 @@ async function resolvePlugins(e, t) {
248
248
  middlewares: r
249
249
  };
250
250
  }
251
- function buildMiddlewareChain(e, t) {
251
+ function B(e, t) {
252
252
  let n = t;
253
253
  for (let t = e.length - 1; t >= 0; t--) {
254
254
  let r = e[t], i = n;
@@ -256,29 +256,29 @@ function buildMiddlewareChain(e, t) {
256
256
  }
257
257
  return n;
258
258
  }
259
- async function scanPluginsAlongPath(t, n) {
259
+ async function V(t, n) {
260
260
  let r = [];
261
261
  for (let n of t) {
262
- let t = join(n, PLUGINS_DIR_NAME), i;
262
+ let t = e(n, I), i;
263
263
  try {
264
- i = await readdir(t, { withFileTypes: !0 });
264
+ i = await c(t, { withFileTypes: !0 });
265
265
  } catch {
266
266
  continue;
267
267
  }
268
- let a = i.filter((e) => e.isFile() && e.name.endsWith(PLUGIN_FILE_EXTENSION)).sort((e, t) => e.name.localeCompare(t.name));
268
+ let a = i.filter((e) => e.isFile() && e.name.endsWith(L)).sort((e, t) => e.name.localeCompare(t.name));
269
269
  for (let n of a) {
270
- let i = join(t, n.name), a = (await import(i)).default;
270
+ let i = e(t, n.name), a = (await import(i)).default;
271
271
  if (a === void 0) throw Error(`Plugin file ${i} does not have a default export`);
272
272
  r.push(a);
273
273
  }
274
274
  }
275
- return resolvePlugins(r, n);
275
+ return z(r, n);
276
276
  }
277
- function resolveEnvName(e, t, n, r) {
277
+ function H(e, t, n, r) {
278
278
  if (e !== void 0) return e;
279
- if (t !== void 0) return deriveEnvName(t, n, r);
279
+ if (t !== void 0) return g(t, n, r);
280
280
  }
281
- function resolveValues(e) {
281
+ function U(e) {
282
282
  let { argsDefs: t, parsedTokens: n, env: r, config: i, commandPath: a, envPrefix: o } = e, s = {}, c = 0;
283
283
  for (let [e, l] of Object.entries(t)) {
284
284
  let t = n.flags.get(e);
@@ -294,7 +294,7 @@ function resolveValues(e) {
294
294
  s[e] = n.positionals[c], c++;
295
295
  continue;
296
296
  }
297
- let u = resolveEnvName(l.env, o, a, e);
297
+ let u = H(l.env, o, a, e);
298
298
  if (u !== void 0) {
299
299
  let t = r[u];
300
300
  if (t !== void 0) {
@@ -303,7 +303,7 @@ function resolveValues(e) {
303
303
  }
304
304
  }
305
305
  if (i !== void 0) {
306
- let t = getByDotPath(i, l.config ?? deriveConfigPath(a, e));
306
+ let t = f(i, l.config ?? _(a, e));
307
307
  if (t !== void 0) {
308
308
  s[e] = t;
309
309
  continue;
@@ -316,21 +316,21 @@ function resolveValues(e) {
316
316
  }
317
317
  return s;
318
318
  }
319
- var DYNAMIC_SEGMENT_PATTERN = /^\[(.+)]$/, COMMAND_FILE_EXTENSION = ".ts", INDEX_FILE_NAME = "index", INTERNAL_PREFIX = "_";
320
- async function fileExists(e) {
319
+ var W = /^\[(.+)]$/, G = ".ts", K = "index", q = "_";
320
+ async function J(e) {
321
321
  try {
322
- return (await stat(e)).isFile();
322
+ return (await l(e)).isFile();
323
323
  } catch {
324
324
  return !1;
325
325
  }
326
326
  }
327
- async function listAvailableEntries(e) {
327
+ async function Y(e) {
328
328
  try {
329
- let t = await readdir(e, { withFileTypes: !0 }), n = [];
330
- for (let e of t) if (!e.name.startsWith(INTERNAL_PREFIX)) {
331
- if (e.isFile() && e.name.endsWith(COMMAND_FILE_EXTENSION)) {
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
332
  let t = e.name.slice(0, -3);
333
- if (t === INDEX_FILE_NAME) continue;
333
+ if (t === K) continue;
334
334
  n.push({
335
335
  name: t,
336
336
  isDynamic: !1
@@ -338,7 +338,7 @@ async function listAvailableEntries(e) {
338
338
  continue;
339
339
  }
340
340
  if (e.isDirectory()) {
341
- let t = e.name.match(DYNAMIC_SEGMENT_PATTERN);
341
+ let t = e.name.match(W);
342
342
  if (t !== null) {
343
343
  n.push({
344
344
  name: e.name,
@@ -358,82 +358,82 @@ async function listAvailableEntries(e) {
358
358
  return [];
359
359
  }
360
360
  }
361
- async function resolveRoute(t, r) {
362
- let i = resolve(t), a = {}, o = [i], s = 0;
361
+ async function X(t, r) {
362
+ let i = n(t), a = {}, o = [i], s = 0;
363
363
  for (let t = 0; t < r.length; t++) {
364
364
  let n = r[t];
365
365
  if (n.startsWith("-")) break;
366
- let l = await readdir(i, { withFileTypes: !0 }), u = n + COMMAND_FILE_EXTENSION, d = l.find((e) => e.isFile() && e.name === u);
366
+ let l = await c(i, { withFileTypes: !0 }), u = n + G, d = l.find((e) => e.isFile() && e.name === u);
367
367
  if (d) return s = t + 1, {
368
368
  kind: "resolved",
369
- filePath: join(i, d.name),
369
+ filePath: e(i, d.name),
370
370
  params: a,
371
371
  remainingTokens: r.slice(s),
372
372
  traversedDirs: o
373
373
  };
374
374
  let f = l.find((e) => e.isDirectory() && e.name === n);
375
375
  if (f) {
376
- i = join(i, f.name), o.push(i), s = t + 1;
376
+ i = e(i, f.name), o.push(i), s = t + 1;
377
377
  continue;
378
378
  }
379
379
  let p, m = l.find((e) => {
380
380
  if (!e.isDirectory()) return !1;
381
- let t = e.name.match(DYNAMIC_SEGMENT_PATTERN);
381
+ let t = e.name.match(W);
382
382
  return t === null ? !1 : (p = t[1], !0);
383
383
  });
384
384
  if (m && p !== void 0) {
385
- a[p] = n, i = join(i, m.name), o.push(i), s = t + 1;
385
+ a[p] = n, i = e(i, m.name), o.push(i), s = t + 1;
386
386
  continue;
387
387
  }
388
388
  break;
389
389
  }
390
- let l = join(i, INDEX_FILE_NAME + COMMAND_FILE_EXTENSION);
391
- if (await fileExists(l)) return {
390
+ let l = e(i, K + G);
391
+ if (await J(l)) return {
392
392
  kind: "resolved",
393
393
  filePath: l,
394
394
  params: a,
395
395
  remainingTokens: r.slice(s),
396
396
  traversedDirs: o
397
397
  };
398
- let u = await listAvailableEntries(i);
398
+ let u = await Y(i);
399
399
  return {
400
400
  kind: "unresolved",
401
401
  stoppedDir: i,
402
402
  availableEntries: u
403
403
  };
404
404
  }
405
- function wrapWithStringPreprocess(e) {
406
- return isBooleanSchema(e) ? z.preprocess((e) => typeof e == "string" ? e === "true" || e === "1" : e, e) : isNumberSchema(e) ? z.preprocess((e) => typeof e == "string" ? Number(e) : e, e) : e;
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;
407
407
  }
408
- function validateArgs(e, t) {
408
+ function ae(e, t) {
409
409
  let n = {};
410
410
  for (let [t, r] of Object.entries(e)) {
411
- let e = wrapWithStringPreprocess(r.type);
411
+ let e = ie(r.type);
412
412
  if (r.multiple === !0) {
413
- n[t] = z.array(e);
413
+ n[t] = o.array(e);
414
414
  continue;
415
415
  }
416
416
  n[t] = e;
417
417
  }
418
- return z.object(n).parse(t);
418
+ return o.object(n).parse(t);
419
419
  }
420
- var DEFAULT_COMMANDS_DIR = "commands", ARGV_SKIP = 2, EXIT_CODE_ERROR = 1;
421
- function buildParserConfig(e) {
422
- let t = /* @__PURE__ */ new Set(), n = /* @__PURE__ */ new Map();
423
- for (let [r, i] of Object.entries(e)) isBooleanSchema(i.type) && t.add(r), i.alias !== void 0 && n.set(i.alias, r);
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);
424
424
  return {
425
425
  booleanFlags: t,
426
426
  aliases: n
427
427
  };
428
428
  }
429
- function extractCommandPath(e, r) {
430
- return relative(resolve(e), r).replace(/\.ts$/, "").split("/").filter((e) => e !== "index" && !e.startsWith("["));
429
+ function $(e, r) {
430
+ return t(n(e), r).replace(/\.ts$/, "").split("/").filter((e) => e !== "index" && !e.startsWith("["));
431
431
  }
432
- function extractPartialCommandPath(e, r) {
433
- let i = relative(resolve(e), r);
432
+ function ce(e, r) {
433
+ let i = t(n(e), r);
434
434
  return i === "" || i === "." ? [] : i.split("/").filter((e) => !e.startsWith("["));
435
435
  }
436
- function extractFrameworkFlags(e) {
436
+ function le(e) {
437
437
  let t, n = [];
438
438
  for (let r = 0; r < e.length; r++) {
439
439
  let i = e[r];
@@ -454,42 +454,39 @@ function extractFrameworkFlags(e) {
454
454
  remainingTokens: n
455
455
  };
456
456
  }
457
- function createCLI(e) {
458
- let t = e.commandsDir ?? DEFAULT_COMMANDS_DIR, r = e.name, a = e.autoEnv?.prefix, o = e.defaultCommand;
457
+ function ue(e) {
458
+ let t = e.commandsDir ?? oe, r = e.name, a = e.autoEnv?.prefix, o = e.defaultCommand;
459
459
  async function s() {
460
- let { configPath: e, remainingTokens: s } = extractFrameworkFlags(process.argv.slice(ARGV_SKIP)), c = await resolveRoute(t, s);
461
- if (c.kind === "unresolved") {
462
- let e = resolve(c.stoppedDir) === resolve(t), i = s.length > 0 && !s[0].startsWith("-");
463
- if (e && o !== void 0 && !i) {
464
- if (s.includes("--help") || s.includes("-h")) {
465
- let e = await resolveRoute(t, [o]);
466
- if (e.kind === "unresolved") throw Error(`defaultCommand "${o}" does not match any command file`);
467
- let n = (await import(e.filePath)).default, i = n.args ?? {}, s = generateDefaultCommandHelp({
468
- programName: r,
469
- defaultCommandName: o,
470
- commandPath: extractCommandPath(t, e.filePath),
471
- description: n.description,
472
- argsDefs: Object.keys(i).length > 0 ? i : void 0,
473
- envPrefix: a,
474
- availableEntries: c.availableEntries
475
- });
476
- console.log(s);
477
- return;
478
- }
479
- let e = await resolveRoute(t, [o, ...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]);
480
464
  if (e.kind === "unresolved") throw Error(`defaultCommand "${o}" does not match any command file`);
481
- c = e;
482
- } else {
483
- let e = generateSubcommandHelp({
465
+ let n = (await import(e.filePath)).default, i = n.args ?? {}, s = O({
484
466
  programName: r,
485
- commandPath: extractPartialCommandPath(t, c.stoppedDir),
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,
486
472
  availableEntries: c.availableEntries
487
473
  });
488
- console.log(e);
474
+ console.log(s);
489
475
  return;
490
476
  }
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;
491
488
  }
492
- let l = (await import(c.filePath)).default, u = l.args ?? {}, d = extractCommandPath(t, c.filePath), f = generateHelp({
489
+ let l = (await import(c.filePath)).default, u = l.args ?? {}, d = $(t, c.filePath), f = T({
493
490
  programName: r,
494
491
  commandPath: d,
495
492
  description: l.description,
@@ -500,10 +497,10 @@ function createCLI(e) {
500
497
  console.log(f);
501
498
  return;
502
499
  }
503
- let p = buildParserConfig(u), m;
500
+ let p = Q(u), m;
504
501
  try {
505
- let t = parseTokens(c.remainingTokens, p), n = await loadMergedConfig(r, e);
506
- m = validateArgs(u, resolveValues({
502
+ let t = F(c.remainingTokens, p), n = await ee(r, e);
503
+ m = ae(u, U({
507
504
  argsDefs: u,
508
505
  parsedTokens: t,
509
506
  env: process.env,
@@ -512,19 +509,19 @@ function createCLI(e) {
512
509
  envPrefix: a
513
510
  }));
514
511
  } catch (e) {
515
- if (e instanceof ZodError) {
512
+ if (e instanceof i) {
516
513
  let t = e.issues.map((e) => `${e.path.join(".")}: ${e.message}`);
517
- console.error(generateValidationErrorHelp(f, t)), process.exit(EXIT_CODE_ERROR);
514
+ console.error(D(f, t)), process.exit(Z);
518
515
  }
519
- throw e instanceof Error && (console.error(generateValidationErrorHelp(f, [e.message])), process.exit(EXIT_CODE_ERROR)), e;
516
+ throw e instanceof Error && (console.error(D(f, [e.message])), process.exit(Z)), e;
520
517
  }
521
- let { extensions: h, middlewares: g } = await scanPluginsAlongPath(c.traversedDirs, { cliName: r }), _ = {
518
+ let { extensions: h, middlewares: g } = await V(c.traversedDirs, { cliName: r }), _ = {
522
519
  commandPath: d,
523
520
  params: c.params,
524
521
  args: m,
525
522
  extensions: h
526
523
  };
527
- await buildMiddlewareChain(g, async (e) => {
524
+ await B(g, async (e) => {
528
525
  await l.run({
529
526
  params: e.params,
530
527
  args: e.args,
@@ -534,7 +531,7 @@ function createCLI(e) {
534
531
  }
535
532
  return { run: s };
536
533
  }
537
- function defineCommand(e) {
534
+ function de(e) {
538
535
  return e;
539
536
  }
540
- export { createCLI, defineCommand, definePlugin };
537
+ export { ue as createCLI, de as defineCommand, R as definePlugin };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@miyaoka/fsss",
3
- "version": "0.3.0",
3
+ "version": "0.3.1",
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",
@@ -37,13 +37,13 @@
37
37
  },
38
38
  "devDependencies": {
39
39
  "@tsconfig/node24": "24.0.4",
40
- "@types/bun": "1.3.9",
41
- "oxfmt": "0.31.0",
42
- "oxlint": "1.46.0",
43
- "oxlint-tsgolint": "0.12.0",
40
+ "@types/bun": "1.3.10",
41
+ "oxfmt": "0.36.0",
42
+ "oxlint": "1.51.0",
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.13"
46
+ "vite": "8.0.0-beta.16"
47
47
  },
48
48
  "scripts": {
49
49
  "build": "vite build",