shell-dsl 0.0.6 → 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 +390 -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 +359 -8
  62. package/dist/cjs/src/lexer/lexer.cjs.map +3 -3
  63. package/dist/cjs/src/lexer/tokens.cjs +35 -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 +280 -8
  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 +390 -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 +359 -8
  133. package/dist/mjs/src/lexer/lexer.mjs.map +3 -3
  134. package/dist/mjs/src/lexer/tokens.mjs +35 -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 +280 -8
  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 +16 -2
  174. package/dist/types/src/lexer/tokens.d.ts +20 -0
  175. package/dist/types/src/parser/ast.d.ts +47 -1
  176. package/dist/types/src/parser/index.d.ts +2 -2
  177. package/dist/types/src/parser/parser.d.ts +15 -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
package/README.md CHANGED
@@ -441,7 +441,7 @@ import { builtinCommands } from "shell-dsl/commands";
441
441
  Or import individually:
442
442
 
443
443
  ```ts
444
- import { echo, cat, grep, wc, cp, mv, touch, tee, tree, find } from "shell-dsl/commands";
444
+ import { echo, cat, grep, wc, cp, mv, touch, tee, tree, find, sed, awk } from "shell-dsl/commands";
445
445
  ```
446
446
 
447
447
  | Command | Description |
@@ -464,6 +464,8 @@ import { echo, cat, grep, wc, cp, mv, touch, tee, tree, find } from "shell-dsl/c
464
464
  | `tee` | Duplicate stdin to stdout and files (`-a` append) |
465
465
  | `tree` | Display directory structure as tree (`-a` all, `-d` dirs only, `-L <n>` depth) |
466
466
  | `find` | Search for files (`-name`, `-iname`, `-type f\|d`, `-maxdepth`, `-mindepth`) |
467
+ | `sed` | Stream editor (`s///`, `d`, `p`, `-n`, `-e`) |
468
+ | `awk` | Pattern scanning (`{print $1}`, `-F`, `NF`, `NR`) |
467
469
  | `test` / `[` | File and string tests (`-f`, `-d`, `-e`, `-z`, `-n`, `=`, `!=`) |
468
470
  | `true` | Exit with code 0 |
469
471
  | `false` | Exit with code 1 |
@@ -49,24 +49,34 @@ __export(exports_shell_dsl, {
49
49
  wc: () => import_commands2.wc,
50
50
  uniq: () => import_commands2.uniq,
51
51
  trueCmd: () => import_commands2.trueCmd,
52
+ tree: () => import_commands2.tree,
53
+ touch: () => import_commands2.touch,
52
54
  test: () => import_commands2.test,
55
+ tee: () => import_commands2.tee,
53
56
  tail: () => import_commands2.tail,
54
57
  sort: () => import_commands2.sort,
58
+ sed: () => import_commands2.sed,
55
59
  rm: () => import_commands2.rm,
56
60
  pwd: () => import_commands2.pwd,
61
+ mv: () => import_commands2.mv,
57
62
  mkdir: () => import_commands2.mkdir,
58
63
  ls: () => import_commands2.ls,
59
64
  head: () => import_commands2.head,
60
65
  grep: () => import_commands2.grep,
66
+ find: () => import_commands2.find,
61
67
  falseCmd: () => import_commands2.falseCmd,
62
68
  echo: () => import_commands2.echo,
69
+ cp: () => import_commands2.cp,
70
+ continueCmd: () => import_commands2.continueCmd,
63
71
  cat: () => import_commands2.cat,
64
72
  builtinCommands: () => import_commands.builtinCommands,
65
- bracket: () => import_commands2.bracket
73
+ breakCmd: () => import_commands2.breakCmd,
74
+ bracket: () => import_commands2.bracket,
75
+ awk: () => import_commands2.awk
66
76
  });
67
77
  module.exports = __toCommonJS(exports_shell_dsl);
68
78
  __reExport(exports_shell_dsl, require("./src/index.cjs"), module.exports);
69
- var import_commands = require("./commands/index.cjs");
70
- var import_commands2 = require("./commands/index.cjs");
79
+ var import_commands = require("./src/commands/index.cjs");
80
+ var import_commands2 = require("./src/commands/index.cjs");
71
81
 
72
- //# debugId=01F96ADDEEC727E964756E2164756E21
82
+ //# debugId=0DEE4EAAC8969A9A64756E2164756E21
@@ -2,9 +2,9 @@
2
2
  "version": 3,
