shell-dsl 0.0.39 → 0.0.41

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 (85) hide show
  1. package/README.md +183 -3
  2. package/dist/cjs/package.json +1 -1
  3. package/dist/cjs/src/commands/exit/exit.cjs +84 -0
  4. package/dist/cjs/src/commands/exit/exit.cjs.map +10 -0
  5. package/dist/cjs/src/commands/index.cjs +18 -2
  6. package/dist/cjs/src/commands/index.cjs.map +3 -3
  7. package/dist/cjs/src/commands/sh/sh.cjs +134 -0
  8. package/dist/cjs/src/commands/sh/sh.cjs.map +10 -0
  9. package/dist/cjs/src/index.cjs +9 -1
  10. package/dist/cjs/src/index.cjs.map +3 -3
  11. package/dist/cjs/src/input-analysis.cjs +154 -0
  12. package/dist/cjs/src/input-analysis.cjs.map +10 -0
  13. package/dist/cjs/src/interpreter/context.cjs +6 -1
  14. package/dist/cjs/src/interpreter/context.cjs.map +3 -3
  15. package/dist/cjs/src/interpreter/index.cjs +2 -1
  16. package/dist/cjs/src/interpreter/index.cjs.map +3 -3
  17. package/dist/cjs/src/interpreter/interpreter.cjs +434 -82
  18. package/dist/cjs/src/interpreter/interpreter.cjs.map +3 -3
  19. package/dist/cjs/src/io/async-queue.cjs +105 -0
  20. package/dist/cjs/src/io/async-queue.cjs.map +10 -0
  21. package/dist/cjs/src/io/index.cjs +4 -1
  22. package/dist/cjs/src/io/index.cjs.map +3 -3
  23. package/dist/cjs/src/io/input-controller.cjs +113 -0
  24. package/dist/cjs/src/io/input-controller.cjs.map +10 -0
  25. package/dist/cjs/src/io/stdout.cjs +9 -6
  26. package/dist/cjs/src/io/stdout.cjs.map +3 -3
  27. package/dist/cjs/src/lexer/lexer.cjs +13 -1
  28. package/dist/cjs/src/lexer/lexer.cjs.map +3 -3
  29. package/dist/cjs/src/parser/parser.cjs +11 -1
  30. package/dist/cjs/src/parser/parser.cjs.map +3 -3
  31. package/dist/cjs/src/shell-dsl.cjs +13 -5
  32. package/dist/cjs/src/shell-dsl.cjs.map +3 -3
  33. package/dist/cjs/src/shell-session.cjs +128 -0
  34. package/dist/cjs/src/shell-session.cjs.map +10 -0
  35. package/dist/cjs/src/types.cjs.map +2 -2
  36. package/dist/mjs/package.json +1 -1
  37. package/dist/mjs/src/commands/exit/exit.mjs +44 -0
  38. package/dist/mjs/src/commands/exit/exit.mjs.map +10 -0
  39. package/dist/mjs/src/commands/index.mjs +18 -2
  40. package/dist/mjs/src/commands/index.mjs.map +3 -3
  41. package/dist/mjs/src/commands/sh/sh.mjs +94 -0
  42. package/dist/mjs/src/commands/sh/sh.mjs.map +10 -0
  43. package/dist/mjs/src/index.mjs +19 -3
  44. package/dist/mjs/src/index.mjs.map +3 -3
  45. package/dist/mjs/src/input-analysis.mjs +114 -0
  46. package/dist/mjs/src/input-analysis.mjs.map +10 -0
  47. package/dist/mjs/src/interpreter/context.mjs +6 -1
  48. package/dist/mjs/src/interpreter/context.mjs.map +3 -3
  49. package/dist/mjs/src/interpreter/index.mjs +3 -2
  50. package/dist/mjs/src/interpreter/index.mjs.map +2 -2
  51. package/dist/mjs/src/interpreter/interpreter.mjs +434 -82
  52. package/dist/mjs/src/interpreter/interpreter.mjs.map +3 -3
  53. package/dist/mjs/src/io/async-queue.mjs +64 -0
  54. package/dist/mjs/src/io/async-queue.mjs.map +10 -0
  55. package/dist/mjs/src/io/index.mjs +4 -1
  56. package/dist/mjs/src/io/index.mjs.map +3 -3
  57. package/dist/mjs/src/io/input-controller.mjs +72 -0
  58. package/dist/mjs/src/io/input-controller.mjs.map +10 -0
  59. package/dist/mjs/src/io/stdout.mjs +9 -6
  60. package/dist/mjs/src/io/stdout.mjs.map +3 -3
  61. package/dist/mjs/src/lexer/lexer.mjs +13 -1
  62. package/dist/mjs/src/lexer/lexer.mjs.map +3 -3
  63. package/dist/mjs/src/parser/parser.mjs +11 -1
  64. package/dist/mjs/src/parser/parser.mjs.map +3 -3
  65. package/dist/mjs/src/shell-dsl.mjs +13 -5
  66. package/dist/mjs/src/shell-dsl.mjs.map +3 -3
  67. package/dist/mjs/src/shell-session.mjs +88 -0
  68. package/dist/mjs/src/shell-session.mjs.map +10 -0
  69. package/dist/mjs/src/types.mjs.map +2 -2
  70. package/dist/types/src/commands/exit/exit.d.ts +2 -0
  71. package/dist/types/src/commands/index.d.ts +2 -0
  72. package/dist/types/src/commands/sh/sh.d.ts +5 -0
  73. package/dist/types/src/index.d.ts +6 -3
  74. package/dist/types/src/input-analysis.d.ts +14 -0
  75. package/dist/types/src/interpreter/context.d.ts +4 -1
  76. package/dist/types/src/interpreter/index.d.ts +1 -1
  77. package/dist/types/src/interpreter/interpreter.d.ts +36 -1
  78. package/dist/types/src/io/async-queue.d.ts +12 -0
  79. package/dist/types/src/io/index.d.ts +1 -0
  80. package/dist/types/src/io/input-controller.d.ts +15 -0
  81. package/dist/types/src/io/stdout.d.ts +4 -3
  82. package/dist/types/src/shell-dsl.d.ts +2 -0
  83. package/dist/types/src/shell-session.d.ts +23 -0
  84. package/dist/types/src/types.d.ts +52 -0
  85. package/package.json +1 -1
