shell-dsl 0.0.38 → 0.0.40

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (60) hide show
  1. package/README.md +118 -3
  2. package/dist/cjs/index.cjs +2 -1
  3. package/dist/cjs/index.cjs.map +3 -3
  4. package/dist/cjs/package.json +1 -1
  5. package/dist/cjs/src/commands/exit/exit.cjs +84 -0
  6. package/dist/cjs/src/commands/exit/exit.cjs.map +10 -0
  7. package/dist/cjs/src/commands/index.cjs +22 -2
  8. package/dist/cjs/src/commands/index.cjs.map +3 -3
  9. package/dist/cjs/src/commands/printf/printf.cjs +416 -0
  10. package/dist/cjs/src/commands/printf/printf.cjs.map +10 -0
  11. package/dist/cjs/src/commands/sh/sh.cjs +134 -0
  12. package/dist/cjs/src/commands/sh/sh.cjs.map +10 -0
  13. package/dist/cjs/src/index.cjs +2 -1
  14. package/dist/cjs/src/index.cjs.map +3 -3
  15. package/dist/cjs/src/interpreter/context.cjs +4 -1
  16. package/dist/cjs/src/interpreter/context.cjs.map +3 -3
  17. package/dist/cjs/src/interpreter/index.cjs +2 -1
  18. package/dist/cjs/src/interpreter/index.cjs.map +3 -3
  19. package/dist/cjs/src/interpreter/interpreter.cjs +301 -76
  20. package/dist/cjs/src/interpreter/interpreter.cjs.map +3 -3
  21. package/dist/cjs/src/lexer/lexer.cjs +13 -1
  22. package/dist/cjs/src/lexer/lexer.cjs.map +3 -3
  23. package/dist/cjs/src/parser/parser.cjs +11 -1
  24. package/dist/cjs/src/parser/parser.cjs.map +3 -3
  25. package/dist/cjs/src/types.cjs.map +2 -2
  26. package/dist/mjs/index.mjs +3 -1
  27. package/dist/mjs/index.mjs.map +3 -3
  28. package/dist/mjs/package.json +1 -1
  29. package/dist/mjs/src/commands/exit/exit.mjs +44 -0
  30. package/dist/mjs/src/commands/exit/exit.mjs.map +10 -0
  31. package/dist/mjs/src/commands/index.mjs +22 -2
  32. package/dist/mjs/src/commands/index.mjs.map +3 -3
  33. package/dist/mjs/src/commands/printf/printf.mjs +376 -0
  34. package/dist/mjs/src/commands/printf/printf.mjs.map +10 -0
  35. package/dist/mjs/src/commands/sh/sh.mjs +94 -0
  36. package/dist/mjs/src/commands/sh/sh.mjs.map +10 -0
  37. package/dist/mjs/src/index.mjs +3 -2
  38. package/dist/mjs/src/index.mjs.map +3 -3
  39. package/dist/mjs/src/interpreter/context.mjs +4 -1
  40. package/dist/mjs/src/interpreter/context.mjs.map +3 -3
  41. package/dist/mjs/src/interpreter/index.mjs +3 -2
  42. package/dist/mjs/src/interpreter/index.mjs.map +2 -2
  43. package/dist/mjs/src/interpreter/interpreter.mjs +301 -76
  44. package/dist/mjs/src/interpreter/interpreter.mjs.map +3 -3
  45. package/dist/mjs/src/lexer/lexer.mjs +13 -1
  46. package/dist/mjs/src/lexer/lexer.mjs.map +3 -3
  47. package/dist/mjs/src/parser/parser.mjs +11 -1
  48. package/dist/mjs/src/parser/parser.mjs.map +3 -3
  49. package/dist/mjs/src/types.mjs.map +2 -2
  50. package/dist/types/index.d.ts +1 -1
  51. package/dist/types/src/commands/exit/exit.d.ts +2 -0
  52. package/dist/types/src/commands/index.d.ts +3 -0
  53. package/dist/types/src/commands/printf/printf.d.ts +2 -0
  54. package/dist/types/src/commands/sh/sh.d.ts +5 -0
  55. package/dist/types/src/index.d.ts +2 -2
  56. package/dist/types/src/interpreter/context.d.ts +2 -1
  57. package/dist/types/src/interpreter/index.d.ts +1 -1
  58. package/dist/types/src/interpreter/interpreter.d.ts +24 -0
  59. package/dist/types/src/types.d.ts +13 -0
  60. package/package.json +1 -1