3
3
  "sources": ["../../index.ts"],
4
4
  "sourcesContent": [
5
- "// Re-export everything from src\nexport * from \"./src/index.cjs\";\n\n// Re-export built-in commands\nexport { builtinCommands } from \"./commands/index.cjs\";\nexport {\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 trueCmd,\n falseCmd,\n} from \"./commands/index.cjs\";\n"
5
+ "// Re-export everything from src\nexport * from \"./src/index.cjs\";\n\n// Re-export built-in commands\nexport { builtinCommands } from \"./src/commands/index.cjs\";\nexport {\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 trueCmd,\n falseCmd,\n touch,\n cp,\n mv,\n tee,\n tree,\n find,\n sed,\n awk,\n breakCmd,\n continueCmd,\n} from \"./src/commands/index.cjs\";\n"
6
6
  ],
7
- "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACA;AAGgC,IAAhC;AAkBO,IAjBP;",
8
- "debugId": "01F96ADDEEC727E964756E2164756E21",
7
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACA;AAGgC,IAAhC;AA4BO,IA3BP;",
8
+ "debugId": "0DEE4EAAC8969A9A64756E2164756E21",
9
9
  "names": []
10
10
  }
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "name": "shell-dsl",
3
- "version": "0.0.6",
3
+ "version": "0.0.8",
4
4
  "type": "commonjs"
5
5
  }