@@ -0,0 +1,114 @@
1
+ // src/input-analysis.ts
2
+ import { Lexer } from "./lexer/lexer.mjs";
3
+ import { Parser } from "./parser/parser.mjs";
4
+ import { LexError, ParseError } from "./errors.mjs";
5
+ function analyzeInput(source) {
6
+ const heredoc = findIncompleteHeredoc(source);
7
+ if (heredoc) {
8
+ return { kind: "incomplete", reason: "heredoc" };
9
+ }
10
+ let tokens;
11
+ try {
12
+ tokens = new Lexer(source, { preserveNewlines: true }).tokenize();
13
+ } catch (err) {
14
+ if (err instanceof LexError && err.message.toLowerCase().includes("unterminated")) {
15
+ return { kind: "incomplete", reason: "quote" };
16
+ }
17
+ return { kind: "invalid", error: err instanceof Error ? err : new Error(String(err)) };
18
+ }
19
+ if (tokens.every((token) => token.type === "newline" || token.type === "eof")) {
20
+ return { kind: "complete", ast: emptyCommandAst() };
21
+ }
22
+ if (hasTrailingPipeline(tokens)) {
23
+ return { kind: "incomplete", reason: "pipeline" };
24
+ }
25
+ try {
26
+ const ast = new Parser(tokens).parse();
27
+ return { kind: "complete", ast };
28
+ } catch (err) {
29
+ if (hasOpenCompound(tokens)) {
30
+ return { kind: "incomplete", reason: "compound" };
31
+ }
32
+ if (err instanceof ParseError && isIncompleteParseMessage(err.message)) {
33
+ return { kind: "incomplete", reason: "compound" };
34
+ }
35
+ return { kind: "invalid", error: err instanceof Error ? err : new Error(String(err)) };
36
+ }
37
+ }
38
+ function emptyCommandAst() {
39
+ return {
40
+ type: "command",
41
+ name: { type: "word", parts: [] },
42
+ args: [],
43
+ redirects: [],
44
+ assignments: []
45
+ };
46
+ }
47
+ function hasTrailingPipeline(tokens) {
48
+ let i = tokens.length - 1;
49
+ while (i >= 0 && (tokens[i].type === "eof" || tokens[i].type === "newline")) {
50
+ i--;
51
+ }
52
+ return i >= 0 && tokens[i].type === "pipe";
53
+ }
54
+ function hasOpenCompound(tokens) {
55
+ const stack = [];
56
+ for (const token of tokens) {
57
+ if (token.type !== "keyword") {
58
+ continue;
59
+ }
60
+ switch (token.value) {
61
+ case "if":
62
+ stack.push("fi");
63
+ break;
64
+ case "for":
65
+ case "while":
66
+ case "until":
67
+ stack.push("done");
68
+ break;
69
+ case "case":
70
+ stack.push("esac");
71
+ break;
72
+ case "fi":
73
+ case "done":
74
+ case "esac":
75
+ if (stack[stack.length - 1] === token.value) {
76
+ stack.pop();
77
+ }
78
+ break;
79
+ }
80
+ }
81
+ return stack.length > 0;
82
+ }
83
+ function isIncompleteParseMessage(message) {
84
+ return message.includes("Expected 'fi'") || message.includes("Expected 'done'") || message.includes("Expected 'esac'") || message.includes("Expected 'then'") || message.includes("Expected 'do'");
85
+ }
86
+ function findIncompleteHeredoc(source) {
87
+ const lines = source.split(/\n/);
88
+ for (let i = 0;i < lines.length; i++) {
89
+ const match = lines[i].match(/<<-?\s*(?:"([^"]+)"|'([^']+)'|([A-Za-z_][A-Za-z0-9_]*|\S+))/);
90
+ if (!match) {
91
+ continue;
92
+ }
93
+ const delimiter = match[1] ?? match[2] ?? match[3];
94
+ if (!delimiter) {
95
+ continue;
96
+ }
97
+ let found = false;
98
+ for (let j = i + 1;j < lines.length; j++) {
99
+ if (lines[j] === delimiter || lines[j].replace(/^\t+/, "") === delimiter) {
100
+ found = true;
101
+ break;
102
+ }
103
+ }
104
+ if (!found) {
105
+ return true;
106
+ }
107
+ }
108
+ return false;
109
+ }
110
+ export {
111
+ analyzeInput
112
+ };
113
+
114
+ //# debugId=840AA9CEDC5E108D64756E2164756E21
@@ -0,0 +1,10 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/input-analysis.ts"],
4
+ "sourcesContent": [
5
+ "import type { ASTNode } from \"./parser/ast.mjs\";\nimport type { Token, KeywordValue } from \"./lexer/tokens.mjs\";\nimport { Lexer } from \"./lexer/lexer.mjs\";\nimport { Parser } from \"./parser/parser.mjs\";\nimport { LexError, ParseError } from \"./errors.mjs\";\n\nexport type InputIncompleteReason = \"quote\" | \"heredoc\" | \"compound\" | \"pipeline\";\n\nexport type InputAnalysis =\n | { kind: \"complete\"; ast: ASTNode }\n | { kind: \"incomplete\"; reason: InputIncompleteReason }\n | { kind: \"invalid\"; error: LexError | ParseError | Error };\n\nexport function analyzeInput(source: string): InputAnalysis {\n const heredoc = findIncompleteHeredoc(source);\n if (heredoc) {\n return { kind: \"incomplete\", reason: \"heredoc\" };\n }\n\n let tokens: Token[];\n try {\n tokens = new Lexer(source, { preserveNewlines: true }).tokenize();\n } catch (err) {\n if (err instanceof LexError && err.message.toLowerCase().includes(\"unterminated\")) {\n return { kind: \"incomplete\", reason: \"quote\" };\n }\n return { kind: \"invalid\", error: err instanceof Error ? err : new Error(String(err)) };\n }\n\n if (tokens.every((token) => token.type === \"newline\" || token.type === \"eof\")) {\n return { kind: \"complete\", ast: emptyCommandAst() };\n }\n\n if (hasTrailingPipeline(tokens)) {\n return { kind: \"incomplete\", reason: \"pipeline\" };\n }\n\n try {\n const ast = new Parser(tokens).parse();\n return { kind: \"complete\", ast };\n } catch (err) {\n if (hasOpenCompound(tokens)) {\n return { kind: \"incomplete\", reason: \"compound\" };\n }\n if (err instanceof ParseError && isIncompleteParseMessage(err.message)) {\n return { kind: \"incomplete\", reason: \"compound\" };\n }\n return { kind: \"invalid\", error: err instanceof Error ? err : new Error(String(err)) };\n }\n}\n\nfunction emptyCommandAst(): ASTNode {\n return {\n type: \"command\",\n name: { type: \"word\", parts: [] },\n args: [],\n redirects: [],\n assignments: [],\n };\n}\n\nfunction hasTrailingPipeline(tokens: Token[]): boolean {\n let i = tokens.length - 1;\n while (i >= 0 && (tokens[i]!.type === \"eof\" || tokens[i]!.type === \"newline\")) {\n i--;\n }\n return i >= 0 && tokens[i]!.type === \"pipe\";\n}\n\nfunction hasOpenCompound(tokens: Token[]): boolean {\n const stack: KeywordValue[] = [];\n\n for (const token of tokens) {\n if (token.type !== \"keyword\") {\n continue;\n }\n\n switch (token.value) {\n case \"if\":\n stack.push(\"fi\");\n break;\n case \"for\":\n case \"while\":\n case \"until\":\n stack.push(\"done\");\n break;\n case \"case\":\n stack.push(\"esac\");\n break;\n case \"fi\":\n case \"done\":\n case \"esac\":\n if (stack[stack.length - 1] === token.value) {\n stack.pop();\n }\n break;\n }\n }\n\n return stack.length > 0;\n}\n\nfunction isIncompleteParseMessage(message: string): boolean {\n return (\n message.includes(\"Expected 'fi'\") ||\n message.includes(\"Expected 'done'\") ||\n message.includes(\"Expected 'esac'\") ||\n message.includes(\"Expected 'then'\") ||\n message.includes(\"Expected 'do'\")\n );\n}\n\nfunction findIncompleteHeredoc(source: string): boolean {\n const lines = source.split(/\\n/);\n\n for (let i = 0; i < lines.length; i++) {\n const match = lines[i]!.match(/<<-?\\s*(?:\"([^\"]+)\"|'([^']+)'|([A-Za-z_][A-Za-z0-9_]*|\\S+))/);\n if (!match) {\n continue;\n }\n\n const delimiter = match[1] ?? match[2] ?? match[3];\n if (!delimiter) {\n continue;\n }\n\n let found = false;\n for (let j = i + 1; j < lines.length; j++) {\n if (lines[j] === delimiter || lines[j]!.replace(/^\\t+/, \"\") === delimiter) {\n found = true;\n break;\n }\n }\n if (!found) {\n return true;\n }\n }\n\n return false;\n}\n"
6
+ ],
7
+ "mappings": ";AAEA;AACA;AACA;AASO,SAAS,YAAY,CAAC,QAA+B;AAAA,EAC1D,MAAM,UAAU,sBAAsB,MAAM;AAAA,EAC5C,IAAI,SAAS;AAAA,IACX,OAAO,EAAE,MAAM,cAAc,QAAQ,UAAU;AAAA,EACjD;AAAA,EAEA,IAAI;AAAA,EACJ,IAAI;AAAA,IACF,SAAS,IAAI,MAAM,QAAQ,EAAE,kBAAkB,KAAK,CAAC,EAAE,SAAS;AAAA,IAChE,OAAO,KAAK;AAAA,IACZ,IAAI,eAAe,YAAY,IAAI,QAAQ,YAAY,EAAE,SAAS,cAAc,GAAG;AAAA,MACjF,OAAO,EAAE,MAAM,cAAc,QAAQ,QAAQ;AAAA,IAC/C;AAAA,IACA,OAAO,EAAE,MAAM,WAAW,OAAO,eAAe,QAAQ,MAAM,IAAI,MAAM,OAAO,GAAG,CAAC,EAAE;AAAA;AAAA,EAGvF,IAAI,OAAO,MAAM,CAAC,UAAU,MAAM,SAAS,aAAa,MAAM,SAAS,KAAK,GAAG;AAAA,IAC7E,OAAO,EAAE,MAAM,YAAY,KAAK,gBAAgB,EAAE;AAAA,EACpD;AAAA,EAEA,IAAI,oBAAoB,MAAM,GAAG;AAAA,IAC/B,OAAO,EAAE,MAAM,cAAc,QAAQ,WAAW;AAAA,EAClD;AAAA,EAEA,IAAI;AAAA,IACF,MAAM,MAAM,IAAI,OAAO,MAAM,EAAE,MAAM;AAAA,IACrC,OAAO,EAAE,MAAM,YAAY,IAAI;AAAA,IAC/B,OAAO,KAAK;AAAA,IACZ,IAAI,gBAAgB,MAAM,GAAG;AAAA,MAC3B,OAAO,EAAE,MAAM,cAAc,QAAQ,WAAW;AAAA,IAClD;AAAA,IACA,IAAI,eAAe,cAAc,yBAAyB,IAAI,OAAO,GAAG;AAAA,MACtE,OAAO,EAAE,MAAM,cAAc,QAAQ,WAAW;AAAA,IAClD;AAAA,IACA,OAAO,EAAE,MAAM,WAAW,OAAO,eAAe,QAAQ,MAAM,IAAI,MAAM,OAAO,GAAG,CAAC,EAAE;AAAA;AAAA;AAIzF,SAAS,eAAe,GAAY;AAAA,EAClC,OAAO;AAAA,IACL,MAAM;AAAA,IACN,MAAM,EAAE,MAAM,QAAQ,OAAO,CAAC,EAAE;AAAA,IAChC,MAAM,CAAC;AAAA,IACP,WAAW,CAAC;AAAA,IACZ,aAAa,CAAC;AAAA,EAChB;AAAA;AAGF,SAAS,mBAAmB,CAAC,QAA0B;AAAA,EACrD,IAAI,IAAI,OAAO,SAAS;AAAA,EACxB,OAAO,KAAK,MAAM,OAAO,GAAI,SAAS,SAAS,OAAO,GAAI,SAAS,YAAY;AAAA,IAC7E;AAAA,EACF;AAAA,EACA,OAAO,KAAK,KAAK,OAAO,GAAI,SAAS;AAAA;AAGvC,SAAS,eAAe,CAAC,QAA0B;AAAA,EACjD,MAAM,QAAwB,CAAC;AAAA,EAE/B,WAAW,SAAS,QAAQ;AAAA,IAC1B,IAAI,MAAM,SAAS,WAAW;AAAA,MAC5B;AAAA,IACF;AAAA,IAEA,QAAQ,MAAM;AAAA,WACP;AAAA,QACH,MAAM,KAAK,IAAI;AAAA,QACf;AAAA,WACG;AAAA,WACA;AAAA,WACA;AAAA,QACH,MAAM,KAAK,MAAM;AAAA,QACjB;AAAA,WACG;AAAA,QACH,MAAM,KAAK,MAAM;AAAA,QACjB;AAAA,WACG;AAAA,WACA;AAAA,WACA;AAAA,QACH,IAAI,MAAM,MAAM,SAAS,OAAO,MAAM,OAAO;AAAA,UAC3C,MAAM,IAAI;AAAA,QACZ;AAAA,QACA;AAAA;AAAA,EAEN;AAAA,EAEA,OAAO,MAAM,SAAS;AAAA;AAGxB,SAAS,wBAAwB,CAAC,SAA0B;AAAA,EAC1D,OACE,QAAQ,SAAS,eAAe,KAChC,QAAQ,SAAS,iBAAiB,KAClC,QAAQ,SAAS,iBAAiB,KAClC,QAAQ,SAAS,iBAAiB,KAClC,QAAQ,SAAS,eAAe;AAAA;AAIpC,SAAS,qBAAqB,CAAC,QAAyB;AAAA,EACtD,MAAM,QAAQ,OAAO,MAAM,IAAI;AAAA,EAE/B,SAAS,IAAI,EAAG,IAAI,MAAM,QAAQ,KAAK;AAAA,IACrC,MAAM,QAAQ,MAAM,GAAI,MAAM,6DAA6D;AAAA,IAC3F,IAAI,CAAC,OAAO;AAAA,MACV;AAAA,IACF;AAAA,IAEA,MAAM,YAAY,MAAM,MAAM,MAAM,MAAM,MAAM;AAAA,IAChD,IAAI,CAAC,WAAW;AAAA,MACd;AAAA,IACF;AAAA,IAEA,IAAI,QAAQ;AAAA,IACZ,SAAS,IAAI,IAAI,EAAG,IAAI,MAAM,QAAQ,KAAK;AAAA,MACzC,IAAI,MAAM,OAAO,aAAa,MAAM,GAAI,QAAQ,QAAQ,EAAE,MAAM,WAAW;AAAA,QACzE,QAAQ;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAAA,IACA,IAAI,CAAC,OAAO;AAAA,MACV,OAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEA,OAAO;AAAA;",
8
+ "debugId": "840AA9CEDC5E108D64756E2164756E21",
9
+ "names": []
10
+ }
@@ -8,15 +8,20 @@ function createCommandContext(options) {
8
8
  fs: options.fs,
9
9
  cwd: options.cwd,
10
10
  env: options.env,
11
+ terminal: options.terminal,
12
+ signal: options.signal,
11
13
  setCwd: options.setCwd
12
14
  };
