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.
Files changed (46) hide show
  1. package/dist/cjs/package.json +1 -1
  2. package/dist/cjs/src/commands/cd/cd.cjs +66 -0
  3. package/dist/cjs/src/commands/cd/cd.cjs.map +10 -0
  4. package/dist/cjs/src/commands/index.cjs +10 -2
  5. package/dist/cjs/src/commands/index.cjs.map +3 -3
  6. package/dist/cjs/src/commands/ls/ls.cjs +65 -42
  7. package/dist/cjs/src/commands/ls/ls.cjs.map +3 -3
  8. package/dist/cjs/src/commands/sed/sed.cjs +291 -76
  9. package/dist/cjs/src/commands/sed/sed.cjs.map +3 -3
  10. package/dist/cjs/src/commands/tr/tr.cjs +223 -0
  11. package/dist/cjs/src/commands/tr/tr.cjs.map +10 -0
  12. package/dist/cjs/src/commands/tree/tree.cjs +7 -4
  13. package/dist/cjs/src/commands/tree/tree.cjs.map +3 -3
  14. package/dist/cjs/src/interpreter/context.cjs +3 -2
  15. package/dist/cjs/src/interpreter/context.cjs.map +3 -3
  16. package/dist/cjs/src/interpreter/interpreter.cjs +4 -2
  17. package/dist/cjs/src/interpreter/interpreter.cjs.map +3 -3
  18. package/dist/cjs/src/parser/parser.cjs +11 -2
  19. package/dist/cjs/src/parser/parser.cjs.map +3 -3
  20. package/dist/cjs/src/types.cjs.map +2 -2
  21. package/dist/mjs/package.json +1 -1
  22. package/dist/mjs/src/commands/cd/cd.mjs +36 -0
  23. package/dist/mjs/src/commands/cd/cd.mjs.map +10 -0
  24. package/dist/mjs/src/commands/index.mjs +10 -2
  25. package/dist/mjs/src/commands/index.mjs.map +3 -3
  26. package/dist/mjs/src/commands/ls/ls.mjs +65 -42
  27. package/dist/mjs/src/commands/ls/ls.mjs.map +3 -3
  28. package/dist/mjs/src/commands/sed/sed.mjs +291 -76
  29. package/dist/mjs/src/commands/sed/sed.mjs.map +3 -3
  30. package/dist/mjs/src/commands/tr/tr.mjs +193 -0
  31. package/dist/mjs/src/commands/tr/tr.mjs.map +10 -0
  32. package/dist/mjs/src/commands/tree/tree.mjs +7 -4
  33. package/dist/mjs/src/commands/tree/tree.mjs.map +3 -3
  34. package/dist/mjs/src/interpreter/context.mjs +3 -2
  35. package/dist/mjs/src/interpreter/context.mjs.map +3 -3
  36. package/dist/mjs/src/interpreter/interpreter.mjs +4 -2
  37. package/dist/mjs/src/interpreter/interpreter.mjs.map +3 -3
  38. package/dist/mjs/src/parser/parser.mjs +11 -2
  39. package/dist/mjs/src/parser/parser.mjs.map +3 -3
  40. package/dist/mjs/src/types.mjs.map +2 -2
  41. package/dist/types/src/commands/cd/cd.d.ts +2 -0
  42. package/dist/types/src/commands/index.d.ts +2 -0
  43. package/dist/types/src/commands/tr/tr.d.ts +2 -0
  44. package/dist/types/src/interpreter/context.d.ts +1 -0
  45. package/dist/types/src/types.d.ts +1 -0
  46. package/package.json +1 -1
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "name": "shell-dsl",
3
- "version": "0.0.14",
3
+ "version": "0.0.16",
4
4
  "type": "commonjs"
5
5
  }
@@ -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=A797E42D013860AF64756E2164756E21
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": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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;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;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;AACP;",
8
- "debugId": "A797E42D013860AF64756E2164756E21",
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 [-al1] [file ...]"
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
- if (paths.length > 1) {
74
- if (i > 0)
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=4890CAC52EAF1A2264756E2164756E21
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 [-al1] [file ...]\",\n};\n\nconst defaults: LsFlags = { all: false, long: false, onePerLine: 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};\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 } = result.flags;\n const paths = result.args.length === 0 ? [\".\"] : result.args;\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 // It's a file, just print the name\n await ctx.stdout.writeText(ctx.fs.basename(path) + \"\\n\");\n continue;\n }\n\n // It's a directory\n if (paths.length > 1) {\n if (i > 0) await ctx.stdout.writeText(\"\\n\");\n await ctx.stdout.writeText(`${pathArg}:\\n`);\n }\n\n let entries = await ctx.fs.readdir(path);\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(path, entry);\n try {\n const entryStat = await ctx.fs.stat(entryPath);\n const type = entryStat.isDirectory() ? \"d\" : \"-\";\n const perms = \"rwxr-xr-x\"; // Simplified permissions\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 // Default: space-separated\n await ctx.stdout.writeText(entries.join(\" \") + \"\\n\");\n }\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"
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": "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",
8
- "debugId": "4890CAC52EAF1A2264756E2164756E21",
7
+ "mappings": "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",
8
+ "debugId": "5A080C64ADFFC97C64756E2164756E21",
9
9
  "names": []
10
10
  }