@miyaoka/fsss 0.3.1 → 0.3.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.
- package/dist/codegen.js +2 -0
- package/dist/help.d.ts.map +1 -1
- package/dist/index.js +164 -123
- package/dist/router.d.ts.map +1 -1
- package/package.json +4 -4
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.map
CHANGED
|
@@ -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;
|
|
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;AAgFD,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"}
|
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
|
|
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,45 +52,60 @@ async function ee(e, t) {
|
|
|
51
52
|
}
|
|
52
53
|
return r;
|
|
53
54
|
}
|
|
54
|
-
|
|
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
|
|
64
|
+
function v(e, t) {
|
|
62
65
|
return [...e, t].join(".");
|
|
63
66
|
}
|
|
64
|
-
|
|
67
|
+
//#endregion
|
|
68
|
+
//#region src/zod-utils.ts
|
|
69
|
+
function y(e) {
|
|
65
70
|
return e instanceof r;
|
|
66
71
|
}
|
|
67
|
-
function
|
|
72
|
+
function b(e) {
|
|
68
73
|
return e instanceof a;
|
|
69
74
|
}
|
|
70
|
-
|
|
71
|
-
|
|
75
|
+
//#endregion
|
|
76
|
+
//#region src/help.ts
|
|
77
|
+
var x = " ", S = 2;
|
|
78
|
+
function C(e, t, n, r) {
|
|
72
79
|
if (e.env !== void 0) return e.env;
|
|
73
|
-
if (t !== void 0) return
|
|
80
|
+
if (t !== void 0) return _(t, n, r);
|
|
81
|
+
}
|
|
82
|
+
function w(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
|
|
91
|
+
function ee(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: ${
|
|
93
|
+
return t !== void 0 && n.push(`env: ${t}`), "default" in e && e.default !== void 0 && n.push(`default: ${w(e.default)}`), n.length === 0 ? "" : ` (${n.join(", ")})`;
|
|
78
94
|
}
|
|
79
|
-
function
|
|
80
|
-
let i =
|
|
95
|
+
function T(e, t, n, r) {
|
|
96
|
+
let i = y(t.type) ? "" : ` <${e}>`, a = `${t.alias === void 0 ? " " : `-${t.alias}, `}--${e}${i}`, o = C(t, n, r, e);
|
|
81
97
|
return {
|
|
82
98
|
left: a,
|
|
83
|
-
right: `${t.description}${
|
|
99
|
+
right: `${t.description}${ee(t, o)}`
|
|
84
100
|
};
|
|
85
101
|
}
|
|
86
|
-
function
|
|
102
|
+
function E() {
|
|
87
103
|
return {
|
|
88
104
|
left: "-h, --help",
|
|
89
105
|
right: "ヘルプを表示する"
|
|
90
106
|
};
|
|
91
107
|
}
|
|
92
|
-
function
|
|
108
|
+
function D(e) {
|
|
93
109
|
let { programName: t, commandPath: n, description: r, argsDefs: i, envPrefix: a } = e, o = [];
|
|
94
110
|
r !== void 0 && (o.push(r), o.push(""));
|
|
95
111
|
let s = [t, ...n];
|
|
@@ -105,51 +121,51 @@ function T(e) {
|
|
|
105
121
|
let c = Object.entries(i).filter(([, e]) => e.positional !== !0);
|
|
106
122
|
if (c.length === 0) {
|
|
107
123
|
o.push("Options:");
|
|
108
|
-
let e =
|
|
109
|
-
return o.push(`${
|
|
124
|
+
let e = E();
|
|
125
|
+
return o.push(`${x}${e.left} ${e.right}`), o.join("\n");
|
|
110
126
|
}
|
|
111
127
|
o.push("Options:");
|
|
112
|
-
let l = c.map(([e, t]) =>
|
|
113
|
-
l.push(
|
|
128
|
+
let l = c.map(([e, t]) => T(e, t, a, n));
|
|
129
|
+
l.push(E());
|
|
114
130
|
let u = Math.max(...l.map((e) => e.left.length));
|
|
115
131
|
for (let e of l) {
|
|
116
|
-
let t = " ".repeat(u - e.left.length +
|
|
117
|
-
o.push(`${
|
|
132
|
+
let t = " ".repeat(u - e.left.length + S);
|
|
133
|
+
o.push(`${x}${e.left}${t}${e.right}`);
|
|
118
134
|
}
|
|
119
135
|
return o.join("\n");
|
|
120
136
|
}
|
|
121
|
-
function
|
|
137
|
+
function te(e) {
|
|
122
138
|
let { programName: t, commandPath: n, availableEntries: r } = e, i = [], a = [t, ...n].join(" ");
|
|
123
139
|
if (i.push(`Usage: ${a} <command>`), i.push(""), r.length === 0) return i.push("No available commands."), i.join("\n");
|
|
124
140
|
i.push("Available commands:");
|
|
125
141
|
for (let e of r) {
|
|
126
142
|
if (e.isDynamic) {
|
|
127
|
-
i.push(`${
|
|
143
|
+
i.push(`${x}<${e.paramName}>`);
|
|
128
144
|
continue;
|
|
129
145
|
}
|
|
130
|
-
i.push(`${
|
|
146
|
+
i.push(`${x}${e.name}`);
|
|
131
147
|
}
|
|
132
148
|
return i.join("\n");
|
|
133
149
|
}
|
|
134
|
-
function
|
|
150
|
+
function O(e, t) {
|
|
135
151
|
return [
|
|
136
152
|
`Error: ${t.join(", ")}`,
|
|
137
153
|
"",
|
|
138
154
|
e
|
|
139
155
|
].join("\n");
|
|
140
156
|
}
|
|
141
|
-
function
|
|
157
|
+
function k(e) {
|
|
142
158
|
let { programName: t, defaultCommandName: n, commandPath: r, description: i, argsDefs: a, envPrefix: o, availableEntries: s } = e, c = [];
|
|
143
159
|
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
160
|
let e = Object.entries(a).filter(([, e]) => e.positional !== !0);
|
|
145
161
|
if (e.length > 0) {
|
|
146
162
|
c.push("Options:");
|
|
147
|
-
let t = e.map(([e, t]) =>
|
|
148
|
-
t.push(
|
|
163
|
+
let t = e.map(([e, t]) => T(e, t, o, r));
|
|
164
|
+
t.push(E());
|
|
149
165
|
let n = Math.max(...t.map((e) => e.left.length));
|
|
150
166
|
for (let e of t) {
|
|
151
|
-
let t = " ".repeat(n - e.left.length +
|
|
152
|
-
c.push(`${
|
|
167
|
+
let t = " ".repeat(n - e.left.length + S);
|
|
168
|
+
c.push(`${x}${e.left}${t}${e.right}`);
|
|
153
169
|
}
|
|
154
170
|
c.push("");
|
|
155
171
|
}
|
|
@@ -158,17 +174,19 @@ function O(e) {
|
|
|
158
174
|
c.push("Available commands:");
|
|
159
175
|
for (let e of s) {
|
|
160
176
|
if (e.isDynamic) {
|
|
161
|
-
c.push(`${
|
|
177
|
+
c.push(`${x}<${e.paramName}>`);
|
|
162
178
|
continue;
|
|
163
179
|
}
|
|
164
180
|
let t = e.name === n ? " (default)" : "";
|
|
165
|
-
c.push(`${
|
|
181
|
+
c.push(`${x}${e.name}${t}`);
|
|
166
182
|
}
|
|
167
183
|
}
|
|
168
184
|
return c.join("\n");
|
|
169
185
|
}
|
|
170
|
-
|
|
171
|
-
|
|
186
|
+
//#endregion
|
|
187
|
+
//#region src/parser.ts
|
|
188
|
+
var A = "--", j = "-", ne = "--", re = "--no-", M = "true", N = "false";
|
|
189
|
+
function P(e, t, n) {
|
|
172
190
|
let r = e.get(t);
|
|
173
191
|
if (r) {
|
|
174
192
|
r.push(n);
|
|
@@ -176,11 +194,11 @@ function N(e, t, n) {
|
|
|
176
194
|
}
|
|
177
195
|
e.set(t, [n]);
|
|
178
196
|
}
|
|
179
|
-
function P(e, t) {
|
|
180
|
-
return t + 1 >= e.length ? !1 : !e[t + 1].startsWith(A);
|
|
181
|
-
}
|
|
182
197
|
function F(e, t) {
|
|
183
|
-
|
|
198
|
+
return t + 1 >= e.length ? !1 : !e[t + 1].startsWith(j);
|
|
199
|
+
}
|
|
200
|
+
function I(e, t) {
|
|
201
|
+
let n = /* @__PURE__ */ new Map(), r = [], i = [], a = 0;
|
|
184
202
|
for (; a < e.length;) {
|
|
185
203
|
let o = e[a];
|
|
186
204
|
if (o === ne) {
|
|
@@ -188,39 +206,39 @@ function F(e, t) {
|
|
|
188
206
|
break;
|
|
189
207
|
}
|
|
190
208
|
if (o.startsWith(re)) {
|
|
191
|
-
|
|
209
|
+
P(n, o.slice(5), N), a++;
|
|
192
210
|
continue;
|
|
193
211
|
}
|
|
194
|
-
if (o.startsWith(
|
|
212
|
+
if (o.startsWith(A) && o.includes("=")) {
|
|
195
213
|
let e = o.indexOf("=");
|
|
196
|
-
|
|
214
|
+
P(n, o.slice(2, e), o.slice(e + 1)), a++;
|
|
197
215
|
continue;
|
|
198
216
|
}
|
|
199
|
-
if (o.startsWith(
|
|
217
|
+
if (o.startsWith(A)) {
|
|
200
218
|
let r = o.slice(2);
|
|
201
219
|
if (t.booleanFlags.has(r)) {
|
|
202
|
-
|
|
220
|
+
P(n, r, M), a++;
|
|
203
221
|
continue;
|
|
204
222
|
}
|
|
205
|
-
if (
|
|
206
|
-
|
|
223
|
+
if (F(e, a)) {
|
|
224
|
+
P(n, r, e[a + 1]), a += 2;
|
|
207
225
|
continue;
|
|
208
226
|
}
|
|
209
227
|
throw Error(`Flag --${r} requires a value`);
|
|
210
228
|
}
|
|
211
|
-
if (o.startsWith(
|
|
229
|
+
if (o.startsWith(j) && !o.startsWith(A) && o.includes("=")) {
|
|
212
230
|
let e = o.indexOf("="), r = o.slice(1, e), i = o.slice(e + 1);
|
|
213
|
-
|
|
231
|
+
P(n, t.aliases.get(r) ?? r, i), a++;
|
|
214
232
|
continue;
|
|
215
233
|
}
|
|
216
|
-
if (o.startsWith(
|
|
234
|
+
if (o.startsWith(j) && !o.startsWith(A)) {
|
|
217
235
|
let r = o.slice(1), i = t.aliases.get(r) ?? r;
|
|
218
236
|
if (t.booleanFlags.has(i)) {
|
|
219
|
-
|
|
237
|
+
P(n, i, M), a++;
|
|
220
238
|
continue;
|
|
221
239
|
}
|
|
222
|
-
if (
|
|
223
|
-
|
|
240
|
+
if (F(e, a)) {
|
|
241
|
+
P(n, i, e[a + 1]), a += 2;
|
|
224
242
|
continue;
|
|
225
243
|
}
|
|
226
244
|
throw Error(`Flag -${r} requires a value`);
|
|
@@ -233,11 +251,13 @@ function F(e, t) {
|
|
|
233
251
|
doubleDashArgs: i
|
|
234
252
|
};
|
|
235
253
|
}
|
|
236
|
-
|
|
237
|
-
|
|
254
|
+
//#endregion
|
|
255
|
+
//#region src/plugin.ts
|
|
256
|
+
var L = "_plugins", R = ".ts";
|
|
257
|
+
function z(e) {
|
|
238
258
|
return e;
|
|
239
259
|
}
|
|
240
|
-
async function
|
|
260
|
+
async function B(e, t) {
|
|
241
261
|
let n = {}, r = [];
|
|
242
262
|
for (let i of e) {
|
|
243
263
|
let e = await i(t);
|
|
@@ -248,7 +268,7 @@ async function z(e, t) {
|
|
|
248
268
|
middlewares: r
|
|
249
269
|
};
|
|
250
270
|
}
|
|
251
|
-
function
|
|
271
|
+
function V(e, t) {
|
|
252
272
|
let n = t;
|
|
253
273
|
for (let t = e.length - 1; t >= 0; t--) {
|
|
254
274
|
let r = e[t], i = n;
|
|
@@ -256,29 +276,31 @@ function B(e, t) {
|
|
|
256
276
|
}
|
|
257
277
|
return n;
|
|
258
278
|
}
|
|
259
|
-
async function
|
|
279
|
+
async function H(t, n) {
|
|
260
280
|
let r = [];
|
|
261
281
|
for (let n of t) {
|
|
262
|
-
let t = e(n,
|
|
282
|
+
let t = e(n, L), i;
|
|
263
283
|
try {
|
|
264
284
|
i = await c(t, { withFileTypes: !0 });
|
|
265
285
|
} catch {
|
|
266
286
|
continue;
|
|
267
287
|
}
|
|
268
|
-
let a = i.filter((e) => e.isFile() && e.name.endsWith(
|
|
288
|
+
let a = i.filter((e) => e.isFile() && e.name.endsWith(R)).sort((e, t) => e.name.localeCompare(t.name));
|
|
269
289
|
for (let n of a) {
|
|
270
290
|
let i = e(t, n.name), a = (await import(i)).default;
|
|
271
291
|
if (a === void 0) throw Error(`Plugin file ${i} does not have a default export`);
|
|
272
292
|
r.push(a);
|
|
273
293
|
}
|
|
274
294
|
}
|
|
275
|
-
return
|
|
295
|
+
return B(r, n);
|
|
276
296
|
}
|
|
277
|
-
|
|
297
|
+
//#endregion
|
|
298
|
+
//#region src/resolver.ts
|
|
299
|
+
function U(e, t, n, r) {
|
|
278
300
|
if (e !== void 0) return e;
|
|
279
|
-
if (t !== void 0) return
|
|
301
|
+
if (t !== void 0) return _(t, n, r);
|
|
280
302
|
}
|
|
281
|
-
function
|
|
303
|
+
function W(e) {
|
|
282
304
|
let { argsDefs: t, parsedTokens: n, env: r, config: i, commandPath: a, envPrefix: o } = e, s = {}, c = 0;
|
|
283
305
|
for (let [e, l] of Object.entries(t)) {
|
|
284
306
|
let t = n.flags.get(e);
|
|
@@ -294,7 +316,7 @@ function U(e) {
|
|
|
294
316
|
s[e] = n.positionals[c], c++;
|
|
295
317
|
continue;
|
|
296
318
|
}
|
|
297
|
-
let u =
|
|
319
|
+
let u = U(l.env, o, a, e);
|
|
298
320
|
if (u !== void 0) {
|
|
299
321
|
let t = r[u];
|
|
300
322
|
if (t !== void 0) {
|
|
@@ -303,7 +325,7 @@ function U(e) {
|
|
|
303
325
|
}
|
|
304
326
|
}
|
|
305
327
|
if (i !== void 0) {
|
|
306
|
-
let t = f(i, l.config ??
|
|
328
|
+
let t = f(i, l.config ?? v(a, e));
|
|
307
329
|
if (t !== void 0) {
|
|
308
330
|
s[e] = t;
|
|
309
331
|
continue;
|
|
@@ -316,29 +338,39 @@ function U(e) {
|
|
|
316
338
|
}
|
|
317
339
|
return s;
|
|
318
340
|
}
|
|
319
|
-
|
|
320
|
-
|
|
341
|
+
//#endregion
|
|
342
|
+
//#region src/router.ts
|
|
343
|
+
var G = /^\[(.+)]$/, K = [".ts", ".js"], q = "index", J = "_";
|
|
344
|
+
function Y(e) {
|
|
345
|
+
return K.find((t) => e.endsWith(t));
|
|
346
|
+
}
|
|
347
|
+
function ie(e, t) {
|
|
348
|
+
return e.slice(0, -t.length);
|
|
349
|
+
}
|
|
350
|
+
async function ae(e) {
|
|
321
351
|
try {
|
|
322
352
|
return (await l(e)).isFile();
|
|
323
353
|
} catch {
|
|
324
354
|
return !1;
|
|
325
355
|
}
|
|
326
356
|
}
|
|
327
|
-
async function
|
|
357
|
+
async function oe(e) {
|
|
328
358
|
try {
|
|
329
|
-
let t = await c(e, { withFileTypes: !0 }), n = [];
|
|
330
|
-
for (let e of t)
|
|
331
|
-
if (e.
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
359
|
+
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();
|
|
360
|
+
for (let e of t) {
|
|
361
|
+
if (e.name.startsWith(J)) continue;
|
|
362
|
+
let t = e.isFile() ? Y(e.name) : void 0;
|
|
363
|
+
if (t !== void 0) {
|
|
364
|
+
let i = ie(e.name, t);
|
|
365
|
+
if (i === q || r.has(i)) continue;
|
|
366
|
+
r.add(i), n.push({
|
|
367
|
+
name: i,
|
|
336
368
|
isDynamic: !1
|
|
337
369
|
});
|
|
338
370
|
continue;
|
|
339
371
|
}
|
|
340
372
|
if (e.isDirectory()) {
|
|
341
|
-
let t = e.name.match(
|
|
373
|
+
let t = e.name.match(G);
|
|
342
374
|
if (t !== null) {
|
|
343
375
|
n.push({
|
|
344
376
|
name: e.name,
|
|
@@ -363,52 +395,56 @@ async function X(t, r) {
|
|
|
363
395
|
for (let t = 0; t < r.length; t++) {
|
|
364
396
|
let n = r[t];
|
|
365
397
|
if (n.startsWith("-")) break;
|
|
366
|
-
let l = await c(i, { withFileTypes: !0 }), u =
|
|
367
|
-
if (
|
|
398
|
+
let l = await c(i, { withFileTypes: !0 }), u = K.reduce((e, t) => e ?? l.find((e) => e.isFile() && e.name === n + t), void 0);
|
|
399
|
+
if (u) return s = t + 1, {
|
|
368
400
|
kind: "resolved",
|
|
369
|
-
filePath: e(i,
|
|
401
|
+
filePath: e(i, u.name),
|
|
370
402
|
params: a,
|
|
371
403
|
remainingTokens: r.slice(s),
|
|
372
404
|
traversedDirs: o
|
|
373
405
|
};
|
|
374
|
-
let
|
|
375
|
-
if (
|
|
376
|
-
i = e(i,
|
|
406
|
+
let d = l.find((e) => e.isDirectory() && e.name === n);
|
|
407
|
+
if (d) {
|
|
408
|
+
i = e(i, d.name), o.push(i), s = t + 1;
|
|
377
409
|
continue;
|
|
378
410
|
}
|
|
379
|
-
let
|
|
411
|
+
let f, p = l.find((e) => {
|
|
380
412
|
if (!e.isDirectory()) return !1;
|
|
381
|
-
let t = e.name.match(
|
|
382
|
-
return t === null ? !1 : (
|
|
413
|
+
let t = e.name.match(G);
|
|
414
|
+
return t === null ? !1 : (f = t[1], !0);
|
|
383
415
|
});
|
|
384
|
-
if (
|
|
385
|
-
a[
|
|
416
|
+
if (p && f !== void 0) {
|
|
417
|
+
a[f] = n, i = e(i, p.name), o.push(i), s = t + 1;
|
|
386
418
|
continue;
|
|
387
419
|
}
|
|
388
420
|
break;
|
|
389
421
|
}
|
|
390
|
-
let
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
422
|
+
for (let t of K) {
|
|
423
|
+
let n = e(i, q + t);
|
|
424
|
+
if (await ae(n)) return {
|
|
425
|
+
kind: "resolved",
|
|
426
|
+
filePath: n,
|
|
427
|
+
params: a,
|
|
428
|
+
remainingTokens: r.slice(s),
|
|
429
|
+
traversedDirs: o
|
|
430
|
+
};
|
|
431
|
+
}
|
|
432
|
+
let l = await oe(i);
|
|
399
433
|
return {
|
|
400
434
|
kind: "unresolved",
|
|
401
435
|
stoppedDir: i,
|
|
402
|
-
availableEntries:
|
|
436
|
+
availableEntries: l
|
|
403
437
|
};
|
|
404
438
|
}
|
|
405
|
-
|
|
406
|
-
|
|
439
|
+
//#endregion
|
|
440
|
+
//#region src/validator.ts
|
|
441
|
+
function se(e) {
|
|
442
|
+
return y(e) ? o.preprocess((e) => typeof e == "string" ? e === "true" || e === "1" : e, e) : b(e) ? o.preprocess((e) => typeof e == "string" ? Number(e) : e, e) : e;
|
|
407
443
|
}
|
|
408
|
-
function
|
|
444
|
+
function ce(e, t) {
|
|
409
445
|
let n = {};
|
|
410
446
|
for (let [t, r] of Object.entries(e)) {
|
|
411
|
-
let e =
|
|
447
|
+
let e = se(r.type);
|
|
412
448
|
if (r.multiple === !0) {
|
|
413
449
|
n[t] = o.array(e);
|
|
414
450
|
continue;
|
|
@@ -417,10 +453,12 @@ function ae(e, t) {
|
|
|
417
453
|
}
|
|
418
454
|
return o.object(n).parse(t);
|
|
419
455
|
}
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
456
|
+
//#endregion
|
|
457
|
+
//#region src/cli.ts
|
|
458
|
+
var le = "commands", Z = 2, Q = 1;
|
|
459
|
+
function ue(e) {
|
|
460
|
+
let t = /* @__PURE__ */ new Set(), n = /* @__PURE__ */ new Map();
|
|
461
|
+
for (let [r, i] of Object.entries(e)) y(i.type) && t.add(r), i.alias !== void 0 && n.set(i.alias, r);
|
|
424
462
|
return {
|
|
425
463
|
booleanFlags: t,
|
|
426
464
|
aliases: n
|
|
@@ -429,11 +467,11 @@ function Q(e) {
|
|
|
429
467
|
function $(e, r) {
|
|
430
468
|
return t(n(e), r).replace(/\.ts$/, "").split("/").filter((e) => e !== "index" && !e.startsWith("["));
|
|
431
469
|
}
|
|
432
|
-
function
|
|
470
|
+
function de(e, r) {
|
|
433
471
|
let i = t(n(e), r);
|
|
434
472
|
return i === "" || i === "." ? [] : i.split("/").filter((e) => !e.startsWith("["));
|
|
435
473
|
}
|
|
436
|
-
function
|
|
474
|
+
function fe(e) {
|
|
437
475
|
let t, n = [];
|
|
438
476
|
for (let r = 0; r < e.length; r++) {
|
|
439
477
|
let i = e[r];
|
|
@@ -454,15 +492,15 @@ function le(e) {
|
|
|
454
492
|
remainingTokens: n
|
|
455
493
|
};
|
|
456
494
|
}
|
|
457
|
-
function
|
|
458
|
-
let t = e.commandsDir ??
|
|
495
|
+
function pe(e) {
|
|
496
|
+
let t = e.commandsDir ?? le, r = e.name, a = e.autoEnv?.prefix, o = e.defaultCommand;
|
|
459
497
|
async function s() {
|
|
460
|
-
let { configPath: e, remainingTokens: s } =
|
|
498
|
+
let { configPath: e, remainingTokens: s } = fe(process.argv.slice(Z)), c = await X(t, s);
|
|
461
499
|
if (c.kind === "unresolved") if (n(c.stoppedDir) === n(t) && o !== void 0) {
|
|
462
500
|
if (s.includes("--help") || s.includes("-h")) {
|
|
463
501
|
let e = await X(t, [o]);
|
|
464
502
|
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 =
|
|
503
|
+
let n = (await import(e.filePath)).default, i = n.args ?? {}, s = k({
|
|
466
504
|
programName: r,
|
|
467
505
|
defaultCommandName: o,
|
|
468
506
|
commandPath: $(t, e.filePath),
|
|
@@ -478,15 +516,15 @@ function ue(e) {
|
|
|
478
516
|
if (e.kind === "unresolved") throw Error(`defaultCommand "${o}" does not match any command file`);
|
|
479
517
|
c = e;
|
|
480
518
|
} else {
|
|
481
|
-
let e =
|
|
519
|
+
let e = te({
|
|
482
520
|
programName: r,
|
|
483
|
-
commandPath:
|
|
521
|
+
commandPath: de(t, c.stoppedDir),
|
|
484
522
|
availableEntries: c.availableEntries
|
|
485
523
|
});
|
|
486
524
|
console.log(e);
|
|
487
525
|
return;
|
|
488
526
|
}
|
|
489
|
-
let l = (await import(c.filePath)).default, u = l.args ?? {}, d = $(t, c.filePath), f =
|
|
527
|
+
let l = (await import(c.filePath)).default, u = l.args ?? {}, d = $(t, c.filePath), f = D({
|
|
490
528
|
programName: r,
|
|
491
529
|
commandPath: d,
|
|
492
530
|
description: l.description,
|
|
@@ -497,10 +535,10 @@ function ue(e) {
|
|
|
497
535
|
console.log(f);
|
|
498
536
|
return;
|
|
499
537
|
}
|
|
500
|
-
let p =
|
|
538
|
+
let p = ue(u), m;
|
|
501
539
|
try {
|
|
502
|
-
let t =
|
|
503
|
-
m =
|
|
540
|
+
let t = I(c.remainingTokens, p), n = await g(r, e);
|
|
541
|
+
m = ce(u, W({
|
|
504
542
|
argsDefs: u,
|
|
505
543
|
parsedTokens: t,
|
|
506
544
|
env: process.env,
|
|
@@ -511,27 +549,30 @@ function ue(e) {
|
|
|
511
549
|
} catch (e) {
|
|
512
550
|
if (e instanceof i) {
|
|
513
551
|
let t = e.issues.map((e) => `${e.path.join(".")}: ${e.message}`);
|
|
514
|
-
console.error(
|
|
552
|
+
console.error(O(f, t)), process.exit(Q);
|
|
515
553
|
}
|
|
516
|
-
throw e instanceof Error && (console.error(
|
|
554
|
+
throw e instanceof Error && (console.error(O(f, [e.message])), process.exit(Q)), e;
|
|
517
555
|
}
|
|
518
|
-
let { extensions: h, middlewares:
|
|
556
|
+
let { extensions: h, middlewares: _ } = await H(c.traversedDirs, { cliName: r }), v = {
|
|
519
557
|
commandPath: d,
|
|
520
558
|
params: c.params,
|
|
521
559
|
args: m,
|
|
522
560
|
extensions: h
|
|
523
561
|
};
|
|
524
|
-
await
|
|
562
|
+
await V(_, async (e) => {
|
|
525
563
|
await l.run({
|
|
526
564
|
params: e.params,
|
|
527
565
|
args: e.args,
|
|
528
566
|
extensions: e.extensions
|
|
529
567
|
});
|
|
530
|
-
})(
|
|
568
|
+
})(v);
|
|
531
569
|
}
|
|
532
570
|
return { run: s };
|
|
533
571
|
}
|
|
534
|
-
|
|
572
|
+
//#endregion
|
|
573
|
+
//#region src/types.ts
|
|
574
|
+
function me(e) {
|
|
535
575
|
return e;
|
|
536
576
|
}
|
|
537
|
-
|
|
577
|
+
//#endregion
|
|
578
|
+
export { pe as createCLI, me as defineCommand, z as definePlugin };
|
package/dist/router.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../src/router.ts"],"names":[],"mappings":"
|
|
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.
|
|
3
|
+
"version": "0.3.2",
|
|
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.
|
|
42
|
-
"oxlint": "1.
|
|
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.
|
|
46
|
+
"vite": "8.0.0-beta.18"
|
|
47
47
|
},
|
|
48
48
|
"scripts": {
|
|
49
49
|
"build": "vite build",
|