shell-dsl 0.0.14 → 0.0.16
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/cjs/package.json +1 -1
- package/dist/cjs/src/commands/cd/cd.cjs +66 -0
- package/dist/cjs/src/commands/cd/cd.cjs.map +10 -0
- package/dist/cjs/src/commands/index.cjs +10 -2
- package/dist/cjs/src/commands/index.cjs.map +3 -3
- package/dist/cjs/src/commands/ls/ls.cjs +65 -42
- package/dist/cjs/src/commands/ls/ls.cjs.map +3 -3
- package/dist/cjs/src/commands/sed/sed.cjs +291 -76
- package/dist/cjs/src/commands/sed/sed.cjs.map +3 -3
- package/dist/cjs/src/commands/tr/tr.cjs +223 -0
- package/dist/cjs/src/commands/tr/tr.cjs.map +10 -0
- package/dist/cjs/src/commands/tree/tree.cjs +7 -4
- package/dist/cjs/src/commands/tree/tree.cjs.map +3 -3
- package/dist/cjs/src/interpreter/context.cjs +3 -2
- package/dist/cjs/src/interpreter/context.cjs.map +3 -3
- package/dist/cjs/src/interpreter/interpreter.cjs +4 -2
- package/dist/cjs/src/interpreter/interpreter.cjs.map +3 -3
- package/dist/cjs/src/parser/parser.cjs +11 -2
- package/dist/cjs/src/parser/parser.cjs.map +3 -3
- package/dist/cjs/src/types.cjs.map +2 -2
- package/dist/mjs/package.json +1 -1
- package/dist/mjs/src/commands/cd/cd.mjs +36 -0
- package/dist/mjs/src/commands/cd/cd.mjs.map +10 -0
- package/dist/mjs/src/commands/index.mjs +10 -2
- package/dist/mjs/src/commands/index.mjs.map +3 -3
- package/dist/mjs/src/commands/ls/ls.mjs +65 -42
- package/dist/mjs/src/commands/ls/ls.mjs.map +3 -3
- package/dist/mjs/src/commands/sed/sed.mjs +291 -76
- package/dist/mjs/src/commands/sed/sed.mjs.map +3 -3
- package/dist/mjs/src/commands/tr/tr.mjs +193 -0
- package/dist/mjs/src/commands/tr/tr.mjs.map +10 -0
- package/dist/mjs/src/commands/tree/tree.mjs +7 -4
- package/dist/mjs/src/commands/tree/tree.mjs.map +3 -3
- package/dist/mjs/src/interpreter/context.mjs +3 -2
- package/dist/mjs/src/interpreter/context.mjs.map +3 -3
- package/dist/mjs/src/interpreter/interpreter.mjs +4 -2
- package/dist/mjs/src/interpreter/interpreter.mjs.map +3 -3
- package/dist/mjs/src/parser/parser.mjs +11 -2
- package/dist/mjs/src/parser/parser.mjs.map +3 -3
- package/dist/mjs/src/types.mjs.map +2 -2
- package/dist/types/src/commands/cd/cd.d.ts +2 -0
- package/dist/types/src/commands/index.d.ts +2 -0
- package/dist/types/src/commands/tr/tr.d.ts +2 -0
- package/dist/types/src/interpreter/context.d.ts +1 -0
- package/dist/types/src/types.d.ts +1 -0
- package/package.json +1 -1
package/dist/cjs/package.json
CHANGED
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
5
|
+
var __moduleCache = /* @__PURE__ */ new WeakMap;
|
|
6
|
+
var __toCommonJS = (from) => {
|
|
7
|
+
var entry = __moduleCache.get(from), desc;
|
|
8
|
+
if (entry)
|
|
9
|
+
return entry;
|
|
10
|
+
entry = __defProp({}, "__esModule", { value: true });
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function")
|
|
12
|
+
__getOwnPropNames(from).map((key) => !__hasOwnProp.call(entry, key) && __defProp(entry, key, {
|
|
13
|
+
get: () => from[key],
|
|
14
|
+
enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
|
|
15
|
+
}));
|
|
16
|
+
__moduleCache.set(from, entry);
|
|
17
|
+
return entry;
|
|
18
|
+
};
|
|
19
|
+
var __export = (target, all) => {
|
|
20
|
+
for (var name in all)
|
|
21
|
+
__defProp(target, name, {
|
|
22
|
+
get: all[name],
|
|
23
|
+
enumerable: true,
|
|
24
|
+
configurable: true,
|
|
25
|
+
set: (newValue) => all[name] = () => newValue
|
|
26
|
+
});
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
// src/commands/cd/cd.ts
|
|
30
|
+
var exports_cd = {};
|
|
31
|
+
__export(exports_cd, {
|
|
32
|
+
cd: () => cd
|
|
33
|
+
});
|
|
34
|
+
module.exports = __toCommonJS(exports_cd);
|
|
35
|
+
var cd = async (ctx) => {
|
|
36
|
+
if (ctx.args.length === 0) {
|
|
37
|
+
return 0;
|
|
38
|
+
}
|
|
39
|
+
let target = ctx.args[0];
|
|
40
|
+
if (target === "-") {
|
|
41
|
+
const oldpwd = ctx.env.OLDPWD;
|
|
42
|
+
if (!oldpwd) {
|
|
43
|
+
await ctx.stderr.writeText(`cd: OLDPWD not set
|
|
44
|
+
`);
|
|
45
|
+
return 1;
|
|
46
|
+
}
|
|
47
|
+
target = oldpwd;
|
|
48
|
+
}
|
|
49
|
+
const resolved = ctx.fs.resolve(ctx.cwd, target);
|
|
50
|
+
try {
|
|
51
|
+
const stat = await ctx.fs.stat(resolved);
|
|
52
|
+
if (!stat.isDirectory()) {
|
|
53
|
+
await ctx.stderr.writeText(`cd: not a directory: ${target}
|
|
54
|
+
`);
|
|
55
|
+
return 1;
|
|
56
|
+
}
|
|
57
|
+
} catch {
|
|
58
|
+
await ctx.stderr.writeText(`cd: not a directory: ${target}
|
|
59
|
+
`);
|
|
60
|
+
return 1;
|
|
61
|
+
}
|
|
62
|
+
ctx.setCwd(resolved);
|
|
63
|
+
return 0;
|
|
64
|
+
};
|
|
65
|
+
|
|
66
|
+
//# debugId=F71D097361CBA61564756E2164756E21
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../src/commands/cd/cd.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"import type { Command } from \"../../types.cjs\";\n\nexport const cd: Command = async (ctx) => {\n if (ctx.args.length === 0) {\n return 0;\n }\n\n let target = ctx.args[0]!;\n\n if (target === \"-\") {\n const oldpwd = ctx.env.OLDPWD;\n if (!oldpwd) {\n await ctx.stderr.writeText(\"cd: OLDPWD not set\\n\");\n return 1;\n }\n target = oldpwd;\n }\n\n const resolved = ctx.fs.resolve(ctx.cwd, target);\n\n try {\n const stat = await ctx.fs.stat(resolved);\n if (!stat.isDirectory()) {\n await ctx.stderr.writeText(`cd: not a directory: ${target}\\n`);\n return 1;\n }\n } catch {\n await ctx.stderr.writeText(`cd: not a directory: ${target}\\n`);\n return 1;\n }\n\n ctx.setCwd(resolved);\n\n return 0;\n};\n"
|
|
6
|
+
],
|
|
7
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEO,IAAM,KAAc,OAAO,QAAQ;AAAA,EACxC,IAAI,IAAI,KAAK,WAAW,GAAG;AAAA,IACzB,OAAO;AAAA,EACT;AAAA,EAEA,IAAI,SAAS,IAAI,KAAK;AAAA,EAEtB,IAAI,WAAW,KAAK;AAAA,IAClB,MAAM,SAAS,IAAI,IAAI;AAAA,IACvB,IAAI,CAAC,QAAQ;AAAA,MACX,MAAM,IAAI,OAAO,UAAU;AAAA,CAAsB;AAAA,MACjD,OAAO;AAAA,IACT;AAAA,IACA,SAAS;AAAA,EACX;AAAA,EAEA,MAAM,WAAW,IAAI,GAAG,QAAQ,IAAI,KAAK,MAAM;AAAA,EAE/C,IAAI;AAAA,IACF,MAAM,OAAO,MAAM,IAAI,GAAG,KAAK,QAAQ;AAAA,IACvC,IAAI,CAAC,KAAK,YAAY,GAAG;AAAA,MACvB,MAAM,IAAI,OAAO,UAAU,wBAAwB;AAAA,CAAU;AAAA,MAC7D,OAAO;AAAA,IACT;AAAA,IACA,MAAM;AAAA,IACN,MAAM,IAAI,OAAO,UAAU,wBAAwB;AAAA,CAAU;AAAA,IAC7D,OAAO;AAAA;AAAA,EAGT,IAAI,OAAO,QAAQ;AAAA,EAEnB,OAAO;AAAA;",
|
|
8
|
+
"debugId": "F71D097361CBA61564756E2164756E21",
|
|
9
|
+
"names": []
|
|
10
|
+
}
|
|
@@ -33,6 +33,7 @@ __export(exports_commands, {
|
|
|
33
33
|
uniq: () => import_uniq.uniq,
|
|
34
34
|
trueCmd: () => import_true_false.trueCmd,
|
|
35
35
|
tree: () => import_tree.tree,
|
|
36
|
+
tr: () => import_tr.tr,
|
|
36
37
|
touch: () => import_touch.touch,
|
|
37
38
|
test: () => import_test.test,
|
|
38
39
|
tee: () => import_tee.tee,
|
|
@@ -52,6 +53,7 @@ __export(exports_commands, {
|
|
|
52
53
|
cp: () => import_cp.cp,
|
|
53
54
|
continueCmd: () => import_break_continue.continueCmd,
|
|
54
55
|
colon: () => import_colon.colon,
|
|
56
|
+
cd: () => import_cd.cd,
|
|
55
57
|
cat: () => import_cat.cat,
|
|
56
58
|
builtinCommands: () => builtinCommands,
|
|
57
59
|
breakCmd: () => import_break_continue.breakCmd,
|
|
@@ -83,6 +85,8 @@ var import_sed = require("./sed/sed.cjs");
|
|
|
83
85
|
var import_awk = require("./awk/awk.cjs");
|
|
84
86
|
var import_break_continue = require("./break-continue/break-continue.cjs");
|
|
85
87
|
var import_colon = require("./colon/colon.cjs");
|
|
88
|
+
var import_cd = require("./cd/cd.cjs");
|
|
89
|
+
var import_tr = require("./tr/tr.cjs");
|
|
86
90
|
var import_echo2 = require("./echo/echo.cjs");
|
|
87
91
|
var import_cat2 = require("./cat/cat.cjs");
|
|
88
92
|
var import_grep2 = require("./grep/grep.cjs");
|
|
@@ -107,6 +111,8 @@ var import_sed2 = require("./sed/sed.cjs");
|
|
|
107
111
|
var import_awk2 = require("./awk/awk.cjs");
|
|
108
112
|
var import_break_continue2 = require("./break-continue/break-continue.cjs");
|
|
109
113
|
var import_colon2 = require("./colon/colon.cjs");
|
|
114
|
+
var import_cd2 = require("./cd/cd.cjs");
|
|
115
|
+
var import_tr2 = require("./tr/tr.cjs");
|
|
110
116
|
var builtinCommands = {
|
|
111
117
|
echo: import_echo2.echo,
|
|
112
118
|
cat: import_cat2.cat,
|
|
@@ -134,7 +140,9 @@ var builtinCommands = {
|
|
|
134
140
|
awk: import_awk2.awk,
|
|
135
141
|
break: import_break_continue2.breakCmd,
|
|
136
142
|
continue: import_break_continue2.continueCmd,
|
|
137
|
-
":": import_colon2.colon
|
|
143
|
+
":": import_colon2.colon,
|
|
144
|
+
cd: import_cd2.cd,
|
|
145
|
+
tr: import_tr2.tr
|
|
138
146
|
};
|
|
139
147
|
|
|
140
|
-
//# debugId=
|
|
148
|
+
//# debugId=17598CDDC0006B1664756E2164756E21
|
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/commands/index.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
|
-
"import type { Command } from \"../types.cjs\";\n\nexport { echo } from \"./echo/echo.cjs\";\nexport { cat } from \"./cat/cat.cjs\";\nexport { grep } from \"./grep/grep.cjs\";\nexport { wc } from \"./wc/wc.cjs\";\nexport { head } from \"./head/head.cjs\";\nexport { tail } from \"./tail/tail.cjs\";\nexport { sort } from \"./sort/sort.cjs\";\nexport { uniq } from \"./uniq/uniq.cjs\";\nexport { pwd } from \"./pwd/pwd.cjs\";\nexport { ls } from \"./ls/ls.cjs\";\nexport { mkdir } from \"./mkdir/mkdir.cjs\";\nexport { rm } from \"./rm/rm.cjs\";\nexport { test, bracket } from \"./test/test.cjs\";\nexport { trueCmd, falseCmd } from \"./true-false/true-false.cjs\";\nexport { touch } from \"./touch/touch.cjs\";\nexport { cp } from \"./cp/cp.cjs\";\nexport { mv } from \"./mv/mv.cjs\";\nexport { tee } from \"./tee/tee.cjs\";\nexport { tree } from \"./tree/tree.cjs\";\nexport { find } from \"./find/find.cjs\";\nexport { sed } from \"./sed/sed.cjs\";\nexport { awk } from \"./awk/awk.cjs\";\nexport { breakCmd, continueCmd } from \"./break-continue/break-continue.cjs\";\nexport { colon } from \"./colon/colon.cjs\";\n\n// Re-export all commands as a bundle\nimport { echo } from \"./echo/echo.cjs\";\nimport { cat } from \"./cat/cat.cjs\";\nimport { grep } from \"./grep/grep.cjs\";\nimport { wc } from \"./wc/wc.cjs\";\nimport { head } from \"./head/head.cjs\";\nimport { tail } from \"./tail/tail.cjs\";\nimport { sort } from \"./sort/sort.cjs\";\nimport { uniq } from \"./uniq/uniq.cjs\";\nimport { pwd } from \"./pwd/pwd.cjs\";\nimport { ls } from \"./ls/ls.cjs\";\nimport { mkdir } from \"./mkdir/mkdir.cjs\";\nimport { rm } from \"./rm/rm.cjs\";\nimport { test, bracket } from \"./test/test.cjs\";\nimport { trueCmd, falseCmd } from \"./true-false/true-false.cjs\";\nimport { touch } from \"./touch/touch.cjs\";\nimport { cp } from \"./cp/cp.cjs\";\nimport { mv } from \"./mv/mv.cjs\";\nimport { tee } from \"./tee/tee.cjs\";\nimport { tree } from \"./tree/tree.cjs\";\nimport { find } from \"./find/find.cjs\";\nimport { sed } from \"./sed/sed.cjs\";\nimport { awk } from \"./awk/awk.cjs\";\nimport { breakCmd, continueCmd } from \"./break-continue/break-continue.cjs\";\nimport { colon } from \"./colon/colon.cjs\";\n\nexport const builtinCommands: Record<string, Command> = {\n echo,\n cat,\n grep,\n wc,\n head,\n tail,\n sort,\n uniq,\n pwd,\n ls,\n mkdir,\n rm,\n test,\n \"[\": bracket,\n true: trueCmd,\n false: falseCmd,\n touch,\n cp,\n mv,\n tee,\n tree,\n find,\n sed,\n awk,\n break: breakCmd,\n continue: continueCmd,\n \":\": colon,\n};\n"
|
|
5
|
+
"import type { Command } from \"../types.cjs\";\n\nexport { echo } from \"./echo/echo.cjs\";\nexport { cat } from \"./cat/cat.cjs\";\nexport { grep } from \"./grep/grep.cjs\";\nexport { wc } from \"./wc/wc.cjs\";\nexport { head } from \"./head/head.cjs\";\nexport { tail } from \"./tail/tail.cjs\";\nexport { sort } from \"./sort/sort.cjs\";\nexport { uniq } from \"./uniq/uniq.cjs\";\nexport { pwd } from \"./pwd/pwd.cjs\";\nexport { ls } from \"./ls/ls.cjs\";\nexport { mkdir } from \"./mkdir/mkdir.cjs\";\nexport { rm } from \"./rm/rm.cjs\";\nexport { test, bracket } from \"./test/test.cjs\";\nexport { trueCmd, falseCmd } from \"./true-false/true-false.cjs\";\nexport { touch } from \"./touch/touch.cjs\";\nexport { cp } from \"./cp/cp.cjs\";\nexport { mv } from \"./mv/mv.cjs\";\nexport { tee } from \"./tee/tee.cjs\";\nexport { tree } from \"./tree/tree.cjs\";\nexport { find } from \"./find/find.cjs\";\nexport { sed } from \"./sed/sed.cjs\";\nexport { awk } from \"./awk/awk.cjs\";\nexport { breakCmd, continueCmd } from \"./break-continue/break-continue.cjs\";\nexport { colon } from \"./colon/colon.cjs\";\nexport { cd } from \"./cd/cd.cjs\";\nexport { tr } from \"./tr/tr.cjs\";\n\n// Re-export all commands as a bundle\nimport { echo } from \"./echo/echo.cjs\";\nimport { cat } from \"./cat/cat.cjs\";\nimport { grep } from \"./grep/grep.cjs\";\nimport { wc } from \"./wc/wc.cjs\";\nimport { head } from \"./head/head.cjs\";\nimport { tail } from \"./tail/tail.cjs\";\nimport { sort } from \"./sort/sort.cjs\";\nimport { uniq } from \"./uniq/uniq.cjs\";\nimport { pwd } from \"./pwd/pwd.cjs\";\nimport { ls } from \"./ls/ls.cjs\";\nimport { mkdir } from \"./mkdir/mkdir.cjs\";\nimport { rm } from \"./rm/rm.cjs\";\nimport { test, bracket } from \"./test/test.cjs\";\nimport { trueCmd, falseCmd } from \"./true-false/true-false.cjs\";\nimport { touch } from \"./touch/touch.cjs\";\nimport { cp } from \"./cp/cp.cjs\";\nimport { mv } from \"./mv/mv.cjs\";\nimport { tee } from \"./tee/tee.cjs\";\nimport { tree } from \"./tree/tree.cjs\";\nimport { find } from \"./find/find.cjs\";\nimport { sed } from \"./sed/sed.cjs\";\nimport { awk } from \"./awk/awk.cjs\";\nimport { breakCmd, continueCmd } from \"./break-continue/break-continue.cjs\";\nimport { colon } from \"./colon/colon.cjs\";\nimport { cd } from \"./cd/cd.cjs\";\nimport { tr } from \"./tr/tr.cjs\";\n\nexport const builtinCommands: Record<string, Command> = {\n echo,\n cat,\n grep,\n wc,\n head,\n tail,\n sort,\n uniq,\n pwd,\n ls,\n mkdir,\n rm,\n test,\n \"[\": bracket,\n true: trueCmd,\n false: falseCmd,\n touch,\n cp,\n mv,\n tee,\n tree,\n find,\n sed,\n awk,\n break: breakCmd,\n continue: continueCmd,\n \":\": colon,\n cd,\n tr,\n};\n"
|
|
6
6
|
],
|
|
7
|
-
"mappings": "
|
|
8
|
-
"debugId": "
|
|
7
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEqB,IAArB;AACoB,IAApB;AACqB,IAArB;AACmB,IAAnB;AACqB,IAArB;AACqB,IAArB;AACqB,IAArB;AACqB,IAArB;AACoB,IAApB;AACmB,IAAnB;AACsB,IAAtB;AACmB,IAAnB;AAC8B,IAA9B;AACkC,IAAlC;AACsB,IAAtB;AACmB,IAAnB;AACmB,IAAnB;AACoB,IAApB;AACqB,IAArB;AACqB,IAArB;AACoB,IAApB;AACoB,IAApB;AACsC,IAAtC;AACsB,IAAtB;AACmB,IAAnB;AACmB,IAAnB;AAGqB,IAArB;AACoB,IAApB;AACqB,IAArB;AACmB,IAAnB;AACqB,IAArB;AACqB,IAArB;AACqB,IAArB;AACqB,IAArB;AACoB,IAApB;AACmB,IAAnB;AACsB,IAAtB;AACmB,IAAnB;AAC8B,IAA9B;AACkC,IAAlC;AACsB,IAAtB;AACmB,IAAnB;AACmB,IAAnB;AACoB,IAApB;AACqB,IAArB;AACqB,IAArB;AACoB,IAApB;AACoB,IAApB;AACsC,IAAtC;AACsB,IAAtB;AACmB,IAAnB;AACmB,IAAnB;AAEO,IAAM,kBAA2C;AAAA,EACtD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,KAAK;AAAA,EACL,MAAM;AAAA,EACN,OAAO;AAAA,EACP;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,OAAO;AAAA,EACP,UAAU;AAAA,EACV,KAAK;AAAA,EACL;AAAA,EACA;AACF;",
|
|
8
|
+
"debugId": "17598CDDC0006B1664756E2164756E21",
|
|
9
9
|
"names": []
|
|
10
10
|
}
|
|
@@ -38,11 +38,12 @@ var spec = {
|
|
|
38
38
|
flags: [
|
|
39
39
|
{ short: "a", long: "all" },
|
|
40
40
|
{ short: "l" },
|
|
41
|
-
{ short: "1" }
|
|
41
|
+
{ short: "1" },
|
|
42
|
+
{ short: "R" }
|
|
42
43
|
],
|
|
43
|
-
usage: "ls [-
|
|
44
|
+
usage: "ls [-alR1] [file ...]"
|
|
44
45
|
};
|
|
45
|
-
var defaults = { all: false, long: false, onePerLine: false };
|
|
46
|
+
var defaults = { all: false, long: false, onePerLine: false, recursive: false };
|
|
46
47
|
var handler = (flags, flag) => {
|
|
47
48
|
if (flag.short === "a")
|
|
48
49
|
flags.all = true;
|
|
@@ -50,6 +51,8 @@ var handler = (flags, flag) => {
|
|
|
50
51
|
flags.long = true;
|
|
51
52
|
if (flag.short === "1")
|
|
52
53
|
flags.onePerLine = true;
|
|
54
|
+
if (flag.short === "R")
|
|
55
|
+
flags.recursive = true;
|
|
53
56
|
};
|
|
54
57
|
var parser = import_flag_parser.createFlagParser(spec, defaults, handler);
|
|
55
58
|
var ls = async (ctx) => {
|
|
@@ -58,8 +61,63 @@ var ls = async (ctx) => {
|
|
|
58
61
|
await parser.writeError(result.error, ctx.stderr);
|
|
59
62
|
return 1;
|
|
60
63
|
}
|
|
61
|
-
const { all: showAll, long: longFormat, onePerLine } = result.flags;
|
|
64
|
+
const { all: showAll, long: longFormat, onePerLine, recursive } = result.flags;
|
|
62
65
|
const paths = result.args.length === 0 ? ["."] : result.args;
|
|
66
|
+
let needsBlankLine = false;
|
|
67
|
+
const listDir = async (dirPath, displayPath, showHeader) => {
|
|
68
|
+
if (needsBlankLine)
|
|
69
|
+
await ctx.stdout.writeText(`
|
|
70
|
+
`);
|
|
71
|
+
needsBlankLine = true;
|
|
72
|
+
if (showHeader) {
|
|
73
|
+
await ctx.stdout.writeText(`${displayPath}:
|
|
74
|
+
`);
|
|
75
|
+
}
|
|
76
|
+
let entries = await ctx.fs.readdir(dirPath);
|
|
77
|
+
if (!showAll) {
|
|
78
|
+
entries = entries.filter((e) => !e.startsWith("."));
|
|
79
|
+
}
|
|
80
|
+
entries.sort();
|
|
81
|
+
if (longFormat) {
|
|
82
|
+
for (const entry of entries) {
|
|
83
|
+
const entryPath = ctx.fs.resolve(dirPath, entry);
|
|
84
|
+
try {
|
|
85
|
+
const entryStat = await ctx.fs.stat(entryPath);
|
|
86
|
+
const type = entryStat.isDirectory() ? "d" : "-";
|
|
87
|
+
const perms = "rwxr-xr-x";
|
|
88
|
+
const size = String(entryStat.size).padStart(8);
|
|
89
|
+
const date = entryStat.mtime.toISOString().slice(0, 10);
|
|
90
|
+
await ctx.stdout.writeText(`${type}${perms} ${size} ${date} ${entry}
|
|
91
|
+
`);
|
|
92
|
+
} catch {
|
|
93
|
+
await ctx.stdout.writeText(`?????????? ${entry}
|
|
94
|
+
`);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
} else if (onePerLine) {
|
|
98
|
+
for (const entry of entries) {
|
|
99
|
+
await ctx.stdout.writeText(entry + `
|
|
100
|
+
`);
|
|
101
|
+
}
|
|
102
|
+
} else {
|
|
103
|
+
if (entries.length > 0) {
|
|
104
|
+
await ctx.stdout.writeText(entries.join(" ") + `
|
|
105
|
+
`);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
if (recursive) {
|
|
109
|
+
for (const entry of entries) {
|
|
110
|
+
const entryPath = ctx.fs.resolve(dirPath, entry);
|
|
111
|
+
try {
|
|
112
|
+
const entryStat = await ctx.fs.stat(entryPath);
|
|
113
|
+
if (entryStat.isDirectory()) {
|
|
114
|
+
const subDisplay = displayPath === "." ? entry : `${displayPath}/${entry}`;
|
|
115
|
+
await listDir(entryPath, subDisplay, true);
|
|
116
|
+
}
|
|
117
|
+
} catch {}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
};
|
|
63
121
|
for (let i = 0;i < paths.length; i++) {
|
|
64
122
|
const pathArg = paths[i];
|
|
65
123
|
const path = ctx.fs.resolve(ctx.cwd, pathArg);
|
|
@@ -70,43 +128,8 @@ var ls = async (ctx) => {
|
|
|
70
128
|
`);
|
|
71
129
|
continue;
|
|
72
130
|
}
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
await ctx.stdout.writeText(`
|
|
76
|
-
`);
|
|
77
|
-
await ctx.stdout.writeText(`${pathArg}:
|
|
78
|
-
`);
|
|
79
|
-
}
|
|
80
|
-
let entries = await ctx.fs.readdir(path);
|
|
81
|
-
if (!showAll) {
|
|
82
|
-
entries = entries.filter((e) => !e.startsWith("."));
|
|
83
|
-
}
|
|
84
|
-
entries.sort();
|
|
85
|
-
if (longFormat) {
|
|
86
|
-
for (const entry of entries) {
|
|
87
|
-
const entryPath = ctx.fs.resolve(path, entry);
|
|
88
|
-
try {
|
|
89
|
-
const entryStat = await ctx.fs.stat(entryPath);
|
|
90
|
-
const type = entryStat.isDirectory() ? "d" : "-";
|
|
91
|
-
const perms = "rwxr-xr-x";
|
|
92
|
-
const size = String(entryStat.size).padStart(8);
|
|
93
|
-
const date = entryStat.mtime.toISOString().slice(0, 10);
|
|
94
|
-
await ctx.stdout.writeText(`${type}${perms} ${size} ${date} ${entry}
|
|
95
|
-
`);
|
|
96
|
-
} catch {
|
|
97
|
-
await ctx.stdout.writeText(`?????????? ${entry}
|
|
98
|
-
`);
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
} else if (onePerLine) {
|
|
102
|
-
for (const entry of entries) {
|
|
103
|
-
await ctx.stdout.writeText(entry + `
|
|
104
|
-
`);
|
|
105
|
-
}
|
|
106
|
-
} else {
|
|
107
|
-
await ctx.stdout.writeText(entries.join(" ") + `
|
|
108
|
-
`);
|
|
109
|
-
}
|
|
131
|
+
const showHeader = recursive || paths.length > 1;
|
|
132
|
+
await listDir(path, pathArg, showHeader);
|
|
110
133
|
} catch (err) {
|
|
111
134
|
await ctx.stderr.writeText(`ls: cannot access '${pathArg}': No such file or directory
|
|
112
135
|
`);
|
|
@@ -116,4 +139,4 @@ var ls = async (ctx) => {
|
|
|
116
139
|
return 0;
|
|
117
140
|
};
|
|
118
141
|
|
|
119
|
-
//# debugId=
|
|
142
|
+
//# debugId=5A080C64ADFFC97C64756E2164756E21
|
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../src/commands/ls/ls.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
|
-
"import type { Command } from \"../../types.cjs\";\nimport { createFlagParser, type FlagDefinition } from \"../../utils/flag-parser.cjs\";\n\ninterface LsFlags {\n all: boolean;\n long: boolean;\n onePerLine: boolean;\n}\n\nconst spec = {\n name: \"ls\",\n flags: [\n { short: \"a\", long: \"all\" },\n { short: \"l\" },\n { short: \"1\" },\n ] as FlagDefinition[],\n usage: \"ls [-
|
|
5
|
+
"import type { Command } from \"../../types.cjs\";\nimport { createFlagParser, type FlagDefinition } from \"../../utils/flag-parser.cjs\";\n\ninterface LsFlags {\n all: boolean;\n long: boolean;\n onePerLine: boolean;\n recursive: boolean;\n}\n\nconst spec = {\n name: \"ls\",\n flags: [\n { short: \"a\", long: \"all\" },\n { short: \"l\" },\n { short: \"1\" },\n { short: \"R\" },\n ] as FlagDefinition[],\n usage: \"ls [-alR1] [file ...]\",\n};\n\nconst defaults: LsFlags = { all: false, long: false, onePerLine: false, recursive: false };\n\nconst handler = (flags: LsFlags, flag: FlagDefinition) => {\n if (flag.short === \"a\") flags.all = true;\n if (flag.short === \"l\") flags.long = true;\n if (flag.short === \"1\") flags.onePerLine = true;\n if (flag.short === \"R\") flags.recursive = true;\n};\n\nconst parser = createFlagParser(spec, defaults, handler);\n\nexport const ls: Command = async (ctx) => {\n const result = parser.parse(ctx.args);\n\n if (result.error) {\n await parser.writeError(result.error, ctx.stderr);\n return 1;\n }\n\n const { all: showAll, long: longFormat, onePerLine, recursive } = result.flags;\n const paths = result.args.length === 0 ? [\".\"] : result.args;\n let needsBlankLine = false;\n\n const listDir = async (dirPath: string, displayPath: string, showHeader: boolean) => {\n if (needsBlankLine) await ctx.stdout.writeText(\"\\n\");\n needsBlankLine = true;\n\n if (showHeader) {\n await ctx.stdout.writeText(`${displayPath}:\\n`);\n }\n\n let entries = await ctx.fs.readdir(dirPath);\n\n if (!showAll) {\n entries = entries.filter((e) => !e.startsWith(\".\"));\n }\n\n entries.sort();\n\n if (longFormat) {\n for (const entry of entries) {\n const entryPath = ctx.fs.resolve(dirPath, entry);\n try {\n const entryStat = await ctx.fs.stat(entryPath);\n const type = entryStat.isDirectory() ? \"d\" : \"-\";\n const perms = \"rwxr-xr-x\";\n const size = String(entryStat.size).padStart(8);\n const date = entryStat.mtime.toISOString().slice(0, 10);\n await ctx.stdout.writeText(`${type}${perms} ${size} ${date} ${entry}\\n`);\n } catch {\n await ctx.stdout.writeText(`?????????? ${entry}\\n`);\n }\n }\n } else if (onePerLine) {\n for (const entry of entries) {\n await ctx.stdout.writeText(entry + \"\\n\");\n }\n } else {\n if (entries.length > 0) {\n await ctx.stdout.writeText(entries.join(\" \") + \"\\n\");\n }\n }\n\n if (recursive) {\n for (const entry of entries) {\n const entryPath = ctx.fs.resolve(dirPath, entry);\n try {\n const entryStat = await ctx.fs.stat(entryPath);\n if (entryStat.isDirectory()) {\n const subDisplay = displayPath === \".\" ? entry : `${displayPath}/${entry}`;\n await listDir(entryPath, subDisplay, true);\n }\n } catch {\n // skip entries we can't stat\n }\n }\n }\n };\n\n for (let i = 0; i < paths.length; i++) {\n const pathArg = paths[i]!;\n const path = ctx.fs.resolve(ctx.cwd, pathArg);\n\n try {\n const stat = await ctx.fs.stat(path);\n\n if (stat.isFile()) {\n await ctx.stdout.writeText(ctx.fs.basename(path) + \"\\n\");\n continue;\n }\n\n const showHeader = recursive || paths.length > 1;\n await listDir(path, pathArg, showHeader);\n } catch (err) {\n await ctx.stderr.writeText(`ls: cannot access '${pathArg}': No such file or directory\\n`);\n return 1;\n }\n }\n\n return 0;\n};\n"
|
|
6
6
|
],
|
|
7
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACsD,IAAtD;
|
|
8
|
-
"debugId": "
|
|
7
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACsD,IAAtD;AASA,IAAM,OAAO;AAAA,EACX,MAAM;AAAA,EACN,OAAO;AAAA,IACL,EAAE,OAAO,KAAK,MAAM,MAAM;AAAA,IAC1B,EAAE,OAAO,IAAI;AAAA,IACb,EAAE,OAAO,IAAI;AAAA,IACb,EAAE,OAAO,IAAI;AAAA,EACf;AAAA,EACA,OAAO;AACT;AAEA,IAAM,WAAoB,EAAE,KAAK,OAAO,MAAM,OAAO,YAAY,OAAO,WAAW,MAAM;AAEzF,IAAM,UAAU,CAAC,OAAgB,SAAyB;AAAA,EACxD,IAAI,KAAK,UAAU;AAAA,IAAK,MAAM,MAAM;AAAA,EACpC,IAAI,KAAK,UAAU;AAAA,IAAK,MAAM,OAAO;AAAA,EACrC,IAAI,KAAK,UAAU;AAAA,IAAK,MAAM,aAAa;AAAA,EAC3C,IAAI,KAAK,UAAU;AAAA,IAAK,MAAM,YAAY;AAAA;AAG5C,IAAM,SAAS,oCAAiB,MAAM,UAAU,OAAO;AAEhD,IAAM,KAAc,OAAO,QAAQ;AAAA,EACxC,MAAM,SAAS,OAAO,MAAM,IAAI,IAAI;AAAA,EAEpC,IAAI,OAAO,OAAO;AAAA,IAChB,MAAM,OAAO,WAAW,OAAO,OAAO,IAAI,MAAM;AAAA,IAChD,OAAO;AAAA,EACT;AAAA,EAEA,QAAQ,KAAK,SAAS,MAAM,YAAY,YAAY,cAAc,OAAO;AAAA,EACzE,MAAM,QAAQ,OAAO,KAAK,WAAW,IAAI,CAAC,GAAG,IAAI,OAAO;AAAA,EACxD,IAAI,iBAAiB;AAAA,EAErB,MAAM,UAAU,OAAO,SAAiB,aAAqB,eAAwB;AAAA,IACnF,IAAI;AAAA,MAAgB,MAAM,IAAI,OAAO,UAAU;AAAA,CAAI;AAAA,IACnD,iBAAiB;AAAA,IAEjB,IAAI,YAAY;AAAA,MACd,MAAM,IAAI,OAAO,UAAU,GAAG;AAAA,CAAgB;AAAA,IAChD;AAAA,IAEA,IAAI,UAAU,MAAM,IAAI,GAAG,QAAQ,OAAO;AAAA,IAE1C,IAAI,CAAC,SAAS;AAAA,MACZ,UAAU,QAAQ,OAAO,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,CAAC;AAAA,IACpD;AAAA,IAEA,QAAQ,KAAK;AAAA,IAEb,IAAI,YAAY;AAAA,MACd,WAAW,SAAS,SAAS;AAAA,QAC3B,MAAM,YAAY,IAAI,GAAG,QAAQ,SAAS,KAAK;AAAA,QAC/C,IAAI;AAAA,UACF,MAAM,YAAY,MAAM,IAAI,GAAG,KAAK,SAAS;AAAA,UAC7C,MAAM,OAAO,UAAU,YAAY,IAAI,MAAM;AAAA,UAC7C,MAAM,QAAQ;AAAA,UACd,MAAM,OAAO,OAAO,UAAU,IAAI,EAAE,SAAS,CAAC;AAAA,UAC9C,MAAM,OAAO,UAAU,MAAM,YAAY,EAAE,MAAM,GAAG,EAAE;AAAA,UACtD,MAAM,IAAI,OAAO,UAAU,GAAG,OAAO,SAAS,QAAQ,QAAQ;AAAA,CAAS;AAAA,UACvE,MAAM;AAAA,UACN,MAAM,IAAI,OAAO,UAAU,cAAc;AAAA,CAAS;AAAA;AAAA,MAEtD;AAAA,IACF,EAAO,SAAI,YAAY;AAAA,MACrB,WAAW,SAAS,SAAS;AAAA,QAC3B,MAAM,IAAI,OAAO,UAAU,QAAQ;AAAA,CAAI;AAAA,MACzC;AAAA,IACF,EAAO;AAAA,MACL,IAAI,QAAQ,SAAS,GAAG;AAAA,QACtB,MAAM,IAAI,OAAO,UAAU,QAAQ,KAAK,IAAI,IAAI;AAAA,CAAI;AAAA,MACtD;AAAA;AAAA,IAGF,IAAI,WAAW;AAAA,MACb,WAAW,SAAS,SAAS;AAAA,QAC3B,MAAM,YAAY,IAAI,GAAG,QAAQ,SAAS,KAAK;AAAA,QAC/C,IAAI;AAAA,UACF,MAAM,YAAY,MAAM,IAAI,GAAG,KAAK,SAAS;AAAA,UAC7C,IAAI,UAAU,YAAY,GAAG;AAAA,YAC3B,MAAM,aAAa,gBAAgB,MAAM,QAAQ,GAAG,eAAe;AAAA,YACnE,MAAM,QAAQ,WAAW,YAAY,IAAI;AAAA,UAC3C;AAAA,UACA,MAAM;AAAA,MAGV;AAAA,IACF;AAAA;AAAA,EAGF,SAAS,IAAI,EAAG,IAAI,MAAM,QAAQ,KAAK;AAAA,IACrC,MAAM,UAAU,MAAM;AAAA,IACtB,MAAM,OAAO,IAAI,GAAG,QAAQ,IAAI,KAAK,OAAO;AAAA,IAE5C,IAAI;AAAA,MACF,MAAM,OAAO,MAAM,IAAI,GAAG,KAAK,IAAI;AAAA,MAEnC,IAAI,KAAK,OAAO,GAAG;AAAA,QACjB,MAAM,IAAI,OAAO,UAAU,IAAI,GAAG,SAAS,IAAI,IAAI;AAAA,CAAI;AAAA,QACvD;AAAA,MACF;AAAA,MAEA,MAAM,aAAa,aAAa,MAAM,SAAS;AAAA,MAC/C,MAAM,QAAQ,MAAM,SAAS,UAAU;AAAA,MACvC,OAAO,KAAK;AAAA,MACZ,MAAM,IAAI,OAAO,UAAU,sBAAsB;AAAA,CAAuC;AAAA,MACxF,OAAO;AAAA;AAAA,EAEX;AAAA,EAEA,OAAO;AAAA;",
|
|
8
|
+
"debugId": "5A080C64ADFFC97C64756E2164756E21",
|
|
9
9
|
"names": []
|
|
10
10
|
}
|