@@ -0,0 +1,416 @@
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/printf/printf.ts
40
+ var exports_printf = {};
41
+ __export(exports_printf, {
42
+ printf: () => printf
43
+ });
44
+ module.exports = __toCommonJS(exports_printf);
45
+ var INTEGER_SPECIFIERS = new Set(["d", "i", "u", "o", "x", "X"]);
46
+ var FLOAT_SPECIFIERS = new Set(["f", "F", "e", "E", "g", "G"]);
47
+ var STRING_SPECIFIERS = new Set(["s", "b", "c"]);
48
+ var LENGTH_MODIFIERS = new Set(["h", "l", "L", "j", "z", "t"]);
49
+ function isOctalDigit(char) {
50
+ return char !== undefined && char >= "0" && char <= "7";
51
+ }
52
+ function isDigit(char) {
53
+ return char !== undefined && char >= "0" && char <= "9";
54
+ }
55
+ function readEscape(input, index) {
56
+ if (index + 1 >= input.length) {
57
+ return { text: "\\", nextIndex: index + 1, stop: false };
58
+ }
59
+ const char = input[index + 1];
60
+ if (char === "c") {
61
+ return { text: "", nextIndex: index + 2, stop: true };
62
+ }
63
+ if (isOctalDigit(char)) {
64
+ let digits = "";
65
+ let nextIndex = index + 1;
66
+ if (input[nextIndex] === "0") {
67
+ nextIndex++;
68
+ }
69
+ while (digits.length < 3 && isOctalDigit(input[nextIndex])) {
70
+ digits += input[nextIndex];
71
+ nextIndex++;
72
+ }
73
+ const codePoint = digits === "" ? 0 : Number.parseInt(digits, 8);
74
+ return { text: String.fromCharCode(codePoint), nextIndex, stop: false };
75
+ }
76
+ if (char === "x") {
77
+ let digits = "";
78
+ let nextIndex = index + 2;
79
+ while (digits.length < 2 && nextIndex < input.length && /[0-9a-fA-F]/.test(input[nextIndex])) {
80
+ digits += input[nextIndex];
81
+ nextIndex++;
82
+ }
83
+ if (digits.length > 0) {
84
+ return { text: String.fromCharCode(Number.parseInt(digits, 16)), nextIndex, stop: false };
85
+ }
86
+ }
87
+ switch (char) {
88
+ case "a":
89
+ return { text: "\x07", nextIndex: index + 2, stop: false };
90
+ case "b":
91
+ return { text: "\b", nextIndex: index + 2, stop: false };
92
+ case "f":
93
+ return { text: "\f", nextIndex: index + 2, stop: false };
94
+ case "n":
95
+ return { text: `
96
+ `, nextIndex: index + 2, stop: false };
97
+ case "r":
98
+ return { text: "\r", nextIndex: index + 2, stop: false };
99
+ case "t":
100
+ return { text: "\t", nextIndex: index + 2, stop: false };
101
+ case "v":
102
+ return { text: "\v", nextIndex: index + 2, stop: false };
103
+ case "\\":
104
+ return { text: "\\", nextIndex: index + 2, stop: false };
105
+ default:
106
+ return { text: `\\${char}`, nextIndex: index + 2, stop: false };
107
+ }
108
+ }
109
+ function expandPrintfEscapes(input) {
110
+ let text = "";
111
+ for (let i = 0;i < input.length; ) {
112
+ if (input[i] !== "\\") {
113
+ text += input[i];
114
+ i++;
115
+ continue;
116
+ }
117
+ const escape = readEscape(input, i);
118
+ text += escape.text;
119
+ i = escape.nextIndex;
120
+ if (escape.stop) {
121
+ return { text, stop: true };
122
+ }
123
+ }
124
+ return { text, stop: false };
125
+ }
126
+ function readNumber(input, index) {
127
+ let digits = "";
128
+ let nextIndex = index;
129
+ while (isDigit(input[nextIndex])) {
130
+ digits += input[nextIndex];
131
+ nextIndex++;
132
+ }
133
+ return {
134
+ value: digits === "" ? undefined : Number.parseInt(digits, 10),
135
+ nextIndex
136
+ };
137
+ }
138
+ function parseConversion(format, index) {
139
+ let nextIndex = index + 1;
140
+ let flags = "";
141
+ while (true) {
142
+ const flag = format[nextIndex];
143
+ if (flag === undefined || !"-+ #0".includes(flag)) {
144
+ break;
145
+ }
146
+ flags += flag;
147
+ nextIndex++;
148
+ }
149
+ const widthResult = readNumber(format, nextIndex);
150
+ const width = widthResult.value;
151
+ nextIndex = widthResult.nextIndex;
152
+ let precision;
153
+ if (format[nextIndex] === ".") {
154
+ const precisionResult = readNumber(format, nextIndex + 1);
155
+ precision = precisionResult.value ?? 0;
156
+ nextIndex = precisionResult.nextIndex;
157
+ }
158
+ if (LENGTH_MODIFIERS.has(format[nextIndex] ?? "")) {
159
+ const modifier = format[nextIndex];
160
+ nextIndex++;
161
+ if (modifier === "h" && format[nextIndex] === "h" || modifier === "l" && format[nextIndex] === "l") {
162
+ nextIndex++;
163
+ }
164
+ }
165
+ const specifier = format[nextIndex];
166
+ if (specifier === undefined) {
167
+ return { nextIndex, error: "missing format character" };
168
+ }
169
+ if (!INTEGER_SPECIFIERS.has(specifier) && !FLOAT_SPECIFIERS.has(specifier) && !STRING_SPECIFIERS.has(specifier)) {
170
+ return { nextIndex: nextIndex + 1, error: `invalid format character '${specifier}'` };
171
+ }
172
+ return {
173
+ spec: { flags, width, precision, specifier },
174
+ nextIndex: nextIndex + 1
175
+ };
176
+ }
177
+ function pad(value, spec, numeric = false) {
178
+ const width = spec.width ?? 0;
179
+ if (value.length >= width) {
180
+ return value;
181
+ }
182
+ const leftAlign = spec.flags.includes("-");
183
+ const useZeroPad = numeric && spec.flags.includes("0") && !leftAlign && spec.precision === undefined;
184
+ const padChar = useZeroPad ? "0" : " ";
185
+ const padding = padChar.repeat(width - value.length);
186
+ if (leftAlign) {
187
+ return value + padding;
188
+ }
189
+ if (useZeroPad && (value.startsWith("-") || value.startsWith("+") || value.startsWith(" "))) {
190
+ return value[0] + padding + value.slice(1);
191
+ }
192
+ if (useZeroPad && (value.startsWith("0x") || value.startsWith("0X"))) {
193
+ return value.slice(0, 2) + padding + value.slice(2);
194
+ }
195
+ return padding + value;
196
+ }
197
+ function integerFromArg(arg) {
198
+ const trimmed = arg.trim();
199
+ if (/^[+-]?0[xX][0-9a-fA-F]+$/.test(trimmed)) {
200
+ const sign = trimmed.startsWith("-") ? -1 : 1;
201
+ return sign * Number.parseInt(trimmed.replace(/^[+-]?0[xX]/, ""), 16);
202
+ }
203
+ const parsed = Number.parseInt(trimmed, 10);
204
+ return Number.isNaN(parsed) ? 0 : parsed;
205
+ }
206
+ function floatFromArg(arg) {
207
+ const parsed = Number.parseFloat(arg.trim());
208
+ return Number.isNaN(parsed) ? 0 : parsed;
209
+ }
210
+ function formatInteger(arg, spec) {
211
+ const originalValue = Math.trunc(integerFromArg(arg));
212
+ const unsignedValue = originalValue < 0 ? originalValue >>> 0 : originalValue;
213
+ let value = spec.specifier === "u" || spec.specifier === "o" || spec.specifier === "x" || spec.specifier === "X" ? unsignedValue : originalValue;
214
+ let sign = "";
215
+ if ((spec.specifier === "d" || spec.specifier === "i") && value < 0) {
216
+ sign = "-";
217
+ value = Math.abs(value);
218
+ } else if ((spec.specifier === "d" || spec.specifier === "i") && spec.flags.includes("+")) {
219
+ sign = "+";
220
+ } else if ((spec.specifier === "d" || spec.specifier === "i") && spec.flags.includes(" ")) {
221
+ sign = " ";
222
+ }
223
+ let digits;
224
+ if (spec.specifier === "o") {
225
+ digits = value.toString(8);
226
+ } else if (spec.specifier === "x" || spec.specifier === "X") {
227
+ digits = value.toString(16);
228
+ if (spec.specifier === "X") {
229
+ digits = digits.toUpperCase();
230
+ }
231
+ } else {
232
+ digits = value.toString(10);
233
+ }
234
+ if (spec.precision !== undefined) {
235
+ if (spec.precision === 0 && value === 0) {
236
+ digits = "";
237
+ } else {
238
+ digits = digits.padStart(spec.precision, "0");
239
+ }
240
+ }
241
+ let prefix = "";
242
+ if (spec.flags.includes("#")) {
243
+ if (spec.specifier === "o" && !digits.startsWith("0")) {
244
+ prefix = "0";
245
+ } else if (spec.specifier === "x" && value !== 0) {
246
+ prefix = "0x";
247
+ } else if (spec.specifier === "X" && value !== 0) {
248
+ prefix = "0X";
249
+ }
250
+ }
251
+ return pad(sign + prefix + digits, spec, true);
252
+ }
253
+ function formatFloat(arg, spec) {
254
+ const value = floatFromArg(arg);
255
+ const precision = spec.precision ?? 6;
256
+ let formatted;
257
+ switch (spec.specifier) {
258
+ case "e":
259
+ case "E":
260
+ formatted = value.toExponential(precision);
261
+ break;
262
+ case "g":
263
+ case "G":
264
+ formatted = value.toPrecision(precision === 0 ? 1 : precision);
265
+ break;
266
+ default:
267
+ formatted = value.toFixed(precision);
268
+ break;
269
+ }
270
+ if (spec.specifier === "E" || spec.specifier === "G" || spec.specifier === "F") {
271
+ formatted = formatted.toUpperCase();
272
+ }
273
+ if (value >= 0 && spec.flags.includes("+")) {
274
+ formatted = `+${formatted}`;
275
+ } else if (value >= 0 && spec.flags.includes(" ")) {
276
+ formatted = ` ${formatted}`;
277
+ }
278
+ return pad(formatted, spec, true);
279
+ }
280
+ function formatString(value, spec) {
281
+ const truncated = spec.precision === undefined ? value : value.slice(0, spec.precision);
282
+ return pad(truncated, spec);
283
+ }
284
+ function renderConversion(spec, args, argIndex) {
285
+ const hasArg = argIndex < args.length;
286
+ const arg = hasArg ? args[argIndex] : "";
287
+ const nextArgIndex = hasArg ? argIndex + 1 : argIndex;
288
+ if (spec.specifier === "s") {
289
+ return {
290
+ output: formatString(arg, spec),
291
+ nextArgIndex,
292
+ consumedArg: hasArg,
293
+ stop: false
294
+ };
295
+ }
296
+ if (spec.specifier === "b") {
297
+ const expanded = expandPrintfEscapes(arg);
298
+ return {
299
+ output: formatString(expanded.text, spec),
300
+ nextArgIndex,
301
+ consumedArg: hasArg,
302
+ stop: expanded.stop
303
+ };
304
+ }
305
+ if (spec.specifier === "c") {
306
+ return {
307
+ output: formatString(arg.slice(0, 1), spec),
308
+ nextArgIndex,
309
+ consumedArg: hasArg,
310
+ stop: false
311
+ };
312
+ }
313
+ if (INTEGER_SPECIFIERS.has(spec.specifier)) {
314
+ return {
315
+ output: formatInteger(hasArg ? arg : "0", spec),
316
+ nextArgIndex,
317
+ consumedArg: hasArg,
318
+ stop: false
319
+ };
320
+ }
321
+ return {
322
+ output: formatFloat(hasArg ? arg : "0", spec),
323
+ nextArgIndex,
324
+ consumedArg: hasArg,
325
+ stop: false
326
+ };
327
+ }
328
+ function renderPass(format, args, startArgIndex) {
329
+ let output = "";
330
+ let argIndex = startArgIndex;
331
+ let consumedArgs = 0;
332
+ for (let i = 0;i < format.length; ) {
333
+ const char = format[i];
334
+ if (char === "\\") {
335
+ const escape = readEscape(format, i);
336
+ output += escape.text;
337
+ i = escape.nextIndex;
338
+ if (escape.stop) {
339
+ return { output, nextArgIndex: argIndex, consumedArgs, stop: true };
340
+ }
341
+ continue;
342
+ }
343
+ if (char !== "%") {
344
+ output += char;
345
+ i++;
346
+ continue;
347
+ }
348
+ if (format[i + 1] === "%") {
349
+ output += "%";
350
+ i += 2;
351
+ continue;
352
+ }
353
+ const parsed = parseConversion(format, i);
354
+ if (parsed.error || !parsed.spec) {
355
+ return {
356
+ output,
357
+ nextArgIndex: argIndex,
358
+ consumedArgs,
359
+ stop: false,
360
+ error: parsed.error ?? "invalid format"
361
+ };
362
+ }
363
+ const rendered = renderConversion(parsed.spec, args, argIndex);
364
+ output += rendered.output;
365
+ argIndex = rendered.nextArgIndex;
366
+ if (rendered.consumedArg) {
367
+ consumedArgs++;
368
+ }
369
+ i = parsed.nextIndex;
370
+ if (rendered.stop) {
371
+ return { output, nextArgIndex: argIndex, consumedArgs, stop: true };
372
+ }
373
+ }
374
+ return { output, nextArgIndex: argIndex, consumedArgs, stop: false };
375
+ }
376
+ function formatPrintf(format, args) {
377
+ let output = "";
378
+ let argIndex = 0;
379
+ let renderedAtLeastOnce = false;
380
+ while (!renderedAtLeastOnce || argIndex < args.length) {
381
+ const pass = renderPass(format, args, argIndex);
382
+ renderedAtLeastOnce = true;
383
+ output += pass.output;
384
+ argIndex = pass.nextArgIndex;
385
+ if (pass.error) {
386
+ return { output, error: pass.error };
387
+ }
388
+ if (pass.stop) {
389
+ return { output };
390
+ }
391
+ if (pass.consumedArgs === 0) {
392
+ break;
393
+ }
394
+ }
395
+ return { output };
396
+ }
397
+ var printf = async (ctx) => {
398
+ if (ctx.args.length === 0) {
399
+ await ctx.stderr.writeText(`printf: missing format operand
400
+ `);
401
+ return 1;
402
+ }
403
+ const [format, ...args] = ctx.args;
404
+ const result = formatPrintf(format, args);
405
+ if (result.output.length > 0) {
406
+ await ctx.stdout.writeText(result.output);
407
+ }
408
+ if (result.error) {
409
+ await ctx.stderr.writeText(`printf: ${result.error}
410
+ `);
411
+ return 1;
412
+ }
413
+ return 0;
414
+ };
415
+
416
+ //# debugId=E1A228909A799CE564756E2164756E21
@@ -0,0 +1,10 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/commands/printf/printf.ts"],
4
+ "sourcesContent": [
5
+ "import type { Command } from \"../../types.cjs\";\n\ninterface EscapeResult {\n text: string;\n nextIndex: number;\n stop: boolean;\n}\n\ninterface FormatResult {\n output: string;\n error?: string;\n}\n\ninterface ConversionSpec {\n flags: string;\n width?: number;\n precision?: number;\n specifier: string;\n}\n\ninterface RenderPassResult {\n output: string;\n nextArgIndex: number;\n consumedArgs: number;\n stop: boolean;\n error?: string;\n}\n\nconst INTEGER_SPECIFIERS = new Set([\"d\", \"i\", \"u\", \"o\", \"x\", \"X\"]);\nconst FLOAT_SPECIFIERS = new Set([\"f\", \"F\", \"e\", \"E\", \"g\", \"G\"]);\nconst STRING_SPECIFIERS = new Set([\"s\", \"b\", \"c\"]);\nconst LENGTH_MODIFIERS = new Set([\"h\", \"l\", \"L\", \"j\", \"z\", \"t\"]);\n\nfunction isOctalDigit(char: string | undefined): boolean {\n return char !== undefined && char >= \"0\" && char <= \"7\";\n}\n\nfunction isDigit(char: string | undefined): boolean {\n return char !== undefined && char >= \"0\" && char <= \"9\";\n}\n\nfunction readEscape(input: string, index: number): EscapeResult {\n if (index + 1 >= input.length) {\n return { text: \"\\\\\", nextIndex: index + 1, stop: false };\n }\n\n const char = input[index + 1]!;\n\n if (char === \"c\") {\n return { text: \"\", nextIndex: index + 2, stop: true };\n }\n\n if (isOctalDigit(char)) {\n let digits = \"\";\n let nextIndex = index + 1;\n\n if (input[nextIndex] === \"0\") {\n nextIndex++;\n }\n\n while (digits.length < 3 && isOctalDigit(input[nextIndex])) {\n digits += input[nextIndex]!;\n nextIndex++;\n }\n\n const codePoint = digits === \"\" ? 0 : Number.parseInt(digits, 8);\n return { text: String.fromCharCode(codePoint), nextIndex, stop: false };\n }\n\n if (char === \"x\") {\n let digits = \"\";\n let nextIndex = index + 2;\n\n while (digits.length < 2 && nextIndex < input.length && /[0-9a-fA-F]/.test(input[nextIndex]!)) {\n digits += input[nextIndex]!;\n nextIndex++;\n }\n\n if (digits.length > 0) {\n return { text: String.fromCharCode(Number.parseInt(digits, 16)), nextIndex, stop: false };\n }\n }\n\n switch (char) {\n case \"a\":\n return { text: \"\\x07\", nextIndex: index + 2, stop: false };\n case \"b\":\n return { text: \"\\b\", nextIndex: index + 2, stop: false };\n case \"f\":\n return { text: \"\\f\", nextIndex: index + 2, stop: false };\n case \"n\":\n return { text: \"\\n\", nextIndex: index + 2, stop: false };\n case \"r\":\n return { text: \"\\r\", nextIndex: index + 2, stop: false };\n case \"t\":\n return { text: \"\\t\", nextIndex: index + 2, stop: false };\n case \"v\":\n return { text: \"\\v\", nextIndex: index + 2, stop: false };\n case \"\\\\\":\n return { text: \"\\\\\", nextIndex: index + 2, stop: false };\n default:\n return { text: `\\\\${char}`, nextIndex: index + 2, stop: false };\n }\n}\n\nfunction expandPrintfEscapes(input: string): { text: string; stop: boolean } {\n let text = \"\";\n\n for (let i = 0; i < input.length;) {\n if (input[i] !== \"\\\\\") {\n text += input[i]!;\n i++;\n continue;\n }\n\n const escape = readEscape(input, i);\n text += escape.text;\n i = escape.nextIndex;\n\n if (escape.stop) {\n return { text, stop: true };\n }\n }\n\n return { text, stop: false };\n}\n\nfunction readNumber(input: string, index: number): { value?: number; nextIndex: number } {\n let digits = \"\";\n let nextIndex = index;\n\n while (isDigit(input[nextIndex])) {\n digits += input[nextIndex]!;\n nextIndex++;\n }\n\n return {\n value: digits === \"\" ? undefined : Number.parseInt(digits, 10),\n nextIndex,\n };\n}\n\nfunction parseConversion(format: string, index: number): { spec?: ConversionSpec; nextIndex: number; error?: string } {\n let nextIndex = index + 1;\n let flags = \"\";\n\n while (true) {\n const flag = format[nextIndex];\n if (flag === undefined || !\"-+ #0\".includes(flag)) {\n break;\n }\n flags += flag;\n nextIndex++;\n }\n\n const widthResult = readNumber(format, nextIndex);\n const width = widthResult.value;\n nextIndex = widthResult.nextIndex;\n\n let precision: number | undefined;\n if (format[nextIndex] === \".\") {\n const precisionResult = readNumber(format, nextIndex + 1);\n precision = precisionResult.value ?? 0;\n nextIndex = precisionResult.nextIndex;\n }\n\n if (LENGTH_MODIFIERS.has(format[nextIndex] ?? \"\")) {\n const modifier = format[nextIndex]!;\n nextIndex++;\n if ((modifier === \"h\" && format[nextIndex] === \"h\") || (modifier === \"l\" && format[nextIndex] === \"l\")) {\n nextIndex++;\n }\n }\n\n const specifier = format[nextIndex];\n if (specifier === undefined) {\n return { nextIndex, error: \"missing format character\" };\n }\n\n if (\n !INTEGER_SPECIFIERS.has(specifier) &&\n !FLOAT_SPECIFIERS.has(specifier) &&\n !STRING_SPECIFIERS.has(specifier)\n ) {\n return { nextIndex: nextIndex + 1, error: `invalid format character '${specifier}'` };\n }\n\n return {\n spec: { flags, width, precision, specifier },\n nextIndex: nextIndex + 1,\n };\n}\n\nfunction pad(value: string, spec: ConversionSpec, numeric = false): string {\n const width = spec.width ?? 0;\n if (value.length >= width) {\n return value;\n }\n\n const leftAlign = spec.flags.includes(\"-\");\n const useZeroPad = numeric && spec.flags.includes(\"0\") && !leftAlign && spec.precision === undefined;\n const padChar = useZeroPad ? \"0\" : \" \";\n const padding = padChar.repeat(width - value.length);\n\n if (leftAlign) {\n return value + padding;\n }\n\n if (useZeroPad && (value.startsWith(\"-\") || value.startsWith(\"+\") || value.startsWith(\" \"))) {\n return value[0]! + padding + value.slice(1);\n }\n\n if (useZeroPad && (value.startsWith(\"0x\") || value.startsWith(\"0X\"))) {\n return value.slice(0, 2) + padding + value.slice(2);\n }\n\n return padding + value;\n}\n\nfunction integerFromArg(arg: string): number {\n const trimmed = arg.trim();\n if (/^[+-]?0[xX][0-9a-fA-F]+$/.test(trimmed)) {\n const sign = trimmed.startsWith(\"-\") ? -1 : 1;\n return sign * Number.parseInt(trimmed.replace(/^[+-]?0[xX]/, \"\"), 16);\n }\n\n const parsed = Number.parseInt(trimmed, 10);\n return Number.isNaN(parsed) ? 0 : parsed;\n}\n\nfunction floatFromArg(arg: string): number {\n const parsed = Number.parseFloat(arg.trim());\n return Number.isNaN(parsed) ? 0 : parsed;\n}\n\nfunction formatInteger(arg: string, spec: ConversionSpec): string {\n const originalValue = Math.trunc(integerFromArg(arg));\n const unsignedValue = originalValue < 0 ? originalValue >>> 0 : originalValue;\n let value = spec.specifier === \"u\" || spec.specifier === \"o\" || spec.specifier === \"x\" || spec.specifier === \"X\"\n ? unsignedValue\n : originalValue;\n\n let sign = \"\";\n if ((spec.specifier === \"d\" || spec.specifier === \"i\") && value < 0) {\n sign = \"-\";\n value = Math.abs(value);\n } else if ((spec.specifier === \"d\" || spec.specifier === \"i\") && spec.flags.includes(\"+\")) {\n sign = \"+\";\n } else if ((spec.specifier === \"d\" || spec.specifier === \"i\") && spec.flags.includes(\" \")) {\n sign = \" \";\n }\n\n let digits: string;\n if (spec.specifier === \"o\") {\n digits = value.toString(8);\n } else if (spec.specifier === \"x\" || spec.specifier === \"X\") {\n digits = value.toString(16);\n if (spec.specifier === \"X\") {\n digits = digits.toUpperCase();\n }\n } else {\n digits = value.toString(10);\n }\n\n if (spec.precision !== undefined) {\n if (spec.precision === 0 && value === 0) {\n digits = \"\";\n } else {\n digits = digits.padStart(spec.precision, \"0\");\n }\n }\n\n let prefix = \"\";\n if (spec.flags.includes(\"#\")) {\n if (spec.specifier === \"o\" && !digits.startsWith(\"0\")) {\n prefix = \"0\";\n } else if (spec.specifier === \"x\" && value !== 0) {\n prefix = \"0x\";\n } else if (spec.specifier === \"X\" && value !== 0) {\n prefix = \"0X\";\n }\n }\n\n return pad(sign + prefix + digits, spec, true);\n}\n\nfunction formatFloat(arg: string, spec: ConversionSpec): string {\n const value = floatFromArg(arg);\n const precision = spec.precision ?? 6;\n let formatted: string;\n\n switch (spec.specifier) {\n case \"e\":\n case \"E\":\n formatted = value.toExponential(precision);\n break;\n case \"g\":\n case \"G\":\n formatted = value.toPrecision(precision === 0 ? 1 : precision);\n break;\n default:\n formatted = value.toFixed(precision);\n break;\n }\n\n if (spec.specifier === \"E\" || spec.specifier === \"G\" || spec.specifier === \"F\") {\n formatted = formatted.toUpperCase();\n }\n\n if (value >= 0 && spec.flags.includes(\"+\")) {\n formatted = `+${formatted}`;\n } else if (value >= 0 && spec.flags.includes(\" \")) {\n formatted = ` ${formatted}`;\n }\n\n return pad(formatted, spec, true);\n}\n\nfunction formatString(value: string, spec: ConversionSpec): string {\n const truncated = spec.precision === undefined ? value : value.slice(0, spec.precision);\n return pad(truncated, spec);\n}\n\nfunction renderConversion(\n spec: ConversionSpec,\n args: string[],\n argIndex: number\n): { output: string; nextArgIndex: number; consumedArg: boolean; stop: boolean } {\n const hasArg = argIndex < args.length;\n const arg = hasArg ? args[argIndex]! : \"\";\n const nextArgIndex = hasArg ? argIndex + 1 : argIndex;\n\n if (spec.specifier === \"s\") {\n return {\n output: formatString(arg, spec),\n nextArgIndex,\n consumedArg: hasArg,\n stop: false,\n };\n }\n\n if (spec.specifier === \"b\") {\n const expanded = expandPrintfEscapes(arg);\n return {\n output: formatString(expanded.text, spec),\n nextArgIndex,\n consumedArg: hasArg,\n stop: expanded.stop,\n };\n }\n\n if (spec.specifier === \"c\") {\n return {\n output: formatString(arg.slice(0, 1), spec),\n nextArgIndex,\n consumedArg: hasArg,\n stop: false,\n };\n }\n\n if (INTEGER_SPECIFIERS.has(spec.specifier)) {\n return {\n output: formatInteger(hasArg ? arg : \"0\", spec),\n nextArgIndex,\n consumedArg: hasArg,\n stop: false,\n };\n }\n\n return {\n output: formatFloat(hasArg ? arg : \"0\", spec),\n nextArgIndex,\n consumedArg: hasArg,\n stop: false,\n };\n}\n\nfunction renderPass(format: string, args: string[], startArgIndex: number): RenderPassResult {\n let output = \"\";\n let argIndex = startArgIndex;\n let consumedArgs = 0;\n\n for (let i = 0; i < format.length;) {\n const char = format[i]!;\n\n if (char === \"\\\\\") {\n const escape = readEscape(format, i);\n output += escape.text;\n i = escape.nextIndex;\n\n if (escape.stop) {\n return { output, nextArgIndex: argIndex, consumedArgs, stop: true };\n }\n continue;\n }\n\n if (char !== \"%\") {\n output += char;\n i++;\n continue;\n }\n\n if (format[i + 1] === \"%\") {\n output += \"%\";\n i += 2;\n continue;\n }\n\n const parsed = parseConversion(format, i);\n if (parsed.error || !parsed.spec) {\n return {\n output,\n nextArgIndex: argIndex,\n consumedArgs,\n stop: false,\n error: parsed.error ?? \"invalid format\",\n };\n }\n\n const rendered = renderConversion(parsed.spec, args, argIndex);\n output += rendered.output;\n argIndex = rendered.nextArgIndex;\n if (rendered.consumedArg) {\n consumedArgs++;\n }\n i = parsed.nextIndex;\n\n if (rendered.stop) {\n return { output, nextArgIndex: argIndex, consumedArgs, stop: true };\n }\n }\n\n return { output, nextArgIndex: argIndex, consumedArgs, stop: false };\n}\n\nfunction formatPrintf(format: string, args: string[]): FormatResult {\n let output = \"\";\n let argIndex = 0;\n let renderedAtLeastOnce = false;\n\n while (!renderedAtLeastOnce || argIndex < args.length) {\n const pass = renderPass(format, args, argIndex);\n renderedAtLeastOnce = true;\n output += pass.output;\n argIndex = pass.nextArgIndex;\n\n if (pass.error) {\n return { output, error: pass.error };\n }\n\n if (pass.stop) {\n return { output };\n }\n\n if (pass.consumedArgs === 0) {\n break;\n }\n }\n\n return { output };\n}\n\nexport const printf: Command = async (ctx) => {\n if (ctx.args.length === 0) {\n await ctx.stderr.writeText(\"printf: missing format operand\\n\");\n return 1;\n }\n\n const [format, ...args] = ctx.args;\n const result = formatPrintf(format!, args);\n\n if (result.output.length > 0) {\n await ctx.stdout.writeText(result.output);\n }\n\n if (result.error) {\n await ctx.stderr.writeText(`printf: ${result.error}\\n`);\n return 1;\n }\n\n return 0;\n};\n"
6
+ ],
7
+ "mappings": "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",
8
+ "debugId": "E1A228909A799CE564756E2164756E21",
9
+ "names": []
10
+ }
@@ -0,0 +1,134 @@
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/sh/sh.ts
40
+ var exports_sh = {};
41
+ __export(exports_sh, {
42
+ source: () => source,
43
+ sh: () => sh,
44
+ evalCmd: () => evalCmd,
45
+ dot: () => dot
46
+ });
47
+ module.exports = __toCommonJS(exports_sh);
48
+ async function readShellFile(fs, cwd, pathName, stderr) {
49
+ const path = fs.resolve(cwd, pathName);
50
+ if (!await fs.exists(path)) {
51
+ await stderr.writeText(`sh: ${pathName}: No such file or directory
52
+ `);
53
+ return { ok: false, exitCode: 127 };
54
+ }
55
+ const stat = await fs.stat(path);
56
+ if (stat.isDirectory()) {
57
+ await stderr.writeText(`sh: ${pathName}: is a directory
58
+ `);
59
+ return { ok: false, exitCode: 126 };
60
+ }
61
+ if (!stat.isFile()) {
62
+ await stderr.writeText(`sh: ${pathName}: not a file
63
+ `);
64
+ return { ok: false, exitCode: 126 };
65
+ }
66
+ try {
67
+ return { ok: true, source: await fs.readFile(path, "utf-8") };
68
+ } catch (err) {
69
+ const message = err instanceof Error ? err.message : String(err);
70
+ await stderr.writeText(`sh: ${pathName}: ${message}
71
+ `);
72
+ return { ok: false, exitCode: 126 };
73
+ }
74
+ }
75
+ var sh = async (ctx) => {
76
+ if (!ctx.shell) {
77
+ await ctx.stderr.writeText(`sh: shell evaluation not supported
78
+ `);
79
+ return 1;
80
+ }
81
+ if (ctx.args.length === 0) {
82
+ return ctx.shell.runShell(await ctx.stdin.text(), { argv0: "sh", args: [] });
83
+ }
84
+ const first = ctx.args[0];
85
+ if (first === "-c") {
86
+ const source = ctx.args[1];
87
+ if (source === undefined) {
88
+ await ctx.stderr.writeText(`sh: -c requires an argument
89
+ `);
90
+ return 2;
91
+ }
92
+ const argv0 = ctx.args[2] ?? "sh";
93
+ const args = ctx.args[2] === undefined ? [] : ctx.args.slice(3);
94
+ return ctx.shell.runShell(source, { argv0, args });
95
+ }
96
+ if (first.startsWith("-")) {
97
+ await ctx.stderr.writeText(`sh: unsupported option: ${first}
98
+ `);
99
+ return 2;
100
+ }
101
+ const loaded = await readShellFile(ctx.fs, ctx.cwd, first, ctx.stderr);
102
+ if (!loaded.ok) {
103
+ return loaded.exitCode;
104
+ }
105
+ return ctx.shell.runShell(loaded.source, { argv0: first, args: ctx.args.slice(1) });
106
+ };
107
+ var evalCmd = async (ctx) => {
108
+ if (!ctx.shell) {
109
+ await ctx.stderr.writeText(`eval: shell evaluation not supported
110
+ `);
111
+ return 1;
112
+ }
113
+ if (ctx.args.length === 0) {
114
+ return 0;
115
+ }
116
+ return ctx.shell.eval(ctx.args.join(" "));
117
+ };
118
+ var source = async (ctx) => {
119
+ if (!ctx.shell) {
120
+ await ctx.stderr.writeText(`source: shell evaluation not supported
121
+ `);
122
+ return 1;
123
+ }
124
+ const path = ctx.args[0];
125
+ if (path === undefined) {
126
+ await ctx.stderr.writeText(`source: filename argument required
127
+ `);
128
+ return 2;
129
+ }
130
+ return ctx.shell.source(path, ctx.args.slice(1));
131
+ };
132
+ var dot = source;
133
+
134
+ //# debugId=21C185C9E381C0F564756E2164756E21
@@ -0,0 +1,10 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/commands/sh/sh.ts"],
4
+ "sourcesContent": [
5
+ "import type { Command, Stderr, VirtualFS } from \"../../types.cjs\";\n\nasync function readShellFile(\n fs: VirtualFS,\n cwd: string,\n pathName: string,\n stderr: Stderr\n): Promise<{ ok: true; source: string } | { ok: false; exitCode: number }> {\n const path = fs.resolve(cwd, pathName);\n\n if (!(await fs.exists(path))) {\n await stderr.writeText(`sh: ${pathName}: No such file or directory\\n`);\n return { ok: false, exitCode: 127 };\n }\n\n const stat = await fs.stat(path);\n if (stat.isDirectory()) {\n await stderr.writeText(`sh: ${pathName}: is a directory\\n`);\n return { ok: false, exitCode: 126 };\n }\n if (!stat.isFile()) {\n await stderr.writeText(`sh: ${pathName}: not a file\\n`);\n return { ok: false, exitCode: 126 };\n }\n\n try {\n return { ok: true, source: await fs.readFile(path, \"utf-8\") };\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n await stderr.writeText(`sh: ${pathName}: ${message}\\n`);\n return { ok: false, exitCode: 126 };\n }\n}\n\nexport const sh: Command = async (ctx) => {\n if (!ctx.shell) {\n await ctx.stderr.writeText(\"sh: shell evaluation not supported\\n\");\n return 1;\n }\n\n if (ctx.args.length === 0) {\n return ctx.shell.runShell(await ctx.stdin.text(), { argv0: \"sh\", args: [] });\n }\n\n const first = ctx.args[0]!;\n if (first === \"-c\") {\n const source = ctx.args[1];\n if (source === undefined) {\n await ctx.stderr.writeText(\"sh: -c requires an argument\\n\");\n return 2;\n }\n\n const argv0 = ctx.args[2] ?? \"sh\";\n const args = ctx.args[2] === undefined ? [] : ctx.args.slice(3);\n return ctx.shell.runShell(source, { argv0, args });\n }\n\n if (first.startsWith(\"-\")) {\n await ctx.stderr.writeText(`sh: unsupported option: ${first}\\n`);\n return 2;\n }\n\n const loaded = await readShellFile(ctx.fs, ctx.cwd, first, ctx.stderr);\n if (!loaded.ok) {\n return loaded.exitCode;\n }\n\n return ctx.shell.runShell(loaded.source, { argv0: first, args: ctx.args.slice(1) });\n};\n\nexport const evalCmd: Command = async (ctx) => {\n if (!ctx.shell) {\n await ctx.stderr.writeText(\"eval: shell evaluation not supported\\n\");\n return 1;\n }\n if (ctx.args.length === 0) {\n return 0;\n }\n return ctx.shell.eval(ctx.args.join(\" \"));\n};\n\nexport const source: Command = async (ctx) => {\n if (!ctx.shell) {\n await ctx.stderr.writeText(\"source: shell evaluation not supported\\n\");\n return 1;\n }\n const path = ctx.args[0];\n if (path === undefined) {\n await ctx.stderr.writeText(\"source: filename argument required\\n\");\n return 2;\n }\n return ctx.shell.source(path, ctx.args.slice(1));\n};\n\nexport const dot = source;\n"
6
+ ],
7
+ "mappings": "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",
8
+ "debugId": "21C185C9E381C0F564756E2164756E21",
9
+ "names": []
10
+ }
@@ -79,6 +79,7 @@ __export(exports_src, {
79
79
  LexError: () => import_errors.LexError,
80
80
  Interpreter: () => import_interpreter.Interpreter,
81
81
  FileSystem: () => import_fs2.FileSystem,
82
+ ExitException: () => import_interpreter.ExitException,
82
83
  ContinueException: () => import_interpreter.ContinueException,
83
84
  BreakException: () => import_interpreter.BreakException
84
85
  });