13
15
  if (options.exec) {
14
16
  ctx.exec = options.exec;
15
17
  }
18
+ if (options.shell) {
19
+ ctx.shell = options.shell;
20
+ }
16
21
  return ctx;
17
22
  }
18
23
  export {
19
24
  createCommandContext
20
25
  };
21
26
 
22
- //# debugId=5FC196A79A9EB9E864756E2164756E21
27
+ //# debugId=648BE3914FE77F1D64756E2164756E21
@@ -2,9 +2,9 @@
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/interpreter/context.ts"],
4
4
  "sourcesContent": [
5
- "import type { CommandContext, VirtualFS, Stdin, Stdout, Stderr, ExecResult } from \"../types.mjs\";\n\nexport interface ContextOptions {\n args: string[];\n stdin: Stdin;\n stdout: Stdout;\n stderr: Stderr;\n fs: VirtualFS;\n cwd: string;\n env: Record<string, string>;\n setCwd: (path: string) => void;\n exec?: (name: string, args: string[]) => Promise<ExecResult>;\n}\n\nexport function createCommandContext(options: ContextOptions): CommandContext {\n const ctx: CommandContext = {\n args: options.args,\n stdin: options.stdin,\n stdout: options.stdout,\n stderr: options.stderr,\n fs: options.fs,\n cwd: options.cwd,\n env: options.env,\n setCwd: options.setCwd,\n };\n if (options.exec) {\n ctx.exec = options.exec;\n }\n return ctx;\n}\n"
5
+ "import type {\n CommandContext,\n VirtualFS,\n Stdin,\n Stdout,\n Stderr,\n ExecResult,\n ShellCommandApi,\n TerminalInfo,\n} from \"../types.mjs\";\n\nexport interface ContextOptions {\n args: string[];\n stdin: Stdin;\n stdout: Stdout;\n stderr: Stderr;\n fs: VirtualFS;\n cwd: string;\n env: Record<string, string>;\n terminal: TerminalInfo;\n signal: AbortSignal;\n setCwd: (path: string) => void;\n exec?: (name: string, args: string[]) => Promise<ExecResult>;\n shell?: ShellCommandApi;\n}\n\nexport function createCommandContext(options: ContextOptions): CommandContext {\n const ctx: CommandContext = {\n args: options.args,\n stdin: options.stdin,\n stdout: options.stdout,\n stderr: options.stderr,\n fs: options.fs,\n cwd: options.cwd,\n env: options.env,\n terminal: options.terminal,\n signal: options.signal,\n setCwd: options.setCwd,\n };\n if (options.exec) {\n ctx.exec = options.exec;\n }\n if (options.shell) {\n ctx.shell = options.shell;\n }\n return ctx;\n}\n"
6
6
  ],