@@ -0,0 +1,276 @@
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/awk/awk.ts
30
+ var exports_awk = {};
31
+ __export(exports_awk, {
32
+ awk: () => awk
33
+ });
34
+ module.exports = __toCommonJS(exports_awk);
35
+ function parseProgram(programStr) {
36
+ const rules = [];
37
+ const trimmed = programStr.trim();
38
+ let remaining = trimmed;
39
+ while (remaining.length > 0) {
40
+ remaining = remaining.trim();
41
+ if (remaining.length === 0)
42
+ break;
43
+ let pattern;
44
+ let action = "";
45
+ if (remaining.startsWith("/")) {
46
+ const endSlash = remaining.indexOf("/", 1);
47
+ if (endSlash > 1) {
48
+ const patternStr = remaining.slice(1, endSlash);
49
+ try {
50
+ pattern = new RegExp(patternStr);
51
+ } catch {}
52
+ remaining = remaining.slice(endSlash + 1).trim();
53
+ }
54
+ }
55
+ if (remaining.startsWith("{")) {
56
+ let braceCount = 1;
57
+ let i = 1;
58
+ while (i < remaining.length && braceCount > 0) {
59
+ if (remaining[i] === "{")
60
+ braceCount++;
61
+ else if (remaining[i] === "}")
62
+ braceCount--;
63
+ i++;
64
+ }
65
+ action = remaining.slice(1, i - 1).trim();
66
+ remaining = remaining.slice(i).trim();
67
+ } else if (pattern) {
68
+ action = "print";
69
+ } else {
70
+ break;
71
+ }
72
+ if (action || pattern) {
73
+ rules.push({ pattern, action: action || "print" });
74
+ }
75
+ }
76
+ return rules;
77
+ }
78
+ function parseArgs(args) {
79
+ const options = {
80
+ fieldSeparator: /[ \t]+/,
81
+ program: []
82
+ };
83
+ const files = [];
84
+ let i = 0;
85
+ let programFound = false;
86
+ while (i < args.length) {
87
+ const arg = args[i];
88
+ if (arg === "-F" && args[i + 1] !== undefined) {
89
+ const fs = args[i + 1];
90
+ if (fs.length === 1) {
91
+ options.fieldSeparator = new RegExp(escapeRegex(fs));
92
+ } else {
93
+ try {
94
+ options.fieldSeparator = new RegExp(fs);
95
+ } catch {
96
+ options.fieldSeparator = new RegExp(escapeRegex(fs));
97
+ }
98
+ }
99
+ i += 2;
100
+ continue;
101
+ }
102
+ if (arg.startsWith("-F") && arg.length > 2) {
103
+ const fs = arg.slice(2);
104
+ if (fs.length === 1) {
105
+ options.fieldSeparator = new RegExp(escapeRegex(fs));
106
+ } else {
107
+ try {
108
+ options.fieldSeparator = new RegExp(fs);
109
+ } catch {
110
+ options.fieldSeparator = new RegExp(escapeRegex(fs));
111
+ }
112
+ }
113
+ i++;
114
+ continue;
115
+ }
116
+ if (!arg.startsWith("-")) {
117
+ if (!programFound) {
118
+ options.program = parseProgram(arg);
119
+ programFound = true;
120
+ } else {
121
+ files.push(arg);
122
+ }
123
+ }
124
+ i++;
125
+ }
126
+ return { options, files };
127
+ }
128
+ function escapeRegex(str) {
129
+ return str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
130
+ }
131
+ function splitFields(line, separator) {
132
+ const parts = line.split(separator);
133
+ if (separator.source === "[ \\t]+" && parts[0] === "") {
134
+ parts.shift();
135
+ }
136
+ return parts;
137
+ }
138
+ function executeAction(action, fields, line, lineNumber) {
139
+ const trimmedAction = action.trim();
140
+ if (trimmedAction === "" || trimmedAction === "print" || trimmedAction === "print $0") {
141
+ return line;
142
+ }
143
+ if (trimmedAction.startsWith("print")) {
144
+ const printArgs = trimmedAction.slice(5).trim();
145
+ return evaluatePrintArgs(printArgs, fields, line, lineNumber);
146
+ }
147
+ if (trimmedAction.startsWith("$")) {
148
+ return evaluatePrintArgs(trimmedAction, fields, line, lineNumber);
149
+ }
150
+ return null;
151
+ }
152
+ function evaluatePrintArgs(argsStr, fields, line, lineNumber) {
153
+ const results = [];
154
+ const args = argsStr.split(",").map((a) => a.trim());
155
+ for (const arg of args) {
156
+ const value = evaluateExpression(arg, fields, line, lineNumber);
157
+ results.push(value);
158
+ }
159
+ return results.join(" ");
160
+ }
161
+ function tokenizeExpression(expr) {
162
+ const tokens = [];
163
+ let i = 0;
164
+ const str = expr.trim();
165
+ while (i < str.length) {
166
+ while (i < str.length && /\s/.test(str[i])) {
167
+ i++;
168
+ }
169
+ if (i >= str.length)
170
+ break;
171
+ if (str[i] === '"' || str[i] === "'") {
172
+ const quote = str[i];
173
+ let j = i + 1;
174
+ while (j < str.length && str[j] !== quote) {
175
+ j++;
176
+ }
177
+ tokens.push(str.slice(i, j + 1));
178
+ i = j + 1;
179
+ } else if (str[i] === "$" || /[a-zA-Z]/.test(str[i])) {
180
+ let j = i;
181
+ while (j < str.length && /[\w$]/.test(str[j])) {
182
+ j++;
183
+ }
184
+ tokens.push(str.slice(i, j));
185
+ i = j;
186
+ } else {
187
+ tokens.push(str[i]);
188
+ i++;
189
+ }
190
+ }
191
+ return tokens;
192
+ }
193
+ function evaluateExpression(expr, fields, line, lineNumber) {
194
+ const tokens = tokenizeExpression(expr);
195
+ if (tokens.length === 0) {
196
+ return "";
197
+ }
198
+ const parts = [];
199
+ for (const token of tokens) {
200
+ if (token.startsWith('"') && token.endsWith('"') || token.startsWith("'") && token.endsWith("'")) {
201
+ parts.push(token.slice(1, -1));
202
+ } else if (token.match(/^\$(\d+)$/)) {
203
+ const fieldNum = parseInt(token.slice(1), 10);
204
+ if (fieldNum === 0) {
205
+ parts.push(line);
206
+ } else {
207
+ parts.push(fields[fieldNum - 1] ?? "");
208
+ }
209
+ } else if (token === "NF") {
210
+ parts.push(String(fields.length));
211
+ } else if (token === "NR") {
212
+ parts.push(String(lineNumber));
213
+ } else {
214
+ parts.push(token);
215
+ }
216
+ }
217
+ return parts.join("");
218
+ }
219
+ function processLine(line, lineNumber, options) {
220
+ const fields = splitFields(line, options.fieldSeparator);
221
+ const outputs = [];
222
+ for (const rule of options.program) {
223
+ if (rule.pattern && !rule.pattern.test(line)) {
224
+ continue;
225
+ }
226
+ const result = executeAction(rule.action, fields, line, lineNumber);
227
+ if (result !== null) {
228
+ outputs.push(result);
229
+ }
230
+ }
231
+ return outputs;
232
+ }
233
+ var awk = async (ctx) => {
234
+ const { options, files } = parseArgs(ctx.args);
235
+ if (options.program.length === 0) {
236
+ await ctx.stderr.writeText(`awk: missing program
237
+ `);
238
+ return 1;
239
+ }
240
+ let lineNumber = 0;
241
+ const processContent = async (content) => {
242
+ const lines = content.split(`
243
+ `);
244
+ if (lines.length > 0 && lines[lines.length - 1] === "") {
245
+ lines.pop();
246
+ }
247
+ for (const line of lines) {
248
+ lineNumber++;
249
+ const outputs = processLine(line, lineNumber, options);
250
+ for (const output of outputs) {
251
+ await ctx.stdout.writeText(output + `
252
+ `);
253
+ }
254
+ }
255
+ };
256
+ if (files.length === 0) {
257
+ const content = await ctx.stdin.text();
258
+ await processContent(content);
259
+ } else {
260
+ for (const file of files) {
261
+ try {
262
+ const path = ctx.fs.resolve(ctx.cwd, file);
263
+ const content = await ctx.fs.readFile(path);
264
+ await processContent(content.toString());
265
+ } catch (err) {
266
+ const message = err instanceof Error ? err.message : String(err);
267
+ await ctx.stderr.writeText(`awk: ${file}: ${message}
268
+ `);
269
+ return 1;
270
+ }
271
+ }
272
+ }
273
+ return 0;
274
+ };
275
+
276
+ //# debugId=286F2CB4A6BAC9AD64756E2164756E21
@@ -0,0 +1,10 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/commands/awk/awk.ts"],
4
+ "sourcesContent": [
5
+ "import type { Command } from \"../../types.cjs\";\n\ninterface AwkRule {\n pattern?: RegExp;\n action: string;\n}\n\ninterface AwkOptions {\n fieldSeparator: RegExp;\n program: AwkRule[];\n}\n\nfunction parseProgram(programStr: string): AwkRule[] {\n const rules: AwkRule[] = [];\n const trimmed = programStr.trim();\n\n // Simple parser for patterns like: /regex/ {action} or {action}\n // Handle multiple rules separated by whitespace/newlines\n\n let remaining = trimmed;\n\n while (remaining.length > 0) {\n remaining = remaining.trim();\n if (remaining.length === 0) break;\n\n let pattern: RegExp | undefined;\n let action = \"\";\n\n // Check for /pattern/ prefix\n if (remaining.startsWith(\"/\")) {\n const endSlash = remaining.indexOf(\"/\", 1);\n if (endSlash > 1) {\n const patternStr = remaining.slice(1, endSlash);\n try {\n pattern = new RegExp(patternStr);\n } catch {\n // Invalid regex, skip\n }\n remaining = remaining.slice(endSlash + 1).trim();\n }\n }\n\n // Check for {action} block\n if (remaining.startsWith(\"{\")) {\n let braceCount = 1;\n let i = 1;\n while (i < remaining.length && braceCount > 0) {\n if (remaining[i] === \"{\") braceCount++;\n else if (remaining[i] === \"}\") braceCount--;\n i++;\n }\n action = remaining.slice(1, i - 1).trim();\n remaining = remaining.slice(i).trim();\n } else if (pattern) {\n // Pattern without action - default action is print\n action = \"print\";\n } else {\n // No pattern and no action block, might be malformed\n break;\n }\n\n if (action || pattern) {\n rules.push({ pattern, action: action || \"print\" });\n }\n }\n\n return rules;\n}\n\nfunction parseArgs(args: string[]): { options: AwkOptions; files: string[] } {\n const options: AwkOptions = {\n fieldSeparator: /[ \\t]+/,\n program: [],\n };\n const files: string[] = [];\n\n let i = 0;\n let programFound = false;\n\n while (i < args.length) {\n const arg = args[i]!;\n\n if (arg === \"-F\" && args[i + 1] !== undefined) {\n const fs = args[i + 1]!;\n // For single character separators, match exactly\n // For patterns, use as regex\n if (fs.length === 1) {\n options.fieldSeparator = new RegExp(escapeRegex(fs));\n } else {\n try {\n options.fieldSeparator = new RegExp(fs);\n } catch {\n options.fieldSeparator = new RegExp(escapeRegex(fs));\n }\n }\n i += 2;\n continue;\n }\n\n // -Ffs format (no space)\n if (arg.startsWith(\"-F\") && arg.length > 2) {\n const fs = arg.slice(2);\n if (fs.length === 1) {\n options.fieldSeparator = new RegExp(escapeRegex(fs));\n } else {\n try {\n options.fieldSeparator = new RegExp(fs);\n } catch {\n options.fieldSeparator = new RegExp(escapeRegex(fs));\n }\n }\n i++;\n continue;\n }\n\n // Non-flag argument\n if (!arg.startsWith(\"-\")) {\n if (!programFound) {\n options.program = parseProgram(arg);\n programFound = true;\n } else {\n files.push(arg);\n }\n }\n i++;\n }\n\n return { options, files };\n}\n\nfunction escapeRegex(str: string): string {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\nfunction splitFields(line: string, separator: RegExp): string[] {\n // Split and filter empty strings for whitespace separation\n const parts = line.split(separator);\n // For whitespace separator, filter leading empty string\n if (separator.source === \"[ \\\\t]+\" && parts[0] === \"\") {\n parts.shift();\n }\n return parts;\n}\n\nfunction executeAction(\n action: string,\n fields: string[],\n line: string,\n lineNumber: number\n): string | null {\n // Parse and execute the action\n // Supported: print, print $0, print $1, print $1, $2, etc.\n\n const trimmedAction = action.trim();\n\n if (trimmedAction === \"\" || trimmedAction === \"print\" || trimmedAction === \"print $0\") {\n return line;\n }\n\n // Check for print with field references\n if (trimmedAction.startsWith(\"print\")) {\n const printArgs = trimmedAction.slice(5).trim();\n return evaluatePrintArgs(printArgs, fields, line, lineNumber);\n }\n\n // Just field reference without print (implicit print)\n if (trimmedAction.startsWith(\"$\")) {\n return evaluatePrintArgs(trimmedAction, fields, line, lineNumber);\n }\n\n return null;\n}\n\nfunction evaluatePrintArgs(\n argsStr: string,\n fields: string[],\n line: string,\n lineNumber: number\n): string {\n const results: string[] = [];\n\n // Split by comma for multiple arguments\n const args = argsStr.split(\",\").map((a) => a.trim());\n\n for (const arg of args) {\n const value = evaluateExpression(arg, fields, line, lineNumber);\n results.push(value);\n }\n\n return results.join(\" \");\n}\n\nfunction tokenizeExpression(expr: string): string[] {\n const tokens: string[] = [];\n let i = 0;\n const str = expr.trim();\n\n while (i < str.length) {\n // Skip whitespace\n while (i < str.length && /\\s/.test(str[i]!)) {\n i++;\n }\n if (i >= str.length) break;\n\n // String literal\n if (str[i] === '\"' || str[i] === \"'\") {\n const quote = str[i]!;\n let j = i + 1;\n while (j < str.length && str[j] !== quote) {\n j++;\n }\n tokens.push(str.slice(i, j + 1));\n i = j + 1;\n }\n // Field reference or variable\n else if (str[i] === '$' || /[a-zA-Z]/.test(str[i]!)) {\n let j = i;\n while (j < str.length && /[\\w$]/.test(str[j]!)) {\n j++;\n }\n tokens.push(str.slice(i, j));\n i = j;\n }\n // Other characters\n else {\n tokens.push(str[i]!);\n i++;\n }\n }\n\n return tokens;\n}\n\nfunction evaluateExpression(\n expr: string,\n fields: string[],\n line: string,\n lineNumber: number\n): string {\n const tokens = tokenizeExpression(expr);\n\n if (tokens.length === 0) {\n return \"\";\n }\n\n // Evaluate each token and concatenate\n const parts: string[] = [];\n for (const token of tokens) {\n // String literal\n if ((token.startsWith('\"') && token.endsWith('\"')) ||\n (token.startsWith(\"'\") && token.endsWith(\"'\"))) {\n parts.push(token.slice(1, -1));\n }\n // Field reference $0, $1, etc.\n else if (token.match(/^\\$(\\d+)$/)) {\n const fieldNum = parseInt(token.slice(1), 10);\n if (fieldNum === 0) {\n parts.push(line);\n } else {\n parts.push(fields[fieldNum - 1] ?? \"\");\n }\n }\n // Built-in variables\n else if (token === \"NF\") {\n parts.push(String(fields.length));\n }\n else if (token === \"NR\") {\n parts.push(String(lineNumber));\n }\n // Unknown - return as-is\n else {\n parts.push(token);\n }\n }\n\n return parts.join(\"\");\n}\n\nfunction processLine(\n line: string,\n lineNumber: number,\n options: AwkOptions\n): string[] {\n const fields = splitFields(line, options.fieldSeparator);\n const outputs: string[] = [];\n\n for (const rule of options.program) {\n // Check pattern match\n if (rule.pattern && !rule.pattern.test(line)) {\n continue;\n }\n\n const result = executeAction(rule.action, fields, line, lineNumber);\n if (result !== null) {\n outputs.push(result);\n }\n }\n\n return outputs;\n}\n\nexport const awk: Command = async (ctx) => {\n const { options, files } = parseArgs(ctx.args);\n\n if (options.program.length === 0) {\n await ctx.stderr.writeText(\"awk: missing program\\n\");\n return 1;\n }\n\n let lineNumber = 0;\n\n const processContent = async (content: string): Promise<void> => {\n const lines = content.split(\"\\n\");\n // Handle trailing newline\n if (lines.length > 0 && lines[lines.length - 1] === \"\") {\n lines.pop();\n }\n\n for (const line of lines) {\n lineNumber++;\n const outputs = processLine(line, lineNumber, options);\n for (const output of outputs) {\n await ctx.stdout.writeText(output + \"\\n\");\n }\n }\n };\n\n if (files.length === 0) {\n // Read from stdin\n const content = await ctx.stdin.text();\n await processContent(content);\n } else {\n // Read from files\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);\n await processContent(content.toString());\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n await ctx.stderr.writeText(`awk: ${file}: ${message}\\n`);\n return 1;\n }\n }\n }\n\n return 0;\n};\n"
6
+ ],
7
+ "mappings": "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",
8
+ "debugId": "286F2CB4A6BAC9AD64756E2164756E21",
9
+ "names": []
10
+ }
@@ -0,0 +1,56 @@
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/break-continue/break-continue.ts
30
+ var exports_break_continue = {};
31
+ __export(exports_break_continue, {
32
+ continueCmd: () => continueCmd,
33
+ breakCmd: () => breakCmd
34
+ });
35
+ module.exports = __toCommonJS(exports_break_continue);
36
+ var import_interpreter = require("../../interpreter/interpreter.cjs");
37
+ var breakCmd = async (ctx) => {
38
+ const levels = ctx.args[0] ? parseInt(ctx.args[0], 10) : 1;
39
+ if (isNaN(levels) || levels < 1) {
40
+ await ctx.stderr.writeText(`break: invalid level
41
+ `);
42
+ return 1;
43
+ }
44
+ throw new import_interpreter.BreakException(levels);
45
+ };
46
+ var continueCmd = async (ctx) => {
47
+ const levels = ctx.args[0] ? parseInt(ctx.args[0], 10) : 1;
48
+ if (isNaN(levels) || levels < 1) {
49
+ await ctx.stderr.writeText(`continue: invalid level
50
+ `);
51
+ return 1;
52
+ }
53
+ throw new import_interpreter.ContinueException(levels);
54
+ };
55
+
56
+ //# debugId=DBA00ACEA25395D764756E2164756E21
@@ -0,0 +1,10 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/commands/break-continue/break-continue.ts"],
4
+ "sourcesContent": [
5
+ "import type { Command } from \"../../types.cjs\";\nimport { BreakException, ContinueException } from \"../../interpreter/interpreter.cjs\";\n\nexport const breakCmd: Command = async (ctx) => {\n const levels = ctx.args[0] ? parseInt(ctx.args[0], 10) : 1;\n if (isNaN(levels) || levels < 1) {\n await ctx.stderr.writeText(\"break: invalid level\\n\");\n return 1;\n }\n throw new BreakException(levels);\n};\n\nexport const continueCmd: Command = async (ctx) => {\n const levels = ctx.args[0] ? parseInt(ctx.args[0], 10) : 1;\n if (isNaN(levels) || levels < 1) {\n await ctx.stderr.writeText(\"continue: invalid level\\n\");\n return 1;\n }\n throw new ContinueException(levels);\n};\n"
6
+ ],
7
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACkD,IAAlD;AAEO,IAAM,WAAoB,OAAO,QAAQ;AAAA,EAC9C,MAAM,SAAS,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,IAAI,EAAE,IAAI;AAAA,EACzD,IAAI,MAAM,MAAM,KAAK,SAAS,GAAG;AAAA,IAC/B,MAAM,IAAI,OAAO,UAAU;AAAA,CAAwB;AAAA,IACnD,OAAO;AAAA,EACT;AAAA,EACA,MAAM,IAAI,kCAAe,MAAM;AAAA;AAG1B,IAAM,cAAuB,OAAO,QAAQ;AAAA,EACjD,MAAM,SAAS,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,IAAI,EAAE,IAAI;AAAA,EACzD,IAAI,MAAM,MAAM,KAAK,SAAS,GAAG;AAAA,IAC/B,MAAM,IAAI,OAAO,UAAU;AAAA,CAA2B;AAAA,IACtD,OAAO;AAAA,EACT;AAAA,EACA,MAAM,IAAI,qCAAkB,MAAM;AAAA;",
8
+ "debugId": "DBA00ACEA25395D764756E2164756E21",
9
+ "names": []
10
+ }
@@ -0,0 +1,57 @@
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/cat/cat.ts
30
+ var exports_cat = {};
31
+ __export(exports_cat, {
32
+ cat: () => cat
33
+ });
34
+ module.exports = __toCommonJS(exports_cat);
35
+ var cat = async (ctx) => {
36
+ if (ctx.args.length === 0) {
37
+ for await (const chunk of ctx.stdin.stream()) {
38
+ await ctx.stdout.write(chunk);
39
+ }
40
+ } else {
41
+ for (const file of ctx.args) {
42
+ try {
43
+ const path = ctx.fs.resolve(ctx.cwd, file);
44
+ const content = await ctx.fs.readFile(path);
45
+ await ctx.stdout.write(new Uint8Array(content));
46
+ } catch (err) {
47
+ const message = err instanceof Error ? err.message : String(err);
48
+ await ctx.stderr.writeText(`cat: ${file}: ${message}
49
+ `);
50
+ return 1;
51
+ }
52
+ }
53
+ }
54
+ return 0;
55
+ };
56
+
57
+ //# debugId=7065B7A0D9839AB964756E2164756E21
@@ -0,0 +1,10 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/commands/cat/cat.ts"],
4
+ "sourcesContent": [
5
+ "import type { Command } from \"../../types.cjs\";\n\nexport const cat: Command = async (ctx) => {\n if (ctx.args.length === 0) {\n // Read from stdin\n for await (const chunk of ctx.stdin.stream()) {\n await ctx.stdout.write(chunk);\n }\n } else {\n // Read from files\n for (const file of ctx.args) {\n try {\n const path = ctx.fs.resolve(ctx.cwd, file);\n const content = await ctx.fs.readFile(path);\n await ctx.stdout.write(new Uint8Array(content));\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n await ctx.stderr.writeText(`cat: ${file}: ${message}\\n`);\n return 1;\n }\n }\n }\n return 0;\n};\n"
6
+ ],
7
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEO,IAAM,MAAe,OAAO,QAAQ;AAAA,EACzC,IAAI,IAAI,KAAK,WAAW,GAAG;AAAA,IAEzB,iBAAiB,SAAS,IAAI,MAAM,OAAO,GAAG;AAAA,MAC5C,MAAM,IAAI,OAAO,MAAM,KAAK;AAAA,IAC9B;AAAA,EACF,EAAO;AAAA,IAEL,WAAW,QAAQ,IAAI,MAAM;AAAA,MAC3B,IAAI;AAAA,QACF,MAAM,OAAO,IAAI,GAAG,QAAQ,IAAI,KAAK,IAAI;AAAA,QACzC,MAAM,UAAU,MAAM,IAAI,GAAG,SAAS,IAAI;AAAA,QAC1C,MAAM,IAAI,OAAO,MAAM,IAAI,WAAW,OAAO,CAAC;AAAA,QAC9C,OAAO,KAAK;AAAA,QACZ,MAAM,UAAU,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAAA,QAC/D,MAAM,IAAI,OAAO,UAAU,QAAQ,SAAS;AAAA,CAAW;AAAA,QACvD,OAAO;AAAA;AAAA,IAEX;AAAA;AAAA,EAEF,OAAO;AAAA;",
8
+ "debugId": "7065B7A0D9839AB964756E2164756E21",
9
+ "names": []
10
+ }
@@ -0,0 +1,126 @@
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/cp/cp.ts
30
+ var exports_cp = {};
31
+ __export(exports_cp, {
32
+ cp: () => cp
33
+ });
34
+ module.exports = __toCommonJS(exports_cp);
35
+ var cp = async (ctx) => {
36
+ let recursive = false;
37
+ let noClobber = false;
38
+ const paths = [];
39
+ for (const arg of ctx.args) {
40
+ if (arg === "-r" || arg === "-R" || arg === "--recursive") {
41
+ recursive = true;
42
+ } else if (arg === "-n" || arg === "--no-clobber") {
43
+ noClobber = true;
44
+ } else if (arg === "-f" || arg === "--force") {} else if (arg.startsWith("-")) {
45
+ for (const flag of arg.slice(1)) {
46
+ if (flag === "r" || flag === "R")
47
+ recursive = true;
48
+ else if (flag === "n")
49
+ noClobber = true;
50
+ else if (flag === "f") {}
51
+ }
52
+ } else {
53
+ paths.push(arg);
54
+ }
55
+ }
56
+ if (paths.length < 2) {
57
+ await ctx.stderr.writeText(`cp: missing destination file operand
58
+ `);
59
+ return 1;
60
+ }
61
+ const sources = paths.slice(0, -1);
62
+ const dest = paths[paths.length - 1];
63
+ const destPath = ctx.fs.resolve(ctx.cwd, dest);
64
+ let destIsDir = false;
65
+ try {
66
+ const stat = await ctx.fs.stat(destPath);
67
+ destIsDir = stat.isDirectory();
68
+ } catch {}
69
+ if (sources.length > 1 && !destIsDir) {
70
+ await ctx.stderr.writeText(`cp: target '${dest}' is not a directory
71
+ `);
72
+ return 1;
73
+ }
74
+ for (const source of sources) {
75
+ const srcPath = ctx.fs.resolve(ctx.cwd, source);
76
+ try {
77
+ const srcStat = await ctx.fs.stat(srcPath);
78
+ if (srcStat.isDirectory()) {
79
+ if (!recursive) {
80
+ await ctx.stderr.writeText(`cp: -r not specified; omitting directory '${source}'
81
+ `);
82
+ return 1;
83
+ }
84
+ const finalDest = destIsDir ? ctx.fs.resolve(destPath, ctx.fs.basename(srcPath)) : destPath;
85
+ await copyDirectory(ctx, srcPath, finalDest, noClobber);
86
+ } else {
87
+ const finalDest = destIsDir ? ctx.fs.resolve(destPath, ctx.fs.basename(srcPath)) : destPath;
88
+ if (noClobber) {
89
+ const exists = await ctx.fs.exists(finalDest);
90
+ if (exists)
91
+ continue;
92
+ }
93
+ const content = await ctx.fs.readFile(srcPath);
94
+ await ctx.fs.writeFile(finalDest, content);
95
+ }
96
+ } catch (err) {
97
+ const message = err instanceof Error ? err.message : String(err);
98
+ await ctx.stderr.writeText(`cp: cannot stat '${source}': ${message}
99
+ `);
100
+ return 1;
101
+ }
102
+ }
103
+ return 0;
104
+ };
105
+ async function copyDirectory(ctx, src, dest, noClobber) {
106
+ await ctx.fs.mkdir(dest, { recursive: true });
107
+ const entries = await ctx.fs.readdir(src);
108
+ for (const entry of entries) {
109
+ const srcPath = ctx.fs.resolve(src, entry);
110
+ const destPath = ctx.fs.resolve(dest, entry);
111
+ const stat = await ctx.fs.stat(srcPath);
112
+ if (stat.isDirectory()) {
113
+ await copyDirectory(ctx, srcPath, destPath, noClobber);
114
+ } else {
115
+ if (noClobber) {
116
+ const exists = await ctx.fs.exists(destPath);
117
+ if (exists)
118
+ continue;
119
+ }
120
+ const content = await ctx.fs.readFile(srcPath);
121
+ await ctx.fs.writeFile(destPath, content);
122
+ }
123
+ }
124
+ }
125
+
126
+ //# debugId=BD98A6AD6515D93664756E2164756E21