shell-dsl 0.0.7 → 0.0.8

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 (197) hide show
  1. package/README.md +3 -1
  2. package/dist/cjs/index.cjs +14 -4
  3. package/dist/cjs/index.cjs.map +3 -3
  4. package/dist/cjs/package.json +1 -1
  5. package/dist/cjs/src/commands/awk/awk.cjs +276 -0
  6. package/dist/cjs/src/commands/awk/awk.cjs.map +10 -0
  7. package/dist/cjs/src/commands/break-continue/break-continue.cjs +56 -0
  8. package/dist/cjs/src/commands/break-continue/break-continue.cjs.map +10 -0
  9. package/dist/cjs/src/commands/cat/cat.cjs +57 -0
  10. package/dist/cjs/src/commands/cat/cat.cjs.map +10 -0
  11. package/dist/cjs/src/commands/cp/cp.cjs +126 -0
  12. package/dist/cjs/src/commands/cp/cp.cjs.map +10 -0
  13. package/dist/cjs/src/commands/echo/echo.cjs +50 -0
  14. package/dist/cjs/src/commands/echo/echo.cjs.map +10 -0
  15. package/dist/cjs/src/commands/find/find.cjs +251 -0
  16. package/dist/cjs/src/commands/find/find.cjs.map +10 -0
  17. package/dist/cjs/src/commands/grep/grep.cjs +510 -0
  18. package/dist/cjs/src/commands/grep/grep.cjs.map +10 -0
  19. package/dist/cjs/src/commands/head/head.cjs +95 -0
  20. package/dist/cjs/src/commands/head/head.cjs.map +10 -0
  21. package/dist/cjs/src/commands/index.cjs +136 -0
  22. package/dist/cjs/src/commands/index.cjs.map +10 -0
  23. package/dist/cjs/src/commands/ls/ls.cjs +119 -0
  24. package/dist/cjs/src/commands/ls/ls.cjs.map +10 -0
  25. package/dist/cjs/src/commands/mkdir/mkdir.cjs +64 -0
  26. package/dist/cjs/src/commands/mkdir/mkdir.cjs.map +10 -0
  27. package/dist/cjs/src/commands/mv/mv.cjs +118 -0
  28. package/dist/cjs/src/commands/mv/mv.cjs.map +10 -0
  29. package/dist/cjs/src/commands/pwd/pwd.cjs +41 -0
  30. package/dist/cjs/src/commands/pwd/pwd.cjs.map +10 -0
  31. package/dist/cjs/src/commands/rm/rm.cjs +82 -0
  32. package/dist/cjs/src/commands/rm/rm.cjs.map +10 -0
  33. package/dist/cjs/src/commands/sed/sed.cjs +218 -0
  34. package/dist/cjs/src/commands/sed/sed.cjs.map +10 -0
  35. package/dist/cjs/src/commands/sort/sort.cjs +105 -0
  36. package/dist/cjs/src/commands/sort/sort.cjs.map +10 -0
  37. package/dist/cjs/src/commands/tail/tail.cjs +95 -0
  38. package/dist/cjs/src/commands/tail/tail.cjs.map +10 -0
  39. package/dist/cjs/src/commands/tee/tee.cjs +65 -0
  40. package/dist/cjs/src/commands/tee/tee.cjs.map +10 -0
  41. package/dist/cjs/src/commands/test/test.cjs +148 -0
  42. package/dist/cjs/src/commands/test/test.cjs.map +10 -0
  43. package/dist/cjs/src/commands/touch/touch.cjs +70 -0
  44. package/dist/cjs/src/commands/touch/touch.cjs.map +10 -0
  45. package/dist/cjs/src/commands/tree/tree.cjs +161 -0
  46. package/dist/cjs/src/commands/tree/tree.cjs.map +10 -0
  47. package/dist/cjs/src/commands/true-false/true-false.cjs +43 -0
  48. package/dist/cjs/src/commands/true-false/true-false.cjs.map +10 -0
  49. package/dist/cjs/src/commands/uniq/uniq.cjs +116 -0
  50. package/dist/cjs/src/commands/uniq/uniq.cjs.map +10 -0
  51. package/dist/cjs/src/commands/wc/wc.cjs +116 -0
  52. package/dist/cjs/src/commands/wc/wc.cjs.map +10 -0
  53. package/dist/cjs/src/index.cjs +10 -2
  54. package/dist/cjs/src/index.cjs.map +3 -3
  55. package/dist/cjs/src/interpreter/index.cjs +4 -2
  56. package/dist/cjs/src/interpreter/index.cjs.map +3 -3
  57. package/dist/cjs/src/interpreter/interpreter.cjs +381 -2
  58. package/dist/cjs/src/interpreter/interpreter.cjs.map +3 -3
  59. package/dist/cjs/src/lexer/index.cjs +3 -2
  60. package/dist/cjs/src/lexer/index.cjs.map +3 -3
  61. package/dist/cjs/src/lexer/lexer.cjs +202 -7
  62. package/dist/cjs/src/lexer/lexer.cjs.map +3 -3
  63. package/dist/cjs/src/lexer/tokens.cjs +31 -2
  64. package/dist/cjs/src/lexer/tokens.cjs.map +3 -3
  65. package/dist/cjs/src/parser/ast.cjs +25 -1
  66. package/dist/cjs/src/parser/ast.cjs.map +3 -3
  67. package/dist/cjs/src/parser/index.cjs +7 -1
  68. package/dist/cjs/src/parser/index.cjs.map +3 -3
  69. package/dist/cjs/src/parser/parser.cjs +211 -7
  70. package/dist/cjs/src/parser/parser.cjs.map +3 -3
  71. package/dist/cjs/src/shell-dsl.cjs +2 -2
  72. package/dist/cjs/src/shell-dsl.cjs.map +3 -3
  73. package/dist/mjs/index.mjs +25 -5
  74. package/dist/mjs/index.mjs.map +3 -3
  75. package/dist/mjs/package.json +1 -1
  76. package/dist/mjs/src/commands/awk/awk.mjs +246 -0
  77. package/dist/mjs/src/commands/awk/awk.mjs.map +10 -0
  78. package/dist/mjs/src/commands/break-continue/break-continue.mjs +26 -0
  79. package/dist/mjs/src/commands/break-continue/break-continue.mjs.map +10 -0
  80. package/dist/mjs/src/commands/cat/cat.mjs +27 -0
  81. package/dist/mjs/src/commands/cat/cat.mjs.map +10 -0
  82. package/dist/mjs/src/commands/cp/cp.mjs +96 -0
  83. package/dist/mjs/src/commands/cp/cp.mjs.map +10 -0
  84. package/dist/mjs/src/commands/echo/echo.mjs +20 -0
  85. package/dist/mjs/src/commands/echo/echo.mjs.map +10 -0
  86. package/dist/mjs/src/commands/find/find.mjs +221 -0
  87. package/dist/mjs/src/commands/find/find.mjs.map +10 -0
  88. package/dist/mjs/src/commands/grep/grep.mjs +480 -0
  89. package/dist/mjs/src/commands/grep/grep.mjs.map +10 -0
  90. package/dist/mjs/src/commands/head/head.mjs +65 -0
  91. package/dist/mjs/src/commands/head/head.mjs.map +10 -0
  92. package/dist/mjs/src/commands/index.mjs +106 -0
  93. package/dist/mjs/src/commands/index.mjs.map +10 -0
  94. package/dist/mjs/src/commands/ls/ls.mjs +89 -0
  95. package/dist/mjs/src/commands/ls/ls.mjs.map +10 -0
  96. package/dist/mjs/src/commands/mkdir/mkdir.mjs +34 -0
  97. package/dist/mjs/src/commands/mkdir/mkdir.mjs.map +10 -0
  98. package/dist/mjs/src/commands/mv/mv.mjs +88 -0
  99. package/dist/mjs/src/commands/mv/mv.mjs.map +10 -0
  100. package/dist/mjs/src/commands/pwd/pwd.mjs +11 -0
  101. package/dist/mjs/src/commands/pwd/pwd.mjs.map +10 -0
  102. package/dist/mjs/src/commands/rm/rm.mjs +52 -0
  103. package/dist/mjs/src/commands/rm/rm.mjs.map +10 -0
  104. package/dist/mjs/src/commands/sed/sed.mjs +188 -0
  105. package/dist/mjs/src/commands/sed/sed.mjs.map +10 -0
  106. package/dist/mjs/src/commands/sort/sort.mjs +75 -0
  107. package/dist/mjs/src/commands/sort/sort.mjs.map +10 -0
  108. package/dist/mjs/src/commands/tail/tail.mjs +65 -0
  109. package/dist/mjs/src/commands/tail/tail.mjs.map +10 -0
  110. package/dist/mjs/src/commands/tee/tee.mjs +35 -0
  111. package/dist/mjs/src/commands/tee/tee.mjs.map +10 -0
  112. package/dist/mjs/src/commands/test/test.mjs +118 -0
  113. package/dist/mjs/src/commands/test/test.mjs.map +10 -0
  114. package/dist/mjs/src/commands/touch/touch.mjs +40 -0
  115. package/dist/mjs/src/commands/touch/touch.mjs.map +10 -0
  116. package/dist/mjs/src/commands/tree/tree.mjs +131 -0
  117. package/dist/mjs/src/commands/tree/tree.mjs.map +10 -0
  118. package/dist/mjs/src/commands/true-false/true-false.mjs +13 -0
  119. package/dist/mjs/src/commands/true-false/true-false.mjs.map +10 -0
  120. package/dist/mjs/src/commands/uniq/uniq.mjs +86 -0
  121. package/dist/mjs/src/commands/uniq/uniq.mjs.map +10 -0
  122. package/dist/mjs/src/commands/wc/wc.mjs +86 -0
  123. package/dist/mjs/src/commands/wc/wc.mjs.map +10 -0
  124. package/dist/mjs/src/index.mjs +18 -4
  125. package/dist/mjs/src/index.mjs.map +3 -3
  126. package/dist/mjs/src/interpreter/index.mjs +5 -3
  127. package/dist/mjs/src/interpreter/index.mjs.map +2 -2
  128. package/dist/mjs/src/interpreter/interpreter.mjs +381 -2
  129. package/dist/mjs/src/interpreter/interpreter.mjs.map +3 -3
  130. package/dist/mjs/src/lexer/index.mjs +4 -3
  131. package/dist/mjs/src/lexer/index.mjs.map +2 -2
  132. package/dist/mjs/src/lexer/lexer.mjs +202 -7
  133. package/dist/mjs/src/lexer/lexer.mjs.map +3 -3
  134. package/dist/mjs/src/lexer/tokens.mjs +31 -2
  135. package/dist/mjs/src/lexer/tokens.mjs.map +3 -3
  136. package/dist/mjs/src/parser/ast.mjs +25 -1
  137. package/dist/mjs/src/parser/ast.mjs.map +3 -3
  138. package/dist/mjs/src/parser/index.mjs +14 -2
  139. package/dist/mjs/src/parser/index.mjs.map +3 -3
  140. package/dist/mjs/src/parser/parser.mjs +211 -7
  141. package/dist/mjs/src/parser/parser.mjs.map +3 -3
  142. package/dist/mjs/src/shell-dsl.mjs +2 -2
  143. package/dist/mjs/src/shell-dsl.mjs.map +3 -3
  144. package/dist/types/index.d.ts +2 -2
  145. package/dist/types/src/commands/awk/awk.d.ts +2 -0
  146. package/dist/types/src/commands/break-continue/break-continue.d.ts +3 -0
  147. package/dist/types/src/commands/cat/cat.d.ts +2 -0
  148. package/dist/types/src/commands/cp/cp.d.ts +2 -0
  149. package/dist/types/src/commands/echo/echo.d.ts +2 -0
  150. package/dist/types/src/commands/find/find.d.ts +2 -0
  151. package/dist/types/src/commands/grep/grep.d.ts +2 -0
  152. package/dist/types/src/commands/head/head.d.ts +2 -0
  153. package/dist/types/src/commands/index.d.ts +25 -0
  154. package/dist/types/src/commands/ls/ls.d.ts +2 -0
  155. package/dist/types/src/commands/mkdir/mkdir.d.ts +2 -0
  156. package/dist/types/src/commands/mv/mv.d.ts +2 -0
  157. package/dist/types/src/commands/pwd/pwd.d.ts +2 -0
  158. package/dist/types/src/commands/rm/rm.d.ts +2 -0
  159. package/dist/types/src/commands/sed/sed.d.ts +2 -0
  160. package/dist/types/src/commands/sort/sort.d.ts +2 -0
  161. package/dist/types/src/commands/tail/tail.d.ts +2 -0
  162. package/dist/types/src/commands/tee/tee.d.ts +2 -0
  163. package/dist/types/{commands → src/commands/test}/test.d.ts +1 -1
  164. package/dist/types/src/commands/touch/touch.d.ts +2 -0
  165. package/dist/types/src/commands/tree/tree.d.ts +2 -0
  166. package/dist/types/{commands → src/commands/true-false}/true-false.d.ts +1 -1
  167. package/dist/types/src/commands/uniq/uniq.d.ts +2 -0
  168. package/dist/types/src/commands/wc/wc.d.ts +2 -0
  169. package/dist/types/src/index.d.ts +3 -3
  170. package/dist/types/src/interpreter/index.d.ts +1 -1
  171. package/dist/types/src/interpreter/interpreter.d.ts +18 -0
  172. package/dist/types/src/lexer/index.d.ts +2 -2
  173. package/dist/types/src/lexer/lexer.d.ts +11 -2
  174. package/dist/types/src/lexer/tokens.d.ts +16 -0
  175. package/dist/types/src/parser/ast.d.ts +46 -1
  176. package/dist/types/src/parser/index.d.ts +2 -2
  177. package/dist/types/src/parser/parser.d.ts +14 -0
  178. package/package.json +1 -1
  179. package/dist/types/commands/cat.d.ts +0 -2
  180. package/dist/types/commands/cp.d.ts +0 -2
  181. package/dist/types/commands/echo.d.ts +0 -2
  182. package/dist/types/commands/find.d.ts +0 -2
  183. package/dist/types/commands/grep.d.ts +0 -2
  184. package/dist/types/commands/head.d.ts +0 -2
  185. package/dist/types/commands/index.d.ts +0 -22
  186. package/dist/types/commands/ls.d.ts +0 -2
  187. package/dist/types/commands/mkdir.d.ts +0 -2
  188. package/dist/types/commands/mv.d.ts +0 -2
  189. package/dist/types/commands/pwd.d.ts +0 -2
  190. package/dist/types/commands/rm.d.ts +0 -2
  191. package/dist/types/commands/sort.d.ts +0 -2
  192. package/dist/types/commands/tail.d.ts +0 -2
  193. package/dist/types/commands/tee.d.ts +0 -2
  194. package/dist/types/commands/touch.d.ts +0 -2
  195. package/dist/types/commands/tree.d.ts +0 -2
  196. package/dist/types/commands/uniq.d.ts +0 -2
  197. package/dist/types/commands/wc.d.ts +0 -2