7
- "mappings": ";AAcO,SAAS,oBAAoB,CAAC,SAAyC;AAAA,EAC5E,MAAM,MAAsB;AAAA,IAC1B,MAAM,QAAQ;AAAA,IACd,OAAO,QAAQ;AAAA,IACf,QAAQ,QAAQ;AAAA,IAChB,QAAQ,QAAQ;AAAA,IAChB,IAAI,QAAQ;AAAA,IACZ,KAAK,QAAQ;AAAA,IACb,KAAK,QAAQ;AAAA,IACb,QAAQ,QAAQ;AAAA,EAClB;AAAA,EACA,IAAI,QAAQ,MAAM;AAAA,IAChB,IAAI,OAAO,QAAQ;AAAA,EACrB;AAAA,EACA,OAAO;AAAA;",
8
- "debugId": "5FC196A79A9EB9E864756E2164756E21",
7
+ "mappings": ";AA0BO,SAAS,oBAAoB,CAAC,SAAyC;AAAA,EAC5E,MAAM,MAAsB;AAAA,IAC1B,MAAM,QAAQ;AAAA,IACd,OAAO,QAAQ;AAAA,IACf,QAAQ,QAAQ;AAAA,IAChB,QAAQ,QAAQ;AAAA,IAChB,IAAI,QAAQ;AAAA,IACZ,KAAK,QAAQ;AAAA,IACb,KAAK,QAAQ;AAAA,IACb,UAAU,QAAQ;AAAA,IAClB,QAAQ,QAAQ;AAAA,IAChB,QAAQ,QAAQ;AAAA,EAClB;AAAA,EACA,IAAI,QAAQ,MAAM;AAAA,IAChB,IAAI,OAAO,QAAQ;AAAA,EACrB;AAAA,EACA,IAAI,QAAQ,OAAO;AAAA,IACjB,IAAI,QAAQ,QAAQ;AAAA,EACtB;AAAA,EACA,OAAO;AAAA;",
8
+ "debugId": "648BE3914FE77F1D64756E2164756E21",
9
9
  "names": []
