@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 +1 -1
- package/dist/codegen.js +22 -22
- package/dist/index.js +155 -158
- package/package.json +6 -6
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,
|
|
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
|
|
6
|
-
async function
|
|
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
|
|
9
|
+
let a = await i(t, { withFileTypes: !0 });
|
|
10
10
|
for (let o of a) {
|
|
11
11
|
if (!o.isDirectory()) continue;
|
|
12
|
-
let a =
|
|
13
|
-
if (o.name ===
|
|
14
|
-
let t = await
|
|
15
|
-
for (let r of t) r.isFile() && r.name.endsWith(
|
|
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
|
|
24
|
-
let t = await
|
|
25
|
-
for (; i !== null;) n.push(i[1]), i =
|
|
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
|
|
29
|
-
let o = await
|
|
28
|
+
async function f(r, i) {
|
|
29
|
+
let o = await u(r), s = [];
|
|
30
30
|
for (let e of o) {
|
|
31
|
-
let n = await
|
|
31
|
+
let n = await d(e);
|
|
32
32
|
if (n.length === 0) continue;
|
|
33
|
-
let 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
|
|
50
|
-
let l =
|
|
51
|
-
await
|
|
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 } =
|
|
53
|
+
var { values: p } = o({ options: {
|
|
54
54
|
commandsDir: { type: "string" },
|
|
55
55
|
outDir: { type: "string" }
|
|
56
56
|
} });
|
|
57
|
-
(
|
|
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
|
|
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
|
|
8
|
+
function f(e, t) {
|
|
9
9
|
let n = t.split("."), r = e;
|
|
10
10
|
for (let e of n) {
|
|
11
|
-
if (!
|
|
11
|
+
if (!d(r)) return;
|
|
12
12
|
r = r[e];
|
|
13
13
|
}
|
|
14
14
|
return r;
|
|
15
15
|
}
|
|
16
|
-
async function
|
|
16
|
+
async function p(e) {
|
|
17
17
|
try {
|
|
18
|
-
let t = await
|
|
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
|
|
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 (
|
|
29
|
-
n[e] =
|
|
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
|
|
36
|
+
function h(t, n) {
|
|
37
37
|
let r = [];
|
|
38
|
-
return r.push(
|
|
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
|
|
41
|
-
let n =
|
|
40
|
+
async function ee(e, t) {
|
|
41
|
+
let n = h(e, t), r;
|
|
42
42
|
for (let e of n) {
|
|
43
|
-
let t = await
|
|
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 =
|
|
49
|
+
r = m(r, t);
|
|
50
50
|
}
|
|
51
51
|
}
|
|
52
52
|
return r;
|
|
53
53
|
}
|
|
54
|
-
function
|
|
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
|
|
61
|
+
function _(e, t) {
|
|
62
62
|
return [...e, t].join(".");
|
|
63
63
|
}
|
|
64
|
-
function
|
|
65
|
-
return e instanceof
|
|
64
|
+
function v(e) {
|
|
65
|
+
return e instanceof r;
|
|
66
66
|
}
|
|
67
|
-
function
|
|
68
|
-
return e instanceof
|
|
67
|
+
function te(e) {
|
|
68
|
+
return e instanceof a;
|
|
69
69
|
}
|
|
70
|
-
var
|
|
71
|
-
function
|
|
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
|
|
73
|
+
if (t !== void 0) return g(t, n, r);
|
|
74
74
|
}
|
|
75
|
-
function
|
|
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
|
|
80
|
-
let i =
|
|
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}${
|
|
83
|
+
right: `${t.description}${S(t, o)}`
|
|
84
84
|
};
|
|
85
85
|
}
|
|
86
|
-
function
|
|
86
|
+
function w() {
|
|
87
87
|
return {
|
|
88
88
|
left: "-h, --help",
|
|
89
89
|
right: "ヘルプを表示する"
|
|
90
90
|
};
|
|
91
91
|
}
|
|
92
|
-
function
|
|
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 =
|
|
109
|
-
return o.push(`${
|
|
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]) =>
|
|
113
|
-
l.push(
|
|
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 +
|
|
117
|
-
o.push(`${
|
|
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
|
|
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(`${
|
|
127
|
+
i.push(`${y}<${e.paramName}>`);
|
|
128
128
|
continue;
|
|
129
129
|
}
|
|
130
|
-
i.push(`${
|
|
130
|
+
i.push(`${y}${e.name}`);
|
|
131
131
|
}
|
|
132
132
|
return i.join("\n");
|
|
133
133
|
}
|
|
134
|
-
function
|
|
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
|
|
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]) =>
|
|
148
|
-
t.push(
|
|
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 +
|
|
152
|
-
c.push(`${
|
|
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(`${
|
|
161
|
+
c.push(`${y}<${e.paramName}>`);
|
|
162
162
|
continue;
|
|
163
163
|
}
|
|
164
164
|
let t = e.name === n ? " (default)" : "";
|
|
165
|
-
c.push(`${
|
|
165
|
+
c.push(`${y}${e.name}${t}`);
|
|
166
166
|
}
|
|
167
167
|
}
|
|
168
168
|
return c.join("\n");
|
|
169
169
|
}
|
|
170
|
-
var
|
|
171
|
-
function
|
|
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
|
|
180
|
-
return t + 1 >= e.length ? !1 : !e[t + 1].startsWith(
|
|
179
|
+
function P(e, t) {
|
|
180
|
+
return t + 1 >= e.length ? !1 : !e[t + 1].startsWith(A);
|
|
181
181
|
}
|
|
182
|
-
function
|
|
183
|
-
let n =
|
|
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 ===
|
|
186
|
+
if (o === ne) {
|
|
187
187
|
i = e.slice(a + 1);
|
|
188
188
|
break;
|
|
189
189
|
}
|
|
190
|
-
if (o.startsWith(
|
|
191
|
-
|
|
190
|
+
if (o.startsWith(re)) {
|
|
191
|
+
N(n, o.slice(5), M), a++;
|
|
192
192
|
continue;
|
|
193
193
|
}
|
|
194
|
-
if (o.startsWith(
|
|
194
|
+
if (o.startsWith(k) && o.includes("=")) {
|
|
195
195
|
let e = o.indexOf("=");
|
|
196
|
-
|
|
196
|
+
N(n, o.slice(2, e), o.slice(e + 1)), a++;
|
|
197
197
|
continue;
|
|
198
198
|
}
|
|
199
|
-
if (o.startsWith(
|
|
199
|
+
if (o.startsWith(k)) {
|
|
200
200
|
let r = o.slice(2);
|
|
201
201
|
if (t.booleanFlags.has(r)) {
|
|
202
|
-
|
|
202
|
+
N(n, r, j), a++;
|
|
203
203
|
continue;
|
|
204
204
|
}
|
|
205
|
-
if (
|
|
206
|
-
|
|
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(
|
|
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
|
-
|
|
213
|
+
N(n, t.aliases.get(r) ?? r, i), a++;
|
|
214
214
|
continue;
|
|
215
215
|
}
|
|
216
|
-
if (o.startsWith(
|
|
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
|
-
|
|
219
|
+
N(n, i, j), a++;
|
|
220
220
|
continue;
|
|
221
221
|
}
|
|
222
|
-
if (
|
|
223
|
-
|
|
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
|
|
237
|
-
function
|
|
236
|
+
var I = "_plugins", L = ".ts";
|
|
237
|
+
function R(e) {
|
|
238
238
|
return e;
|
|
239
239
|
}
|
|
240
|
-
async function
|
|
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
|
|
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
|
|
259
|
+
async function V(t, n) {
|
|
260
260
|
let r = [];
|
|
261
261
|
for (let n of t) {
|
|
262
|
-
let t =
|
|
262
|
+
let t = e(n, I), i;
|
|
263
263
|
try {
|
|
264
|
-
i = await
|
|
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(
|
|
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 =
|
|
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
|
|
275
|
+
return z(r, n);
|
|
276
276
|
}
|
|
277
|
-
function
|
|
277
|
+
function H(e, t, n, r) {
|
|
278
278
|
if (e !== void 0) return e;
|
|
279
|
-
if (t !== void 0) return
|
|
279
|
+
if (t !== void 0) return g(t, n, r);
|
|
280
280
|
}
|
|
281
|
-
function
|
|
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 =
|
|
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 =
|
|
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
|
|
320
|
-
async function
|
|
319
|
+
var W = /^\[(.+)]$/, G = ".ts", K = "index", q = "_";
|
|
320
|
+
async function J(e) {
|
|
321
321
|
try {
|
|
322
|
-
return (await
|
|
322
|
+
return (await l(e)).isFile();
|
|
323
323
|
} catch {
|
|
324
324
|
return !1;
|
|
325
325
|
}
|
|
326
326
|
}
|
|
327
|
-
async function
|
|
327
|
+
async function Y(e) {
|
|
328
328
|
try {
|
|
329
|
-
let t = await
|
|
330
|
-
for (let e of t) if (!e.name.startsWith(
|
|
331
|
-
if (e.isFile() && e.name.endsWith(
|
|
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 ===
|
|
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(
|
|
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
|
|
362
|
-
let i =
|
|
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
|
|
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:
|
|
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 =
|
|
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(
|
|
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 =
|
|
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 =
|
|
391
|
-
if (await
|
|
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
|
|
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
|
|
406
|
-
return
|
|
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
|
|
408
|
+
function ae(e, t) {
|
|
409
409
|
let n = {};
|
|
410
410
|
for (let [t, r] of Object.entries(e)) {
|
|
411
|
-
let e =
|
|
411
|
+
let e = ie(r.type);
|
|
412
412
|
if (r.multiple === !0) {
|
|
413
|
-
n[t] =
|
|
413
|
+
n[t] = o.array(e);
|
|
414
414
|
continue;
|
|
415
415
|
}
|
|
416
416
|
n[t] = e;
|
|
417
417
|
}
|
|
418
|
-
return
|
|
418
|
+
return o.object(n).parse(t);
|
|
419
419
|
}
|
|
420
|
-
var
|
|
421
|
-
function
|
|
422
|
-
let t =
|
|
423
|
-
for (let [r, i] of Object.entries(e))
|
|
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
|
|
430
|
-
return
|
|
429
|
+
function $(e, r) {
|
|
430
|
+
return t(n(e), r).replace(/\.ts$/, "").split("/").filter((e) => e !== "index" && !e.startsWith("["));
|
|
431
431
|
}
|
|
432
|
-
function
|
|
433
|
-
let i =
|
|
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
|
|
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
|
|
458
|
-
let t = e.commandsDir ??
|
|
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 } =
|
|
461
|
-
if (c.kind === "unresolved") {
|
|
462
|
-
|
|
463
|
-
|
|
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
|
-
|
|
482
|
-
} else {
|
|
483
|
-
let e = generateSubcommandHelp({
|
|
465
|
+
let n = (await import(e.filePath)).default, i = n.args ?? {}, s = O({
|
|
484
466
|
programName: r,
|
|
485
|
-
|
|
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(
|
|
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 =
|
|
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 =
|
|
500
|
+
let p = Q(u), m;
|
|
504
501
|
try {
|
|
505
|
-
let t =
|
|
506
|
-
m =
|
|
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
|
|
512
|
+
if (e instanceof i) {
|
|
516
513
|
let t = e.issues.map((e) => `${e.path.join(".")}: ${e.message}`);
|
|
517
|
-
console.error(
|
|
514
|
+
console.error(D(f, t)), process.exit(Z);
|
|
518
515
|
}
|
|
519
|
-
throw e instanceof Error && (console.error(
|
|
516
|
+
throw e instanceof Error && (console.error(D(f, [e.message])), process.exit(Z)), e;
|
|
520
517
|
}
|
|
521
|
-
let { extensions: h, middlewares: g } = await
|
|
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
|
|
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
|
|
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.
|
|
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.
|
|
41
|
-
"oxfmt": "0.
|
|
42
|
-
"oxlint": "1.
|
|
43
|
-
"oxlint-tsgolint": "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.
|
|
46
|
+
"vite": "8.0.0-beta.16"
|
|
47
47
|
},
|
|
48
48
|
"scripts": {
|
|
49
49
|
"build": "vite build",
|