@@ -0,0 +1,86 @@
1
+ // src/commands/uniq/uniq.ts
2
+ var uniq = async (ctx) => {
3
+ let countMode = false;
4
+ let duplicatesOnly = false;
5
+ let uniqueOnly = false;
6
+ const files = [];
7
+ for (const arg of ctx.args) {
8
+ if (arg === "-c") {
9
+ countMode = true;
10
+ } else if (arg === "-d") {
11
+ duplicatesOnly = true;
12
+ } else if (arg === "-u") {
13
+ uniqueOnly = true;
14
+ } else if (arg.startsWith("-")) {
15
+ for (const flag of arg.slice(1)) {
16
+ if (flag === "c")
17
+ countMode = true;
18
+ else if (flag === "d")
19
+ duplicatesOnly = true;
20
+ else if (flag === "u")
21
+ uniqueOnly = true;
22
+ }
23
+ } else {
24
+ files.push(arg);
25
+ }
26
+ }
27
+ let lines = [];
28
+ if (files.length === 0) {
29
+ for await (const line of ctx.stdin.lines()) {
30
+ lines.push(line);
31
+ }
32
+ } else {
33
+ const file = files[0];
34
+ try {
35
+ const path = ctx.fs.resolve(ctx.cwd, file);
36
+ const content = (await ctx.fs.readFile(path)).toString();
37
+ lines = content.split(`
38
+ `);
39
+ if (lines[lines.length - 1] === "") {
40
+ lines.pop();
41
+ }
42
+ } catch (err) {
43
+ await ctx.stderr.writeText(`uniq: ${file}: No such file or directory
44
+ `);
45
+ return 1;
46
+ }
47
+ }
48
+ const results = [];
49
+ let currentLine = null;
50
+ let currentCount = 0;
51
+ for (const line of lines) {
52
+ if (line === currentLine) {
53
+ currentCount++;
54
+ } else {
55
+ if (currentLine !== null) {
56
+ results.push({ line: currentLine, count: currentCount });
57
+ }
58
+ currentLine = line;
59
+ currentCount = 1;
60
+ }
61
+ }
62
+ if (currentLine !== null) {
63
+ results.push({ line: currentLine, count: currentCount });
64
+ }
65
+ for (const { line, count } of results) {
66
+ const isDuplicate = count > 1;
67
+ const isUnique = count === 1;
68
+ if (duplicatesOnly && !isDuplicate)
69
+ continue;
70
+ if (uniqueOnly && !isUnique)
71
+ continue;
72
+ if (countMode) {
73
+ await ctx.stdout.writeText(`${String(count).padStart(7)} ${line}
74
+ `);
75
+ } else {
76
+ await ctx.stdout.writeText(line + `
77
+ `);
78
+ }
79
+ }
80
+ return 0;
81
+ };
82
+ export {
83
+ uniq
84
+ };
85
+
86
+ //# debugId=7EE1149CCDA4E33564756E2164756E21
@@ -0,0 +1,10 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/commands/uniq/uniq.ts"],
4
+ "sourcesContent": [
5
+ "import type { Command } from \"../../types.mjs\";\n\nexport const uniq: Command = async (ctx) => {\n let countMode = false;\n let duplicatesOnly = false;\n let uniqueOnly = false;\n const files: string[] = [];\n\n // Parse arguments\n for (const arg of ctx.args) {\n if (arg === \"-c\") {\n countMode = true;\n } else if (arg === \"-d\") {\n duplicatesOnly = true;\n } else if (arg === \"-u\") {\n uniqueOnly = true;\n } else if (arg.startsWith(\"-\")) {\n for (const flag of arg.slice(1)) {\n if (flag === \"c\") countMode = true;\n else if (flag === \"d\") duplicatesOnly = true;\n else if (flag === \"u\") uniqueOnly = true;\n }\n } else {\n files.push(arg);\n }\n }\n\n let lines: string[] = [];\n\n if (files.length === 0) {\n for await (const line of ctx.stdin.lines()) {\n lines.push(line);\n }\n } else {\n const file = files[0]!;\n try {\n const path = ctx.fs.resolve(ctx.cwd, file);\n const content = (await ctx.fs.readFile(path)).toString();\n lines = content.split(\"\\n\");\n if (lines[lines.length - 1] === \"\") {\n lines.pop();\n }\n } catch (err) {\n await ctx.stderr.writeText(`uniq: ${file}: No such file or directory\\n`);\n return 1;\n }\n }\n\n // Process lines\n const results: Array<{ line: string; count: number }> = [];\n let currentLine: string | null = null;\n let currentCount = 0;\n\n for (const line of lines) {\n if (line === currentLine) {\n currentCount++;\n } else {\n if (currentLine !== null) {\n results.push({ line: currentLine, count: currentCount });\n }\n currentLine = line;\n currentCount = 1;\n }\n }\n if (currentLine !== null) {\n results.push({ line: currentLine, count: currentCount });\n }\n\n // Output\n for (const { line, count } of results) {\n const isDuplicate = count > 1;\n const isUnique = count === 1;\n\n if (duplicatesOnly && !isDuplicate) continue;\n if (uniqueOnly && !isUnique) continue;\n\n if (countMode) {\n await ctx.stdout.writeText(`${String(count).padStart(7)} ${line}\\n`);\n } else {\n await ctx.stdout.writeText(line + \"\\n\");\n }\n }\n\n return 0;\n};\n"
6
+ ],
7
+ "mappings": ";AAEO,IAAM,OAAgB,OAAO,QAAQ;AAAA,EAC1C,IAAI,YAAY;AAAA,EAChB,IAAI,iBAAiB;AAAA,EACrB,IAAI,aAAa;AAAA,EACjB,MAAM,QAAkB,CAAC;AAAA,EAGzB,WAAW,OAAO,IAAI,MAAM;AAAA,IAC1B,IAAI,QAAQ,MAAM;AAAA,MAChB,YAAY;AAAA,IACd,EAAO,SAAI,QAAQ,MAAM;AAAA,MACvB,iBAAiB;AAAA,IACnB,EAAO,SAAI,QAAQ,MAAM;AAAA,MACvB,aAAa;AAAA,IACf,EAAO,SAAI,IAAI,WAAW,GAAG,GAAG;AAAA,MAC9B,WAAW,QAAQ,IAAI,MAAM,CAAC,GAAG;AAAA,QAC/B,IAAI,SAAS;AAAA,UAAK,YAAY;AAAA,QACzB,SAAI,SAAS;AAAA,UAAK,iBAAiB;AAAA,QACnC,SAAI,SAAS;AAAA,UAAK,aAAa;AAAA,MACtC;AAAA,IACF,EAAO;AAAA,MACL,MAAM,KAAK,GAAG;AAAA;AAAA,EAElB;AAAA,EAEA,IAAI,QAAkB,CAAC;AAAA,EAEvB,IAAI,MAAM,WAAW,GAAG;AAAA,IACtB,iBAAiB,QAAQ,IAAI,MAAM,MAAM,GAAG;AAAA,MAC1C,MAAM,KAAK,IAAI;AAAA,IACjB;AAAA,EACF,EAAO;AAAA,IACL,MAAM,OAAO,MAAM;AAAA,IACnB,IAAI;AAAA,MACF,MAAM,OAAO,IAAI,GAAG,QAAQ,IAAI,KAAK,IAAI;AAAA,MACzC,MAAM,WAAW,MAAM,IAAI,GAAG,SAAS,IAAI,GAAG,SAAS;AAAA,MACvD,QAAQ,QAAQ,MAAM;AAAA,CAAI;AAAA,MAC1B,IAAI,MAAM,MAAM,SAAS,OAAO,IAAI;AAAA,QAClC,MAAM,IAAI;AAAA,MACZ;AAAA,MACA,OAAO,KAAK;AAAA,MACZ,MAAM,IAAI,OAAO,UAAU,SAAS;AAAA,CAAmC;AAAA,MACvE,OAAO;AAAA;AAAA;AAAA,EAKX,MAAM,UAAkD,CAAC;AAAA,EACzD,IAAI,cAA6B;AAAA,EACjC,IAAI,eAAe;AAAA,EAEnB,WAAW,QAAQ,OAAO;AAAA,IACxB,IAAI,SAAS,aAAa;AAAA,MACxB;AAAA,IACF,EAAO;AAAA,MACL,IAAI,gBAAgB,MAAM;AAAA,QACxB,QAAQ,KAAK,EAAE,MAAM,aAAa,OAAO,aAAa,CAAC;AAAA,MACzD;AAAA,MACA,cAAc;AAAA,MACd,eAAe;AAAA;AAAA,EAEnB;AAAA,EACA,IAAI,gBAAgB,MAAM;AAAA,IACxB,QAAQ,KAAK,EAAE,MAAM,aAAa,OAAO,aAAa,CAAC;AAAA,EACzD;AAAA,EAGA,aAAa,MAAM,WAAW,SAAS;AAAA,IACrC,MAAM,cAAc,QAAQ;AAAA,IAC5B,MAAM,WAAW,UAAU;AAAA,IAE3B,IAAI,kBAAkB,CAAC;AAAA,MAAa;AAAA,IACpC,IAAI,cAAc,CAAC;AAAA,MAAU;AAAA,IAE7B,IAAI,WAAW;AAAA,MACb,MAAM,IAAI,OAAO,UAAU,GAAG,OAAO,KAAK,EAAE,SAAS,CAAC,KAAK;AAAA,CAAQ;AAAA,IACrE,EAAO;AAAA,MACL,MAAM,IAAI,OAAO,UAAU,OAAO;AAAA,CAAI;AAAA;AAAA,EAE1C;AAAA,EAEA,OAAO;AAAA;",
8
+ "debugId": "7EE1149CCDA4E33564756E2164756E21",
9
+ "names": []
10
+ }
@@ -0,0 +1,86 @@
1
+ // src/commands/wc/wc.ts
2
+ var wc = async (ctx) => {
3
+ let showLines = false;
4
+ let showWords = false;
5
+ let showChars = false;
6
+ const files = [];
7
+ for (const arg of ctx.args) {
8
+ if (arg === "-l") {
9
+ showLines = true;
10
+ } else if (arg === "-w") {
11
+ showWords = true;
12
+ } else if (arg === "-c" || arg === "-m") {
13
+ showChars = true;
14
+ } else if (arg.startsWith("-")) {
15
+ for (const flag of arg.slice(1)) {
16
+ if (flag === "l")
17
+ showLines = true;
18
+ else if (flag === "w")
19
+ showWords = true;
20
+ else if (flag === "c" || flag === "m")
21
+ showChars = true;
22
+ }
23
+ } else {
24
+ files.push(arg);
25
+ }
26
+ }
27
+ if (!showLines && !showWords && !showChars) {
28
+ showLines = true;
29
+ showWords = true;
30
+ showChars = true;
31
+ }
32
+ const countContent = (content) => {
33
+ const lines = content.split(`
34
+ `).length - (content.endsWith(`
35
+ `) ? 1 : 0);
36
+ const words = content.split(/\s+/).filter((w) => w.length > 0).length;
37
+ const chars = content.length;
38
+ return { lines, words, chars };
39
+ };
40
+ const formatOutput = (counts, filename) => {
41
+ const parts = [];
42
+ if (showLines)
43
+ parts.push(String(counts.lines).padStart(8));
44
+ if (showWords)
45
+ parts.push(String(counts.words).padStart(8));
46
+ if (showChars)
47
+ parts.push(String(counts.chars).padStart(8));
48
+ if (filename)
49
+ parts.push(" " + filename);
50
+ return parts.join("") + `
51
+ `;
52
+ };
53
+ if (files.length === 0) {
54
+ const content = await ctx.stdin.text();
55
+ const counts = countContent(content);
56
+ await ctx.stdout.writeText(formatOutput(counts));
57
+ } else {
58
+ let totalLines = 0;
59
+ let totalWords = 0;
60
+ let totalChars = 0;
61
+ for (const file of files) {
62
+ try {
63
+ const path = ctx.fs.resolve(ctx.cwd, file);
64
+ const content = (await ctx.fs.readFile(path)).toString();
65
+ const counts = countContent(content);
66
+ totalLines += counts.lines;
67
+ totalWords += counts.words;
68
+ totalChars += counts.chars;
69
+ await ctx.stdout.writeText(formatOutput(counts, file));
70
+ } catch (err) {
71
+ await ctx.stderr.writeText(`wc: ${file}: No such file or directory
72
+ `);
73
+ return 1;
74
+ }
75
+ }
76
+ if (files.length > 1) {
77
+ await ctx.stdout.writeText(formatOutput({ lines: totalLines, words: totalWords, chars: totalChars }, "total"));
78
+ }
79
+ }
80
+ return 0;
81
+ };
82
+ export {
83
+ wc
84
+ };
85
+
86
+ //# debugId=F4DC48F530142E6764756E2164756E21
@@ -0,0 +1,10 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/commands/wc/wc.ts"],
4
+ "sourcesContent": [
5
+ "import type { Command } from \"../../types.mjs\";\n\nexport const wc: Command = async (ctx) => {\n let showLines = false;\n let showWords = false;\n let showChars = false;\n const files: string[] = [];\n\n // Parse arguments\n for (const arg of ctx.args) {\n if (arg === \"-l\") {\n showLines = true;\n } else if (arg === \"-w\") {\n showWords = true;\n } else if (arg === \"-c\" || arg === \"-m\") {\n showChars = true;\n } else if (arg.startsWith(\"-\")) {\n // Handle combined flags\n for (const flag of arg.slice(1)) {\n if (flag === \"l\") showLines = true;\n else if (flag === \"w\") showWords = true;\n else if (flag === \"c\" || flag === \"m\") showChars = true;\n }\n } else {\n files.push(arg);\n }\n }\n\n // Default: show all\n if (!showLines && !showWords && !showChars) {\n showLines = true;\n showWords = true;\n showChars = true;\n }\n\n const countContent = (content: string) => {\n const lines = content.split(\"\\n\").length - (content.endsWith(\"\\n\") ? 1 : 0);\n const words = content.split(/\\s+/).filter((w) => w.length > 0).length;\n const chars = content.length;\n return { lines, words, chars };\n };\n\n const formatOutput = (counts: { lines: number; words: number; chars: number }, filename?: string) => {\n const parts: string[] = [];\n if (showLines) parts.push(String(counts.lines).padStart(8));\n if (showWords) parts.push(String(counts.words).padStart(8));\n if (showChars) parts.push(String(counts.chars).padStart(8));\n if (filename) parts.push(\" \" + filename);\n return parts.join(\"\") + \"\\n\";\n };\n\n if (files.length === 0) {\n // Read from stdin\n const content = await ctx.stdin.text();\n const counts = countContent(content);\n await ctx.stdout.writeText(formatOutput(counts));\n } else {\n let totalLines = 0;\n let totalWords = 0;\n let totalChars = 0;\n\n for (const file of files) {\n try {\n const path = ctx.fs.resolve(ctx.cwd, file);\n const content = (await ctx.fs.readFile(path)).toString();\n const counts = countContent(content);\n totalLines += counts.lines;\n totalWords += counts.words;\n totalChars += counts.chars;\n await ctx.stdout.writeText(formatOutput(counts, file));\n } catch (err) {\n await ctx.stderr.writeText(`wc: ${file}: No such file or directory\\n`);\n return 1;\n }\n }\n\n if (files.length > 1) {\n await ctx.stdout.writeText(\n formatOutput({ lines: totalLines, words: totalWords, chars: totalChars }, \"total\")\n );\n }\n }\n\n return 0;\n};\n"
6
+ ],
7
+ "mappings": "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",
8
+ "debugId": "F4DC48F530142E6764756E2164756E21",
9
+ "names": []
10
+ }
@@ -15,9 +15,15 @@ import {
15
15
  isVariableNode,
16
16
  isSubstitutionNode,
17
17
  isGlobNode,
18
- isConcatNode
18
+ isConcatNode,
19
+ isIfNode,
20
+ isForNode,
21
+ isWhileNode,
22
+ isUntilNode,
23
+ isCaseNode,
24
+ isArithmeticNode
19
25
  } from "./parser/index.mjs";