@@ -98,4 +99,4 @@ var import_io2 = require("./io/index.cjs");
98
99
  var import_utils = require("./utils/index.cjs");
99
100
  var import_vcs = require("./vcs/index.cjs");
100
101
 
101
- //# debugId=188D4F3252D1BB8C64756E2164756E21
102
+ //# debugId=A1C14CC7E153FA4864756E2164756E21
@@ -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 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"
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 ShellCommandApi,\n ShellRunOptions,\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, ExitException } from \"./interpreter/index.cjs\";\n\n// Filesystem\nexport { createVirtualFS } from \"./fs/index.cjs\";\nexport {\n FileSystem,\n ReadOnlyFileSystem,\n WebFileSystem,\n createWebUnderlyingFS,\n type PathOps,\n type Permission,\n type PermissionRules,\n type UnderlyingFS,\n} from \"./fs/index.cjs\";\n\n// I/O\nexport { createStdin, StdinImpl } from \"./io/index.cjs\";\nexport { createStdout, createStderr, createPipe, OutputCollectorImpl, PipeBuffer } from \"./io/index.cjs\";\n\n// Utilities\nexport { escape, escapeForInterpolation, globVirtualFS } from \"./utils/index.cjs\";\nexport type { GlobVirtualFS, GlobOptions } from \"./utils/index.cjs\";\n\n// Version Control\nexport { VersionControlSystem } from \"./vcs/index.cjs\";\nexport type {\n VCSConfig,\n VCSAttributeRule,\n VCSResolvedAttributes,\n VCSDiffMode,\n VCSPatchSuppressionReason,\n Revision,\n DiffEntry,\n TreeManifest,\n TreeEntry,\n FileEntry,\n DirectoryEntry,\n VCSIndexEntry,\n VCSIndexFile,\n CommitOptions,\n CheckoutOptions,\n LogOptions,\n LogEntry,\n BranchInfo,\n} from \"./vcs/index.cjs\";\n"
6
6
  ],
7
- "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACuD,IAAvD;AACuD,IAAvD;AAiB2B,IAA3B;AAGiD,IAAjD;AAG0C,IAA1C;AAI8B,IAA9B;AAkCO,IAZP;AAewF,IAAxF;AAGgC,IAAhC;AAUO,IATP;AAYuC,IAAvC;AACwF,IAAxF;AAG8D,IAA9D;AAIqC,IAArC;",
8
- "debugId": "188D4F3252D1BB8C64756E2164756E21",
7
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACuD,IAAvD;AACuD,IAAvD;AAmB2B,IAA3B;AAGiD,IAAjD;AAG0C,IAA1C;AAI8B,IAA9B;AAkCO,IAZP;AAeuG,IAAvG;AAGgC,IAAhC;AAUO,IATP;AAYuC,IAAvC;AACwF,IAAxF;AAG8D,IAA9D;AAIqC,IAArC;",
8
+ "debugId": "A1C14CC7E153FA4864756E2164756E21",
9
9
  "names": []
10
10
  }