shell-dsl 0.0.35 → 0.0.37

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 (48) hide show
  1. package/README.md +27 -3
  2. package/dist/cjs/index.cjs +2 -1
  3. package/dist/cjs/index.cjs.map +3 -3
  4. package/dist/cjs/package.json +1 -1
  5. package/dist/cjs/src/commands/echo/echo.cjs +29 -23
  6. package/dist/cjs/src/commands/echo/echo.cjs.map +3 -3
  7. package/dist/cjs/src/commands/index.cjs +6 -2
  8. package/dist/cjs/src/commands/index.cjs.map +3 -3
  9. package/dist/cjs/src/commands/od/od.cjs +274 -0
  10. package/dist/cjs/src/commands/od/od.cjs.map +10 -0
  11. package/dist/cjs/src/index.cjs +2 -7
  12. package/dist/cjs/src/index.cjs.map +3 -3
  13. package/dist/cjs/src/interpreter/interpreter.cjs +186 -68
  14. package/dist/cjs/src/interpreter/interpreter.cjs.map +3 -3
  15. package/dist/cjs/src/parser/ast.cjs +5 -25
  16. package/dist/cjs/src/parser/ast.cjs.map +3 -3
  17. package/dist/cjs/src/parser/index.cjs +2 -7
  18. package/dist/cjs/src/parser/index.cjs.map +3 -3
  19. package/dist/cjs/src/parser/parser.cjs +132 -82
  20. package/dist/cjs/src/parser/parser.cjs.map +3 -3
  21. package/dist/mjs/index.mjs +4 -2
  22. package/dist/mjs/index.mjs.map +3 -3
  23. package/dist/mjs/package.json +1 -1
  24. package/dist/mjs/src/commands/echo/echo.mjs +29 -23
  25. package/dist/mjs/src/commands/echo/echo.mjs.map +3 -3
  26. package/dist/mjs/src/commands/index.mjs +6 -2
  27. package/dist/mjs/src/commands/index.mjs.map +3 -3
  28. package/dist/mjs/src/commands/od/od.mjs +234 -0
  29. package/dist/mjs/src/commands/od/od.mjs.map +10 -0
  30. package/dist/mjs/src/index.mjs +4 -14
  31. package/dist/mjs/src/index.mjs.map +3 -3
  32. package/dist/mjs/src/interpreter/interpreter.mjs +186 -68
  33. package/dist/mjs/src/interpreter/interpreter.mjs.map +3 -3
  34. package/dist/mjs/src/parser/ast.mjs +5 -25
  35. package/dist/mjs/src/parser/ast.mjs.map +3 -3
  36. package/dist/mjs/src/parser/index.mjs +4 -14
  37. package/dist/mjs/src/parser/index.mjs.map +3 -3
  38. package/dist/mjs/src/parser/parser.mjs +132 -82
  39. package/dist/mjs/src/parser/parser.mjs.map +3 -3
  40. package/dist/types/index.d.ts +1 -1
  41. package/dist/types/src/commands/index.d.ts +1 -0
  42. package/dist/types/src/commands/od/od.d.ts +2 -0
  43. package/dist/types/src/index.d.ts +2 -2
  44. package/dist/types/src/interpreter/interpreter.d.ts +15 -1
  45. package/dist/types/src/parser/ast.d.ts +34 -38
  46. package/dist/types/src/parser/index.d.ts +2 -2
  47. package/dist/types/src/parser/parser.d.ts +4 -1
  48. package/package.json +1 -1
package/README.md CHANGED
@@ -257,7 +257,10 @@ await sh`FOO=bar && echo $FOO`.text(); // "bar\n"
257
257
  Assign variables for a single command (scoped):
258
258
 
259
259
  ```ts
260
- await sh`FOO=bar echo $FOO`.text(); // "bar\n"
260
+ await sh`FOO=bar echo ok`.text(); // "ok\n"
261
+ await sh`FOO=bar echo $FOO`.text(); // "\n"
262
+ // FOO is available to the executed command via ctx.env,
263
+ // but sibling shell expansion still uses the previous shell env
261
264
  // FOO is not set after this command
262
265
  ```
263
266
 
@@ -326,15 +329,35 @@ const myls: Command = async (ctx) => {
326
329
  };
327
330
  ```
328
331
 
332
+ ## Field Splitting
333
+
334
+ Unquoted parameter, command, and arithmetic expansions follow shell-style word expansion:
335
+
336
+ 1. Expand variables / `$(...)` / `$((...))`
337
+ 2. Split unquoted results using `IFS` (default: space, tab, newline)
338
+ 3. Apply pathname expansion (globbing) to the resulting fields
339
+
340
+ Quoted expansions stay single-field, and assignment values plus redirect targets use scalar expansion only.
341
+
342
+ ```ts
343
+ await sh`LIST="alpha beta" && for item in $LIST; do echo $item; done`.text();
344
+ // "alpha\nbeta\n"
345
+
346
+ await sh`LIST="alpha,beta,,gamma" && IFS=, && for item in $LIST; do echo "[$item]"; done`.text();
347
+ // "[alpha]\n[beta]\n[]\n[gamma]\n"
348
+ ```
349
+
329
350
  ## Glob Expansion
330
351
 
331
- Globs are expanded by the interpreter before command execution:
352
+ Globs run after field splitting, and only wildcard characters from unquoted text or unquoted expansions participate:
332
353
 
333
354
  ```ts
334
355
  await sh`ls *.txt`; // Matches: a.txt, b.txt, ...
335
356
  await sh`cat src/**/*.ts`; // Recursive glob
336
357
  await sh`echo file[123].txt`; // Character classes
337
358
  await sh`echo {a,b,c}.txt`; // Brace expansion: a.txt b.txt c.txt
359
+ await sh`pattern='*.txt'; echo $pattern`; // Expands matches
360
+ await sh`pattern='*.txt'; echo "$pattern"`; // Literal "*.txt"
338
361
  ```
339
362
 
340
363
  ## Command Substitution
@@ -544,7 +567,7 @@ import { builtinCommands } from "shell-dsl/commands";
544
567
  Or import individually:
545
568
 
546
569
  ```ts
