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.
- package/README.md +27 -3
- package/dist/cjs/index.cjs +2 -1
- package/dist/cjs/index.cjs.map +3 -3
- package/dist/cjs/package.json +1 -1
- package/dist/cjs/src/commands/echo/echo.cjs +29 -23
- package/dist/cjs/src/commands/echo/echo.cjs.map +3 -3
- package/dist/cjs/src/commands/index.cjs +6 -2
- package/dist/cjs/src/commands/index.cjs.map +3 -3
- package/dist/cjs/src/commands/od/od.cjs +274 -0
- package/dist/cjs/src/commands/od/od.cjs.map +10 -0
- package/dist/cjs/src/index.cjs +2 -7
- package/dist/cjs/src/index.cjs.map +3 -3
- package/dist/cjs/src/interpreter/interpreter.cjs +186 -68
- package/dist/cjs/src/interpreter/interpreter.cjs.map +3 -3
- package/dist/cjs/src/parser/ast.cjs +5 -25
- package/dist/cjs/src/parser/ast.cjs.map +3 -3
- package/dist/cjs/src/parser/index.cjs +2 -7
- package/dist/cjs/src/parser/index.cjs.map +3 -3
- package/dist/cjs/src/parser/parser.cjs +132 -82
- package/dist/cjs/src/parser/parser.cjs.map +3 -3
- package/dist/mjs/index.mjs +4 -2
- package/dist/mjs/index.mjs.map +3 -3
- package/dist/mjs/package.json +1 -1
- package/dist/mjs/src/commands/echo/echo.mjs +29 -23
- package/dist/mjs/src/commands/echo/echo.mjs.map +3 -3
- package/dist/mjs/src/commands/index.mjs +6 -2
- package/dist/mjs/src/commands/index.mjs.map +3 -3
- package/dist/mjs/src/commands/od/od.mjs +234 -0
- package/dist/mjs/src/commands/od/od.mjs.map +10 -0
- package/dist/mjs/src/index.mjs +4 -14
- package/dist/mjs/src/index.mjs.map +3 -3
- package/dist/mjs/src/interpreter/interpreter.mjs +186 -68
- package/dist/mjs/src/interpreter/interpreter.mjs.map +3 -3
- package/dist/mjs/src/parser/ast.mjs +5 -25
- package/dist/mjs/src/parser/ast.mjs.map +3 -3
- package/dist/mjs/src/parser/index.mjs +4 -14
- package/dist/mjs/src/parser/index.mjs.map +3 -3
- package/dist/mjs/src/parser/parser.mjs +132 -82
- package/dist/mjs/src/parser/parser.mjs.map +3 -3
- package/dist/types/index.d.ts +1 -1
- package/dist/types/src/commands/index.d.ts +1 -0
- package/dist/types/src/commands/od/od.d.ts +2 -0
- package/dist/types/src/index.d.ts +2 -2
- package/dist/types/src/interpreter/interpreter.d.ts +15 -1
- package/dist/types/src/parser/ast.d.ts +34 -38
- package/dist/types/src/parser/index.d.ts +2 -2
- package/dist/types/src/parser/parser.d.ts +4 -1
- 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
|
|
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
|
|
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 |
|
package/dist/cjs/index.cjs
CHANGED
|
@@ -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=
|
|
94
|
+
//# debugId=D3C9D8D0D2FCEB0A64756E2164756E21
|
package/dist/cjs/index.cjs.map
CHANGED
|
@@ -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": "
|
|
8
|
-
"debugId": "
|
|
7
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACA;AAGgC,IAAhC;AA6BO,IA5BP;",
|
|
8
|
+
"debugId": "D3C9D8D0D2FCEB0A64756E2164756E21",
|
|
9
9
|
"names": []
|
|
10
10
|
}
|
package/dist/cjs/package.json
CHANGED
|
@@ -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
|
-
|
|
58
|
-
if (
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
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=
|
|
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 {
|
|
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": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
8
|
-
"debugId": "
|
|
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=
|
|
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": "
|
|
8
|
-
"debugId": "
|
|
7
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEqB,IAArB;AACoB,IAApB;AACqB,IAArB;AACmB,IAAnB;AACqB,IAArB;AACqB,IAArB;AACqB,IAArB;AACqB,IAArB;AACoB,IAApB;AACmB,IAAnB;AACsB,IAAtB;AACmB,IAAnB;AAC8B,IAA9B;AACkC,IAAlC;AACsB,IAAtB;AACmB,IAAnB;AACmB,IAAnB;AACoB,IAApB;AACqB,IAArB;AACqB,IAArB;AACoB,IAApB;AACoB,IAApB;AACsC,IAAtC;AACsB,IAAtB;AACmB,IAAnB;AACmB,IAAnB;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
|
+
}
|
package/dist/cjs/src/index.cjs
CHANGED
|
@@ -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=
|
|
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
|
|
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": "
|
|
8
|
-
"debugId": "
|
|
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
|
}
|