nixparse 0.1.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/README.ja.md +480 -0
- package/README.md +480 -0
- package/dist/index.cjs +556 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +404 -0
- package/dist/index.d.ts +404 -0
- package/dist/index.js +525 -0
- package/dist/index.js.map +1 -0
- package/package.json +54 -0
package/dist/index.js
ADDED
|
@@ -0,0 +1,525 @@
|
|
|
1
|
+
// src/parsers/ps.ts
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
|
|
4
|
+
// src/parsers/_table.ts
|
|
5
|
+
function splitNonEmptyLines(text) {
|
|
6
|
+
return text.split("\n").filter((l) => l.trim().length > 0);
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
// src/parsers/ps.ts
|
|
10
|
+
var ProcessInfoSchema = z.object({
|
|
11
|
+
user: z.string(),
|
|
12
|
+
pid: z.number().int(),
|
|
13
|
+
cpu: z.number(),
|
|
14
|
+
mem: z.number(),
|
|
15
|
+
vsz: z.number().int(),
|
|
16
|
+
rss: z.number().int(),
|
|
17
|
+
tty: z.string(),
|
|
18
|
+
stat: z.string(),
|
|
19
|
+
start: z.string(),
|
|
20
|
+
time: z.string(),
|
|
21
|
+
command: z.string()
|
|
22
|
+
});
|
|
23
|
+
var NUM_FIXED_COLUMNS = 10;
|
|
24
|
+
function parsePsAux(raw) {
|
|
25
|
+
const lines = splitNonEmptyLines(raw);
|
|
26
|
+
const dataLines = lines.slice(1);
|
|
27
|
+
return dataLines.map((line) => {
|
|
28
|
+
const parts = line.trim().split(/\s+/);
|
|
29
|
+
const fixed = parts.slice(0, NUM_FIXED_COLUMNS);
|
|
30
|
+
const command = parts.slice(NUM_FIXED_COLUMNS).join(" ");
|
|
31
|
+
const [user, pid, cpu, mem, vsz, rss, tty, stat, start, time] = fixed;
|
|
32
|
+
return {
|
|
33
|
+
user,
|
|
34
|
+
pid: Number(pid),
|
|
35
|
+
cpu: Number(cpu),
|
|
36
|
+
mem: Number(mem),
|
|
37
|
+
vsz: Number(vsz),
|
|
38
|
+
rss: Number(rss),
|
|
39
|
+
tty,
|
|
40
|
+
stat,
|
|
41
|
+
start,
|
|
42
|
+
time,
|
|
43
|
+
command
|
|
44
|
+
};
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
var psParser = {
|
|
48
|
+
schema: z.array(ProcessInfoSchema),
|
|
49
|
+
parse: parsePsAux
|
|
50
|
+
};
|
|
51
|
+
|
|
52
|
+
// src/parsers/df.ts
|
|
53
|
+
import { z as z2 } from "zod";
|
|
54
|
+
var DiskUsageSchema = z2.object({
|
|
55
|
+
filesystem: z2.string(),
|
|
56
|
+
blocksKb: z2.number().int(),
|
|
57
|
+
usedKb: z2.number().int(),
|
|
58
|
+
availableKb: z2.number().int(),
|
|
59
|
+
usePercent: z2.number(),
|
|
60
|
+
mountedOn: z2.string()
|
|
61
|
+
});
|
|
62
|
+
function parseDf(raw) {
|
|
63
|
+
const lines = splitNonEmptyLines(raw);
|
|
64
|
+
const dataLines = lines.slice(1);
|
|
65
|
+
return dataLines.map((line) => {
|
|
66
|
+
const parts = line.trim().split(/\s+/);
|
|
67
|
+
const filesystem = parts[0];
|
|
68
|
+
const blocksKb = parts[1];
|
|
69
|
+
const usedKb = parts[2];
|
|
70
|
+
const availableKb = parts[3];
|
|
71
|
+
const usePercent = parts[4];
|
|
72
|
+
const mountedOn = parts.slice(5).join(" ");
|
|
73
|
+
return {
|
|
74
|
+
filesystem,
|
|
75
|
+
blocksKb: Number(blocksKb),
|
|
76
|
+
usedKb: Number(usedKb),
|
|
77
|
+
availableKb: Number(availableKb),
|
|
78
|
+
usePercent: Number(String(usePercent).replace("%", "")),
|
|
79
|
+
mountedOn
|
|
80
|
+
};
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
var dfParser = {
|
|
84
|
+
schema: z2.array(DiskUsageSchema),
|
|
85
|
+
parse: parseDf
|
|
86
|
+
};
|
|
87
|
+
|
|
88
|
+
// src/parsers/du.ts
|
|
89
|
+
import { z as z3 } from "zod";
|
|
90
|
+
var DirSizeSchema = z3.object({
|
|
91
|
+
sizeKb: z3.number().int(),
|
|
92
|
+
path: z3.string()
|
|
93
|
+
});
|
|
94
|
+
function parseDu(raw) {
|
|
95
|
+
const lines = splitNonEmptyLines(raw);
|
|
96
|
+
return lines.map((line) => {
|
|
97
|
+
const match = line.match(/^(\d+)\s+(.+)$/);
|
|
98
|
+
if (!match) {
|
|
99
|
+
throw new Error(`Unrecognized du line: ${line}`);
|
|
100
|
+
}
|
|
101
|
+
const [, sizeKb, path] = match;
|
|
102
|
+
return { sizeKb: Number(sizeKb), path };
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
var duParser = {
|
|
106
|
+
schema: z3.array(DirSizeSchema),
|
|
107
|
+
parse: parseDu
|
|
108
|
+
};
|
|
109
|
+
|
|
110
|
+
// src/parsers/free.ts
|
|
111
|
+
import { z as z4 } from "zod";
|
|
112
|
+
var MemoryInfoSchema = z4.object({
|
|
113
|
+
mem: z4.object({
|
|
114
|
+
total: z4.number().int(),
|
|
115
|
+
used: z4.number().int(),
|
|
116
|
+
free: z4.number().int(),
|
|
117
|
+
shared: z4.number().int(),
|
|
118
|
+
buffCache: z4.number().int(),
|
|
119
|
+
available: z4.number().int()
|
|
120
|
+
}),
|
|
121
|
+
swap: z4.object({
|
|
122
|
+
total: z4.number().int(),
|
|
123
|
+
used: z4.number().int(),
|
|
124
|
+
free: z4.number().int()
|
|
125
|
+
})
|
|
126
|
+
});
|
|
127
|
+
function parseFree(raw) {
|
|
128
|
+
const lines = splitNonEmptyLines(raw);
|
|
129
|
+
const memLine = lines.find((l) => l.startsWith("Mem:"));
|
|
130
|
+
const swapLine = lines.find((l) => l.startsWith("Swap:"));
|
|
131
|
+
if (!memLine || !swapLine) {
|
|
132
|
+
throw new Error("Could not find Mem: or Swap: line in free output");
|
|
133
|
+
}
|
|
134
|
+
const [, total, used, free, shared, buffCache, available] = memLine.trim().split(/\s+/);
|
|
135
|
+
const [, sTotal, sUsed, sFree] = swapLine.trim().split(/\s+/);
|
|
136
|
+
return {
|
|
137
|
+
mem: {
|
|
138
|
+
total: Number(total),
|
|
139
|
+
used: Number(used),
|
|
140
|
+
free: Number(free),
|
|
141
|
+
shared: Number(shared),
|
|
142
|
+
buffCache: Number(buffCache),
|
|
143
|
+
available: Number(available)
|
|
144
|
+
},
|
|
145
|
+
swap: {
|
|
146
|
+
total: Number(sTotal),
|
|
147
|
+
used: Number(sUsed),
|
|
148
|
+
free: Number(sFree)
|
|
149
|
+
}
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
var freeParser = {
|
|
153
|
+
schema: MemoryInfoSchema,
|
|
154
|
+
parse: parseFree
|
|
155
|
+
};
|
|
156
|
+
|
|
157
|
+
// src/parsers/lsof.ts
|
|
158
|
+
import { z as z5 } from "zod";
|
|
159
|
+
var OpenFileSchema = z5.object({
|
|
160
|
+
pid: z5.number().int(),
|
|
161
|
+
command: z5.string(),
|
|
162
|
+
user: z5.string(),
|
|
163
|
+
fd: z5.string(),
|
|
164
|
+
type: z5.string(),
|
|
165
|
+
name: z5.string()
|
|
166
|
+
});
|
|
167
|
+
function parseLsof(raw) {
|
|
168
|
+
const lines = splitNonEmptyLines(raw);
|
|
169
|
+
const results = [];
|
|
170
|
+
let currentPid;
|
|
171
|
+
let currentCommand;
|
|
172
|
+
let currentUser;
|
|
173
|
+
let pendingFd;
|
|
174
|
+
let pendingType;
|
|
175
|
+
const flush = (name) => {
|
|
176
|
+
if (currentPid === void 0) return;
|
|
177
|
+
results.push({
|
|
178
|
+
pid: currentPid,
|
|
179
|
+
command: currentCommand ?? "",
|
|
180
|
+
user: currentUser ?? "",
|
|
181
|
+
fd: pendingFd ?? "",
|
|
182
|
+
type: pendingType ?? "",
|
|
183
|
+
name
|
|
184
|
+
});
|
|
185
|
+
};
|
|
186
|
+
for (const line of lines) {
|
|
187
|
+
const tag = line[0];
|
|
188
|
+
const value = line.slice(1);
|
|
189
|
+
switch (tag) {
|
|
190
|
+
case "p":
|
|
191
|
+
currentPid = Number(value);
|
|
192
|
+
break;
|
|
193
|
+
case "c":
|
|
194
|
+
currentCommand = value;
|
|
195
|
+
break;
|
|
196
|
+
case "u":
|
|
197
|
+
currentUser = value;
|
|
198
|
+
break;
|
|
199
|
+
case "f":
|
|
200
|
+
pendingFd = value;
|
|
201
|
+
break;
|
|
202
|
+
case "T":
|
|
203
|
+
break;
|
|
204
|
+
case "t":
|
|
205
|
+
pendingType = value;
|
|
206
|
+
break;
|
|
207
|
+
case "n":
|
|
208
|
+
flush(value);
|
|
209
|
+
break;
|
|
210
|
+
default:
|
|
211
|
+
break;
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
return results;
|
|
215
|
+
}
|
|
216
|
+
var lsofParser = {
|
|
217
|
+
schema: z5.array(OpenFileSchema),
|
|
218
|
+
parse: parseLsof
|
|
219
|
+
};
|
|
220
|
+
|
|
221
|
+
// src/parsers/mount.ts
|
|
222
|
+
import { z as z6 } from "zod";
|
|
223
|
+
var MountPointSchema = z6.object({
|
|
224
|
+
device: z6.string(),
|
|
225
|
+
path: z6.string(),
|
|
226
|
+
fsType: z6.string(),
|
|
227
|
+
options: z6.array(z6.string())
|
|
228
|
+
});
|
|
229
|
+
var MOUNT_LINE_RE = /^(\S+) on (.+) type (\S+) \((.*)\)$/;
|
|
230
|
+
function parseMount(raw) {
|
|
231
|
+
const lines = splitNonEmptyLines(raw);
|
|
232
|
+
return lines.map((line) => {
|
|
233
|
+
const match = line.match(MOUNT_LINE_RE);
|
|
234
|
+
if (!match) {
|
|
235
|
+
throw new Error(`Unrecognized mount line: ${line}`);
|
|
236
|
+
}
|
|
237
|
+
const [, device, path, fsType, optionsStr] = match;
|
|
238
|
+
return {
|
|
239
|
+
device,
|
|
240
|
+
path,
|
|
241
|
+
fsType,
|
|
242
|
+
options: optionsStr ? optionsStr.split(",") : []
|
|
243
|
+
};
|
|
244
|
+
});
|
|
245
|
+
}
|
|
246
|
+
var mountParser = {
|
|
247
|
+
schema: z6.array(MountPointSchema),
|
|
248
|
+
parse: parseMount
|
|
249
|
+
};
|
|
250
|
+
|
|
251
|
+
// src/parsers/who.ts
|
|
252
|
+
import { z as z7 } from "zod";
|
|
253
|
+
var LoggedInUserSchema = z7.object({
|
|
254
|
+
user: z7.string(),
|
|
255
|
+
tty: z7.string(),
|
|
256
|
+
loginTime: z7.string()
|
|
257
|
+
});
|
|
258
|
+
var WHO_LINE_RE = /^(\S+)\s+(\S+)\s+(.+)$/;
|
|
259
|
+
function parseWho(raw) {
|
|
260
|
+
const lines = splitNonEmptyLines(raw);
|
|
261
|
+
return lines.map((line) => {
|
|
262
|
+
const match = line.match(WHO_LINE_RE);
|
|
263
|
+
if (!match) {
|
|
264
|
+
throw new Error(`Unrecognized who line: ${line}`);
|
|
265
|
+
}
|
|
266
|
+
const [, user, tty, loginTime] = match;
|
|
267
|
+
return { user, tty, loginTime: loginTime?.trim() };
|
|
268
|
+
});
|
|
269
|
+
}
|
|
270
|
+
var whoParser = {
|
|
271
|
+
schema: z7.array(LoggedInUserSchema),
|
|
272
|
+
parse: parseWho
|
|
273
|
+
};
|
|
274
|
+
|
|
275
|
+
// src/parsers/uptime.ts
|
|
276
|
+
import { z as z8 } from "zod";
|
|
277
|
+
var UptimeInfoSchema = z8.object({
|
|
278
|
+
currentTime: z8.string(),
|
|
279
|
+
upDays: z8.number().int(),
|
|
280
|
+
upHours: z8.number().int(),
|
|
281
|
+
upMinutes: z8.number().int(),
|
|
282
|
+
users: z8.number().int(),
|
|
283
|
+
loadAverage1m: z8.number(),
|
|
284
|
+
loadAverage5m: z8.number(),
|
|
285
|
+
loadAverage15m: z8.number()
|
|
286
|
+
});
|
|
287
|
+
var UPTIME_RE = /^\s*(\S+)\s+up\s+(.+?),\s+(\d+)\s+users?,\s+load average:\s*([\d.]+),\s*([\d.]+),\s*([\d.]+)/;
|
|
288
|
+
function parseUpDuration(upStr) {
|
|
289
|
+
const dayMatch = upStr.match(/(\d+)\s+days?/);
|
|
290
|
+
const days = dayMatch ? Number(dayMatch[1]) : 0;
|
|
291
|
+
const hmMatch = upStr.match(/(\d+):(\d+)/);
|
|
292
|
+
if (hmMatch) {
|
|
293
|
+
return { days, hours: Number(hmMatch[1]), minutes: Number(hmMatch[2]) };
|
|
294
|
+
}
|
|
295
|
+
const minMatch = upStr.match(/(\d+)\s+min/);
|
|
296
|
+
if (minMatch) {
|
|
297
|
+
return { days, hours: 0, minutes: Number(minMatch[1]) };
|
|
298
|
+
}
|
|
299
|
+
return { days, hours: 0, minutes: 0 };
|
|
300
|
+
}
|
|
301
|
+
function parseUptime(raw) {
|
|
302
|
+
const line = raw.trim();
|
|
303
|
+
const match = line.match(UPTIME_RE);
|
|
304
|
+
if (!match) {
|
|
305
|
+
throw new Error(`Unrecognized uptime output: ${line}`);
|
|
306
|
+
}
|
|
307
|
+
const [, currentTime, upStr, users, l1, l5, l15] = match;
|
|
308
|
+
const { days, hours, minutes } = parseUpDuration(upStr ?? "");
|
|
309
|
+
return {
|
|
310
|
+
currentTime,
|
|
311
|
+
upDays: days,
|
|
312
|
+
upHours: hours,
|
|
313
|
+
upMinutes: minutes,
|
|
314
|
+
users: Number(users),
|
|
315
|
+
loadAverage1m: Number(l1),
|
|
316
|
+
loadAverage5m: Number(l5),
|
|
317
|
+
loadAverage15m: Number(l15)
|
|
318
|
+
};
|
|
319
|
+
}
|
|
320
|
+
var uptimeParser = {
|
|
321
|
+
schema: UptimeInfoSchema,
|
|
322
|
+
parse: parseUptime
|
|
323
|
+
};
|
|
324
|
+
|
|
325
|
+
// src/parsers/ip.ts
|
|
326
|
+
import { z as z9 } from "zod";
|
|
327
|
+
var AddrInfoSchema = z9.object({
|
|
328
|
+
family: z9.string(),
|
|
329
|
+
local: z9.string(),
|
|
330
|
+
prefixlen: z9.number().int(),
|
|
331
|
+
broadcast: z9.string().optional(),
|
|
332
|
+
scope: z9.string(),
|
|
333
|
+
label: z9.string().optional(),
|
|
334
|
+
valid_life_time: z9.number(),
|
|
335
|
+
preferred_life_time: z9.number()
|
|
336
|
+
});
|
|
337
|
+
var NetworkInterfaceSchema = z9.object({
|
|
338
|
+
ifindex: z9.number().int(),
|
|
339
|
+
ifname: z9.string(),
|
|
340
|
+
flags: z9.array(z9.string()),
|
|
341
|
+
mtu: z9.number().int(),
|
|
342
|
+
qdisc: z9.string(),
|
|
343
|
+
operstate: z9.string(),
|
|
344
|
+
group: z9.string(),
|
|
345
|
+
txqlen: z9.number().int().optional(),
|
|
346
|
+
link_type: z9.string(),
|
|
347
|
+
address: z9.string(),
|
|
348
|
+
broadcast: z9.string().optional(),
|
|
349
|
+
addr_info: z9.array(AddrInfoSchema)
|
|
350
|
+
});
|
|
351
|
+
function parseIpAddr(raw) {
|
|
352
|
+
return JSON.parse(raw);
|
|
353
|
+
}
|
|
354
|
+
var ipAddrParser = {
|
|
355
|
+
schema: z9.array(NetworkInterfaceSchema),
|
|
356
|
+
parse: parseIpAddr
|
|
357
|
+
};
|
|
358
|
+
var RouteEntrySchema = z9.object({
|
|
359
|
+
dst: z9.string(),
|
|
360
|
+
gateway: z9.string().optional(),
|
|
361
|
+
dev: z9.string().optional(),
|
|
362
|
+
protocol: z9.string().optional(),
|
|
363
|
+
scope: z9.string().optional(),
|
|
364
|
+
prefsrc: z9.string().optional(),
|
|
365
|
+
flags: z9.array(z9.string())
|
|
366
|
+
});
|
|
367
|
+
function parseIpRoute(raw) {
|
|
368
|
+
return JSON.parse(raw);
|
|
369
|
+
}
|
|
370
|
+
var ipRouteParser = {
|
|
371
|
+
schema: z9.array(RouteEntrySchema),
|
|
372
|
+
parse: parseIpRoute
|
|
373
|
+
};
|
|
374
|
+
|
|
375
|
+
// src/parsers/ss.ts
|
|
376
|
+
import { z as z10 } from "zod";
|
|
377
|
+
var SocketSchema = z10.object({
|
|
378
|
+
state: z10.string(),
|
|
379
|
+
recvQ: z10.number().int(),
|
|
380
|
+
sendQ: z10.number().int(),
|
|
381
|
+
localAddress: z10.string(),
|
|
382
|
+
localPort: z10.string(),
|
|
383
|
+
peerAddress: z10.string(),
|
|
384
|
+
peerPort: z10.string(),
|
|
385
|
+
process: z10.string().optional()
|
|
386
|
+
});
|
|
387
|
+
function splitAddrPort(token) {
|
|
388
|
+
const lastColon = token.lastIndexOf(":");
|
|
389
|
+
if (lastColon === -1) {
|
|
390
|
+
return { address: token, port: "" };
|
|
391
|
+
}
|
|
392
|
+
return {
|
|
393
|
+
address: token.slice(0, lastColon),
|
|
394
|
+
port: token.slice(lastColon + 1)
|
|
395
|
+
};
|
|
396
|
+
}
|
|
397
|
+
function parseSs(raw) {
|
|
398
|
+
const lines = splitNonEmptyLines(raw);
|
|
399
|
+
const dataLines = lines.slice(1);
|
|
400
|
+
return dataLines.map((line) => {
|
|
401
|
+
const parts = line.trim().split(/\s+/);
|
|
402
|
+
const [state, recvQ, sendQ, localToken, peerAndRest] = parts;
|
|
403
|
+
const local = splitAddrPort(localToken ?? "");
|
|
404
|
+
const rest = parts.slice(4).join(" ");
|
|
405
|
+
const peerMatch = rest.match(/^(\S+)\s*(.*)$/);
|
|
406
|
+
const peerToken = peerMatch?.[1] ?? peerAndRest ?? "";
|
|
407
|
+
const processPart = peerMatch?.[2]?.trim();
|
|
408
|
+
const peer = splitAddrPort(peerToken);
|
|
409
|
+
return {
|
|
410
|
+
state,
|
|
411
|
+
recvQ: Number(recvQ),
|
|
412
|
+
sendQ: Number(sendQ),
|
|
413
|
+
localAddress: local.address,
|
|
414
|
+
localPort: local.port,
|
|
415
|
+
peerAddress: peer.address,
|
|
416
|
+
peerPort: peer.port,
|
|
417
|
+
process: processPart || void 0
|
|
418
|
+
};
|
|
419
|
+
});
|
|
420
|
+
}
|
|
421
|
+
var ssParser = {
|
|
422
|
+
schema: z10.array(SocketSchema),
|
|
423
|
+
parse: parseSs
|
|
424
|
+
};
|
|
425
|
+
|
|
426
|
+
// src/registry.ts
|
|
427
|
+
var builtinParsers = {
|
|
428
|
+
ps: psParser,
|
|
429
|
+
df: dfParser,
|
|
430
|
+
du: duParser,
|
|
431
|
+
free: freeParser,
|
|
432
|
+
lsof: lsofParser,
|
|
433
|
+
mount: mountParser,
|
|
434
|
+
who: whoParser,
|
|
435
|
+
uptime: uptimeParser,
|
|
436
|
+
"ip-addr": ipAddrParser,
|
|
437
|
+
"ip-route": ipRouteParser,
|
|
438
|
+
ss: ssParser
|
|
439
|
+
};
|
|
440
|
+
var registry = new Map(
|
|
441
|
+
Object.entries(builtinParsers)
|
|
442
|
+
);
|
|
443
|
+
function registerParser(name, definition) {
|
|
444
|
+
registry.set(name, definition);
|
|
445
|
+
}
|
|
446
|
+
|
|
447
|
+
// src/exec.ts
|
|
448
|
+
import { execFile } from "child_process";
|
|
449
|
+
import { promisify } from "util";
|
|
450
|
+
|
|
451
|
+
// src/types.ts
|
|
452
|
+
var CommandNotFoundError = class extends Error {
|
|
453
|
+
constructor(command) {
|
|
454
|
+
super(`Command not found: "${command}". Is it installed and on PATH?`);
|
|
455
|
+
this.command = command;
|
|
456
|
+
this.name = "CommandNotFoundError";
|
|
457
|
+
}
|
|
458
|
+
command;
|
|
459
|
+
};
|
|
460
|
+
var UnknownParserError = class extends Error {
|
|
461
|
+
constructor(name) {
|
|
462
|
+
super(
|
|
463
|
+
`No parser registered for "${name}". Use registerParser() to add a custom one.`
|
|
464
|
+
);
|
|
465
|
+
this.name = name;
|
|
466
|
+
this.name = "UnknownParserError";
|
|
467
|
+
}
|
|
468
|
+
name;
|
|
469
|
+
};
|
|
470
|
+
|
|
471
|
+
// src/exec.ts
|
|
472
|
+
var execFileAsync = promisify(execFile);
|
|
473
|
+
async function runCommand(command, args) {
|
|
474
|
+
try {
|
|
475
|
+
const { stdout } = await execFileAsync(command, args, {
|
|
476
|
+
maxBuffer: 1024 * 1024 * 32
|
|
477
|
+
});
|
|
478
|
+
return stdout;
|
|
479
|
+
} catch (err) {
|
|
480
|
+
const nodeErr = err;
|
|
481
|
+
if (nodeErr.code === "ENOENT") {
|
|
482
|
+
throw new CommandNotFoundError(command);
|
|
483
|
+
}
|
|
484
|
+
throw err;
|
|
485
|
+
}
|
|
486
|
+
}
|
|
487
|
+
|
|
488
|
+
// src/index.ts
|
|
489
|
+
function parse(name, raw) {
|
|
490
|
+
const definition = registry.get(name);
|
|
491
|
+
if (!definition) {
|
|
492
|
+
throw new UnknownParserError(name);
|
|
493
|
+
}
|
|
494
|
+
const result = definition.parse(raw);
|
|
495
|
+
return definition.schema.parse(result);
|
|
496
|
+
}
|
|
497
|
+
var commandSpecs = /* @__PURE__ */ new Map([
|
|
498
|
+
["ps", { binary: "ps", defaultArgs: ["aux"] }],
|
|
499
|
+
["df", { binary: "df", defaultArgs: ["-k"] }],
|
|
500
|
+
["du", { binary: "du", defaultArgs: ["-k"] }],
|
|
501
|
+
["free", { binary: "free", defaultArgs: ["-b"] }],
|
|
502
|
+
["lsof", { binary: "lsof", defaultArgs: ["-F", "pcufTtn"] }],
|
|
503
|
+
["mount", { binary: "mount", defaultArgs: [] }],
|
|
504
|
+
["who", { binary: "who", defaultArgs: [] }],
|
|
505
|
+
["uptime", { binary: "uptime", defaultArgs: [] }],
|
|
506
|
+
["ip-addr", { binary: "ip", defaultArgs: ["-j", "addr"] }],
|
|
507
|
+
["ip-route", { binary: "ip", defaultArgs: ["-j", "route"] }],
|
|
508
|
+
["ss", { binary: "ss", defaultArgs: ["-tln"] }]
|
|
509
|
+
]);
|
|
510
|
+
async function run(name, args) {
|
|
511
|
+
const spec = commandSpecs.get(name);
|
|
512
|
+
if (!spec) {
|
|
513
|
+
throw new UnknownParserError(name);
|
|
514
|
+
}
|
|
515
|
+
const raw = await runCommand(spec.binary, args ?? spec.defaultArgs);
|
|
516
|
+
return parse(name, raw);
|
|
517
|
+
}
|
|
518
|
+
export {
|
|
519
|
+
CommandNotFoundError,
|
|
520
|
+
UnknownParserError,
|
|
521
|
+
parse,
|
|
522
|
+
registerParser,
|
|
523
|
+
run
|
|
524
|
+
};
|
|
525
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/parsers/ps.ts","../src/parsers/_table.ts","../src/parsers/df.ts","../src/parsers/du.ts","../src/parsers/free.ts","../src/parsers/lsof.ts","../src/parsers/mount.ts","../src/parsers/who.ts","../src/parsers/uptime.ts","../src/parsers/ip.ts","../src/parsers/ss.ts","../src/registry.ts","../src/exec.ts","../src/types.ts","../src/index.ts"],"sourcesContent":["import { z } from \"zod\";\nimport type { ParserDefinition } from \"../types.js\";\nimport { splitNonEmptyLines } from \"./_table.js\";\n\nexport const ProcessInfoSchema = z.object({\n user: z.string(),\n pid: z.number().int(),\n cpu: z.number(),\n mem: z.number(),\n vsz: z.number().int(),\n rss: z.number().int(),\n tty: z.string(),\n stat: z.string(),\n start: z.string(),\n time: z.string(),\n command: z.string(),\n});\n\nexport type ProcessInfo = z.infer<typeof ProcessInfoSchema>;\n\nconst NUM_FIXED_COLUMNS = 10;\n\nfunction parsePsAux(raw: string): unknown {\n const lines = splitNonEmptyLines(raw);\n const dataLines = lines.slice(1);\n\n return dataLines.map((line) => {\n const parts = line.trim().split(/\\s+/);\n const fixed = parts.slice(0, NUM_FIXED_COLUMNS);\n const command = parts.slice(NUM_FIXED_COLUMNS).join(\" \");\n const [user, pid, cpu, mem, vsz, rss, tty, stat, start, time] = fixed;\n\n return {\n user,\n pid: Number(pid),\n cpu: Number(cpu),\n mem: Number(mem),\n vsz: Number(vsz),\n rss: Number(rss),\n tty,\n stat,\n start,\n time,\n command,\n };\n });\n}\n\nexport const psParser: ParserDefinition<ProcessInfo[]> = {\n schema: z.array(ProcessInfoSchema),\n parse: parsePsAux,\n};\n","/**\n * ヘッダー行から列の開始位置を検出し、各データ行を列名→値のオブジェクトに変換する。\n * 最後の列は値の中にスペースを含みうるため、末尾まで含めて切り出す。\n */\nexport function parseFixedColumnTable(\n lines: string[],\n headerNames: string[],\n): Record<string, string>[] {\n if (lines.length === 0) return [];\n const header = lines[0]!;\n const starts = headerNames.map((name) => {\n const idx = header.indexOf(name);\n if (idx === -1) {\n throw new Error(`Header column \"${name}\" not found in: ${header}`);\n }\n return idx;\n });\n\n const rows = lines.slice(1).filter((l) => l.trim().length > 0);\n\n return rows.map((line) => {\n const record: Record<string, string> = {};\n for (let i = 0; i < headerNames.length; i++) {\n const start = starts[i]!;\n const end = i + 1 < starts.length ? starts[i + 1]! : line.length;\n record[headerNames[i]!] = line.slice(start, end).trim();\n }\n return record;\n });\n}\n\nexport function splitNonEmptyLines(text: string): string[] {\n return text.split(\"\\n\").filter((l) => l.trim().length > 0);\n}\n","import { z } from \"zod\";\nimport type { ParserDefinition } from \"../types.js\";\nimport { splitNonEmptyLines } from \"./_table.js\";\n\nexport const DiskUsageSchema = z.object({\n filesystem: z.string(),\n blocksKb: z.number().int(),\n usedKb: z.number().int(),\n availableKb: z.number().int(),\n usePercent: z.number(),\n mountedOn: z.string(),\n});\n\nexport type DiskUsage = z.infer<typeof DiskUsageSchema>;\n\nfunction parseDf(raw: string): unknown {\n const lines = splitNonEmptyLines(raw);\n const dataLines = lines.slice(1);\n\n return dataLines.map((line) => {\n const parts = line.trim().split(/\\s+/);\n const filesystem = parts[0];\n const blocksKb = parts[1];\n const usedKb = parts[2];\n const availableKb = parts[3];\n const usePercent = parts[4];\n const mountedOn = parts.slice(5).join(\" \");\n\n return {\n filesystem,\n blocksKb: Number(blocksKb),\n usedKb: Number(usedKb),\n availableKb: Number(availableKb),\n usePercent: Number(String(usePercent).replace(\"%\", \"\")),\n mountedOn,\n };\n });\n}\n\nexport const dfParser: ParserDefinition<DiskUsage[]> = {\n schema: z.array(DiskUsageSchema),\n parse: parseDf,\n};\n","import { z } from \"zod\";\nimport type { ParserDefinition } from \"../types.js\";\nimport { splitNonEmptyLines } from \"./_table.js\";\n\nexport const DirSizeSchema = z.object({\n sizeKb: z.number().int(),\n path: z.string(),\n});\n\nexport type DirSize = z.infer<typeof DirSizeSchema>;\n\nfunction parseDu(raw: string): unknown {\n const lines = splitNonEmptyLines(raw);\n\n return lines.map((line) => {\n const match = line.match(/^(\\d+)\\s+(.+)$/);\n if (!match) {\n throw new Error(`Unrecognized du line: ${line}`);\n }\n const [, sizeKb, path] = match;\n return { sizeKb: Number(sizeKb), path };\n });\n}\n\nexport const duParser: ParserDefinition<DirSize[]> = {\n schema: z.array(DirSizeSchema),\n parse: parseDu,\n};\n","import { z } from \"zod\";\nimport type { ParserDefinition } from \"../types.js\";\nimport { splitNonEmptyLines } from \"./_table.js\";\n\nexport const MemoryInfoSchema = z.object({\n mem: z.object({\n total: z.number().int(),\n used: z.number().int(),\n free: z.number().int(),\n shared: z.number().int(),\n buffCache: z.number().int(),\n available: z.number().int(),\n }),\n swap: z.object({\n total: z.number().int(),\n used: z.number().int(),\n free: z.number().int(),\n }),\n});\n\nexport type MemoryInfo = z.infer<typeof MemoryInfoSchema>;\n\nfunction parseFree(raw: string): unknown {\n const lines = splitNonEmptyLines(raw);\n const memLine = lines.find((l) => l.startsWith(\"Mem:\"));\n const swapLine = lines.find((l) => l.startsWith(\"Swap:\"));\n if (!memLine || !swapLine) {\n throw new Error(\"Could not find Mem: or Swap: line in free output\");\n }\n\n const [, total, used, free, shared, buffCache, available] = memLine\n .trim()\n .split(/\\s+/);\n const [, sTotal, sUsed, sFree] = swapLine.trim().split(/\\s+/);\n\n return {\n mem: {\n total: Number(total),\n used: Number(used),\n free: Number(free),\n shared: Number(shared),\n buffCache: Number(buffCache),\n available: Number(available),\n },\n swap: {\n total: Number(sTotal),\n used: Number(sUsed),\n free: Number(sFree),\n },\n };\n}\n\nexport const freeParser: ParserDefinition<MemoryInfo> = {\n schema: MemoryInfoSchema,\n parse: parseFree,\n};\n","import { z } from \"zod\";\nimport type { ParserDefinition } from \"../types.js\";\nimport { splitNonEmptyLines } from \"./_table.js\";\n\nexport const OpenFileSchema = z.object({\n pid: z.number().int(),\n command: z.string(),\n user: z.string(),\n fd: z.string(),\n type: z.string(),\n name: z.string(),\n});\n\nexport type OpenFile = z.infer<typeof OpenFileSchema>;\n\n/**\n * lsof -F pcuTtn の出力をパースする。\n * `-F` モードは1フィールド1行で、行頭の1文字がフィールド識別子(p,c,u,T,t,n等)。\n * p(PID)行が新しいプロセスの開始を意味し、以降のレコードはそのPID/COMMAND/USERを継承する。\n */\nfunction parseLsof(raw: string): unknown {\n const lines = splitNonEmptyLines(raw);\n const results: Record<string, unknown>[] = [];\n\n let currentPid: number | undefined;\n let currentCommand: string | undefined;\n let currentUser: string | undefined;\n let pendingFd: string | undefined;\n let pendingType: string | undefined;\n\n const flush = (name: string) => {\n if (currentPid === undefined) return;\n results.push({\n pid: currentPid,\n command: currentCommand ?? \"\",\n user: currentUser ?? \"\",\n fd: pendingFd ?? \"\",\n type: pendingType ?? \"\",\n name,\n });\n };\n\n for (const line of lines) {\n const tag = line[0];\n const value = line.slice(1);\n switch (tag) {\n case \"p\":\n currentPid = Number(value);\n break;\n case \"c\":\n currentCommand = value;\n break;\n case \"u\":\n currentUser = value;\n break;\n case \"f\":\n pendingFd = value;\n break;\n case \"T\":\n // protocol state line (TCP state etc.) — TYPE行の前に来る場合があるため独立フィールドとして無視\n break;\n case \"t\":\n pendingType = value;\n break;\n case \"n\":\n flush(value);\n break;\n default:\n break;\n }\n }\n\n return results;\n}\n\nexport const lsofParser: ParserDefinition<OpenFile[]> = {\n schema: z.array(OpenFileSchema),\n parse: parseLsof,\n};\n","import { z } from \"zod\";\nimport type { ParserDefinition } from \"../types.js\";\nimport { splitNonEmptyLines } from \"./_table.js\";\n\nexport const MountPointSchema = z.object({\n device: z.string(),\n path: z.string(),\n fsType: z.string(),\n options: z.array(z.string()),\n});\n\nexport type MountPoint = z.infer<typeof MountPointSchema>;\n\nconst MOUNT_LINE_RE = /^(\\S+) on (.+) type (\\S+) \\((.*)\\)$/;\n\nfunction parseMount(raw: string): unknown {\n const lines = splitNonEmptyLines(raw);\n\n return lines.map((line) => {\n const match = line.match(MOUNT_LINE_RE);\n if (!match) {\n throw new Error(`Unrecognized mount line: ${line}`);\n }\n const [, device, path, fsType, optionsStr] = match;\n return {\n device,\n path,\n fsType,\n options: optionsStr ? optionsStr.split(\",\") : [],\n };\n });\n}\n\nexport const mountParser: ParserDefinition<MountPoint[]> = {\n schema: z.array(MountPointSchema),\n parse: parseMount,\n};\n","import { z } from \"zod\";\nimport type { ParserDefinition } from \"../types.js\";\nimport { splitNonEmptyLines } from \"./_table.js\";\n\nexport const LoggedInUserSchema = z.object({\n user: z.string(),\n tty: z.string(),\n loginTime: z.string(),\n});\n\nexport type LoggedInUser = z.infer<typeof LoggedInUserSchema>;\n\nconst WHO_LINE_RE = /^(\\S+)\\s+(\\S+)\\s+(.+)$/;\n\nfunction parseWho(raw: string): unknown {\n const lines = splitNonEmptyLines(raw);\n\n return lines.map((line) => {\n const match = line.match(WHO_LINE_RE);\n if (!match) {\n throw new Error(`Unrecognized who line: ${line}`);\n }\n const [, user, tty, loginTime] = match;\n return { user, tty, loginTime: loginTime?.trim() };\n });\n}\n\nexport const whoParser: ParserDefinition<LoggedInUser[]> = {\n schema: z.array(LoggedInUserSchema),\n parse: parseWho,\n};\n","import { z } from \"zod\";\nimport type { ParserDefinition } from \"../types.js\";\n\nexport const UptimeInfoSchema = z.object({\n currentTime: z.string(),\n upDays: z.number().int(),\n upHours: z.number().int(),\n upMinutes: z.number().int(),\n users: z.number().int(),\n loadAverage1m: z.number(),\n loadAverage5m: z.number(),\n loadAverage15m: z.number(),\n});\n\nexport type UptimeInfo = z.infer<typeof UptimeInfoSchema>;\n\nconst UPTIME_RE =\n /^\\s*(\\S+)\\s+up\\s+(.+?),\\s+(\\d+)\\s+users?,\\s+load average:\\s*([\\d.]+),\\s*([\\d.]+),\\s*([\\d.]+)/;\n\nfunction parseUpDuration(upStr: string): {\n days: number;\n hours: number;\n minutes: number;\n} {\n // 例: \"1:08\", \"1 day, 2:03\", \"5 min\"\n const dayMatch = upStr.match(/(\\d+)\\s+days?/);\n const days = dayMatch ? Number(dayMatch[1]) : 0;\n\n const hmMatch = upStr.match(/(\\d+):(\\d+)/);\n if (hmMatch) {\n return { days, hours: Number(hmMatch[1]), minutes: Number(hmMatch[2]) };\n }\n\n const minMatch = upStr.match(/(\\d+)\\s+min/);\n if (minMatch) {\n return { days, hours: 0, minutes: Number(minMatch[1]) };\n }\n\n return { days, hours: 0, minutes: 0 };\n}\n\nfunction parseUptime(raw: string): unknown {\n const line = raw.trim();\n const match = line.match(UPTIME_RE);\n if (!match) {\n throw new Error(`Unrecognized uptime output: ${line}`);\n }\n const [, currentTime, upStr, users, l1, l5, l15] = match;\n const { days, hours, minutes } = parseUpDuration(upStr ?? \"\");\n\n return {\n currentTime,\n upDays: days,\n upHours: hours,\n upMinutes: minutes,\n users: Number(users),\n loadAverage1m: Number(l1),\n loadAverage5m: Number(l5),\n loadAverage15m: Number(l15),\n };\n}\n\nexport const uptimeParser: ParserDefinition<UptimeInfo> = {\n schema: UptimeInfoSchema,\n parse: parseUptime,\n};\n","import { z } from \"zod\";\nimport type { ParserDefinition } from \"../types.js\";\n\nexport const AddrInfoSchema = z.object({\n family: z.string(),\n local: z.string(),\n prefixlen: z.number().int(),\n broadcast: z.string().optional(),\n scope: z.string(),\n label: z.string().optional(),\n valid_life_time: z.number(),\n preferred_life_time: z.number(),\n});\n\nexport const NetworkInterfaceSchema = z.object({\n ifindex: z.number().int(),\n ifname: z.string(),\n flags: z.array(z.string()),\n mtu: z.number().int(),\n qdisc: z.string(),\n operstate: z.string(),\n group: z.string(),\n txqlen: z.number().int().optional(),\n link_type: z.string(),\n address: z.string(),\n broadcast: z.string().optional(),\n addr_info: z.array(AddrInfoSchema),\n});\n\nexport type NetworkInterface = z.infer<typeof NetworkInterfaceSchema>;\n\n/**\n * `ip -j addr` はネイティブでJSONを出力するため、変換は不要。\n * JSON.parse + Zodスキーマ検証のみを行い、構造保証された型を返す。\n */\nfunction parseIpAddr(raw: string): unknown {\n return JSON.parse(raw);\n}\n\nexport const ipAddrParser: ParserDefinition<NetworkInterface[]> = {\n schema: z.array(NetworkInterfaceSchema),\n parse: parseIpAddr,\n};\n\nexport const RouteEntrySchema = z.object({\n dst: z.string(),\n gateway: z.string().optional(),\n dev: z.string().optional(),\n protocol: z.string().optional(),\n scope: z.string().optional(),\n prefsrc: z.string().optional(),\n flags: z.array(z.string()),\n});\n\nexport type RouteEntry = z.infer<typeof RouteEntrySchema>;\n\nfunction parseIpRoute(raw: string): unknown {\n return JSON.parse(raw);\n}\n\nexport const ipRouteParser: ParserDefinition<RouteEntry[]> = {\n schema: z.array(RouteEntrySchema),\n parse: parseIpRoute,\n};\n","import { z } from \"zod\";\nimport type { ParserDefinition } from \"../types.js\";\nimport { splitNonEmptyLines } from \"./_table.js\";\n\nexport const SocketSchema = z.object({\n state: z.string(),\n recvQ: z.number().int(),\n sendQ: z.number().int(),\n localAddress: z.string(),\n localPort: z.string(),\n peerAddress: z.string(),\n peerPort: z.string(),\n process: z.string().optional(),\n});\n\nexport type Socket = z.infer<typeof SocketSchema>;\n\n/**\n * \"host:port\" 形式からportを切り出す。IPv6は `[::1]:631` のように\n * 括弧で囲まれるため、最後の `:` で分割すれば host/port とも安全に取れる。\n */\nfunction splitAddrPort(token: string): { address: string; port: string } {\n const lastColon = token.lastIndexOf(\":\");\n if (lastColon === -1) {\n return { address: token, port: \"\" };\n }\n return {\n address: token.slice(0, lastColon),\n port: token.slice(lastColon + 1),\n };\n}\n\nfunction parseSs(raw: string): unknown {\n const lines = splitNonEmptyLines(raw);\n const dataLines = lines.slice(1);\n\n return dataLines.map((line) => {\n const parts = line.trim().split(/\\s+/);\n const [state, recvQ, sendQ, localToken, peerAndRest] = parts;\n const local = splitAddrPort(localToken ?? \"\");\n\n // peer列の直後にProcess列がスペースなしで連結されるケース(`*:* users:(...)`)があるため\n // 残りの文字列から最初の空白までをpeerトークンとし、それ以降をprocessとする\n const rest = parts.slice(4).join(\" \");\n const peerMatch = rest.match(/^(\\S+)\\s*(.*)$/);\n const peerToken = peerMatch?.[1] ?? peerAndRest ?? \"\";\n const processPart = peerMatch?.[2]?.trim();\n const peer = splitAddrPort(peerToken);\n\n return {\n state,\n recvQ: Number(recvQ),\n sendQ: Number(sendQ),\n localAddress: local.address,\n localPort: local.port,\n peerAddress: peer.address,\n peerPort: peer.port,\n process: processPart || undefined,\n };\n });\n}\n\nexport const ssParser: ParserDefinition<Socket[]> = {\n schema: z.array(SocketSchema),\n parse: parseSs,\n};\n","import type { AnyParserDefinition } from \"./types.js\";\nimport { psParser } from \"./parsers/ps.js\";\nimport { dfParser } from \"./parsers/df.js\";\nimport { duParser } from \"./parsers/du.js\";\nimport { freeParser } from \"./parsers/free.js\";\nimport { lsofParser } from \"./parsers/lsof.js\";\nimport { mountParser } from \"./parsers/mount.js\";\nimport { whoParser } from \"./parsers/who.js\";\nimport { uptimeParser } from \"./parsers/uptime.js\";\nimport { ipAddrParser, ipRouteParser } from \"./parsers/ip.js\";\nimport { ssParser } from \"./parsers/ss.js\";\n\nconst builtinParsers: Record<string, AnyParserDefinition> = {\n ps: psParser as AnyParserDefinition,\n df: dfParser as AnyParserDefinition,\n du: duParser as AnyParserDefinition,\n free: freeParser as AnyParserDefinition,\n lsof: lsofParser as AnyParserDefinition,\n mount: mountParser as AnyParserDefinition,\n who: whoParser as AnyParserDefinition,\n uptime: uptimeParser as AnyParserDefinition,\n \"ip-addr\": ipAddrParser as AnyParserDefinition,\n \"ip-route\": ipRouteParser as AnyParserDefinition,\n ss: ssParser as AnyParserDefinition,\n};\n\nexport const registry = new Map<string, AnyParserDefinition>(\n Object.entries(builtinParsers),\n);\n\nexport function registerParser<T>(\n name: string,\n definition: AnyParserDefinition,\n): void {\n registry.set(name, definition as AnyParserDefinition);\n}\n\nexport type BuiltinCommandName = keyof typeof builtinParsers;\n","import { execFile } from \"node:child_process\";\nimport { promisify } from \"node:util\";\nimport { CommandNotFoundError } from \"./types.js\";\n\nconst execFileAsync = promisify(execFile);\n\nexport async function runCommand(\n command: string,\n args: string[],\n): Promise<string> {\n try {\n const { stdout } = await execFileAsync(command, args, {\n maxBuffer: 1024 * 1024 * 32,\n });\n return stdout;\n } catch (err) {\n const nodeErr = err as NodeJS.ErrnoException;\n if (nodeErr.code === \"ENOENT\") {\n throw new CommandNotFoundError(command);\n }\n throw err;\n }\n}\n","import type { z } from \"zod\";\n\nexport interface ParserDefinition<T> {\n schema: z.ZodType<T>;\n parse: (raw: string) => unknown;\n}\n\nexport type AnyParserDefinition = ParserDefinition<unknown>;\n\nexport class CommandNotFoundError extends Error {\n constructor(public readonly command: string) {\n super(`Command not found: \"${command}\". Is it installed and on PATH?`);\n this.name = \"CommandNotFoundError\";\n }\n}\n\nexport class UnknownParserError extends Error {\n constructor(public readonly name: string) {\n super(\n `No parser registered for \"${name}\". Use registerParser() to add a custom one.`,\n );\n this.name = \"UnknownParserError\";\n }\n}\n","import { registry, registerParser, type BuiltinCommandName } from \"./registry.js\";\nimport { runCommand } from \"./exec.js\";\nimport { UnknownParserError } from \"./types.js\";\n\nexport { registerParser };\nexport type { BuiltinCommandName };\nexport {\n CommandNotFoundError,\n UnknownParserError,\n type ParserDefinition,\n} from \"./types.js\";\n\nexport type { ProcessInfo } from \"./parsers/ps.js\";\nexport type { DiskUsage } from \"./parsers/df.js\";\nexport type { DirSize } from \"./parsers/du.js\";\nexport type { MemoryInfo } from \"./parsers/free.js\";\nexport type { OpenFile } from \"./parsers/lsof.js\";\nexport type { MountPoint } from \"./parsers/mount.js\";\nexport type { LoggedInUser } from \"./parsers/who.js\";\nexport type { UptimeInfo } from \"./parsers/uptime.js\";\nexport type { NetworkInterface, RouteEntry } from \"./parsers/ip.js\";\nexport type { Socket } from \"./parsers/ss.js\";\n\n/**\n * 生のコマンド出力テキストをパースし、Zodで検証した結果を返す。\n * コマンドの実行は行わない(エージェント等が既に取得した出力を渡すケースを想定)。\n */\nexport function parse<T = unknown>(name: string, raw: string): T {\n const definition = registry.get(name);\n if (!definition) {\n throw new UnknownParserError(name);\n }\n const result = definition.parse(raw);\n return definition.schema.parse(result) as T;\n}\n\ninterface CommandSpec {\n binary: string;\n defaultArgs: string[];\n}\n\nconst commandSpecs = new Map<BuiltinCommandName, CommandSpec>([\n [\"ps\", { binary: \"ps\", defaultArgs: [\"aux\"] }],\n [\"df\", { binary: \"df\", defaultArgs: [\"-k\"] }],\n [\"du\", { binary: \"du\", defaultArgs: [\"-k\"] }],\n [\"free\", { binary: \"free\", defaultArgs: [\"-b\"] }],\n [\"lsof\", { binary: \"lsof\", defaultArgs: [\"-F\", \"pcufTtn\"] }],\n [\"mount\", { binary: \"mount\", defaultArgs: [] }],\n [\"who\", { binary: \"who\", defaultArgs: [] }],\n [\"uptime\", { binary: \"uptime\", defaultArgs: [] }],\n [\"ip-addr\", { binary: \"ip\", defaultArgs: [\"-j\", \"addr\"] }],\n [\"ip-route\", { binary: \"ip\", defaultArgs: [\"-j\", \"route\"] }],\n [\"ss\", { binary: \"ss\", defaultArgs: [\"-tln\"] }],\n]);\n\n/**\n * 組み込みコマンドを実行し、その出力をパースして返す。\n * 引数を省略すると各パーサーの想定するデフォルト引数(`ps aux`等)を使う。\n */\nexport async function run<T = unknown>(\n name: BuiltinCommandName,\n args?: string[],\n): Promise<T> {\n const spec = commandSpecs.get(name);\n if (!spec) {\n throw new UnknownParserError(name);\n }\n const raw = await runCommand(spec.binary, args ?? spec.defaultArgs);\n return parse<T>(name, raw);\n}\n"],"mappings":"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","names":["z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "nixparse",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Type-safe parsers for Unix command output (ps, df, du, free, lsof, mount, who, uptime, ip, ss) with runtime validation via Zod",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/index.cjs",
|
|
7
|
+
"module": "./dist/index.js",
|
|
8
|
+
"types": "./dist/index.d.ts",
|
|
9
|
+
"exports": {
|
|
10
|
+
".": {
|
|
11
|
+
"types": "./dist/index.d.ts",
|
|
12
|
+
"import": "./dist/index.js",
|
|
13
|
+
"require": "./dist/index.cjs"
|
|
14
|
+
}
|
|
15
|
+
},
|
|
16
|
+
"files": [
|
|
17
|
+
"dist"
|
|
18
|
+
],
|
|
19
|
+
"scripts": {
|
|
20
|
+
"build": "tsup",
|
|
21
|
+
"test": "vitest run",
|
|
22
|
+
"test:watch": "vitest",
|
|
23
|
+
"typecheck": "tsc --noEmit"
|
|
24
|
+
},
|
|
25
|
+
"keywords": [
|
|
26
|
+
"cli",
|
|
27
|
+
"parser",
|
|
28
|
+
"unix",
|
|
29
|
+
"ps",
|
|
30
|
+
"df",
|
|
31
|
+
"du",
|
|
32
|
+
"free",
|
|
33
|
+
"lsof",
|
|
34
|
+
"mount",
|
|
35
|
+
"uptime",
|
|
36
|
+
"ip",
|
|
37
|
+
"ss",
|
|
38
|
+
"zod",
|
|
39
|
+
"typescript"
|
|
40
|
+
],
|
|
41
|
+
"license": "MIT",
|
|
42
|
+
"dependencies": {
|
|
43
|
+
"zod": "^3.23.8"
|
|
44
|
+
},
|
|
45
|
+
"devDependencies": {
|
|
46
|
+
"@types/node": "^26.0.1",
|
|
47
|
+
"tsup": "^8.3.5",
|
|
48
|
+
"typescript": "^5.6.3",
|
|
49
|
+
"vitest": "^4.1.9"
|
|
50
|
+
},
|
|
51
|
+
"engines": {
|
|
52
|
+
"node": ">=18"
|
|
53
|
+
}
|
|
54
|
+
}
|