shell-dsl 0.0.34 → 0.0.36
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 +41 -5
- package/dist/cjs/package.json +1 -1
- package/dist/cjs/src/fs/memfs-adapter.cjs +56 -2
- package/dist/cjs/src/fs/memfs-adapter.cjs.map +3 -3
- package/dist/cjs/src/fs/real-fs.cjs +134 -3
- package/dist/cjs/src/fs/real-fs.cjs.map +3 -3
- package/dist/cjs/src/fs/special-files.cjs +3 -2
- package/dist/cjs/src/fs/special-files.cjs.map +3 -3
- package/dist/cjs/src/fs/web-fs.cjs +72 -3
- package/dist/cjs/src/fs/web-fs.cjs.map +3 -3
- 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/cjs/src/types.cjs.map +2 -2
- package/dist/cjs/src/vcs/content.cjs +106 -0
- package/dist/cjs/src/vcs/content.cjs.map +10 -0
- package/dist/cjs/src/vcs/diff.cjs +72 -28
- package/dist/cjs/src/vcs/diff.cjs.map +3 -3
- package/dist/cjs/src/vcs/index.cjs.map +1 -1
- package/dist/cjs/src/vcs/objects.cjs +141 -0
- package/dist/cjs/src/vcs/objects.cjs.map +10 -0
- package/dist/cjs/src/vcs/rules.cjs +6 -3
- package/dist/cjs/src/vcs/rules.cjs.map +3 -3
- package/dist/cjs/src/vcs/snapshot.cjs +89 -39
- package/dist/cjs/src/vcs/snapshot.cjs.map +3 -3
- package/dist/cjs/src/vcs/storage.cjs +44 -3
- package/dist/cjs/src/vcs/storage.cjs.map +3 -3
- package/dist/cjs/src/vcs/text-diff.cjs +219 -0
- package/dist/cjs/src/vcs/text-diff.cjs.map +10 -0
- package/dist/cjs/src/vcs/vcs.cjs +108 -61
- package/dist/cjs/src/vcs/vcs.cjs.map +3 -3
- package/dist/mjs/package.json +1 -1
- package/dist/mjs/src/fs/memfs-adapter.mjs +57 -2
- package/dist/mjs/src/fs/memfs-adapter.mjs.map +3 -3
- package/dist/mjs/src/fs/real-fs.mjs +135 -3
- package/dist/mjs/src/fs/real-fs.mjs.map +3 -3
- package/dist/mjs/src/fs/special-files.mjs +3 -2
- package/dist/mjs/src/fs/special-files.mjs.map +3 -3
- package/dist/mjs/src/fs/web-fs.mjs +72 -3
- package/dist/mjs/src/fs/web-fs.mjs.map +3 -3
- 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/mjs/src/types.mjs.map +2 -2
- package/dist/mjs/src/vcs/content.mjs +66 -0
- package/dist/mjs/src/vcs/content.mjs.map +10 -0
- package/dist/mjs/src/vcs/diff.mjs +72 -28
- package/dist/mjs/src/vcs/diff.mjs.map +3 -3
- package/dist/mjs/src/vcs/index.mjs.map +1 -1
- package/dist/mjs/src/vcs/objects.mjs +106 -0
- package/dist/mjs/src/vcs/objects.mjs.map +10 -0
- package/dist/mjs/src/vcs/rules.mjs +6 -3
- package/dist/mjs/src/vcs/rules.mjs.map +3 -3
- package/dist/mjs/src/vcs/snapshot.mjs +89 -39
- package/dist/mjs/src/vcs/snapshot.mjs.map +3 -3
- package/dist/mjs/src/vcs/storage.mjs +45 -3
- package/dist/mjs/src/vcs/storage.mjs.map +3 -3
- package/dist/mjs/src/vcs/text-diff.mjs +179 -0
- package/dist/mjs/src/vcs/text-diff.mjs.map +10 -0
- package/dist/mjs/src/vcs/vcs.mjs +115 -63
- package/dist/mjs/src/vcs/vcs.mjs.map +3 -3
- package/dist/types/src/fs/real-fs.d.ts +12 -1
- package/dist/types/src/index.d.ts +4 -4
- 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/dist/types/src/types.d.ts +10 -0
- package/dist/types/src/vcs/content.d.ts +6 -0
- package/dist/types/src/vcs/diff.d.ts +10 -7
- package/dist/types/src/vcs/index.d.ts +1 -1
- package/dist/types/src/vcs/objects.d.ts +22 -0
- package/dist/types/src/vcs/snapshot.d.ts +13 -8
- package/dist/types/src/vcs/storage.d.ts +7 -1
- package/dist/types/src/vcs/text-diff.d.ts +1 -0
- package/dist/types/src/vcs/types.d.ts +20 -5
- package/dist/types/src/vcs/vcs.d.ts +6 -0
- package/package.json +7 -2
|
@@ -3,6 +3,9 @@ import { createCommandContext } from "./context.mjs";
|
|
|
3
3
|
import { createStdin } from "../io/stdin.mjs";
|
|
4
4
|
import { createStdout, createStderr, createPipe, createBufferTargetCollector } from "../io/stdout.mjs";
|
|
5
5
|
import { isDevNullPath } from "../fs/special-files.mjs";
|
|
6
|
+
var DEFAULT_IFS = `
|
|
7
|
+
`;
|
|
8
|
+
var GLOB_META_CHARS = /[*?[{]/;
|
|
6
9
|
|
|
7
10
|
class BreakException extends Error {
|
|
8
11
|
levels;
|
|
@@ -74,34 +77,23 @@ class Interpreter {
|
|
|
74
77
|
case "case":
|
|
75
78
|
return this.executeCase(node, stdinSource, stdout, stderr);
|
|
76
79
|
default:
|
|
77
|
-
throw new Error(
|
|
80
|
+
throw new Error("Cannot execute unknown node type");
|
|
78
81
|
}
|
|
79
82
|
}
|
|
80
83
|
async executeCommand(node, stdinSource, stdout, stderr) {
|
|
81
|
-
const
|
|
84
|
+
const assignmentEnv = { ...this.env };
|
|
82
85
|
for (const assignment of node.assignments) {
|
|
83
|
-
|
|
84
|
-
}
|
|
85
|
-
const
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
}
|
|
92
|
-
const args = [];
|
|
93
|
-
for (const arg of node.args) {
|
|
94
|
-
const evaluated = await this.evaluateNode(arg, localEnv);
|
|
95
|
-
if (arg.type === "glob") {
|
|
96
|
-
const matches = await this.fs.glob(evaluated, { cwd: this.cwd });
|
|
97
|
-
if (matches.length > 0) {
|
|
98
|
-
args.push(...matches);
|
|
99
|
-
} else {
|
|
100
|
-
args.push(evaluated);
|
|
86
|
+
assignmentEnv[assignment.name] = await this.expandWordScalar(assignment.value, assignmentEnv);
|
|
87
|
+
}
|
|
88
|
+
const expandedWords = await this.expandCommandWords(node, this.env);
|
|
89
|
+
const [name, ...args] = expandedWords;
|
|
90
|
+
if (name === undefined || name === "") {
|
|
91
|
+
if (node.assignments.length > 0) {
|
|
92
|
+
for (const assignment of node.assignments) {
|
|
93
|
+
this.env[assignment.name] = assignmentEnv[assignment.name] ?? "";
|
|
101
94
|
}
|
|
102
|
-
} else {
|
|
103
|
-
args.push(evaluated);
|
|
104
95
|
}
|
|
96
|
+
return 0;
|
|
105
97
|
}
|
|
106
98
|
let actualStdin = stdinSource;
|
|
107
99
|
let actualStdout = stdout;
|
|
@@ -111,7 +103,7 @@ class Interpreter {
|
|
|
111
103
|
const fileWritePromises = [];
|
|
112
104
|
for (const redirect of node.redirects) {
|
|
113
105
|
try {
|
|
114
|
-
const result = await this.handleRedirect(redirect, actualStdin, actualStdout, actualStderr);
|
|
106
|
+
const result = await this.handleRedirect(redirect, actualStdin, actualStdout, actualStderr, this.env);
|
|
115
107
|
actualStdin = result.stdin;
|
|
116
108
|
actualStdout = result.stdout;
|
|
117
109
|
actualStderr = result.stderr;
|
|
@@ -121,7 +113,7 @@ class Interpreter {
|
|
|
121
113
|
fileWritePromises.push(result.fileWritePromise);
|
|
122
114
|
}
|
|
123
115
|
} catch (err) {
|
|
124
|
-
const target = await this.
|
|
116
|
+
const target = await this.expandWordScalar(redirect.target, this.env);
|
|
125
117
|
const message = err instanceof Error ? err.message : String(err);
|
|
126
118
|
await stderr.writeText(`sh: ${target}: ${message}
|
|
127
119
|
`);
|
|
@@ -159,7 +151,7 @@ class Interpreter {
|
|
|
159
151
|
stderr: subStderr,
|
|
160
152
|
fs: this.fs,
|
|
161
153
|
cwd: this.cwd,
|
|
162
|
-
env: { ...
|
|
154
|
+
env: { ...assignmentEnv },
|
|
163
155
|
setCwd: (path) => this.setCwd(path),
|
|
164
156
|
exec
|
|
165
157
|
});
|
|
@@ -190,7 +182,7 @@ class Interpreter {
|
|
|
190
182
|
stderr: actualStderr,
|
|
191
183
|
fs: this.fs,
|
|
192
184
|
cwd: this.cwd,
|
|
193
|
-
env:
|
|
185
|
+
env: assignmentEnv,
|
|
194
186
|
setCwd: (path) => this.setCwd(path),
|
|
195
187
|
exec
|
|
196
188
|
});
|
|
@@ -217,15 +209,15 @@ class Interpreter {
|
|
|
217
209
|
} catch (err) {
|
|
218
210
|
const message = err instanceof Error ? err.message : String(err);
|
|
219
211
|
const writeRedirects = node.redirects.filter((r) => r.mode !== "<" && r.mode !== "2>&1" && r.mode !== "1>&2");
|
|
220
|
-
const target = writeRedirects.length > 0 ? await this.
|
|
212
|
+
const target = writeRedirects.length > 0 ? await this.expandWordScalar(writeRedirects[writeRedirects.length - 1].target, this.env) : "unknown";
|
|
221
213
|
await stderr.writeText(`sh: ${target}: ${message}
|
|
222
214
|
`);
|
|
223
215
|
exitCode = 1;
|
|
224
216
|
}
|
|
225
217
|
return exitCode;
|
|
226
218
|
}
|
|
227
|
-
async handleRedirect(redirect, stdin, stdout, stderr) {
|
|
228
|
-
const target = await this.
|
|
219
|
+
async handleRedirect(redirect, stdin, stdout, stderr, env) {
|
|
220
|
+
const target = await this.expandWordScalar(redirect.target, env);
|
|
229
221
|
if (target in this.redirectObjects) {
|
|
230
222
|
return this.handleObjectRedirect(redirect.mode, this.redirectObjects[target], stdin, stdout, stderr);
|
|
231
223
|
}
|
|
@@ -457,17 +449,7 @@ class Interpreter {
|
|
|
457
449
|
async executeFor(node, stdinSource, stdout, stderr) {
|
|
458
450
|
const expandedItems = [];
|
|
459
451
|
for (const item of node.items) {
|
|
460
|
-
|
|
461
|
-
if (item.type === "glob") {
|
|
462
|
-
const matches = await this.fs.glob(evaluated, { cwd: this.cwd });
|
|
463
|
-
if (matches.length > 0) {
|
|
464
|
-
expandedItems.push(...matches);
|
|
465
|
-
} else {
|
|
466
|
-
expandedItems.push(evaluated);
|
|
467
|
-
}
|
|
468
|
-
} else {
|
|
469
|
-
expandedItems.push(evaluated);
|
|
470
|
-
}
|
|
452
|
+
expandedItems.push(...await this.expandWordForCommand(item, this.env));
|
|
471
453
|
}
|
|
472
454
|
if (expandedItems.length === 0) {
|
|
473
455
|
return 0;
|
|
@@ -571,10 +553,10 @@ class Interpreter {
|
|
|
571
553
|
return lastExitCode;
|
|
572
554
|
}
|
|
573
555
|
async executeCase(node, stdinSource, stdout, stderr) {
|
|
574
|
-
const word = await this.
|
|
556
|
+
const word = await this.expandWordScalar(node.word, this.env);
|
|
575
557
|
for (const clause of node.clauses) {
|
|
576
558
|
for (const patternNode of clause.patterns) {
|
|
577
|
-
const pattern = await this.
|
|
559
|
+
const pattern = await this.expandWordScalar(patternNode, this.env);
|
|
578
560
|
if (this.matchCasePattern(word, pattern)) {
|
|
579
561
|
return this.executeNode(clause.body, stdinSource, stdout, stderr);
|
|
580
562
|
}
|
|
@@ -615,34 +597,170 @@ class Interpreter {
|
|
|
615
597
|
return word === pattern;
|
|
616
598
|
}
|
|
617
599
|
}
|
|
618
|
-
async
|
|
619
|
-
const
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
|
|
600
|
+
async expandCommandWords(node, env) {
|
|
601
|
+
const expanded = [];
|
|
602
|
+
for (const word of [node.name, ...node.args]) {
|
|
603
|
+
expanded.push(...await this.expandWordForCommand(word, env));
|
|
604
|
+
}
|
|
605
|
+
return expanded;
|
|
606
|
+
}
|
|
607
|
+
async expandWordForCommand(word, env) {
|
|
608
|
+
const fields = await this.expandWordFields(word, env);
|
|
609
|
+
const expanded = [];
|
|
610
|
+
for (const field of fields) {
|
|
611
|
+
expanded.push(...await this.expandPathname(field));
|
|
612
|
+
}
|
|
613
|
+
return expanded;
|
|
614
|
+
}
|
|
615
|
+
async expandWordScalar(word, env) {
|
|
616
|
+
let result = "";
|
|
617
|
+
for (const part of word.parts) {
|
|
618
|
+
result += await this.expandWordPart(part, env);
|
|
619
|
+
}
|
|
620
|
+
return result;
|
|
621
|
+
}
|
|
622
|
+
async expandWordFields(word, env) {
|
|
623
|
+
const fields = [this.createExpandedField()];
|
|
624
|
+
const ifs = this.getIFS(env);
|
|
625
|
+
for (const part of word.parts) {
|
|
626
|
+
if (part.type === "text") {
|
|
627
|
+
this.appendSegment(fields[fields.length - 1], part.value, part.quoted);
|
|
628
|
+
continue;
|
|
629
|
+
}
|
|
630
|
+
const value = await this.expandWordPart(part, env);
|
|
631
|
+
if (part.quoted) {
|
|
632
|
+
this.appendSegment(fields[fields.length - 1], value, true);
|
|
633
|
+
continue;
|
|
634
|
+
}
|
|
635
|
+
const splitFields = this.splitUnquotedExpansion(value, ifs);
|
|
636
|
+
if (splitFields.length === 0) {
|
|
637
|
+
continue;
|
|
638
|
+
}
|
|
639
|
+
this.appendSegment(fields[fields.length - 1], splitFields[0], false);
|
|
640
|
+
for (let i = 1;i < splitFields.length; i++) {
|
|
641
|
+
const field = this.createExpandedField();
|
|
642
|
+
this.appendSegment(field, splitFields[i], false);
|
|
643
|
+
fields.push(field);
|
|
644
|
+
}
|
|
645
|
+
}
|
|
646
|
+
return fields.filter((field) => field.segments.length > 0);
|
|
647
|
+
}
|
|
648
|
+
async expandWordPart(part, env) {
|
|
649
|
+
switch (part.type) {
|
|
650
|
+
case "text":
|
|
651
|
+
return part.value;
|
|
623
652
|
case "variable":
|
|
624
|
-
return env[
|
|
625
|
-
case "
|
|
626
|
-
return
|
|
627
|
-
case "
|
|
628
|
-
|
|
629
|
-
return parts.join("");
|
|
630
|
-
}
|
|
631
|
-
case "substitution": {
|
|
632
|
-
const subStdout = createStdout();
|
|
633
|
-
const subStderr = createStderr();
|
|
634
|
-
await this.executeNode(node.command, null, subStdout, subStderr);
|
|
635
|
-
subStdout.close();
|
|
636
|
-
const output = await subStdout.collect();
|
|
637
|
-
return output.toString("utf-8").replace(/\n+$/, "");
|
|
638
|
-
}
|
|
639
|
-
case "arithmetic": {
|
|
640
|
-
const result = this.evaluateArithmetic(node.expression, env);
|
|
641
|
-
return String(result);
|
|
642
|
-
}
|
|
653
|
+
return env[part.name] ?? "";
|
|
654
|
+
case "substitution":
|
|
655
|
+
return this.executeSubstitution(part.command, env);
|
|
656
|
+
case "arithmetic":
|
|
657
|
+
return String(this.evaluateArithmetic(part.expression, env));
|
|
643
658
|
default:
|
|
644
|
-
throw new Error(
|
|
659
|
+
throw new Error("Cannot expand unknown word part");
|
|
660
|
+
}
|
|
661
|
+
}
|
|
662
|
+
async executeSubstitution(command, env) {
|
|
663
|
+
const interpreter = new Interpreter({
|
|
664
|
+
fs: this.fs,
|
|
665
|
+
cwd: this.cwd,
|
|
666
|
+
env,
|
|
667
|
+
commands: this.commands,
|
|
668
|
+
redirectObjects: this.redirectObjects,
|
|
669
|
+
isTTY: false
|
|
670
|
+
});
|
|
671
|
+
const result = await interpreter.execute(command);
|
|
672
|
+
return result.stdout.toString("utf-8").replace(/\n+$/, "");
|
|
673
|
+
}
|
|
674
|
+
getIFS(env) {
|
|
675
|
+
return env.IFS ?? DEFAULT_IFS;
|
|
676
|
+
}
|
|
677
|
+
splitUnquotedExpansion(value, ifs) {
|
|
678
|
+
if (value.length === 0) {
|
|
679
|
+
return [];
|
|
680
|
+
}
|
|
681
|
+
if (ifs === "") {
|
|
682
|
+
return [value];
|
|
645
683
|
}
|
|
684
|
+
const ifsChars = new Set(ifs);
|
|
685
|
+
const isIfsWhitespace = (char) => ifsChars.has(char) && (char === " " || char === "\t" || char === `
|
|
686
|
+
`);
|
|
687
|
+
const isIfsNonWhitespace = (char) => ifsChars.has(char) && !isIfsWhitespace(char);
|
|
688
|
+
const fields = [];
|
|
689
|
+
let i = 0;
|
|
690
|
+
while (i < value.length && isIfsWhitespace(value[i])) {
|
|
691
|
+
i++;
|
|
692
|
+
}
|
|
693
|
+
let fieldStart = i;
|
|
694
|
+
let lastDelimiterWasNonWhitespace = false;
|
|
695
|
+
while (i < value.length) {
|
|
696
|
+
const char = value[i];
|
|
697
|
+
if (isIfsNonWhitespace(char)) {
|
|
698
|
+
fields.push(value.slice(fieldStart, i));
|
|
699
|
+
i++;
|
|
700
|
+
while (i < value.length && isIfsWhitespace(value[i])) {
|
|
701
|
+
i++;
|
|
702
|
+
}
|
|
703
|
+
fieldStart = i;
|
|
704
|
+
lastDelimiterWasNonWhitespace = true;
|
|
705
|
+
continue;
|
|
706
|
+
}
|
|
707
|
+
if (isIfsWhitespace(char)) {
|
|
708
|
+
fields.push(value.slice(fieldStart, i));
|
|
709
|
+
while (i < value.length && isIfsWhitespace(value[i])) {
|
|
710
|
+
i++;
|
|
711
|
+
}
|
|
712
|
+
if (i < value.length && isIfsNonWhitespace(value[i])) {
|
|
713
|
+
i++;
|
|
714
|
+
while (i < value.length && isIfsWhitespace(value[i])) {
|
|
715
|
+
i++;
|
|
716
|
+
}
|
|
717
|
+
lastDelimiterWasNonWhitespace = true;
|
|
718
|
+
} else {
|
|
719
|
+
lastDelimiterWasNonWhitespace = false;
|
|
720
|
+
}
|
|
721
|
+
fieldStart = i;
|
|
722
|
+
continue;
|
|
723
|
+
}
|
|
724
|
+
lastDelimiterWasNonWhitespace = false;
|
|
725
|
+
i++;
|
|
726
|
+
}
|
|
727
|
+
if (fieldStart < value.length) {
|
|
728
|
+
fields.push(value.slice(fieldStart));
|
|
729
|
+
} else if (lastDelimiterWasNonWhitespace) {
|
|
730
|
+
fields.push("");
|
|
731
|
+
}
|
|
732
|
+
return fields;
|
|
733
|
+
}
|
|
734
|
+
createExpandedField() {
|
|
735
|
+
return { segments: [] };
|
|
736
|
+
}
|
|
737
|
+
appendSegment(field, value, quoted) {
|
|
738
|
+
const lastSegment = field.segments[field.segments.length - 1];
|
|
739
|
+
if (lastSegment && lastSegment.quoted === quoted) {
|
|
740
|
+
lastSegment.value += value;
|
|
741
|
+
return;
|
|
742
|
+
}
|
|
743
|
+
field.segments.push({ value, quoted });
|
|
744
|
+
}
|
|
745
|
+
async expandPathname(field) {
|
|
746
|
+
if (!this.hasUnquotedGlobMeta(field)) {
|
|
747
|
+
return [this.fieldToString(field)];
|
|
748
|
+
}
|
|
749
|
+
const pattern = this.fieldToGlobPattern(field);
|
|
750
|
+
const matches = await this.fs.glob(pattern, { cwd: this.cwd });
|
|
751
|
+
return matches.length > 0 ? matches : [this.fieldToString(field)];
|
|
752
|
+
}
|
|
753
|
+
hasUnquotedGlobMeta(field) {
|
|
754
|
+
return field.segments.some((segment) => !segment.quoted && GLOB_META_CHARS.test(segment.value));
|
|
755
|
+
}
|
|
756
|
+
fieldToString(field) {
|
|
757
|
+
return field.segments.map((segment) => segment.value).join("");
|
|
758
|
+
}
|
|
759
|
+
fieldToGlobPattern(field) {
|
|
760
|
+
return field.segments.map((segment) => segment.quoted ? this.escapeLiteralGlobChars(segment.value) : segment.value).join("");
|
|
761
|
+
}
|
|
762
|
+
escapeLiteralGlobChars(value) {
|
|
763
|
+
return value.replaceAll("[", "[[]").replaceAll("]", "[]]").replaceAll("*", "[*]").replaceAll("?", "[?]").replaceAll("{", "[{]").replaceAll("}", "[}]");
|
|
646
764
|
}
|
|
647
765
|
evaluateArithmetic(expression, env) {
|
|
648
766
|
let expandedExpr = expression;
|
|
@@ -827,4 +945,4 @@ export {
|
|
|
827
945
|
BreakException
|
|
828
946
|
};
|
|
829
947
|
|
|
830
|
-
//# debugId=
|
|
948
|
+
//# debugId=96916342C8FA80E364756E2164756E21
|
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/interpreter/interpreter.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
|
-
"import type { ASTNode, CommandNode, Redirect, IfNode, ForNode, WhileNode, UntilNode, CaseNode } from \"../parser/ast.mjs\";\nimport type { Command, VirtualFS, ExecResult, OutputCollector, RedirectObjectMap } from \"../types.mjs\";\nimport { createCommandContext } from \"./context.mjs\";\nimport { createStdin } from \"../io/stdin.mjs\";\nimport { createStdout, createStderr, createPipe, PipeBuffer, createBufferTargetCollector } from \"../io/stdout.mjs\";\nimport { Lexer } from \"../lexer/lexer.mjs\";\nimport { Parser } from \"../parser/parser.mjs\";\nimport { isDevNullPath } from \"../fs/special-files.mjs\";\n\nexport interface InterpreterOptions {\n fs: VirtualFS;\n cwd: string;\n env: Record<string, string>;\n commands: Record<string, Command>;\n redirectObjects?: RedirectObjectMap;\n isTTY?: boolean;\n}\n\n// Loop control flow exceptions\nexport class BreakException extends Error {\n constructor(public levels: number = 1) {\n super(\"break\");\n }\n}\n\nexport class ContinueException extends Error {\n constructor(public levels: number = 1) {\n super(\"continue\");\n }\n}\n\nexport class Interpreter {\n private fs: VirtualFS;\n private cwd: string;\n private env: Record<string, string>;\n private commands: Record<string, Command>;\n private redirectObjects: RedirectObjectMap;\n private loopDepth: number = 0;\n private isTTY: boolean;\n\n constructor(options: InterpreterOptions) {\n this.fs = options.fs;\n this.cwd = options.cwd;\n this.env = { ...options.env };\n this.commands = options.commands;\n this.redirectObjects = options.redirectObjects ?? {};\n this.isTTY = options.isTTY ?? false;\n }\n\n getLoopDepth(): number {\n return this.loopDepth;\n }\n\n async execute(ast: ASTNode): Promise<ExecResult> {\n const stdout = createStdout(this.isTTY);\n const stderr = createStderr(this.isTTY);\n\n const exitCode = await this.executeNode(ast, null, stdout, stderr);\n\n stdout.close();\n stderr.close();\n\n return {\n stdout: await stdout.collect(),\n stderr: await stderr.collect(),\n exitCode,\n };\n }\n\n private async executeNode(\n node: ASTNode,\n stdinSource: AsyncIterable<Uint8Array> | null,\n stdout: OutputCollector,\n stderr: OutputCollector\n ): Promise<number> {\n switch (node.type) {\n case \"command\":\n return this.executeCommand(node, stdinSource, stdout, stderr);\n case \"pipeline\":\n return this.executePipeline(node.commands, stdinSource, stdout, stderr);\n case \"sequence\":\n return this.executeSequence(node.commands, stdinSource, stdout, stderr);\n case \"and\":\n return this.executeAnd(node.left, node.right, stdinSource, stdout, stderr);\n case \"or\":\n return this.executeOr(node.left, node.right, stdinSource, stdout, stderr);\n case \"if\":\n return this.executeIf(node, stdinSource, stdout, stderr);\n case \"for\":\n return this.executeFor(node, stdinSource, stdout, stderr);\n case \"while\":\n return this.executeWhile(node, stdinSource, stdout, stderr);\n case \"until\":\n return this.executeUntil(node, stdinSource, stdout, stderr);\n case \"case\":\n return this.executeCase(node, stdinSource, stdout, stderr);\n default:\n throw new Error(`Cannot execute node type: ${node.type}`);\n }\n }\n\n private async executeCommand(\n node: CommandNode,\n stdinSource: AsyncIterable<Uint8Array> | null,\n stdout: OutputCollector,\n stderr: OutputCollector\n ): Promise<number> {\n // Create local env with assignments\n const localEnv = { ...this.env };\n for (const assignment of node.assignments) {\n localEnv[assignment.name] = await this.evaluateNode(assignment.value);\n }\n\n // If there's no command name but there are assignments, just update env\n const name = await this.evaluateNode(node.name);\n if (name === \"\" && node.assignments.length > 0) {\n for (const assignment of node.assignments) {\n this.env[assignment.name] = await this.evaluateNode(assignment.value);\n }\n return 0;\n }\n\n // Evaluate arguments using localEnv for scoped variable expansion\n const args: string[] = [];\n for (const arg of node.args) {\n const evaluated = await this.evaluateNode(arg, localEnv);\n // Glob expansion returns multiple values\n if (arg.type === \"glob\") {\n const matches = await this.fs.glob(evaluated, { cwd: this.cwd });\n if (matches.length > 0) {\n args.push(...matches);\n } else {\n // No matches - use pattern as-is\n args.push(evaluated);\n }\n } else {\n args.push(evaluated);\n }\n }\n\n // Handle redirects\n let actualStdin = stdinSource;\n let actualStdout: OutputCollector = stdout;\n let actualStderr: OutputCollector = stderr;\n let stderrToStdout = false;\n let stdoutToStderr = false;\n const fileWritePromises: Promise<void>[] = [];\n\n for (const redirect of node.redirects) {\n try {\n const result = await this.handleRedirect(\n redirect,\n actualStdin,\n actualStdout,\n actualStderr\n );\n actualStdin = result.stdin;\n actualStdout = result.stdout;\n actualStderr = result.stderr;\n stderrToStdout = result.stderrToStdout || stderrToStdout;\n stdoutToStderr = result.stdoutToStderr || stdoutToStderr;\n if (result.fileWritePromise) {\n fileWritePromises.push(result.fileWritePromise);\n }\n } catch (err) {\n const target = await this.evaluateNode(redirect.target);\n const message = err instanceof Error ? err.message : String(err);\n await stderr.writeText(`sh: ${target}: ${message}\\n`);\n return 1;\n }\n }\n\n // Handle stderr->stdout redirect\n if (stderrToStdout) {\n actualStderr = actualStdout;\n }\n if (stdoutToStderr) {\n actualStdout = actualStderr;\n }\n\n // Look up command\n const command = this.commands[name];\n if (!command) {\n await stderr.writeText(`${name}: command not found\\n`);\n return 127;\n }\n\n // Create exec closure for sub-command invocation\n const exec = async (cmdName: string, cmdArgs: string[]) => {\n const cmd = this.commands[cmdName];\n if (!cmd) {\n return {\n stdout: Buffer.alloc(0),\n stderr: Buffer.from(`${cmdName}: command not found\\n`),\n exitCode: 127,\n };\n }\n const subStdout = createStdout();\n const subStderr = createStderr();\n const subCtx = createCommandContext({\n args: cmdArgs,\n stdin: createStdin(null),\n stdout: subStdout,\n stderr: subStderr,\n fs: this.fs,\n cwd: this.cwd,\n env: { ...localEnv },\n setCwd: (path: string) => this.setCwd(path),\n exec,\n });\n let exitCode: number;\n try {\n exitCode = await cmd(subCtx);\n } catch (err) {\n if (err instanceof BreakException || err instanceof ContinueException) {\n throw err;\n }\n const message = err instanceof Error ? err.message : String(err);\n await subStderr.writeText(`${cmdName}: ${message}\\n`);\n exitCode = 1;\n }\n subStdout.close();\n subStderr.close();\n return {\n stdout: await subStdout.collect(),\n stderr: await subStderr.collect(),\n exitCode,\n };\n };\n\n // Create context and execute\n const ctx = createCommandContext({\n args,\n stdin: createStdin(actualStdin),\n stdout: actualStdout,\n stderr: actualStderr,\n fs: this.fs,\n cwd: this.cwd,\n env: localEnv,\n setCwd: (path: string) => this.setCwd(path),\n exec,\n });\n\n let exitCode: number;\n try {\n exitCode = await command(ctx);\n } catch (err) {\n // Re-throw loop control exceptions\n if (err instanceof BreakException || err instanceof ContinueException) {\n throw err;\n }\n const message = err instanceof Error ? err.message : String(err);\n await stderr.writeText(`${name}: ${message}\\n`);\n exitCode = 1;\n }\n\n // Close redirect collectors and wait for file writes\n if (actualStdout !== stdout) {\n actualStdout.close();\n }\n if (actualStderr !== stderr && actualStderr !== actualStdout) {\n actualStderr.close();\n }\n\n // Wait for all file write operations to complete\n try {\n await Promise.all(fileWritePromises);\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n // Find the redirect target for the error message\n const writeRedirects = node.redirects.filter(r => r.mode !== \"<\" && r.mode !== \"2>&1\" && r.mode !== \"1>&2\");\n const target = writeRedirects.length > 0\n ? await this.evaluateNode(writeRedirects[writeRedirects.length - 1]!.target)\n : \"unknown\";\n await stderr.writeText(`sh: ${target}: ${message}\\n`);\n exitCode = 1;\n }\n\n return exitCode;\n }\n\n private async handleRedirect(\n redirect: Redirect,\n stdin: AsyncIterable<Uint8Array> | null,\n stdout: OutputCollector,\n stderr: OutputCollector\n ): Promise<{\n stdin: AsyncIterable<Uint8Array> | null;\n stdout: OutputCollector;\n stderr: OutputCollector;\n stderrToStdout?: boolean;\n stdoutToStderr?: boolean;\n fileWritePromise?: Promise<void>;\n }> {\n const target = await this.evaluateNode(redirect.target);\n\n // Check if target is a redirect object marker\n if (target in this.redirectObjects) {\n return this.handleObjectRedirect(redirect.mode, this.redirectObjects[target]!, stdin, stdout, stderr);\n }\n\n switch (redirect.mode) {\n case \"<\": {\n if (redirect.heredocContent) {\n // Heredoc: target is already the content\n return {\n stdin: (async function* () {\n yield new TextEncoder().encode(target);\n })(),\n stdout,\n stderr,\n };\n }\n // /dev/null: empty input\n if (isDevNullPath(target)) {\n return {\n stdin: (async function* () {})(),\n stdout,\n stderr,\n };\n }\n // Input redirect from file\n const path = this.fs.resolve(this.cwd, target);\n const content = await this.fs.readFile(path);\n return {\n stdin: (async function* () {\n yield new Uint8Array(content);\n })(),\n stdout,\n stderr,\n };\n }\n case \">\": {\n // Output redirect (overwrite)\n const collector = createStdout();\n if (isDevNullPath(target)) {\n return { stdin, stdout: collector, stderr };\n }\n const path = this.fs.resolve(this.cwd, target);\n const fileWritePromise = (async () => {\n const data = await collector.collect();\n await this.fs.writeFile(path, data);\n })();\n return { stdin, stdout: collector, stderr, fileWritePromise };\n }\n case \">>\": {\n // Output redirect (append)\n const collector = createStdout();\n if (isDevNullPath(target)) {\n return { stdin, stdout: collector, stderr };\n }\n const path = this.fs.resolve(this.cwd, target);\n const fileWritePromise = (async () => {\n const data = await collector.collect();\n await this.fs.appendFile(path, data);\n })();\n return { stdin, stdout: collector, stderr, fileWritePromise };\n }\n case \"2>\": {\n // Stderr redirect (overwrite)\n const collector = createStderr();\n if (isDevNullPath(target)) {\n return { stdin, stdout, stderr: collector };\n }\n const path = this.fs.resolve(this.cwd, target);\n const fileWritePromise = (async () => {\n const data = await collector.collect();\n await this.fs.writeFile(path, data);\n })();\n return { stdin, stdout, stderr: collector, fileWritePromise };\n }\n case \"2>>\": {\n // Stderr redirect (append)\n const collector = createStderr();\n if (isDevNullPath(target)) {\n return { stdin, stdout, stderr: collector };\n }\n const path = this.fs.resolve(this.cwd, target);\n const fileWritePromise = (async () => {\n const data = await collector.collect();\n await this.fs.appendFile(path, data);\n })();\n return { stdin, stdout, stderr: collector, fileWritePromise };\n }\n case \"&>\": {\n // Both to file (overwrite)\n const collector = createStdout();\n if (isDevNullPath(target)) {\n return { stdin, stdout: collector, stderr: collector };\n }\n const path = this.fs.resolve(this.cwd, target);\n const fileWritePromise = (async () => {\n const data = await collector.collect();\n await this.fs.writeFile(path, data);\n })();\n return { stdin, stdout: collector, stderr: collector, fileWritePromise };\n }\n case \"&>>\": {\n // Both to file (append)\n const collector = createStdout();\n if (isDevNullPath(target)) {\n return { stdin, stdout: collector, stderr: collector };\n }\n const path = this.fs.resolve(this.cwd, target);\n const fileWritePromise = (async () => {\n const data = await collector.collect();\n await this.fs.appendFile(path, data);\n })();\n return { stdin, stdout: collector, stderr: collector, fileWritePromise };\n }\n case \"2>&1\":\n return { stdin, stdout, stderr, stderrToStdout: true };\n case \"1>&2\":\n return { stdin, stdout, stderr, stdoutToStderr: true };\n default:\n return { stdin, stdout, stderr };\n }\n }\n\n private async handleObjectRedirect(\n mode: string,\n obj: Buffer | Blob | Response | string,\n stdin: AsyncIterable<Uint8Array> | null,\n stdout: OutputCollector,\n stderr: OutputCollector\n ): Promise<{\n stdin: AsyncIterable<Uint8Array> | null;\n stdout: OutputCollector;\n stderr: OutputCollector;\n stderrToStdout?: boolean;\n stdoutToStderr?: boolean;\n fileWritePromise?: Promise<void>;\n }> {\n switch (mode) {\n case \"<\": {\n // Input from object\n const data = await this.readFromObject(obj);\n return {\n stdin: (async function* () {\n yield data;\n })(),\n stdout,\n stderr,\n };\n }\n case \">\":\n case \">>\": {\n // Output to object (only Buffer supported)\n if (!Buffer.isBuffer(obj)) {\n throw new Error(\"Output redirection only supports Buffer targets\");\n }\n const collector = createBufferTargetCollector(obj);\n return { stdin, stdout: collector, stderr };\n }\n case \"2>\":\n case \"2>>\": {\n // Stderr to object (only Buffer supported)\n if (!Buffer.isBuffer(obj)) {\n throw new Error(\"Stderr redirection only supports Buffer targets\");\n }\n const collector = createBufferTargetCollector(obj);\n return { stdin, stdout, stderr: collector };\n }\n case \"&>\":\n case \"&>>\": {\n // Both to object (only Buffer supported)\n if (!Buffer.isBuffer(obj)) {\n throw new Error(\"Combined redirection only supports Buffer targets\");\n }\n const collector = createBufferTargetCollector(obj);\n return { stdin, stdout: collector, stderr: collector };\n }\n default:\n return { stdin, stdout, stderr };\n }\n }\n\n private async readFromObject(obj: Buffer | Blob | Response | string): Promise<Uint8Array> {\n if (Buffer.isBuffer(obj)) {\n return new Uint8Array(obj);\n }\n if (obj instanceof Blob) {\n return new Uint8Array(await obj.arrayBuffer());\n }\n if (obj instanceof Response) {\n return new Uint8Array(await obj.arrayBuffer());\n }\n if (typeof obj === \"string\") {\n return new TextEncoder().encode(obj);\n }\n throw new Error(\"Unsupported redirect object type\");\n }\n\n private async executePipeline(\n commands: ASTNode[],\n stdinSource: AsyncIterable<Uint8Array> | null,\n stdout: OutputCollector,\n stderr: OutputCollector\n ): Promise<number> {\n if (commands.length === 0) return 0;\n if (commands.length === 1) {\n return this.executeNode(commands[0]!, stdinSource, stdout, stderr);\n }\n\n // Create pipes between commands\n const pipes: PipeBuffer[] = [];\n for (let i = 0; i < commands.length - 1; i++) {\n pipes.push(createPipe());\n }\n\n // Execute all commands concurrently\n const promises: Promise<number>[] = [];\n\n for (let i = 0; i < commands.length; i++) {\n const command = commands[i]!;\n const cmdStdin = i === 0 ? stdinSource : pipes[i - 1]!.getReadableStream();\n const cmdStdout = i === commands.length - 1 ? stdout : pipes[i]!;\n\n promises.push(\n this.executeNode(command, cmdStdin, cmdStdout, stderr).then((code) => {\n // Close pipe when command finishes\n if (i < commands.length - 1) {\n pipes[i]!.close();\n }\n return code;\n })\n );\n }\n\n // Wait for all commands and return last exit code\n const results = await Promise.all(promises);\n return results[results.length - 1]!;\n }\n\n private async executeSequence(\n commands: ASTNode[],\n stdinSource: AsyncIterable<Uint8Array> | null,\n stdout: OutputCollector,\n stderr: OutputCollector\n ): Promise<number> {\n let lastExitCode = 0;\n\n for (const command of commands) {\n lastExitCode = await this.executeNode(command, stdinSource, stdout, stderr);\n }\n\n return lastExitCode;\n }\n\n private async executeAnd(\n left: ASTNode,\n right: ASTNode,\n stdinSource: AsyncIterable<Uint8Array> | null,\n stdout: OutputCollector,\n stderr: OutputCollector\n ): Promise<number> {\n const leftCode = await this.executeNode(left, stdinSource, stdout, stderr);\n if (leftCode !== 0) {\n return leftCode;\n }\n return this.executeNode(right, stdinSource, stdout, stderr);\n }\n\n private async executeOr(\n left: ASTNode,\n right: ASTNode,\n stdinSource: AsyncIterable<Uint8Array> | null,\n stdout: OutputCollector,\n stderr: OutputCollector\n ): Promise<number> {\n const leftCode = await this.executeNode(left, stdinSource, stdout, stderr);\n if (leftCode === 0) {\n return 0;\n }\n return this.executeNode(right, stdinSource, stdout, stderr);\n }\n\n private async executeIf(\n node: IfNode,\n stdinSource: AsyncIterable<Uint8Array> | null,\n stdout: OutputCollector,\n stderr: OutputCollector\n ): Promise<number> {\n // Execute condition\n const conditionCode = await this.executeNode(node.condition, stdinSource, stdout, stderr);\n\n if (conditionCode === 0) {\n // Condition succeeded, execute then branch\n return this.executeNode(node.thenBranch, stdinSource, stdout, stderr);\n }\n\n // Check elif branches\n for (const elif of node.elifBranches) {\n const elifConditionCode = await this.executeNode(elif.condition, stdinSource, stdout, stderr);\n if (elifConditionCode === 0) {\n return this.executeNode(elif.body, stdinSource, stdout, stderr);\n }\n }\n\n // Execute else branch if present\n if (node.elseBranch) {\n return this.executeNode(node.elseBranch, stdinSource, stdout, stderr);\n }\n\n return 0;\n }\n\n private async executeFor(\n node: ForNode,\n stdinSource: AsyncIterable<Uint8Array> | null,\n stdout: OutputCollector,\n stderr: OutputCollector\n ): Promise<number> {\n // Evaluate items and expand globs\n const expandedItems: string[] = [];\n for (const item of node.items) {\n const evaluated = await this.evaluateNode(item);\n if (item.type === \"glob\") {\n const matches = await this.fs.glob(evaluated, { cwd: this.cwd });\n if (matches.length > 0) {\n expandedItems.push(...matches);\n } else {\n expandedItems.push(evaluated);\n }\n } else {\n expandedItems.push(evaluated);\n }\n }\n\n // If no items provided, use positional parameters (not implemented, so empty)\n if (expandedItems.length === 0) {\n return 0;\n }\n\n let lastExitCode = 0;\n this.loopDepth++;\n\n try {\n for (const value of expandedItems) {\n // Set the loop variable\n this.env[node.variable] = value;\n\n try {\n lastExitCode = await this.executeNode(node.body, stdinSource, stdout, stderr);\n } catch (e) {\n if (e instanceof ContinueException) {\n if (e.levels > 1) {\n e.levels--;\n throw e;\n }\n continue;\n }\n if (e instanceof BreakException) {\n if (e.levels > 1) {\n e.levels--;\n throw e;\n }\n break;\n }\n throw e;\n }\n }\n } finally {\n this.loopDepth--;\n }\n\n return lastExitCode;\n }\n\n private async executeWhile(\n node: WhileNode,\n stdinSource: AsyncIterable<Uint8Array> | null,\n stdout: OutputCollector,\n stderr: OutputCollector\n ): Promise<number> {\n let lastExitCode = 0;\n this.loopDepth++;\n\n try {\n while (true) {\n // Check condition\n const conditionCode = await this.executeNode(node.condition, stdinSource, stdout, stderr);\n if (conditionCode !== 0) {\n break;\n }\n\n try {\n lastExitCode = await this.executeNode(node.body, stdinSource, stdout, stderr);\n } catch (e) {\n if (e instanceof ContinueException) {\n if (e.levels > 1) {\n e.levels--;\n throw e;\n }\n continue;\n }\n if (e instanceof BreakException) {\n if (e.levels > 1) {\n e.levels--;\n throw e;\n }\n break;\n }\n throw e;\n }\n }\n } finally {\n this.loopDepth--;\n }\n\n return lastExitCode;\n }\n\n private async executeUntil(\n node: UntilNode,\n stdinSource: AsyncIterable<Uint8Array> | null,\n stdout: OutputCollector,\n stderr: OutputCollector\n ): Promise<number> {\n let lastExitCode = 0;\n this.loopDepth++;\n\n try {\n while (true) {\n // Check condition - loop until condition succeeds\n const conditionCode = await this.executeNode(node.condition, stdinSource, stdout, stderr);\n if (conditionCode === 0) {\n break;\n }\n\n try {\n lastExitCode = await this.executeNode(node.body, stdinSource, stdout, stderr);\n } catch (e) {\n if (e instanceof ContinueException) {\n if (e.levels > 1) {\n e.levels--;\n throw e;\n }\n continue;\n }\n if (e instanceof BreakException) {\n if (e.levels > 1) {\n e.levels--;\n throw e;\n }\n break;\n }\n throw e;\n }\n }\n } finally {\n this.loopDepth--;\n }\n\n return lastExitCode;\n }\n\n private async executeCase(\n node: CaseNode,\n stdinSource: AsyncIterable<Uint8Array> | null,\n stdout: OutputCollector,\n stderr: OutputCollector\n ): Promise<number> {\n const word = await this.evaluateNode(node.word);\n\n for (const clause of node.clauses) {\n for (const patternNode of clause.patterns) {\n const pattern = await this.evaluateNode(patternNode);\n\n if (this.matchCasePattern(word, pattern)) {\n return this.executeNode(clause.body, stdinSource, stdout, stderr);\n }\n }\n }\n\n return 0;\n }\n\n private matchCasePattern(word: string, pattern: string): boolean {\n // Convert shell glob pattern to regex\n // * matches any string, ? matches any single character\n let regexStr = \"^\";\n for (let i = 0; i < pattern.length; i++) {\n const char = pattern[i];\n if (char === \"*\") {\n regexStr += \".*\";\n } else if (char === \"?\") {\n regexStr += \".\";\n } else if (char === \"[\") {\n // Character class - find closing bracket\n let j = i + 1;\n while (j < pattern.length && pattern[j] !== \"]\") {\n j++;\n }\n if (j < pattern.length) {\n regexStr += pattern.slice(i, j + 1);\n i = j;\n } else {\n regexStr += \"\\\\[\";\n }\n } else if (/[.+^${}()|\\\\]/.test(char!)) {\n // Escape regex special characters\n regexStr += \"\\\\\" + char;\n } else {\n regexStr += char;\n }\n }\n regexStr += \"$\";\n\n try {\n const regex = new RegExp(regexStr);\n return regex.test(word);\n } catch {\n // If regex fails, fall back to exact match\n return word === pattern;\n }\n }\n\n private async evaluateNode(node: ASTNode, localEnv?: Record<string, string>): Promise<string> {\n const env = localEnv ?? this.env;\n switch (node.type) {\n case \"literal\":\n return node.value;\n case \"variable\":\n return env[node.name] ?? \"\";\n case \"glob\":\n return node.pattern;\n case \"concat\": {\n const parts = await Promise.all(node.parts.map((p) => this.evaluateNode(p, localEnv)));\n return parts.join(\"\");\n }\n case \"substitution\": {\n // Execute the command and capture output\n const subStdout = createStdout();\n const subStderr = createStderr();\n await this.executeNode(node.command, null, subStdout, subStderr);\n subStdout.close();\n const output = await subStdout.collect();\n // Trim trailing newlines\n return output.toString(\"utf-8\").replace(/\\n+$/, \"\");\n }\n case \"arithmetic\": {\n const result = this.evaluateArithmetic(node.expression, env);\n return String(result);\n }\n default:\n throw new Error(`Cannot evaluate node type: ${node.type}`);\n }\n }\n\n private evaluateArithmetic(expression: string, env: Record<string, string>): number {\n // Expand variables in the expression\n let expandedExpr = expression;\n // Replace $VAR and ${VAR} with their values\n expandedExpr = expandedExpr.replace(/\\$\\{([a-zA-Z_][a-zA-Z0-9_]*)\\}/g, (_, name) => {\n return env[name] ?? \"0\";\n });\n expandedExpr = expandedExpr.replace(/\\$([a-zA-Z_][a-zA-Z0-9_]*)/g, (_, name) => {\n return env[name] ?? \"0\";\n });\n // Also handle bare variable names (in arithmetic, variables can be referenced without $)\n expandedExpr = expandedExpr.replace(/\\b([a-zA-Z_][a-zA-Z0-9_]*)\\b/g, (match) => {\n // Don't replace if it looks like a number\n if (/^\\d+$/.test(match)) return match;\n return env[match] ?? \"0\";\n });\n\n // Parse and evaluate the expression\n return this.parseArithmeticExpr(expandedExpr.trim());\n }\n\n private parseArithmeticExpr(expr: string): number {\n // Simple arithmetic expression parser\n // Supports: +, -, *, /, %, ==, !=, <, >, <=, >=, &&, ||, parentheses\n // Uses a simple recursive descent parser\n\n let pos = 0;\n\n const skipWhitespace = () => {\n while (pos < expr.length && /\\s/.test(expr[pos]!)) pos++;\n };\n\n const parseNumber = (): number => {\n skipWhitespace();\n let numStr = \"\";\n const negative = expr[pos] === \"-\";\n if (negative) {\n pos++;\n skipWhitespace();\n }\n while (pos < expr.length && /[0-9]/.test(expr[pos]!)) {\n numStr += expr[pos];\n pos++;\n }\n if (numStr === \"\") return 0;\n return negative ? -parseInt(numStr, 10) : parseInt(numStr, 10);\n };\n\n const parsePrimary = (): number => {\n skipWhitespace();\n if (expr[pos] === \"(\") {\n pos++; // consume (\n const result = parseOr();\n skipWhitespace();\n if (expr[pos] === \")\") pos++; // consume )\n return result;\n }\n return parseNumber();\n };\n\n const parseUnary = (): number => {\n skipWhitespace();\n if (expr[pos] === \"-\" && !/[0-9]/.test(expr[pos + 1] ?? \"\")) {\n pos++;\n return -parseUnary();\n }\n if (expr[pos] === \"!\") {\n pos++;\n return parseUnary() === 0 ? 1 : 0;\n }\n return parsePrimary();\n };\n\n const parseMulDiv = (): number => {\n let left = parseUnary();\n while (true) {\n skipWhitespace();\n const op = expr[pos];\n if (op === \"*\" || op === \"/\" || op === \"%\") {\n pos++;\n const right = parseUnary();\n if (op === \"*\") left = left * right;\n else if (op === \"/\") left = right === 0 ? 0 : Math.trunc(left / right);\n else left = right === 0 ? 0 : left % right;\n } else {\n break;\n }\n }\n return left;\n };\n\n const parseAddSub = (): number => {\n let left = parseMulDiv();\n while (true) {\n skipWhitespace();\n const op = expr[pos];\n if (op === \"+\" || (op === \"-\" && !/[0-9]/.test(expr[pos + 1] ?? \"\"))) {\n pos++;\n const right = parseMulDiv();\n if (op === \"+\") left = left + right;\n else left = left - right;\n } else {\n break;\n }\n }\n return left;\n };\n\n const parseComparison = (): number => {\n let left = parseAddSub();\n while (true) {\n skipWhitespace();\n if (expr.slice(pos, pos + 2) === \"<=\") {\n pos += 2;\n const right = parseAddSub();\n left = left <= right ? 1 : 0;\n } else if (expr.slice(pos, pos + 2) === \">=\") {\n pos += 2;\n const right = parseAddSub();\n left = left >= right ? 1 : 0;\n } else if (expr.slice(pos, pos + 2) === \"==\") {\n pos += 2;\n const right = parseAddSub();\n left = left === right ? 1 : 0;\n } else if (expr.slice(pos, pos + 2) === \"!=\") {\n pos += 2;\n const right = parseAddSub();\n left = left !== right ? 1 : 0;\n } else if (expr[pos] === \"<\") {\n pos++;\n const right = parseAddSub();\n left = left < right ? 1 : 0;\n } else if (expr[pos] === \">\") {\n pos++;\n const right = parseAddSub();\n left = left > right ? 1 : 0;\n } else {\n break;\n }\n }\n return left;\n };\n\n const parseAnd = (): number => {\n let left = parseComparison();\n while (true) {\n skipWhitespace();\n if (expr.slice(pos, pos + 2) === \"&&\") {\n pos += 2;\n const right = parseComparison();\n left = (left !== 0 && right !== 0) ? 1 : 0;\n } else {\n break;\n }\n }\n return left;\n };\n\n const parseOr = (): number => {\n let left = parseAnd();\n while (true) {\n skipWhitespace();\n if (expr.slice(pos, pos + 2) === \"||\") {\n pos += 2;\n const right = parseAnd();\n left = (left !== 0 || right !== 0) ? 1 : 0;\n } else {\n break;\n }\n }\n return left;\n };\n\n return parseOr();\n }\n\n setCwd(cwd: string): void {\n this.env.OLDPWD = this.cwd;\n this.cwd = cwd;\n }\n\n setEnv(vars: Record<string, string>): void {\n Object.assign(this.env, vars);\n }\n\n getCwd(): string {\n return this.cwd;\n }\n\n getEnv(): Record<string, string> {\n return { ...this.env };\n }\n}\n"
|
|
5
|
+
"import type {\n ASTNode,\n CommandNode,\n Redirect,\n IfNode,\n ForNode,\n WhileNode,\n UntilNode,\n CaseNode,\n WordNode,\n WordPart,\n} from \"../parser/ast.mjs\";\nimport type { Command, VirtualFS, ExecResult, OutputCollector, RedirectObjectMap } from \"../types.mjs\";\nimport { createCommandContext } from \"./context.mjs\";\nimport { createStdin } from \"../io/stdin.mjs\";\nimport { createStdout, createStderr, createPipe, PipeBuffer, createBufferTargetCollector } from \"../io/stdout.mjs\";\nimport { isDevNullPath } from \"../fs/special-files.mjs\";\n\nexport interface InterpreterOptions {\n fs: VirtualFS;\n cwd: string;\n env: Record<string, string>;\n commands: Record<string, Command>;\n redirectObjects?: RedirectObjectMap;\n isTTY?: boolean;\n}\n\ninterface ExpandedSegment {\n value: string;\n quoted: boolean;\n}\n\ninterface ExpandedField {\n segments: ExpandedSegment[];\n}\n\nconst DEFAULT_IFS = \" \\t\\n\";\nconst GLOB_META_CHARS = /[*?[{]/;\n\n// Loop control flow exceptions\nexport class BreakException extends Error {\n constructor(public levels: number = 1) {\n super(\"break\");\n }\n}\n\nexport class ContinueException extends Error {\n constructor(public levels: number = 1) {\n super(\"continue\");\n }\n}\n\nexport class Interpreter {\n private fs: VirtualFS;\n private cwd: string;\n private env: Record<string, string>;\n private commands: Record<string, Command>;\n private redirectObjects: RedirectObjectMap;\n private loopDepth: number = 0;\n private isTTY: boolean;\n\n constructor(options: InterpreterOptions) {\n this.fs = options.fs;\n this.cwd = options.cwd;\n this.env = { ...options.env };\n this.commands = options.commands;\n this.redirectObjects = options.redirectObjects ?? {};\n this.isTTY = options.isTTY ?? false;\n }\n\n getLoopDepth(): number {\n return this.loopDepth;\n }\n\n async execute(ast: ASTNode): Promise<ExecResult> {\n const stdout = createStdout(this.isTTY);\n const stderr = createStderr(this.isTTY);\n\n const exitCode = await this.executeNode(ast, null, stdout, stderr);\n\n stdout.close();\n stderr.close();\n\n return {\n stdout: await stdout.collect(),\n stderr: await stderr.collect(),\n exitCode,\n };\n }\n\n private async executeNode(\n node: ASTNode,\n stdinSource: AsyncIterable<Uint8Array> | null,\n stdout: OutputCollector,\n stderr: OutputCollector\n ): Promise<number> {\n switch (node.type) {\n case \"command\":\n return this.executeCommand(node, stdinSource, stdout, stderr);\n case \"pipeline\":\n return this.executePipeline(node.commands, stdinSource, stdout, stderr);\n case \"sequence\":\n return this.executeSequence(node.commands, stdinSource, stdout, stderr);\n case \"and\":\n return this.executeAnd(node.left, node.right, stdinSource, stdout, stderr);\n case \"or\":\n return this.executeOr(node.left, node.right, stdinSource, stdout, stderr);\n case \"if\":\n return this.executeIf(node, stdinSource, stdout, stderr);\n case \"for\":\n return this.executeFor(node, stdinSource, stdout, stderr);\n case \"while\":\n return this.executeWhile(node, stdinSource, stdout, stderr);\n case \"until\":\n return this.executeUntil(node, stdinSource, stdout, stderr);\n case \"case\":\n return this.executeCase(node, stdinSource, stdout, stderr);\n default:\n throw new Error(\"Cannot execute unknown node type\");\n }\n }\n\n private async executeCommand(\n node: CommandNode,\n stdinSource: AsyncIterable<Uint8Array> | null,\n stdout: OutputCollector,\n stderr: OutputCollector\n ): Promise<number> {\n const assignmentEnv = { ...this.env };\n for (const assignment of node.assignments) {\n assignmentEnv[assignment.name] = await this.expandWordScalar(assignment.value, assignmentEnv);\n }\n\n const expandedWords = await this.expandCommandWords(node, this.env);\n const [name, ...args] = expandedWords;\n\n if (name === undefined || name === \"\") {\n if (node.assignments.length > 0) {\n for (const assignment of node.assignments) {\n this.env[assignment.name] = assignmentEnv[assignment.name] ?? \"\";\n }\n }\n return 0;\n }\n\n // Handle redirects\n let actualStdin = stdinSource;\n let actualStdout: OutputCollector = stdout;\n let actualStderr: OutputCollector = stderr;\n let stderrToStdout = false;\n let stdoutToStderr = false;\n const fileWritePromises: Promise<void>[] = [];\n\n for (const redirect of node.redirects) {\n try {\n const result = await this.handleRedirect(\n redirect,\n actualStdin,\n actualStdout,\n actualStderr,\n this.env\n );\n actualStdin = result.stdin;\n actualStdout = result.stdout;\n actualStderr = result.stderr;\n stderrToStdout = result.stderrToStdout || stderrToStdout;\n stdoutToStderr = result.stdoutToStderr || stdoutToStderr;\n if (result.fileWritePromise) {\n fileWritePromises.push(result.fileWritePromise);\n }\n } catch (err) {\n const target = await this.expandWordScalar(redirect.target, this.env);\n const message = err instanceof Error ? err.message : String(err);\n await stderr.writeText(`sh: ${target}: ${message}\\n`);\n return 1;\n }\n }\n\n // Handle stderr->stdout redirect\n if (stderrToStdout) {\n actualStderr = actualStdout;\n }\n if (stdoutToStderr) {\n actualStdout = actualStderr;\n }\n\n // Look up command\n const command = this.commands[name];\n if (!command) {\n await stderr.writeText(`${name}: command not found\\n`);\n return 127;\n }\n\n // Create exec closure for sub-command invocation\n const exec = async (cmdName: string, cmdArgs: string[]) => {\n const cmd = this.commands[cmdName];\n if (!cmd) {\n return {\n stdout: Buffer.alloc(0),\n stderr: Buffer.from(`${cmdName}: command not found\\n`),\n exitCode: 127,\n };\n }\n const subStdout = createStdout();\n const subStderr = createStderr();\n const subCtx = createCommandContext({\n args: cmdArgs,\n stdin: createStdin(null),\n stdout: subStdout,\n stderr: subStderr,\n fs: this.fs,\n cwd: this.cwd,\n env: { ...assignmentEnv },\n setCwd: (path: string) => this.setCwd(path),\n exec,\n });\n let exitCode: number;\n try {\n exitCode = await cmd(subCtx);\n } catch (err) {\n if (err instanceof BreakException || err instanceof ContinueException) {\n throw err;\n }\n const message = err instanceof Error ? err.message : String(err);\n await subStderr.writeText(`${cmdName}: ${message}\\n`);\n exitCode = 1;\n }\n subStdout.close();\n subStderr.close();\n return {\n stdout: await subStdout.collect(),\n stderr: await subStderr.collect(),\n exitCode,\n };\n };\n\n // Create context and execute\n const ctx = createCommandContext({\n args,\n stdin: createStdin(actualStdin),\n stdout: actualStdout,\n stderr: actualStderr,\n fs: this.fs,\n cwd: this.cwd,\n env: assignmentEnv,\n setCwd: (path: string) => this.setCwd(path),\n exec,\n });\n\n let exitCode: number;\n try {\n exitCode = await command(ctx);\n } catch (err) {\n // Re-throw loop control exceptions\n if (err instanceof BreakException || err instanceof ContinueException) {\n throw err;\n }\n const message = err instanceof Error ? err.message : String(err);\n await stderr.writeText(`${name}: ${message}\\n`);\n exitCode = 1;\n }\n\n // Close redirect collectors and wait for file writes\n if (actualStdout !== stdout) {\n actualStdout.close();\n }\n if (actualStderr !== stderr && actualStderr !== actualStdout) {\n actualStderr.close();\n }\n\n // Wait for all file write operations to complete\n try {\n await Promise.all(fileWritePromises);\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n // Find the redirect target for the error message\n const writeRedirects = node.redirects.filter(r => r.mode !== \"<\" && r.mode !== \"2>&1\" && r.mode !== \"1>&2\");\n const target = writeRedirects.length > 0\n ? await this.expandWordScalar(writeRedirects[writeRedirects.length - 1]!.target, this.env)\n : \"unknown\";\n await stderr.writeText(`sh: ${target}: ${message}\\n`);\n exitCode = 1;\n }\n\n return exitCode;\n }\n\n private async handleRedirect(\n redirect: Redirect,\n stdin: AsyncIterable<Uint8Array> | null,\n stdout: OutputCollector,\n stderr: OutputCollector,\n env: Record<string, string>\n ): Promise<{\n stdin: AsyncIterable<Uint8Array> | null;\n stdout: OutputCollector;\n stderr: OutputCollector;\n stderrToStdout?: boolean;\n stdoutToStderr?: boolean;\n fileWritePromise?: Promise<void>;\n }> {\n const target = await this.expandWordScalar(redirect.target, env);\n\n // Check if target is a redirect object marker\n if (target in this.redirectObjects) {\n return this.handleObjectRedirect(redirect.mode, this.redirectObjects[target]!, stdin, stdout, stderr);\n }\n\n switch (redirect.mode) {\n case \"<\": {\n if (redirect.heredocContent) {\n // Heredoc: target is already the content\n return {\n stdin: (async function* () {\n yield new TextEncoder().encode(target);\n })(),\n stdout,\n stderr,\n };\n }\n // /dev/null: empty input\n if (isDevNullPath(target)) {\n return {\n stdin: (async function* () {})(),\n stdout,\n stderr,\n };\n }\n // Input redirect from file\n const path = this.fs.resolve(this.cwd, target);\n const content = await this.fs.readFile(path);\n return {\n stdin: (async function* () {\n yield new Uint8Array(content);\n })(),\n stdout,\n stderr,\n };\n }\n case \">\": {\n // Output redirect (overwrite)\n const collector = createStdout();\n if (isDevNullPath(target)) {\n return { stdin, stdout: collector, stderr };\n }\n const path = this.fs.resolve(this.cwd, target);\n const fileWritePromise = (async () => {\n const data = await collector.collect();\n await this.fs.writeFile(path, data);\n })();\n return { stdin, stdout: collector, stderr, fileWritePromise };\n }\n case \">>\": {\n // Output redirect (append)\n const collector = createStdout();\n if (isDevNullPath(target)) {\n return { stdin, stdout: collector, stderr };\n }\n const path = this.fs.resolve(this.cwd, target);\n const fileWritePromise = (async () => {\n const data = await collector.collect();\n await this.fs.appendFile(path, data);\n })();\n return { stdin, stdout: collector, stderr, fileWritePromise };\n }\n case \"2>\": {\n // Stderr redirect (overwrite)\n const collector = createStderr();\n if (isDevNullPath(target)) {\n return { stdin, stdout, stderr: collector };\n }\n const path = this.fs.resolve(this.cwd, target);\n const fileWritePromise = (async () => {\n const data = await collector.collect();\n await this.fs.writeFile(path, data);\n })();\n return { stdin, stdout, stderr: collector, fileWritePromise };\n }\n case \"2>>\": {\n // Stderr redirect (append)\n const collector = createStderr();\n if (isDevNullPath(target)) {\n return { stdin, stdout, stderr: collector };\n }\n const path = this.fs.resolve(this.cwd, target);\n const fileWritePromise = (async () => {\n const data = await collector.collect();\n await this.fs.appendFile(path, data);\n })();\n return { stdin, stdout, stderr: collector, fileWritePromise };\n }\n case \"&>\": {\n // Both to file (overwrite)\n const collector = createStdout();\n if (isDevNullPath(target)) {\n return { stdin, stdout: collector, stderr: collector };\n }\n const path = this.fs.resolve(this.cwd, target);\n const fileWritePromise = (async () => {\n const data = await collector.collect();\n await this.fs.writeFile(path, data);\n })();\n return { stdin, stdout: collector, stderr: collector, fileWritePromise };\n }\n case \"&>>\": {\n // Both to file (append)\n const collector = createStdout();\n if (isDevNullPath(target)) {\n return { stdin, stdout: collector, stderr: collector };\n }\n const path = this.fs.resolve(this.cwd, target);\n const fileWritePromise = (async () => {\n const data = await collector.collect();\n await this.fs.appendFile(path, data);\n })();\n return { stdin, stdout: collector, stderr: collector, fileWritePromise };\n }\n case \"2>&1\":\n return { stdin, stdout, stderr, stderrToStdout: true };\n case \"1>&2\":\n return { stdin, stdout, stderr, stdoutToStderr: true };\n default:\n return { stdin, stdout, stderr };\n }\n }\n\n private async handleObjectRedirect(\n mode: string,\n obj: Buffer | Blob | Response | string,\n stdin: AsyncIterable<Uint8Array> | null,\n stdout: OutputCollector,\n stderr: OutputCollector\n ): Promise<{\n stdin: AsyncIterable<Uint8Array> | null;\n stdout: OutputCollector;\n stderr: OutputCollector;\n stderrToStdout?: boolean;\n stdoutToStderr?: boolean;\n fileWritePromise?: Promise<void>;\n }> {\n switch (mode) {\n case \"<\": {\n // Input from object\n const data = await this.readFromObject(obj);\n return {\n stdin: (async function* () {\n yield data;\n })(),\n stdout,\n stderr,\n };\n }\n case \">\":\n case \">>\": {\n // Output to object (only Buffer supported)\n if (!Buffer.isBuffer(obj)) {\n throw new Error(\"Output redirection only supports Buffer targets\");\n }\n const collector = createBufferTargetCollector(obj);\n return { stdin, stdout: collector, stderr };\n }\n case \"2>\":\n case \"2>>\": {\n // Stderr to object (only Buffer supported)\n if (!Buffer.isBuffer(obj)) {\n throw new Error(\"Stderr redirection only supports Buffer targets\");\n }\n const collector = createBufferTargetCollector(obj);\n return { stdin, stdout, stderr: collector };\n }\n case \"&>\":\n case \"&>>\": {\n // Both to object (only Buffer supported)\n if (!Buffer.isBuffer(obj)) {\n throw new Error(\"Combined redirection only supports Buffer targets\");\n }\n const collector = createBufferTargetCollector(obj);\n return { stdin, stdout: collector, stderr: collector };\n }\n default:\n return { stdin, stdout, stderr };\n }\n }\n\n private async readFromObject(obj: Buffer | Blob | Response | string): Promise<Uint8Array> {\n if (Buffer.isBuffer(obj)) {\n return new Uint8Array(obj);\n }\n if (obj instanceof Blob) {\n return new Uint8Array(await obj.arrayBuffer());\n }\n if (obj instanceof Response) {\n return new Uint8Array(await obj.arrayBuffer());\n }\n if (typeof obj === \"string\") {\n return new TextEncoder().encode(obj);\n }\n throw new Error(\"Unsupported redirect object type\");\n }\n\n private async executePipeline(\n commands: ASTNode[],\n stdinSource: AsyncIterable<Uint8Array> | null,\n stdout: OutputCollector,\n stderr: OutputCollector\n ): Promise<number> {\n if (commands.length === 0) return 0;\n if (commands.length === 1) {\n return this.executeNode(commands[0]!, stdinSource, stdout, stderr);\n }\n\n // Create pipes between commands\n const pipes: PipeBuffer[] = [];\n for (let i = 0; i < commands.length - 1; i++) {\n pipes.push(createPipe());\n }\n\n // Execute all commands concurrently\n const promises: Promise<number>[] = [];\n\n for (let i = 0; i < commands.length; i++) {\n const command = commands[i]!;\n const cmdStdin = i === 0 ? stdinSource : pipes[i - 1]!.getReadableStream();\n const cmdStdout = i === commands.length - 1 ? stdout : pipes[i]!;\n\n promises.push(\n this.executeNode(command, cmdStdin, cmdStdout, stderr).then((code) => {\n // Close pipe when command finishes\n if (i < commands.length - 1) {\n pipes[i]!.close();\n }\n return code;\n })\n );\n }\n\n // Wait for all commands and return last exit code\n const results = await Promise.all(promises);\n return results[results.length - 1]!;\n }\n\n private async executeSequence(\n commands: ASTNode[],\n stdinSource: AsyncIterable<Uint8Array> | null,\n stdout: OutputCollector,\n stderr: OutputCollector\n ): Promise<number> {\n let lastExitCode = 0;\n\n for (const command of commands) {\n lastExitCode = await this.executeNode(command, stdinSource, stdout, stderr);\n }\n\n return lastExitCode;\n }\n\n private async executeAnd(\n left: ASTNode,\n right: ASTNode,\n stdinSource: AsyncIterable<Uint8Array> | null,\n stdout: OutputCollector,\n stderr: OutputCollector\n ): Promise<number> {\n const leftCode = await this.executeNode(left, stdinSource, stdout, stderr);\n if (leftCode !== 0) {\n return leftCode;\n }\n return this.executeNode(right, stdinSource, stdout, stderr);\n }\n\n private async executeOr(\n left: ASTNode,\n right: ASTNode,\n stdinSource: AsyncIterable<Uint8Array> | null,\n stdout: OutputCollector,\n stderr: OutputCollector\n ): Promise<number> {\n const leftCode = await this.executeNode(left, stdinSource, stdout, stderr);\n if (leftCode === 0) {\n return 0;\n }\n return this.executeNode(right, stdinSource, stdout, stderr);\n }\n\n private async executeIf(\n node: IfNode,\n stdinSource: AsyncIterable<Uint8Array> | null,\n stdout: OutputCollector,\n stderr: OutputCollector\n ): Promise<number> {\n // Execute condition\n const conditionCode = await this.executeNode(node.condition, stdinSource, stdout, stderr);\n\n if (conditionCode === 0) {\n // Condition succeeded, execute then branch\n return this.executeNode(node.thenBranch, stdinSource, stdout, stderr);\n }\n\n // Check elif branches\n for (const elif of node.elifBranches) {\n const elifConditionCode = await this.executeNode(elif.condition, stdinSource, stdout, stderr);\n if (elifConditionCode === 0) {\n return this.executeNode(elif.body, stdinSource, stdout, stderr);\n }\n }\n\n // Execute else branch if present\n if (node.elseBranch) {\n return this.executeNode(node.elseBranch, stdinSource, stdout, stderr);\n }\n\n return 0;\n }\n\n private async executeFor(\n node: ForNode,\n stdinSource: AsyncIterable<Uint8Array> | null,\n stdout: OutputCollector,\n stderr: OutputCollector\n ): Promise<number> {\n const expandedItems: string[] = [];\n for (const item of node.items) {\n expandedItems.push(...(await this.expandWordForCommand(item, this.env)));\n }\n\n // If no items provided, use positional parameters (not implemented, so empty)\n if (expandedItems.length === 0) {\n return 0;\n }\n\n let lastExitCode = 0;\n this.loopDepth++;\n\n try {\n for (const value of expandedItems) {\n // Set the loop variable\n this.env[node.variable] = value;\n\n try {\n lastExitCode = await this.executeNode(node.body, stdinSource, stdout, stderr);\n } catch (e) {\n if (e instanceof ContinueException) {\n if (e.levels > 1) {\n e.levels--;\n throw e;\n }\n continue;\n }\n if (e instanceof BreakException) {\n if (e.levels > 1) {\n e.levels--;\n throw e;\n }\n break;\n }\n throw e;\n }\n }\n } finally {\n this.loopDepth--;\n }\n\n return lastExitCode;\n }\n\n private async executeWhile(\n node: WhileNode,\n stdinSource: AsyncIterable<Uint8Array> | null,\n stdout: OutputCollector,\n stderr: OutputCollector\n ): Promise<number> {\n let lastExitCode = 0;\n this.loopDepth++;\n\n try {\n while (true) {\n // Check condition\n const conditionCode = await this.executeNode(node.condition, stdinSource, stdout, stderr);\n if (conditionCode !== 0) {\n break;\n }\n\n try {\n lastExitCode = await this.executeNode(node.body, stdinSource, stdout, stderr);\n } catch (e) {\n if (e instanceof ContinueException) {\n if (e.levels > 1) {\n e.levels--;\n throw e;\n }\n continue;\n }\n if (e instanceof BreakException) {\n if (e.levels > 1) {\n e.levels--;\n throw e;\n }\n break;\n }\n throw e;\n }\n }\n } finally {\n this.loopDepth--;\n }\n\n return lastExitCode;\n }\n\n private async executeUntil(\n node: UntilNode,\n stdinSource: AsyncIterable<Uint8Array> | null,\n stdout: OutputCollector,\n stderr: OutputCollector\n ): Promise<number> {\n let lastExitCode = 0;\n this.loopDepth++;\n\n try {\n while (true) {\n // Check condition - loop until condition succeeds\n const conditionCode = await this.executeNode(node.condition, stdinSource, stdout, stderr);\n if (conditionCode === 0) {\n break;\n }\n\n try {\n lastExitCode = await this.executeNode(node.body, stdinSource, stdout, stderr);\n } catch (e) {\n if (e instanceof ContinueException) {\n if (e.levels > 1) {\n e.levels--;\n throw e;\n }\n continue;\n }\n if (e instanceof BreakException) {\n if (e.levels > 1) {\n e.levels--;\n throw e;\n }\n break;\n }\n throw e;\n }\n }\n } finally {\n this.loopDepth--;\n }\n\n return lastExitCode;\n }\n\n private async executeCase(\n node: CaseNode,\n stdinSource: AsyncIterable<Uint8Array> | null,\n stdout: OutputCollector,\n stderr: OutputCollector\n ): Promise<number> {\n const word = await this.expandWordScalar(node.word, this.env);\n\n for (const clause of node.clauses) {\n for (const patternNode of clause.patterns) {\n const pattern = await this.expandWordScalar(patternNode, this.env);\n\n if (this.matchCasePattern(word, pattern)) {\n return this.executeNode(clause.body, stdinSource, stdout, stderr);\n }\n }\n }\n\n return 0;\n }\n\n private matchCasePattern(word: string, pattern: string): boolean {\n // Convert shell glob pattern to regex\n // * matches any string, ? matches any single character\n let regexStr = \"^\";\n for (let i = 0; i < pattern.length; i++) {\n const char = pattern[i];\n if (char === \"*\") {\n regexStr += \".*\";\n } else if (char === \"?\") {\n regexStr += \".\";\n } else if (char === \"[\") {\n // Character class - find closing bracket\n let j = i + 1;\n while (j < pattern.length && pattern[j] !== \"]\") {\n j++;\n }\n if (j < pattern.length) {\n regexStr += pattern.slice(i, j + 1);\n i = j;\n } else {\n regexStr += \"\\\\[\";\n }\n } else if (/[.+^${}()|\\\\]/.test(char!)) {\n // Escape regex special characters\n regexStr += \"\\\\\" + char;\n } else {\n regexStr += char;\n }\n }\n regexStr += \"$\";\n\n try {\n const regex = new RegExp(regexStr);\n return regex.test(word);\n } catch {\n // If regex fails, fall back to exact match\n return word === pattern;\n }\n }\n\n private async expandCommandWords(node: CommandNode, env: Record<string, string>): Promise<string[]> {\n const expanded: string[] = [];\n for (const word of [node.name, ...node.args]) {\n expanded.push(...(await this.expandWordForCommand(word, env)));\n }\n return expanded;\n }\n\n private async expandWordForCommand(word: WordNode, env: Record<string, string>): Promise<string[]> {\n const fields = await this.expandWordFields(word, env);\n const expanded: string[] = [];\n for (const field of fields) {\n expanded.push(...(await this.expandPathname(field)));\n }\n return expanded;\n }\n\n private async expandWordScalar(word: WordNode, env: Record<string, string>): Promise<string> {\n let result = \"\";\n for (const part of word.parts) {\n result += await this.expandWordPart(part, env);\n }\n return result;\n }\n\n private async expandWordFields(word: WordNode, env: Record<string, string>): Promise<ExpandedField[]> {\n const fields: ExpandedField[] = [this.createExpandedField()];\n const ifs = this.getIFS(env);\n\n for (const part of word.parts) {\n if (part.type === \"text\") {\n this.appendSegment(fields[fields.length - 1]!, part.value, part.quoted);\n continue;\n }\n\n const value = await this.expandWordPart(part, env);\n if (part.quoted) {\n this.appendSegment(fields[fields.length - 1]!, value, true);\n continue;\n }\n\n const splitFields = this.splitUnquotedExpansion(value, ifs);\n if (splitFields.length === 0) {\n continue;\n }\n\n this.appendSegment(fields[fields.length - 1]!, splitFields[0]!, false);\n for (let i = 1; i < splitFields.length; i++) {\n const field = this.createExpandedField();\n this.appendSegment(field, splitFields[i]!, false);\n fields.push(field);\n }\n }\n\n return fields.filter((field) => field.segments.length > 0);\n }\n\n private async expandWordPart(part: WordPart, env: Record<string, string>): Promise<string> {\n switch (part.type) {\n case \"text\":\n return part.value;\n case \"variable\":\n return env[part.name] ?? \"\";\n case \"substitution\":\n return this.executeSubstitution(part.command, env);\n case \"arithmetic\":\n return String(this.evaluateArithmetic(part.expression, env));\n default:\n throw new Error(\"Cannot expand unknown word part\");\n }\n }\n\n private async executeSubstitution(command: ASTNode, env: Record<string, string>): Promise<string> {\n const interpreter = new Interpreter({\n fs: this.fs,\n cwd: this.cwd,\n env,\n commands: this.commands,\n redirectObjects: this.redirectObjects,\n isTTY: false,\n });\n const result = await interpreter.execute(command);\n return result.stdout.toString(\"utf-8\").replace(/\\n+$/, \"\");\n }\n\n private getIFS(env: Record<string, string>): string {\n return env.IFS ?? DEFAULT_IFS;\n }\n\n private splitUnquotedExpansion(value: string, ifs: string): string[] {\n if (value.length === 0) {\n return [];\n }\n if (ifs === \"\") {\n return [value];\n }\n\n const ifsChars = new Set(ifs);\n const isIfsWhitespace = (char: string) =>\n ifsChars.has(char) && (char === \" \" || char === \"\\t\" || char === \"\\n\");\n const isIfsNonWhitespace = (char: string) => ifsChars.has(char) && !isIfsWhitespace(char);\n\n const fields: string[] = [];\n let i = 0;\n\n while (i < value.length && isIfsWhitespace(value[i]!)) {\n i++;\n }\n\n let fieldStart = i;\n let lastDelimiterWasNonWhitespace = false;\n\n while (i < value.length) {\n const char = value[i]!;\n\n if (isIfsNonWhitespace(char)) {\n fields.push(value.slice(fieldStart, i));\n i++;\n while (i < value.length && isIfsWhitespace(value[i]!)) {\n i++;\n }\n fieldStart = i;\n lastDelimiterWasNonWhitespace = true;\n continue;\n }\n\n if (isIfsWhitespace(char)) {\n fields.push(value.slice(fieldStart, i));\n while (i < value.length && isIfsWhitespace(value[i]!)) {\n i++;\n }\n if (i < value.length && isIfsNonWhitespace(value[i]!)) {\n i++;\n while (i < value.length && isIfsWhitespace(value[i]!)) {\n i++;\n }\n lastDelimiterWasNonWhitespace = true;\n } else {\n lastDelimiterWasNonWhitespace = false;\n }\n fieldStart = i;\n continue;\n }\n\n lastDelimiterWasNonWhitespace = false;\n i++;\n }\n\n if (fieldStart < value.length) {\n fields.push(value.slice(fieldStart));\n } else if (lastDelimiterWasNonWhitespace) {\n fields.push(\"\");\n }\n\n return fields;\n }\n\n private createExpandedField(): ExpandedField {\n return { segments: [] };\n }\n\n private appendSegment(field: ExpandedField, value: string, quoted: boolean): void {\n const lastSegment = field.segments[field.segments.length - 1];\n if (lastSegment && lastSegment.quoted === quoted) {\n lastSegment.value += value;\n return;\n }\n field.segments.push({ value, quoted });\n }\n\n private async expandPathname(field: ExpandedField): Promise<string[]> {\n if (!this.hasUnquotedGlobMeta(field)) {\n return [this.fieldToString(field)];\n }\n\n const pattern = this.fieldToGlobPattern(field);\n const matches = await this.fs.glob(pattern, { cwd: this.cwd });\n return matches.length > 0 ? matches : [this.fieldToString(field)];\n }\n\n private hasUnquotedGlobMeta(field: ExpandedField): boolean {\n return field.segments.some((segment) => !segment.quoted && GLOB_META_CHARS.test(segment.value));\n }\n\n private fieldToString(field: ExpandedField): string {\n return field.segments.map((segment) => segment.value).join(\"\");\n }\n\n private fieldToGlobPattern(field: ExpandedField): string {\n return field.segments\n .map((segment) => (segment.quoted ? this.escapeLiteralGlobChars(segment.value) : segment.value))\n .join(\"\");\n }\n\n private escapeLiteralGlobChars(value: string): string {\n return value\n .replaceAll(\"[\", \"[[]\")\n .replaceAll(\"]\", \"[]]\")\n .replaceAll(\"*\", \"[*]\")\n .replaceAll(\"?\", \"[?]\")\n .replaceAll(\"{\", \"[{]\")\n .replaceAll(\"}\", \"[}]\");\n }\n\n private evaluateArithmetic(expression: string, env: Record<string, string>): number {\n // Expand variables in the expression\n let expandedExpr = expression;\n // Replace $VAR and ${VAR} with their values\n expandedExpr = expandedExpr.replace(/\\$\\{([a-zA-Z_][a-zA-Z0-9_]*)\\}/g, (_, name) => {\n return env[name] ?? \"0\";\n });\n expandedExpr = expandedExpr.replace(/\\$([a-zA-Z_][a-zA-Z0-9_]*)/g, (_, name) => {\n return env[name] ?? \"0\";\n });\n // Also handle bare variable names (in arithmetic, variables can be referenced without $)\n expandedExpr = expandedExpr.replace(/\\b([a-zA-Z_][a-zA-Z0-9_]*)\\b/g, (match) => {\n // Don't replace if it looks like a number\n if (/^\\d+$/.test(match)) return match;\n return env[match] ?? \"0\";\n });\n\n // Parse and evaluate the expression\n return this.parseArithmeticExpr(expandedExpr.trim());\n }\n\n private parseArithmeticExpr(expr: string): number {\n // Simple arithmetic expression parser\n // Supports: +, -, *, /, %, ==, !=, <, >, <=, >=, &&, ||, parentheses\n // Uses a simple recursive descent parser\n\n let pos = 0;\n\n const skipWhitespace = () => {\n while (pos < expr.length && /\\s/.test(expr[pos]!)) pos++;\n };\n\n const parseNumber = (): number => {\n skipWhitespace();\n let numStr = \"\";\n const negative = expr[pos] === \"-\";\n if (negative) {\n pos++;\n skipWhitespace();\n }\n while (pos < expr.length && /[0-9]/.test(expr[pos]!)) {\n numStr += expr[pos];\n pos++;\n }\n if (numStr === \"\") return 0;\n return negative ? -parseInt(numStr, 10) : parseInt(numStr, 10);\n };\n\n const parsePrimary = (): number => {\n skipWhitespace();\n if (expr[pos] === \"(\") {\n pos++; // consume (\n const result = parseOr();\n skipWhitespace();\n if (expr[pos] === \")\") pos++; // consume )\n return result;\n }\n return parseNumber();\n };\n\n const parseUnary = (): number => {\n skipWhitespace();\n if (expr[pos] === \"-\" && !/[0-9]/.test(expr[pos + 1] ?? \"\")) {\n pos++;\n return -parseUnary();\n }\n if (expr[pos] === \"!\") {\n pos++;\n return parseUnary() === 0 ? 1 : 0;\n }\n return parsePrimary();\n };\n\n const parseMulDiv = (): number => {\n let left = parseUnary();\n while (true) {\n skipWhitespace();\n const op = expr[pos];\n if (op === \"*\" || op === \"/\" || op === \"%\") {\n pos++;\n const right = parseUnary();\n if (op === \"*\") left = left * right;\n else if (op === \"/\") left = right === 0 ? 0 : Math.trunc(left / right);\n else left = right === 0 ? 0 : left % right;\n } else {\n break;\n }\n }\n return left;\n };\n\n const parseAddSub = (): number => {\n let left = parseMulDiv();\n while (true) {\n skipWhitespace();\n const op = expr[pos];\n if (op === \"+\" || (op === \"-\" && !/[0-9]/.test(expr[pos + 1] ?? \"\"))) {\n pos++;\n const right = parseMulDiv();\n if (op === \"+\") left = left + right;\n else left = left - right;\n } else {\n break;\n }\n }\n return left;\n };\n\n const parseComparison = (): number => {\n let left = parseAddSub();\n while (true) {\n skipWhitespace();\n if (expr.slice(pos, pos + 2) === \"<=\") {\n pos += 2;\n const right = parseAddSub();\n left = left <= right ? 1 : 0;\n } else if (expr.slice(pos, pos + 2) === \">=\") {\n pos += 2;\n const right = parseAddSub();\n left = left >= right ? 1 : 0;\n } else if (expr.slice(pos, pos + 2) === \"==\") {\n pos += 2;\n const right = parseAddSub();\n left = left === right ? 1 : 0;\n } else if (expr.slice(pos, pos + 2) === \"!=\") {\n pos += 2;\n const right = parseAddSub();\n left = left !== right ? 1 : 0;\n } else if (expr[pos] === \"<\") {\n pos++;\n const right = parseAddSub();\n left = left < right ? 1 : 0;\n } else if (expr[pos] === \">\") {\n pos++;\n const right = parseAddSub();\n left = left > right ? 1 : 0;\n } else {\n break;\n }\n }\n return left;\n };\n\n const parseAnd = (): number => {\n let left = parseComparison();\n while (true) {\n skipWhitespace();\n if (expr.slice(pos, pos + 2) === \"&&\") {\n pos += 2;\n const right = parseComparison();\n left = (left !== 0 && right !== 0) ? 1 : 0;\n } else {\n break;\n }\n }\n return left;\n };\n\n const parseOr = (): number => {\n let left = parseAnd();\n while (true) {\n skipWhitespace();\n if (expr.slice(pos, pos + 2) === \"||\") {\n pos += 2;\n const right = parseAnd();\n left = (left !== 0 || right !== 0) ? 1 : 0;\n } else {\n break;\n }\n }\n return left;\n };\n\n return parseOr();\n }\n\n setCwd(cwd: string): void {\n this.env.OLDPWD = this.cwd;\n this.cwd = cwd;\n }\n\n setEnv(vars: Record<string, string>): void {\n Object.assign(this.env, vars);\n }\n\n getCwd(): string {\n return this.cwd;\n }\n\n getEnv(): Record<string, string> {\n return { ...this.env };\n }\n}\n"
|
|
6
6
|
],
|
|
7
|
-
"mappings": "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",
|
|
8
|
-
"debugId": "
|
|
7
|
+
"mappings": "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",
|
|
8
|
+
"debugId": "96916342C8FA80E364756E2164756E21",
|
|
9
9
|
"names": []
|
|
10
10
|
}
|