547
- import { echo, cat, grep, wc, cp, mv, touch, tee, tree, find, sed, awk, cut } from "shell-dsl/commands";
570
+ import { echo, cat, grep, wc, cp, mv, touch, tee, tree, find, sed, awk, cut, od } from "shell-dsl/commands";
548
571
  ```
549
572
 
550
573
  | Command | Description |
@@ -570,6 +593,7 @@ import { echo, cat, grep, wc, cp, mv, touch, tee, tree, find, sed, awk, cut } fr
570
593
  | `sed` | Stream editor (`s///`, `d`, `p`, `-n`, `-e`) |
571
594
  | `awk` | Pattern scanning (`{print $1}`, `-F`, `NF`, `NR`) |
572
595
  | `cut` | Select fields/characters (`-f`, `-d`, `-c`, `-b`, `-s`, `--complement`) |
596
+ | `od` | Dump binary/text data (`-A`, `-t x1/x2/o1/o2/c`, `-j`, `-N`, `-v`) |
573
597
  | `test` / `[` | File and string tests (`-f`, `-d`, `-e`, `-z`, `-n`, `=`, `!=`) |
574
598
  | `true` | Exit with code 0 |
575
599
  | `false` | Exit with code 1 |
@@ -69,6 +69,7 @@ __export(exports_shell_dsl, {
69
69
  sed: () => import_commands2.sed,
70
70
  rm: () => import_commands2.rm,
71
71
  pwd: () => import_commands2.pwd,
72
+ od: () => import_commands2.od,
72
73
  mv: () => import_commands2.mv,
73
74
  mkdir: () => import_commands2.mkdir,
74
75
  ls: () => import_commands2.ls,
@@ -90,4 +91,4 @@ __reExport(exports_shell_dsl, require("./src/index.cjs"), module.exports);
90
91
  var import_commands = require("./src/commands/index.cjs");
91
92
  var import_commands2 = require("./src/commands/index.cjs");
92
93
 
93
- //# debugId=1205A0385489D10D64756E2164756E21
94
+ //# debugId=D3C9D8D0D2FCEB0A64756E2164756E21
@@ -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 \"./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"
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 od,\n} from \"./src/commands/index.cjs\";\n"
6
6
  ],
7
- "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACA;AAGgC,IAAhC;AA4BO,IA3BP;",
8
- "debugId": "1205A0385489D10D64756E2164756E21",
7
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACA;AAGgC,IAAhC;AA6BO,IA5BP;",
8
+ "debugId": "D3C9D8D0D2FCEB0A64756E2164756E21",
9
9
  "names": []
10
10
  }
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "name": "shell-dsl",
3
- "version": "0.0.35",
3
+ "version": "0.0.37",
4
4
  "type": "commonjs"
5
5
  }
@@ -42,31 +42,37 @@ __export(exports_echo, {
42
42
  echo: () => echo
43
43
  });
44
44
  module.exports = __toCommonJS(exports_echo);
45
- var import_flag_parser = require("../../utils/flag-parser.cjs");
46
45
  var import_expand_escapes = require("../../utils/expand-escapes.cjs");
47
- var spec = {
48
- name: "echo",
49
- flags: [
50
- { short: "n" },
51
- { short: "e" }
52
- ],
53
- usage: "echo [-neE] [string ...]",
54
- stopAfterFirstPositional: true
55
- };
56
46
  var defaults = { noNewline: false, interpretEscapes: false };