20
- import { Interpreter } from "./interpreter/index.mjs";
26
+ import { Interpreter, BreakException, ContinueException } from "./interpreter/index.mjs";
21
27
  import { createVirtualFS } from "./fs/index.mjs";
22
28
  import {
23
29
  FileSystem,
@@ -30,16 +36,22 @@ export {
30
36
  tokenToString,
31
37
  parse,
32
38
  lex,
39
+ isWhileNode,
33
40
  isVariableNode,
41
+ isUntilNode,
34
42
  isSubstitutionNode,
35
43
  isSequenceNode,
36
44
  isRawValue,
37
45
  isPipelineNode,
38
46
  isOrNode,
39
47
  isLiteralNode,
48
+ isIfNode,
40
49
  isGlobNode,
50
+ isForNode,
41
51
  isConcatNode,
42
52
  isCommandNode,
53
+ isCaseNode,
54
+ isArithmeticNode,
43
55
  isAndNode,
44
56
  escapeForInterpolation,
45
57
  escape,
@@ -61,7 +73,9 @@ export {
61
73
  Lexer,
62
74
  LexError,
63
75
  Interpreter,
64
- FileSystem
76
+ FileSystem,
77
+ ContinueException,
78
+ BreakException
65
79
  };
66
80
 
67
- //# debugId=4DB7B709124A1C5464756E2164756E21
81
+ //# debugId=0CC96BD5A2BCA29264756E2164756E21
@@ -2,9 +2,9 @@
2
2
  "version": 3,
3
3
  "sources": ["../../../src/index.ts"],
4
4
  "sourcesContent": [
5
- "// Main class exports\nexport { ShellDSL, createShellDSL, type Program } from \"./shell-dsl.mjs\";\nexport { ShellPromise, type ShellPromiseOptions } from \"./shell-promise.mjs\";\n\n// Types\nexport type {\n VirtualFS,\n FileStat,\n Command,\n CommandContext,\n Stdin,\n Stdout,\n Stderr,\n OutputCollector,\n ExecResult,\n ShellConfig,\n RawValue,\n} from \"./types.mjs\";\nexport { isRawValue } from \"./types.mjs\";\n\n// Errors\nexport { ShellError, LexError, ParseError } from \"./errors.mjs\";\n\n// Lexer\nexport { Lexer, lex, tokenToString } from \"./lexer/index.mjs\";\nexport type { Token, RedirectMode } from \"./lexer/index.mjs\";\n\n// Parser\nexport { Parser, parse } from \"./parser/index.mjs\";\nexport type {\n ASTNode,\n Redirect,\n CommandNode,\n PipelineNode,\n AndNode,\n OrNode,\n SequenceNode,\n LiteralNode,\n VariableNode,\n SubstitutionNode,\n GlobNode,\n ConcatNode,\n} from \"./parser/index.mjs\";\nexport {\n isCommandNode,\n isPipelineNode,\n isAndNode,\n isOrNode,\n isSequenceNode,\n isLiteralNode,\n isVariableNode,\n isSubstitutionNode,\n isGlobNode,\n isConcatNode,\n} from \"./parser/index.mjs\";\n\n// Interpreter\nexport { Interpreter, type InterpreterOptions } from \"./interpreter/index.mjs\";\n\n// Filesystem\nexport { createVirtualFS } from \"./fs/index.mjs\";\nexport {\n FileSystem,\n ReadOnlyFileSystem,\n type Permission,\n type PermissionRules,\n type UnderlyingFS,\n} from \"./fs/index.mjs\";\n\n// I/O\nexport { createStdin, StdinImpl } from \"./io/index.mjs\";\nexport { createStdout, createStderr, createPipe, OutputCollectorImpl, PipeBuffer } from \"./io/index.mjs\";\n\n// Utilities\nexport { escape, escapeForInterpolation } from \"./utils/index.mjs\";\n"
5
+ "// Main class exports\nexport { ShellDSL, createShellDSL, type Program } from \"./shell-dsl.mjs\";\nexport { ShellPromise, type ShellPromiseOptions } from \"./shell-promise.mjs\";\n\n// Types\nexport type {\n VirtualFS,\n FileStat,\n Command,\n CommandContext,\n Stdin,\n Stdout,\n Stderr,\n OutputCollector,\n ExecResult,\n ShellConfig,\n RawValue,\n} from \"./types.mjs\";\nexport { isRawValue } from \"./types.mjs\";\n\n// Errors\nexport { ShellError, LexError, ParseError } from \"./errors.mjs\";\n\n// Lexer\nexport { Lexer, lex, tokenToString } from \"./lexer/index.mjs\";\nexport type { Token, RedirectMode } from \"./lexer/index.mjs\";\n\n// Parser\nexport { Parser, parse } from \"./parser/index.mjs\";\nexport type {\n ASTNode,\n Redirect,\n CommandNode,\n PipelineNode,\n AndNode,\n OrNode,\n SequenceNode,\n LiteralNode,\n VariableNode,\n SubstitutionNode,\n GlobNode,\n ConcatNode,\n IfNode,\n ForNode,\n WhileNode,\n UntilNode,\n CaseNode,\n CaseClause,\n ArithmeticNode,\n} from \"./parser/index.mjs\";\nexport {\n isCommandNode,\n isPipelineNode,\n isAndNode,\n isOrNode,\n isSequenceNode,\n isLiteralNode,\n isVariableNode,\n isSubstitutionNode,\n isGlobNode,\n isConcatNode,\n isIfNode,\n isForNode,\n isWhileNode,\n isUntilNode,\n isCaseNode,\n isArithmeticNode,\n} from \"./parser/index.mjs\";\n\n// Interpreter\nexport { Interpreter, type InterpreterOptions, BreakException, ContinueException } from \"./interpreter/index.mjs\";\n\n// Filesystem\nexport { createVirtualFS } from \"./fs/index.mjs\";\nexport {\n FileSystem,\n ReadOnlyFileSystem,\n type Permission,\n type PermissionRules,\n type UnderlyingFS,\n} from \"./fs/index.mjs\";\n\n// I/O\nexport { createStdin, StdinImpl } from \"./io/index.mjs\";\nexport { createStdout, createStderr, createPipe, OutputCollectorImpl, PipeBuffer } from \"./io/index.mjs\";\n\n// Utilities\nexport { escape, escapeForInterpolation } from \"./utils/index.mjs\";\n"
6
6
  ],
7
- "mappings": ";AACA;AACA;AAgBA;AAGA;AAGA;AAIA;AAeA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAcA;AAGA;AACA;AAAA;AAAA;AAAA;AASA;AACA;AAGA;",
8
- "debugId": "4DB7B709124A1C5464756E2164756E21",
7
+ "mappings": ";AACA;AACA;AAgBA;AAGA;AAGA;AAIA;AAsBA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAoBA;AAGA;AACA;AAAA;AAAA;AAAA;AASA;AACA;AAGA;",
8
+ "debugId": "0CC96BD5A2BCA29264756E2164756E21",
9
9
  "names": []
10
10
  }
@@ -1,9 +1,11 @@
1
1
  // src/interpreter/index.ts
2
- import { Interpreter } from "./interpreter.mjs";
2
+ import { Interpreter, BreakException, ContinueException } from "./interpreter.mjs";
3
3
  import { createCommandContext } from "./context.mjs";
4
4
  export {
5
5
  createCommandContext,
6
- Interpreter
6
+ Interpreter,
7
+ ContinueException,
8
+ BreakException
7
9
  };
8
10
 
9
- //# debugId=EA5249C729B670C464756E2164756E21
11
+ //# debugId=71A1B05D75F46BFA64756E2164756E21
@@ -2,9 +2,9 @@
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/interpreter/index.ts"],
4
4
  "sourcesContent": [
5
- "export { Interpreter, type InterpreterOptions } from \"./interpreter.mjs\";\nexport { createCommandContext, type ContextOptions } from \"./context.mjs\";\n"
5
+ "export { Interpreter, type InterpreterOptions, BreakException, ContinueException } from \"./interpreter.mjs\";\nexport { createCommandContext, type ContextOptions } from \"./context.mjs\";\n"
6
6
  ],
7
7
  "mappings": ";AAAA;AACA;",
8
- "debugId": "EA5249C729B670C464756E2164756E21",
8
+ "debugId": "71A1B05D75F46BFA64756E2164756E21",
9
9
  "names": []
10
10
  }