10
10
  }
@@ -1,11 +1,12 @@
1
1
  // src/interpreter/index.ts
2
- import { Interpreter, BreakException, ContinueException } from "./interpreter.mjs";
2
+ import { Interpreter, BreakException, ContinueException, ExitException } from "./interpreter.mjs";
3
3
  import { createCommandContext } from "./context.mjs";
4
4
  export {
5
5
  createCommandContext,
6
6
  Interpreter,
7
+ ExitException,
7
8
  ContinueException,
8
9
  BreakException
9
10
  };
10
11
 
11
- //# debugId=71A1B05D75F46BFA64756E2164756E21
12
+ //# debugId=3382F60717545D4664756E2164756E21
@@ -2,9 +2,9 @@
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/interpreter/index.ts"],
4
4
  "sourcesContent": [
5
- "export { Interpreter, type InterpreterOptions, BreakException, ContinueException } from \"./interpreter.mjs\";\nexport { createCommandContext, type ContextOptions } from \"./context.mjs\";\n"
5
+ "export { Interpreter, type InterpreterOptions, BreakException, ContinueException, ExitException } from \"./interpreter.mjs\";\nexport { createCommandContext, type ContextOptions } from \"./context.mjs\";\n"
6
6
  ],
7
7
  "mappings": ";AAAA;AACA;",
8
- "debugId": "71A1B05D75F46BFA64756E2164756E21",
8
+ "debugId": "3382F60717545D4664756E2164756E21",
9
9
  "names": []
10
10
  }