57
- var handler = (flags, flag) => {
58
- if (flag.short === "n")
59
- flags.noNewline = true;
60
- if (flag.short === "e")
61
- flags.interpretEscapes = true;
62
- };
63
- var parser = import_flag_parser.createFlagParser(spec, defaults, handler);
64
- var echo = async (ctx) => {
65
- const result = parser.parse(ctx.args);
66
- if (result.error) {
67
- await parser.writeError(result.error, ctx.stderr);
68
- return 1;
47
+ function isEchoOption(arg) {
48
+ if (!arg.startsWith("-") || arg === "-") {
49
+ return false;
50
+ }
51
+ for (const char of arg.slice(1)) {
52
+ if (char !== "n" && char !== "e" && char !== "E") {
53
+ return false;
54
+ }
69
55
  }
56
+ return true;
57
+ }
58
+ function parseEchoArgs(args) {
59
+ const flags = { ...defaults };
60
+ let index = 0;
61
+ while (index < args.length && isEchoOption(args[index])) {
62
+ for (const char of args[index].slice(1)) {
63
+ if (char === "n")
64
+ flags.noNewline = true;
65
+ if (char === "e")
66
+ flags.interpretEscapes = true;
67
+ if (char === "E")
68
+ flags.interpretEscapes = false;
69
+ }
70
+ index++;
71
+ }
72
+ return { flags, args: args.slice(index) };
73
+ }
74
+ var echo = async (ctx) => {
75
+ const result = parseEchoArgs(ctx.args);
70
76
  let output = result.args.join(" ");
71
77
  if (result.flags.interpretEscapes) {
72
78
  output = import_expand_escapes.expandEscapes(output);
@@ -79,4 +85,4 @@ var echo = async (ctx) => {
79
85
  return 0;
80
86
  };
81
87
 
82
- //# debugId=1C2C02D83C5D2B1D64756E2164756E21
88
+ //# debugId=91584B2D49E63BEA64756E2164756E21
@@ -2,9 +2,9 @@
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/commands/echo/echo.ts"],
4
4
  "sourcesContent": [
5
- "import type { Command } from \"../../types.cjs\";\nimport { createFlagParser, type FlagDefinition } from \"../../utils/flag-parser.cjs\";\nimport { expandEscapes } from \"../../utils/expand-escapes.cjs\";\n\ninterface EchoFlags {\n noNewline: boolean;\n interpretEscapes: boolean;\n}\n\nconst spec = {\n name: \"echo\",\n flags: [\n { short: \"n\" },\n { short: \"e\" },\n ] as FlagDefinition[],\n usage: \"echo [-neE] [string ...]\",\n stopAfterFirstPositional: true,\n};\n\nconst defaults: EchoFlags = { noNewline: false, interpretEscapes: false };\n\nconst handler = (flags: EchoFlags, flag: FlagDefinition) => {\n if (flag.short === \"n\") flags.noNewline = true;\n if (flag.short === \"e\") flags.interpretEscapes = true;\n};\n\nconst parser = createFlagParser(spec, defaults, handler);\n\nexport const echo: 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 let output = result.args.join(\" \");\n\n if (result.flags.interpretEscapes) {\n output = expandEscapes(output);\n }\n\n if (!result.flags.noNewline) {\n output += \"\\n\";\n }\n\n await ctx.stdout.writeText(output);\n return 0;\n};\n"
5
+ "import type { Command } from \"../../types.cjs\";\nimport { expandEscapes } from \"../../utils/expand-escapes.cjs\";\n\ninterface EchoFlags {\n noNewline: boolean;\n interpretEscapes: boolean;\n}\n\nconst defaults: EchoFlags = { noNewline: false, interpretEscapes: false };\n\nfunction isEchoOption(arg: string): boolean {\n if (!arg.startsWith(\"-\") || arg === \"-\") {\n return false;\n }\n\n for (const char of arg.slice(1)) {\n if (char !== \"n\" && char !== \"e\" && char !== \"E\") {\n return false;\n }\n }\n\n return true;\n}\n\nfunction parseEchoArgs(args: string[]): { flags: EchoFlags; args: string[] } {\n const flags = { ...defaults };\n let index = 0;\n\n // Match common shell echo behavior: only leading -n/-e/-E clusters are\n // treated as options. Anything else, including \"--\" and \"--invalid\", is\n // printed literally.\n while (index < args.length && isEchoOption(args[index]!)) {\n for (const char of args[index]!.slice(1)) {\n if (char === \"n\") flags.noNewline = true;\n if (char === \"e\") flags.interpretEscapes = true;\n if (char === \"E\") flags.interpretEscapes = false;\n }\n index++;\n }\n\n return { flags, args: args.slice(index) };\n}\n\nexport const echo: Command = async (ctx) => {\n const result = parseEchoArgs(ctx.args);\n\n let output = result.args.join(\" \");\n\n if (result.flags.interpretEscapes) {\n output = expandEscapes(output);\n }\n\n if (!result.flags.noNewline) {\n output += \"\\n\";\n }\n\n await ctx.stdout.writeText(output);\n return 0;\n};\n"
6
6
  ],
7
- "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACsD,IAAtD;AAC8B,IAA9B;AAOA,IAAM,OAAO;AAAA,EACX,MAAM;AAAA,EACN,OAAO;AAAA,IACL,EAAE,OAAO,IAAI;AAAA,IACb,EAAE,OAAO,IAAI;AAAA,EACf;AAAA,EACA,OAAO;AAAA,EACP,0BAA0B;AAC5B;AAEA,IAAM,WAAsB,EAAE,WAAW,OAAO,kBAAkB,MAAM;AAExE,IAAM,UAAU,CAAC,OAAkB,SAAyB;AAAA,EAC1D,IAAI,KAAK,UAAU;AAAA,IAAK,MAAM,YAAY;AAAA,EAC1C,IAAI,KAAK,UAAU;AAAA,IAAK,MAAM,mBAAmB;AAAA;AAGnD,IAAM,SAAS,oCAAiB,MAAM,UAAU,OAAO;AAEhD,IAAM,OAAgB,OAAO,QAAQ;AAAA,EAC1C,MAAM,SAAS,OAAO,MAAM,IAAI,IAAI;AAAA,EAEpC,IAAI,OAAO,OAAO;AAAA,IAChB,MAAM,OAAO,WAAW,OAAO,OAAO,IAAI,MAAM;AAAA,IAChD,OAAO;AAAA,EACT;AAAA,EAEA,IAAI,SAAS,OAAO,KAAK,KAAK,GAAG;AAAA,EAEjC,IAAI,OAAO,MAAM,kBAAkB;AAAA,IACjC,SAAS,oCAAc,MAAM;AAAA,EAC/B;AAAA,EAEA,IAAI,CAAC,OAAO,MAAM,WAAW;AAAA,IAC3B,UAAU;AAAA;AAAA,EACZ;AAAA,EAEA,MAAM,IAAI,OAAO,UAAU,MAAM;AAAA,EACjC,OAAO;AAAA;",
8
- "debugId": "1C2C02D83C5D2B1D64756E2164756E21",
7
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAC8B,IAA9B;AAOA,IAAM,WAAsB,EAAE,WAAW,OAAO,kBAAkB,MAAM;AAExE,SAAS,YAAY,CAAC,KAAsB;AAAA,EAC1C,IAAI,CAAC,IAAI,WAAW,GAAG,KAAK,QAAQ,KAAK;AAAA,IACvC,OAAO;AAAA,EACT;AAAA,EAEA,WAAW,QAAQ,IAAI,MAAM,CAAC,GAAG;AAAA,IAC/B,IAAI,SAAS,OAAO,SAAS,OAAO,SAAS,KAAK;AAAA,MAChD,OAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEA,OAAO;AAAA;AAGT,SAAS,aAAa,CAAC,MAAsD;AAAA,EAC3E,MAAM,QAAQ,KAAK,SAAS;AAAA,EAC5B,IAAI,QAAQ;AAAA,EAKZ,OAAO,QAAQ,KAAK,UAAU,aAAa,KAAK,MAAO,GAAG;AAAA,IACxD,WAAW,QAAQ,KAAK,OAAQ,MAAM,CAAC,GAAG;AAAA,MACxC,IAAI,SAAS;AAAA,QAAK,MAAM,YAAY;AAAA,MACpC,IAAI,SAAS;AAAA,QAAK,MAAM,mBAAmB;AAAA,MAC3C,IAAI,SAAS;AAAA,QAAK,MAAM,mBAAmB;AAAA,IAC7C;AAAA,IACA;AAAA,EACF;AAAA,EAEA,OAAO,EAAE,OAAO,MAAM,KAAK,MAAM,KAAK,EAAE;AAAA;AAGnC,IAAM,OAAgB,OAAO,QAAQ;AAAA,EAC1C,MAAM,SAAS,cAAc,IAAI,IAAI;AAAA,EAErC,IAAI,SAAS,OAAO,KAAK,KAAK,GAAG;AAAA,EAEjC,IAAI,OAAO,MAAM,kBAAkB;AAAA,IACjC,SAAS,oCAAc,MAAM;AAAA,EAC/B;AAAA,EAEA,IAAI,CAAC,OAAO,MAAM,WAAW;AAAA,IAC3B,UAAU;AAAA;AAAA,EACZ;AAAA,EAEA,MAAM,IAAI,OAAO,UAAU,MAAM;AAAA,EACjC,OAAO;AAAA;",
8
+ "debugId": "91584B2D49E63BEA64756E2164756E21",
9
9
  "names": []
10
10
  }
@@ -52,6 +52,7 @@ __export(exports_commands, {
52
52
  sed: () => import_sed.sed,
53
53
  rm: () => import_rm.rm,
54
54
  pwd: () => import_pwd.pwd,
55
+ od: () => import_od.od,
55
56
  mv: () => import_mv.mv,
56
57
  mkdir: () => import_mkdir.mkdir,
57
58
  ls: () => import_ls.ls,
@@ -99,6 +100,7 @@ var import_colon = require("./colon/colon.cjs");
99
100
  var import_cd = require("./cd/cd.cjs");
100
101
  var import_tr = require("./tr/tr.cjs");
101
102
  var import_cut = require("./cut/cut.cjs");
103
+ var import_od = require("./od/od.cjs");
102
104
  var import_echo2 = require("./echo/echo.cjs");
103
105
  var import_cat2 = require("./cat/cat.cjs");
104
106
  var import_grep2 = require("./grep/grep.cjs");
@@ -126,6 +128,7 @@ var import_colon2 = require("./colon/colon.cjs");
126
128
  var import_cd2 = require("./cd/cd.cjs");
127
129
  var import_tr2 = require("./tr/tr.cjs");
128
130
  var import_cut2 = require("./cut/cut.cjs");
131
+ var import_od2 = require("./od/od.cjs");
129
132
  var builtinCommands = {
130
133
  echo: import_echo2.echo,
131
134
  cat: import_cat2.cat,
@@ -156,7 +159,8 @@ var builtinCommands = {
156
159
  ":": import_colon2.colon,
157
160
  cd: import_cd2.cd,
158
161
  tr: import_tr2.tr,
159
- cut: import_cut2.cut
162
+ cut: import_cut2.cut,
163
+ od: import_od2.od
160
164
  };
161
165
 
162
- //# debugId=245790BFC6ECB4BD64756E2164756E21
166
+ //# debugId=3F2FAD85701006CD64756E2164756E21
@@ -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\";\nexport { cd } from \"./cd/cd.cjs\";\nexport { tr } from \"./tr/tr.cjs\";\nexport { cut } from \"./cut/cut.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\";\nimport { cut } from \"./cut/cut.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 cut,\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\";\nexport { cut } from \"./cut/cut.cjs\";\nexport { od } from \"./od/od.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\";\nimport { cut } from \"./cut/cut.cjs\";\nimport { od } from \"./od/od.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 cut,\n od,\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;AACmB,IAAnB;AACmB,IAAnB;AACoB,IAApB;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;AACoB,IAApB;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;AAAA,EACA;AACF;",
8
- "debugId": "245790BFC6ECB4BD64756E2164756E21",
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;AACoB,IAApB;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;AACoB,IAApB;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;AAAA,EACA;AAAA,EACA;AACF;",
8
+ "debugId": "3F2FAD85701006CD64756E2164756E21",
9
9
  "names": []
10
10
  }
@@ -0,0 +1,274 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __getOwnPropNames = Object.getOwnPropertyNames;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
5
+ function __accessProp(key) {
6
+ return this[key];
7
+ }
8
+ var __toCommonJS = (from) => {
9
+ var entry = (__moduleCache ??= new WeakMap).get(from), desc;
10
+ if (entry)
11
+ return entry;
12
+ entry = __defProp({}, "__esModule", { value: true });
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (var key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(entry, key))
16
+ __defProp(entry, key, {
17
+ get: __accessProp.bind(from, key),
18
+ enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
19
+ });
20
+ }
21
+ __moduleCache.set(from, entry);
22
+ return entry;
23
+ };
24
+ var __moduleCache;
25
+ var __returnValue = (v) => v;
26
+ function __exportSetter(name, newValue) {
27
+ this[name] = __returnValue.bind(null, newValue);
28
+ }
29
+ var __export = (target, all) => {
30
+ for (var name in all)
31
+ __defProp(target, name, {
32
+ get: all[name],
33
+ enumerable: true,
34
+ configurable: true,
35
+ set: __exportSetter.bind(all, name)
36
+ });
37
+ };
38
+
39
+ // src/commands/od/od.ts
40
+ var exports_od = {};
41
+ __export(exports_od, {
42
+ od: () => od
43
+ });
44
+ module.exports = __toCommonJS(exports_od);
45
+ var import_flag_parser = require("../../utils/flag-parser.cjs");
46
+ var ADDRESS_WIDTH = 7;
47
+ var ADDRESS_SEPARATOR = " ";
48
+ var NO_ADDRESS_PREFIX = " ".repeat(ADDRESS_WIDTH + ADDRESS_SEPARATOR.length);
49
+ var LINE_BYTES = 16;
50
+ var spec = {
51
+ name: "od",
52
+ flags: [
53
+ { short: "A", takesValue: true },
54
+ { short: "b" },
55
+ { short: "c" },
56
+ { short: "j", takesValue: true },
57
+ { short: "N", takesValue: true },
58
+ { short: "o" },
59
+ { short: "t", takesValue: true },
60
+ { short: "v" },
61
+ { short: "x" }
62
+ ],
63
+ usage: "od [-bcovx] [-A radix] [-j skip] [-N count] [-t type] [file ...]"
64
+ };
65
+ var defaults = {
66
+ addressRadix: "o",
67
+ format: null,
68
+ formatConflict: null,
69
+ invalidType: null,
70
+ verbose: false,
71
+ skip: null,
72
+ count: null
73
+ };
74
+ function selectFormat(flags, format, source) {
75
+ if (flags.format === null) {
76
+ flags.format = format;
77
+ return;
78
+ }
79
+ flags.formatConflict = source;
80
+ }
81
+ function isOutputFormat(value) {
82
+ return value === "x1" || value === "x2" || value === "o1" || value === "o2" || value === "c";
83
+ }
84
+ var parser = import_flag_parser.createFlagParser(spec, defaults, (flags, flag, value) => {
85
+ switch (flag.short) {
86
+ case "A":
87
+ flags.addressRadix = value ?? "o";
88
+ break;
89
+ case "b":
90
+ selectFormat(flags, "o1", "-b");
91
+ break;
92
+ case "c":
93
+ selectFormat(flags, "c", "-c");
94
+ break;
95
+ case "j":
96
+ flags.skip = value ?? null;
97
+ break;
98
+ case "N":
99
+ flags.count = value ?? null;
100
+ break;
101
+ case "o":
102
+ selectFormat(flags, "o2", "-o");
103
+ break;
104
+ case "t":
105
+ if (value && isOutputFormat(value)) {
106
+ selectFormat(flags, value, "-t");
107
+ } else if (value) {
108
+ flags.invalidType = value;
109
+ }
110
+ break;
111
+ case "v":
112
+ flags.verbose = true;
113
+ break;
114
+ case "x":
115
+ selectFormat(flags, "x2", "-x");
116
+ break;
117
+ }
118
+ });
119
+ function isAddressRadix(value) {
120
+ return value === "o" || value === "d" || value === "x" || value === "n";
121
+ }
122
+ function parseNonNegativeInteger(value, label) {
123
+ if (!/^\d+$/.test(value)) {
124
+ return null;
125
+ }
126
+ const parsed = Number(value);
127
+ if (!Number.isSafeInteger(parsed)) {
128
+ return null;
129
+ }
130
+ return parsed;
131
+ }
132
+ function formatAddress(offset, radix) {
133
+ const base = radix === "o" ? 8 : radix === "d" ? 10 : 16;
134
+ return offset.toString(base).padStart(ADDRESS_WIDTH, "0");
135
+ }
136
+ function formatCharacter(byte) {
137
+ let token;
138
+ if (byte === 0) {
139
+ token = "\\0";
140
+ } else if (byte === 9) {
141
+ token = "\\t";
142
+ } else if (byte === 10) {
143
+ token = "\\n";
144
+ } else if (byte >= 32 && byte <= 126) {
145
+ token = String.fromCharCode(byte);
146
+ } else {
147
+ token = `\\${byte.toString(8).padStart(3, "0")}`;
148
+ }
149
+ return token.length < 3 ? token.padStart(3, " ") : token;
150
+ }
151
+ function formatWord(bytes, index, radix) {
152
+ const low = bytes[index] ?? 0;
153
+ const high = bytes[index + 1] ?? 0;
154
+ const value = low | high << 8;
155
+ const base = radix === "hex" ? 16 : 8;
156
+ const width = radix === "hex" ? 4 : 6;
157
+ return value.toString(base).padStart(width, "0");
158
+ }
159
+ function formatRow(bytes, format) {
160
+ const values = [];
161
+ if (format === "x1") {
162
+ for (const byte of bytes) {
163
+ values.push(byte.toString(16).padStart(2, "0"));
164
+ }
165
+ } else if (format === "o1") {
166
+ for (const byte of bytes) {
167
+ values.push(byte.toString(8).padStart(3, "0"));
168
+ }
169
+ } else if (format === "c") {
170
+ for (const byte of bytes) {
171
+ values.push(formatCharacter(byte));
172
+ }
173
+ } else if (format === "x2") {
174
+ for (let i = 0;i < bytes.length; i += 2) {
175
+ values.push(formatWord(bytes, i, "hex"));
176
+ }
177
+ } else {
178
+ for (let i = 0;i < bytes.length; i += 2) {
179
+ values.push(formatWord(bytes, i, "octal"));
180
+ }
181
+ }
182
+ return values.join(" ");
183
+ }
184
+ async function readInput(ctx, files) {
185
+ if (files.length === 0) {
186
+ return await ctx.stdin.buffer();
187
+ }
188
+ const chunks = [];
189
+ for (const file of files) {
190
+ try {
191
+ const path = ctx.fs.resolve(ctx.cwd, file);
192
+ chunks.push(await ctx.fs.readFile(path));
193
+ } catch {
194
+ await ctx.stderr.writeText(`od: ${file}: No such file or directory
195
+ `);
196
+ return null;
197
+ }
198
+ }
199
+ return Buffer.concat(chunks);
200
+ }
201
+ var od = async (ctx) => {
202
+ const result = parser.parse(ctx.args);
203
+ if (result.error) {
204
+ await parser.writeError(result.error, ctx.stderr);
205
+ return 1;
206
+ }
207
+ const { addressRadix, formatConflict, invalidType, skip, count, verbose } = result.flags;
208
+ if (!isAddressRadix(addressRadix)) {
209
+ await ctx.stderr.writeText(`od: invalid address radix '${addressRadix}'
210
+ `);
211
+ return 1;
212
+ }
213
+ if (invalidType !== null) {
214
+ await ctx.stderr.writeText(`od: invalid type string '${invalidType}'
215
+ `);
216
+ return 1;
217
+ }
218
+ if (formatConflict !== null) {
219
+ await ctx.stderr.writeText(`od: multiple output formats are not supported
220
+ `);
221
+ return 1;
222
+ }
223
+ const skipBytes = skip === null ? 0 : parseNonNegativeInteger(skip, "skip");
224
+ if (skipBytes === null) {
225
+ await ctx.stderr.writeText(`od: invalid skip '${skip}'
226
+ `);
227
+ return 1;
228
+ }
229
+ const countBytes = count === null ? null : parseNonNegativeInteger(count, "count");
230
+ if (count !== null && countBytes === null) {
231
+ await ctx.stderr.writeText(`od: invalid byte count '${count}'
232
+ `);
233
+ return 1;
234
+ }
235
+ const input = await readInput(ctx, result.args);
236
+ if (input === null) {
237
+ return 1;
238
+ }
239
+ const start = Math.min(skipBytes, input.length);
240
+ const sliced = countBytes === null ? input.subarray(start) : input.subarray(start, Math.min(start + countBytes, input.length));
241
+ if (sliced.length === 0) {
242
+ return 0;
243
+ }
244
+ const format = result.flags.format ?? "o2";
245
+ let previousRow = null;
246
+ let emittedSqueezeMarker = false;
247
+ let offset = start;
248
+ for (let i = 0;i < sliced.length; i += LINE_BYTES) {
249
+ const rowBytes = sliced.subarray(i, Math.min(i + LINE_BYTES, sliced.length));
250
+ const row = formatRow(rowBytes, format);
251
+ if (!verbose && row === previousRow) {
252
+ if (!emittedSqueezeMarker) {
253
+ await ctx.stdout.writeText(`*
254
+ `);
255
+ emittedSqueezeMarker = true;
256
+ }
257
+ offset += rowBytes.length;
258
+ continue;
259
+ }
260
+ previousRow = row;
261
+ emittedSqueezeMarker = false;
262
+ const prefix = addressRadix === "n" ? NO_ADDRESS_PREFIX : `${formatAddress(offset, addressRadix)}${ADDRESS_SEPARATOR}`;
263
+ await ctx.stdout.writeText(`${prefix}${row}
264
+ `);
265
+ offset += rowBytes.length;
266
+ }
267
+ if (addressRadix !== "n") {
268
+ await ctx.stdout.writeText(`${formatAddress(offset, addressRadix)}
269
+ `);
270
+ }
271
+ return 0;
272
+ };
273
+
274
+ //# debugId=3DFF62CF5B2C215464756E2164756E21
@@ -0,0 +1,10 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/commands/od/od.ts"],
4
+ "sourcesContent": [
5
+ "import type { Command } from \"../../types.cjs\";\nimport { createFlagParser, type FlagDefinition } from \"../../utils/flag-parser.cjs\";\n\ntype AddressRadix = \"o\" | \"d\" | \"x\" | \"n\";\ntype OutputFormat = \"x1\" | \"x2\" | \"o1\" | \"o2\" | \"c\";\n\ninterface OdFlags {\n addressRadix: string;\n format: OutputFormat | null;\n formatConflict: string | null;\n invalidType: string | null;\n verbose: boolean;\n skip: string | null;\n count: string | null;\n}\n\nconst ADDRESS_WIDTH = 7;\nconst ADDRESS_SEPARATOR = \" \";\nconst NO_ADDRESS_PREFIX = \" \".repeat(ADDRESS_WIDTH + ADDRESS_SEPARATOR.length);\nconst LINE_BYTES = 16;\n\nconst spec = {\n name: \"od\",\n flags: [\n { short: \"A\", takesValue: true },\n { short: \"b\" },\n { short: \"c\" },\n { short: \"j\", takesValue: true },\n { short: \"N\", takesValue: true },\n { short: \"o\" },\n { short: \"t\", takesValue: true },\n { short: \"v\" },\n { short: \"x\" },\n ] as FlagDefinition[],\n usage: \"od [-bcovx] [-A radix] [-j skip] [-N count] [-t type] [file ...]\",\n};\n\nconst defaults: OdFlags = {\n addressRadix: \"o\",\n format: null,\n formatConflict: null,\n invalidType: null,\n verbose: false,\n skip: null,\n count: null,\n};\n\nfunction selectFormat(flags: OdFlags, format: OutputFormat, source: string): void {\n if (flags.format === null) {\n flags.format = format;\n return;\n }\n\n flags.formatConflict = source;\n}\n\nfunction isOutputFormat(value: string): value is OutputFormat {\n return value === \"x1\" || value === \"x2\" || value === \"o1\" || value === \"o2\" || value === \"c\";\n}\n\nconst parser = createFlagParser(spec, defaults, (flags, flag, value) => {\n switch (flag.short) {\n case \"A\":\n flags.addressRadix = value ?? \"o\";\n break;\n case \"b\":\n selectFormat(flags, \"o1\", \"-b\");\n break;\n case \"c\":\n selectFormat(flags, \"c\", \"-c\");\n break;\n case \"j\":\n flags.skip = value ?? null;\n break;\n case \"N\":\n flags.count = value ?? null;\n break;\n case \"o\":\n selectFormat(flags, \"o2\", \"-o\");\n break;\n case \"t\":\n if (value && isOutputFormat(value)) {\n selectFormat(flags, value, \"-t\");\n } else if (value) {\n flags.invalidType = value;\n }\n break;\n case \"v\":\n flags.verbose = true;\n break;\n case \"x\":\n selectFormat(flags, \"x2\", \"-x\");\n break;\n }\n});\n\nfunction isAddressRadix(value: string): value is AddressRadix {\n return value === \"o\" || value === \"d\" || value === \"x\" || value === \"n\";\n}\n\nfunction parseNonNegativeInteger(value: string, label: \"skip\" | \"count\"): number | null {\n if (!/^\\d+$/.test(value)) {\n return null;\n }\n\n const parsed = Number(value);\n if (!Number.isSafeInteger(parsed)) {\n return null;\n }\n\n return parsed;\n}\n\nfunction formatAddress(offset: number, radix: Exclude<AddressRadix, \"n\">): string {\n const base = radix === \"o\" ? 8 : radix === \"d\" ? 10 : 16;\n return offset.toString(base).padStart(ADDRESS_WIDTH, \"0\");\n}\n\nfunction formatCharacter(byte: number): string {\n let token: string;\n\n if (byte === 0) {\n token = \"\\\\0\";\n } else if (byte === 9) {\n token = \"\\\\t\";\n } else if (byte === 10) {\n token = \"\\\\n\";\n } else if (byte >= 32 && byte <= 126) {\n token = String.fromCharCode(byte);\n } else {\n token = `\\\\${byte.toString(8).padStart(3, \"0\")}`;\n }\n\n return token.length < 3 ? token.padStart(3, \" \") : token;\n}\n\nfunction formatWord(bytes: Uint8Array, index: number, radix: \"hex\" | \"octal\"): string {\n const low = bytes[index] ?? 0;\n const high = bytes[index + 1] ?? 0;\n const value = low | (high << 8);\n const base = radix === \"hex\" ? 16 : 8;\n const width = radix === \"hex\" ? 4 : 6;\n return value.toString(base).padStart(width, \"0\");\n}\n\nfunction formatRow(bytes: Uint8Array, format: OutputFormat): string {\n const values: string[] = [];\n\n if (format === \"x1\") {\n for (const byte of bytes) {\n values.push(byte.toString(16).padStart(2, \"0\"));\n }\n } else if (format === \"o1\") {\n for (const byte of bytes) {\n values.push(byte.toString(8).padStart(3, \"0\"));\n }\n } else if (format === \"c\") {\n for (const byte of bytes) {\n values.push(formatCharacter(byte));\n }\n } else if (format === \"x2\") {\n for (let i = 0; i < bytes.length; i += 2) {\n values.push(formatWord(bytes, i, \"hex\"));\n }\n } else {\n for (let i = 0; i < bytes.length; i += 2) {\n values.push(formatWord(bytes, i, \"octal\"));\n }\n }\n\n return values.join(\" \");\n}\n\nasync function readInput(ctx: Parameters<Command>[0], files: string[]): Promise<Buffer | null> {\n if (files.length === 0) {\n return await ctx.stdin.buffer();\n }\n\n const chunks: Buffer[] = [];\n\n for (const file of files) {\n try {\n const path = ctx.fs.resolve(ctx.cwd, file);\n chunks.push(await ctx.fs.readFile(path));\n } catch {\n await ctx.stderr.writeText(`od: ${file}: No such file or directory\\n`);\n return null;\n }\n }\n\n return Buffer.concat(chunks);\n}\n\nexport const od: 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 { addressRadix, formatConflict, invalidType, skip, count, verbose } = result.flags;\n\n if (!isAddressRadix(addressRadix)) {\n await ctx.stderr.writeText(`od: invalid address radix '${addressRadix}'\\n`);\n return 1;\n }\n\n if (invalidType !== null) {\n await ctx.stderr.writeText(`od: invalid type string '${invalidType}'\\n`);\n return 1;\n }\n\n if (formatConflict !== null) {\n await ctx.stderr.writeText(\"od: multiple output formats are not supported\\n\");\n return 1;\n }\n\n const skipBytes = skip === null ? 0 : parseNonNegativeInteger(skip, \"skip\");\n if (skipBytes === null) {\n await ctx.stderr.writeText(`od: invalid skip '${skip}'\\n`);\n return 1;\n }\n\n const countBytes = count === null ? null : parseNonNegativeInteger(count, \"count\");\n if (count !== null && countBytes === null) {\n await ctx.stderr.writeText(`od: invalid byte count '${count}'\\n`);\n return 1;\n }\n\n const input = await readInput(ctx, result.args);\n if (input === null) {\n return 1;\n }\n\n const start = Math.min(skipBytes, input.length);\n const sliced = countBytes === null\n ? input.subarray(start)\n : input.subarray(start, Math.min(start + countBytes, input.length));\n\n if (sliced.length === 0) {\n return 0;\n }\n\n const format = result.flags.format ?? \"o2\";\n\n let previousRow: string | null = null;\n let emittedSqueezeMarker = false;\n let offset = start;\n\n for (let i = 0; i < sliced.length; i += LINE_BYTES) {\n const rowBytes = sliced.subarray(i, Math.min(i + LINE_BYTES, sliced.length));\n const row = formatRow(rowBytes, format);\n\n if (!verbose && row === previousRow) {\n if (!emittedSqueezeMarker) {\n await ctx.stdout.writeText(\"*\\n\");\n emittedSqueezeMarker = true;\n }\n offset += rowBytes.length;\n continue;\n }\n\n previousRow = row;\n emittedSqueezeMarker = false;\n\n const prefix = addressRadix === \"n\"\n ? NO_ADDRESS_PREFIX\n : `${formatAddress(offset, addressRadix)}${ADDRESS_SEPARATOR}`;\n\n await ctx.stdout.writeText(`${prefix}${row}\\n`);\n offset += rowBytes.length;\n }\n\n if (addressRadix !== \"n\") {\n await ctx.stdout.writeText(`${formatAddress(offset, addressRadix)}\\n`);\n }\n\n return 0;\n};\n"
6
+ ],
7
+ "mappings": "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",
8
+ "debugId": "3DFF62CF5B2C215464756E2164756E21",
9
+ "names": []
10
+ }
@@ -42,22 +42,17 @@ __export(exports_src, {
42
42
  tokenToString: () => import_lexer.tokenToString,
43
43
  parse: () => import_parser.parse,
44
44
  lex: () => import_lexer.lex,
45
+ isWordNode: () => import_parser2.isWordNode,
45
46
  isWhileNode: () => import_parser2.isWhileNode,
46
- isVariableNode: () => import_parser2.isVariableNode,
47
47
  isUntilNode: () => import_parser2.isUntilNode,
48
- isSubstitutionNode: () => import_parser2.isSubstitutionNode,
49
48
  isSequenceNode: () => import_parser2.isSequenceNode,
50
49
  isRawValue: () => import_types.isRawValue,
51
50
  isPipelineNode: () => import_parser2.isPipelineNode,
52
51
  isOrNode: () => import_parser2.isOrNode,
53
- isLiteralNode: () => import_parser2.isLiteralNode,
54
52
  isIfNode: () => import_parser2.isIfNode,
55
- isGlobNode: () => import_parser2.isGlobNode,
56
53
  isForNode: () => import_parser2.isForNode,
57
- isConcatNode: () => import_parser2.isConcatNode,
58
54
  isCommandNode: () => import_parser2.isCommandNode,
59
55
  isCaseNode: () => import_parser2.isCaseNode,
60
- isArithmeticNode: () => import_parser2.isArithmeticNode,
61
56
  isAndNode: () => import_parser2.isAndNode,
62
57
  globVirtualFS: () => import_utils.globVirtualFS,
63
58
  escapeForInterpolation: () => import_utils.escapeForInterpolation,
@@ -103,4 +98,4 @@ var import_io2 = require("./io/index.cjs");
103
98
  var import_utils = require("./utils/index.cjs");
104
99
  var import_vcs = require("./vcs/index.cjs");
105
100
 
106
- //# debugId=27F0973A44539CA064756E2164756E21
101
+ //# debugId=188D4F3252D1BB8C64756E2164756E21
@@ -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.cjs\";\nexport { ShellPromise, type ShellPromiseOptions } from \"./shell-promise.cjs\";\n\n// Types\nexport type {\n VirtualFS,\n VirtualFSWritable,\n FileStat,\n Command,\n CommandContext,\n Stdin,\n Stdout,\n Stderr,\n OutputCollector,\n ExecResult,\n ShellConfig,\n RawValue,\n} from \"./types.cjs\";\nexport { isRawValue } from \"./types.cjs\";\n\n// Errors\nexport { ShellError, LexError, ParseError } from \"./errors.cjs\";\n\n// Lexer\nexport { Lexer, lex, tokenToString } from \"./lexer/index.cjs\";\nexport type { Token, RedirectMode } from \"./lexer/index.cjs\";\n\n// Parser\nexport { Parser, parse } from \"./parser/index.cjs\";\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.cjs\";\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.cjs\";\n\n// Interpreter\nexport { Interpreter, type InterpreterOptions, BreakException, ContinueException } from \"./interpreter/index.cjs\";\n\n// Filesystem\nexport { createVirtualFS } from \"./fs/index.cjs\";\nexport {\n FileSystem,\n ReadOnlyFileSystem,\n WebFileSystem,\n createWebUnderlyingFS,\n type PathOps,\n type Permission,\n type PermissionRules,\n type UnderlyingFS,\n} from \"./fs/index.cjs\";\n\n// I/O\nexport { createStdin, StdinImpl } from \"./io/index.cjs\";\nexport { createStdout, createStderr, createPipe, OutputCollectorImpl, PipeBuffer } from \"./io/index.cjs\";\n\n// Utilities\nexport { escape, escapeForInterpolation, globVirtualFS } from \"./utils/index.cjs\";\nexport type { GlobVirtualFS, GlobOptions } from \"./utils/index.cjs\";\n\n// Version Control\nexport { VersionControlSystem } from \"./vcs/index.cjs\";\nexport type {\n VCSConfig,\n VCSAttributeRule,\n VCSResolvedAttributes,\n VCSDiffMode,\n VCSPatchSuppressionReason,\n Revision,\n DiffEntry,\n TreeManifest,\n TreeEntry,\n FileEntry,\n DirectoryEntry,\n VCSIndexEntry,\n VCSIndexFile,\n CommitOptions,\n CheckoutOptions,\n LogOptions,\n LogEntry,\n BranchInfo,\n} from \"./vcs/index.cjs\";\n"
5
+ "// Main class exports\nexport { ShellDSL, createShellDSL, type Program } from \"./shell-dsl.cjs\";\nexport { ShellPromise, type ShellPromiseOptions } from \"./shell-promise.cjs\";\n\n// Types\nexport type {\n VirtualFS,\n VirtualFSWritable,\n FileStat,\n Command,\n CommandContext,\n Stdin,\n Stdout,\n Stderr,\n OutputCollector,\n ExecResult,\n ShellConfig,\n RawValue,\n} from \"./types.cjs\";\nexport { isRawValue } from \"./types.cjs\";\n\n// Errors\nexport { ShellError, LexError, ParseError } from \"./errors.cjs\";\n\n// Lexer\nexport { Lexer, lex, tokenToString } from \"./lexer/index.cjs\";\nexport type { Token, RedirectMode } from \"./lexer/index.cjs\";\n\n// Parser\nexport { Parser, parse } from \"./parser/index.cjs\";\nexport type {\n ASTNode,\n Redirect,\n CommandNode,\n PipelineNode,\n AndNode,\n OrNode,\n SequenceNode,\n WordNode,\n WordPart,\n TextPart,\n VariablePart,\n SubstitutionPart,\n ArithmeticPart,\n IfNode,\n ForNode,\n WhileNode,\n UntilNode,\n CaseNode,\n CaseClause,\n} from \"./parser/index.cjs\";\nexport {\n isWordNode,\n isCommandNode,\n isPipelineNode,\n isAndNode,\n isOrNode,\n isSequenceNode,\n isIfNode,\n isForNode,\n isWhileNode,\n isUntilNode,\n isCaseNode,\n} from \"./parser/index.cjs\";\n\n// Interpreter\nexport { Interpreter, type InterpreterOptions, BreakException, ContinueException } from \"./interpreter/index.cjs\";\n\n// Filesystem\nexport { createVirtualFS } from \"./fs/index.cjs\";\nexport {\n FileSystem,\n ReadOnlyFileSystem,\n WebFileSystem,\n createWebUnderlyingFS,\n type PathOps,\n type Permission,\n type PermissionRules,\n type UnderlyingFS,\n} from \"./fs/index.cjs\";\n\n// I/O\nexport { createStdin, StdinImpl } from \"./io/index.cjs\";\nexport { createStdout, createStderr, createPipe, OutputCollectorImpl, PipeBuffer } from \"./io/index.cjs\";\n\n// Utilities\nexport { escape, escapeForInterpolation, globVirtualFS } from \"./utils/index.cjs\";\nexport type { GlobVirtualFS, GlobOptions } from \"./utils/index.cjs\";\n\n// Version Control\nexport { VersionControlSystem } from \"./vcs/index.cjs\";\nexport type {\n VCSConfig,\n VCSAttributeRule,\n VCSResolvedAttributes,\n VCSDiffMode,\n VCSPatchSuppressionReason,\n Revision,\n DiffEntry,\n TreeManifest,\n TreeEntry,\n FileEntry,\n DirectoryEntry,\n VCSIndexEntry,\n VCSIndexFile,\n CommitOptions,\n CheckoutOptions,\n LogOptions,\n LogEntry,\n BranchInfo,\n} from \"./vcs/index.cjs\";\n"
6
6
  ],
7
- "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACuD,IAAvD;AACuD,IAAvD;AAiB2B,IAA3B;AAGiD,IAAjD;AAG0C,IAA1C;AAI8B,IAA9B;AAuCO,IAjBP;AAoBwF,IAAxF;AAGgC,IAAhC;AAUO,IATP;AAYuC,IAAvC;AACwF,IAAxF;AAG8D,IAA9D;AAIqC,IAArC;",
8
- "debugId": "27F0973A44539CA064756E2164756E21",
7
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACuD,IAAvD;AACuD,IAAvD;AAiB2B,IAA3B;AAGiD,IAAjD;AAG0C,IAA1C;AAI8B,IAA9B;AAkCO,IAZP;AAewF,IAAxF;AAGgC,IAAhC;AAUO,IATP;AAYuC,IAAvC;AACwF,IAAxF;AAG8D,IAA9D;AAIqC,IAArC;",
8
+ "debugId": "188D4F3252D1BB8C64756E2164756E21",
9
9
  "names": []
10
10
  }