shell-dsl 0.0.39 → 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.
- package/README.md +117 -3
- package/dist/cjs/package.json +1 -1
- package/dist/cjs/src/commands/exit/exit.cjs +84 -0
- package/dist/cjs/src/commands/exit/exit.cjs.map +10 -0
- package/dist/cjs/src/commands/index.cjs +18 -2
- package/dist/cjs/src/commands/index.cjs.map +3 -3
- package/dist/cjs/src/commands/sh/sh.cjs +134 -0
- package/dist/cjs/src/commands/sh/sh.cjs.map +10 -0
- package/dist/cjs/src/index.cjs +2 -1
- package/dist/cjs/src/index.cjs.map +3 -3
- package/dist/cjs/src/interpreter/context.cjs +4 -1
- package/dist/cjs/src/interpreter/context.cjs.map +3 -3
- package/dist/cjs/src/interpreter/index.cjs +2 -1
- package/dist/cjs/src/interpreter/index.cjs.map +3 -3
- package/dist/cjs/src/interpreter/interpreter.cjs +301 -76
- package/dist/cjs/src/interpreter/interpreter.cjs.map +3 -3
- package/dist/cjs/src/lexer/lexer.cjs +13 -1
- package/dist/cjs/src/lexer/lexer.cjs.map +3 -3
- package/dist/cjs/src/parser/parser.cjs +11 -1
- package/dist/cjs/src/parser/parser.cjs.map +3 -3
- package/dist/cjs/src/types.cjs.map +2 -2
- package/dist/mjs/package.json +1 -1
- package/dist/mjs/src/commands/exit/exit.mjs +44 -0
- package/dist/mjs/src/commands/exit/exit.mjs.map +10 -0
- package/dist/mjs/src/commands/index.mjs +18 -2
- package/dist/mjs/src/commands/index.mjs.map +3 -3
- package/dist/mjs/src/commands/sh/sh.mjs +94 -0
- package/dist/mjs/src/commands/sh/sh.mjs.map +10 -0
- package/dist/mjs/src/index.mjs +3 -2
- package/dist/mjs/src/index.mjs.map +3 -3
- package/dist/mjs/src/interpreter/context.mjs +4 -1
- package/dist/mjs/src/interpreter/context.mjs.map +3 -3
- package/dist/mjs/src/interpreter/index.mjs +3 -2
- package/dist/mjs/src/interpreter/index.mjs.map +2 -2
- package/dist/mjs/src/interpreter/interpreter.mjs +301 -76
- package/dist/mjs/src/interpreter/interpreter.mjs.map +3 -3
- package/dist/mjs/src/lexer/lexer.mjs +13 -1
- package/dist/mjs/src/lexer/lexer.mjs.map +3 -3
- package/dist/mjs/src/parser/parser.mjs +11 -1
- package/dist/mjs/src/parser/parser.mjs.map +3 -3
- package/dist/mjs/src/types.mjs.map +2 -2
- package/dist/types/src/commands/exit/exit.d.ts +2 -0
- package/dist/types/src/commands/index.d.ts +2 -0
- package/dist/types/src/commands/sh/sh.d.ts +5 -0
- package/dist/types/src/index.d.ts +2 -2
- package/dist/types/src/interpreter/context.d.ts +2 -1
- package/dist/types/src/interpreter/index.d.ts +1 -1
- package/dist/types/src/interpreter/interpreter.d.ts +24 -0
- package/dist/types/src/types.d.ts +13 -0
- package/package.json +1 -1
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/parser/parser.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
|
-
"import { ParseError } from \"../errors.mjs\";\nimport { Lexer } from \"../lexer/lexer.mjs\";\nimport type { Token, KeywordValue } from \"../lexer/tokens.mjs\";\nimport type {\n ASTNode,\n Redirect,\n RedirectMode,\n CommandNode,\n IfNode,\n ForNode,\n WhileNode,\n UntilNode,\n CaseNode,\n CaseClause,\n WordNode,\n WordPart,\n} from \"./ast.mjs\";\n\nexport class Parser {\n private tokens: Token[];\n private pos: number = 0;\n\n constructor(tokens: Token[]) {\n this.tokens = tokens;\n }\n\n parse(): ASTNode {\n const result = this.parseSequence();\n if (!this.isAtEnd()) {\n throw new ParseError(`Unexpected token: ${JSON.stringify(this.peek())}`);\n }\n return result;\n }\n\n // sequence := and_or ((';'|'\\n') and_or)*\n private parseSequence(): ASTNode {\n this.skipNewlines();\n const commands: ASTNode[] = [];\n commands.push(this.parseAndOr());\n\n while (this.match(\"semicolon\") || this.match(\"newline\")) {\n this.skipNewlines();\n if (this.isAtEnd() || this.check(\"semicolon\") || this.check(\"newline\") || this.isTerminatingKeyword()) continue;\n commands.push(this.parseAndOr());\n }\n\n if (commands.length === 1) {\n return commands[0]!;\n }\n\n return { type: \"sequence\", commands };\n }\n\n private skipNewlines(): void {\n while (this.match(\"newline\")) {\n // keep consuming newlines\n }\n }\n\n private isTerminatingKeyword(): boolean {\n const token = this.peek();\n if (token.type !== \"keyword\") return false;\n return [\"then\", \"elif\", \"else\", \"fi\", \"do\", \"done\", \"esac\"].includes(token.value);\n }\n\n // and_or := pipeline (('&&'|'||') pipeline)*\n private parseAndOr(): ASTNode {\n let left = this.parsePipeline();\n\n while (this.check(\"and\") || this.check(\"or\")) {\n if (this.match(\"and\")) {\n const right = this.parsePipeline();\n left = { type: \"and\", left, right };\n } else if (this.match(\"or\")) {\n const right = this.parsePipeline();\n left = { type: \"or\", left, right };\n }\n }\n\n return left;\n }\n\n // pipeline := command ('|' command)*\n private parsePipeline(): ASTNode {\n const commands: ASTNode[] = [];\n commands.push(this.parseCompoundOrCommand());\n\n while (this.match(\"pipe\")) {\n this.skipNewlines();\n commands.push(this.parseCompoundOrCommand());\n }\n\n if (commands.length === 1) {\n return commands[0]!;\n }\n\n return { type: \"pipeline\", commands };\n }\n\n // compound_or_command := compound_command | simple_command\n private parseCompoundOrCommand(): ASTNode {\n this.skipNewlines();\n const token = this.peek();\n\n if (token.type === \"keyword\") {\n switch (token.value) {\n case \"if\":\n return this.parseIf();\n case \"for\":\n return this.parseFor();\n case \"while\":\n return this.parseWhile();\n case \"until\":\n return this.parseUntil();\n case \"case\":\n return this.parseCase();\n }\n }\n\n return this.parseCommand();\n }\n\n // if := 'if' compound_list 'then' compound_list ('elif' compound_list 'then' compound_list)* ['else' compound_list] 'fi'\n private parseIf(): IfNode {\n this.expectKeyword(\"if\");\n const condition = this.parseCompoundList([\"then\"]);\n this.expectKeyword(\"then\");\n const thenBranch = this.parseCompoundList([\"elif\", \"else\", \"fi\"]);\n\n const elifBranches: Array<{ condition: ASTNode; body: ASTNode }> = [];\n while (this.checkKeyword(\"elif\")) {\n this.expectKeyword(\"elif\");\n const elifCondition = this.parseCompoundList([\"then\"]);\n this.expectKeyword(\"then\");\n const elifBody = this.parseCompoundList([\"elif\", \"else\", \"fi\"]);\n elifBranches.push({ condition: elifCondition, body: elifBody });\n }\n\n let elseBranch: ASTNode | undefined;\n if (this.checkKeyword(\"else\")) {\n this.expectKeyword(\"else\");\n elseBranch = this.parseCompoundList([\"fi\"]);\n }\n\n this.expectKeyword(\"fi\");\n\n return {\n type: \"if\",\n condition,\n thenBranch,\n elifBranches,\n elseBranch,\n };\n }\n\n // for := 'for' NAME ['in' word*] (';'|'\\n') 'do' compound_list 'done'\n private parseFor(): ForNode {\n this.expectKeyword(\"for\");\n\n const varToken = this.peek();\n if (varToken.type !== \"word\") {\n throw new ParseError(\"Expected variable name after 'for'\");\n }\n this.advance();\n const variable = varToken.value;\n\n const items: WordNode[] = [];\n if (this.checkKeyword(\"in\")) {\n this.expectKeyword(\"in\");\n while (!this.isAtEnd() && !this.check(\"semicolon\") && !this.check(\"newline\") && !this.checkKeyword(\"do\")) {\n items.push(this.parseWordArg());\n }\n }\n\n if (!this.match(\"semicolon\")) {\n this.match(\"newline\");\n }\n this.skipNewlines();\n\n this.expectKeyword(\"do\");\n const body = this.parseCompoundList([\"done\"]);\n this.expectKeyword(\"done\");\n\n return {\n type: \"for\",\n variable,\n items,\n body,\n };\n }\n\n // while := 'while' compound_list 'do' compound_list 'done'\n private parseWhile(): WhileNode {\n this.expectKeyword(\"while\");\n const condition = this.parseCompoundList([\"do\"]);\n this.expectKeyword(\"do\");\n const body = this.parseCompoundList([\"done\"]);\n this.expectKeyword(\"done\");\n\n return {\n type: \"while\",\n condition,\n body,\n };\n }\n\n // until := 'until' compound_list 'do' compound_list 'done'\n private parseUntil(): UntilNode {\n this.expectKeyword(\"until\");\n const condition = this.parseCompoundList([\"do\"]);\n this.expectKeyword(\"do\");\n const body = this.parseCompoundList([\"done\"]);\n this.expectKeyword(\"done\");\n\n return {\n type: \"until\",\n condition,\n body,\n };\n }\n\n // case := 'case' word 'in' case_clause* 'esac'\n private parseCase(): CaseNode {\n this.expectKeyword(\"case\");\n const word = this.parseWordArg();\n this.expectKeyword(\"in\");\n this.skipNewlines();\n\n const clauses: CaseClause[] = [];\n\n while (!this.isAtEnd() && !this.checkKeyword(\"esac\")) {\n this.match(\"openParen\");\n\n const patterns: WordNode[] = [];\n patterns.push(this.parseCasePattern());\n\n while (this.match(\"pipe\")) {\n patterns.push(this.parseCasePattern());\n }\n\n if (!this.match(\"closeParen\")) {\n throw new ParseError(\"Expected ')' after case pattern\");\n }\n\n const body = this.parseCaseBody();\n clauses.push({ patterns, body });\n\n this.match(\"doubleSemicolon\");\n this.skipNewlines();\n }\n\n this.expectKeyword(\"esac\");\n\n return {\n type: \"case\",\n word,\n clauses,\n };\n }\n\n private parseCasePattern(): WordNode {\n const token = this.peek();\n\n if (token.type === \"word\" || token.type === \"glob\" || token.type === \"singleQuote\" || token.type === \"doubleQuote\") {\n return this.parseWordArg();\n }\n\n throw new ParseError(`Expected pattern in case clause, got ${token.type}`);\n }\n\n private parseCaseBody(): ASTNode {\n const commands: ASTNode[] = [];\n this.skipNewlines();\n\n while (!this.isAtEnd() && !this.check(\"doubleSemicolon\") && !this.checkKeyword(\"esac\")) {\n commands.push(this.parseAndOr());\n if (!this.match(\"semicolon\") && !this.match(\"newline\")) {\n break;\n }\n this.skipNewlines();\n if (this.check(\"doubleSemicolon\") || this.checkKeyword(\"esac\")) {\n break;\n }\n }\n\n if (commands.length === 0) {\n return this.createNoopCommand();\n }\n if (commands.length === 1) {\n return commands[0]!;\n }\n return { type: \"sequence\", commands };\n }\n\n // compound_list := and_or ((';'|'\\n') and_or)* [';'|'\\n']\n private parseCompoundList(terminators: KeywordValue[]): ASTNode {\n this.skipNewlines();\n const commands: ASTNode[] = [];\n\n if (this.isCompoundListTerminator(terminators)) {\n return this.createNoopCommand();\n }\n\n commands.push(this.parseAndOr());\n\n while ((this.match(\"semicolon\") || this.match(\"newline\")) && !this.isAtEnd()) {\n this.skipNewlines();\n if (this.isCompoundListTerminator(terminators)) {\n break;\n }\n commands.push(this.parseAndOr());\n }\n\n if (commands.length === 1) {\n return commands[0]!;\n }\n\n return { type: \"sequence\", commands };\n }\n\n private createNoopCommand(): CommandNode {\n return {\n type: \"command\",\n name: this.createTextWord(\"true\"),\n args: [],\n redirects: [],\n assignments: [],\n };\n }\n\n private createTextWord(value: string, quoted = false): WordNode {\n return {\n type: \"word\",\n parts: value === \"\" && !quoted ? [] : [{ type: \"text\", value, quoted }],\n };\n }\n\n private isCompoundListTerminator(terminators: KeywordValue[]): boolean {\n const token = this.peek();\n if (token.type !== \"keyword\") return false;\n return terminators.includes(token.value);\n }\n\n private checkKeyword(value: KeywordValue): boolean {\n const token = this.peek();\n return token.type === \"keyword\" && token.value === value;\n }\n\n private expectKeyword(value: KeywordValue): void {\n if (!this.checkKeyword(value)) {\n throw new ParseError(`Expected '${value}'`);\n }\n this.advance();\n }\n\n // command := assignment* word+ redirect*\n private parseCommand(): CommandNode {\n const assignments: Array<{ name: string; value: WordNode }> = [];\n const args: WordNode[] = [];\n const redirects: Redirect[] = [];\n\n while (this.check(\"assignment\")) {\n const token = this.advance() as Token & { type: \"assignment\" };\n assignments.push({\n name: token.name,\n value: this.tokenToWord(token.value),\n });\n }\n\n while (this.isWordToken()) {\n if (this.peek().type === \"heredoc\") {\n const heredocToken = this.advance() as Token & { type: \"heredoc\" };\n redirects.push({\n mode: \"<\",\n target: this.tokenToWord(heredocToken),\n heredocContent: true,\n });\n } else {\n args.push(this.parseWordArg());\n }\n }\n\n while (this.check(\"redirect\")) {\n const redirect = this.parseRedirect();\n redirects.push(redirect);\n while (this.isWordToken()) {\n if (this.peek().type === \"heredoc\") {\n const heredocToken = this.advance() as Token & { type: \"heredoc\" };\n redirects.push({\n mode: \"<\",\n target: this.tokenToWord(heredocToken),\n heredocContent: true,\n });\n } else {\n args.push(this.parseWordArg());\n }\n }\n }\n\n if (args.length === 0 && assignments.length === 0 && redirects.length === 0) {\n throw new ParseError(\"Expected command\");\n }\n\n const name = args.shift() ?? this.createTextWord(redirects.length > 0 ? \":\" : \"\");\n\n return {\n type: \"command\",\n name,\n args,\n redirects,\n assignments,\n };\n }\n\n private parseWordArg(): WordNode {\n const token = this.advance();\n return this.tokenToWord(token);\n }\n\n private tokenToWord(token: Token | string | Token[]): WordNode {\n const parts = this.tokenToWordParts(token);\n return {\n type: \"word\",\n parts,\n };\n }\n\n private tokenToWordParts(token: Token | string | Token[], quoted = false): WordPart[] {\n if (typeof token === \"string\") {\n return [{ type: \"text\", value: token, quoted }];\n }\n\n if (Array.isArray(token)) {\n return token.flatMap((part) => this.tokenToWordParts(part, quoted));\n }\n\n switch (token.type) {\n case \"word\":\n return [{ type: \"text\", value: token.value, quoted }];\n case \"singleQuote\":\n return [{ type: \"text\", value: token.value, quoted: true }];\n case \"doubleQuote\":\n return this.parseDoubleQuoteParts(token.parts);\n case \"variable\":\n return [{ type: \"variable\", name: token.name, quoted }];\n case \"substitution\": {\n const innerParser = new Parser(\n new Lexer(token.command, { preserveNewlines: true }).tokenize()\n );\n return [{ type: \"substitution\", command: innerParser.parse(), quoted }];\n }\n case \"arithmetic\":\n return [{ type: \"arithmetic\", expression: token.expression, quoted }];\n case \"glob\":\n return [{ type: \"text\", value: token.pattern, quoted }];\n case \"assignment\":\n return this.tokenToWordParts(token.value, quoted);\n case \"heredoc\":\n return token.expand\n ? this.parseHeredocContent(token.content).parts\n : [{ type: \"text\", value: token.content, quoted: true }];\n default:\n throw new ParseError(`Unexpected token type: ${(token as Token).type}`);\n }\n }\n\n private parseDoubleQuoteParts(parts: Array<string | Token>): WordPart[] {\n if (parts.length === 0) {\n return [{ type: \"text\", value: \"\", quoted: true }];\n }\n\n return parts.flatMap((part) => this.tokenToWordParts(part, true));\n }\n\n private parseHeredocContent(content: string): WordNode {\n const parts: WordPart[] = [];\n let currentText = \"\";\n let i = 0;\n\n const pushText = () => {\n if (currentText.length > 0) {\n parts.push({ type: \"text\", value: currentText, quoted: false });\n currentText = \"\";\n }\n };\n\n while (i < content.length) {\n if (content[i] !== \"$\") {\n currentText += content[i];\n i++;\n continue;\n }\n\n pushText();\n i++;\n\n if (i >= content.length) {\n currentText += \"$\";\n break;\n }\n\n if (content[i] === \"{\") {\n i++;\n let name = \"\";\n while (i < content.length && content[i] !== \"}\") {\n name += content[i];\n i++;\n }\n if (i < content.length && content[i] === \"}\") {\n i++;\n }\n parts.push({ type: \"variable\", name, quoted: false });\n continue;\n }\n\n if (content[i] === \"(\" && content[i + 1] === \"(\") {\n i += 2;\n let depth = 1;\n let expression = \"\";\n while (i < content.length && depth > 0) {\n if (content[i] === \"(\" && content[i + 1] === \"(\") {\n depth++;\n expression += content[i]! + content[i + 1]!;\n i += 2;\n continue;\n }\n if (content[i] === \")\" && content[i + 1] === \")\") {\n depth--;\n if (depth === 0) {\n i += 2;\n break;\n }\n expression += content[i]! + content[i + 1]!;\n i += 2;\n continue;\n }\n expression += content[i]!;\n i++;\n }\n parts.push({ type: \"arithmetic\", expression, quoted: false });\n continue;\n }\n\n if (content[i] === \"(\") {\n i++;\n let depth = 1;\n let command = \"\";\n while (i < content.length && depth > 0) {\n if (content[i] === \"(\") {\n depth++;\n } else if (content[i] === \")\") {\n depth--;\n if (depth === 0) {\n i++;\n break;\n }\n }\n command += content[i]!;\n i++;\n }\n const innerParser = new Parser(\n new Lexer(command, { preserveNewlines: true }).tokenize()\n );\n parts.push({ type: \"substitution\", command: innerParser.parse(), quoted: false });\n continue;\n }\n\n if (/[a-zA-Z_]/.test(content[i] ?? \"\")) {\n let name = \"\";\n while (i < content.length && /[a-zA-Z0-9_]/.test(content[i] ?? \"\")) {\n name += content[i];\n i++;\n }\n parts.push({ type: \"variable\", name, quoted: false });\n continue;\n }\n\n currentText += \"$\";\n }\n\n pushText();\n\n return {\n type: \"word\",\n parts,\n };\n }\n\n private parseRedirect(): Redirect {\n const token = this.advance() as Token & { type: \"redirect\" };\n const mode = token.mode as RedirectMode;\n\n if (mode === \"2>&1\" || mode === \"1>&2\") {\n return { mode, target: this.createTextWord(\"\") };\n }\n\n if (!this.isWordToken()) {\n throw new ParseError(`Expected redirect target after ${mode}`);\n }\n\n const target = this.parseWordArg();\n return { mode, target };\n }\n\n private isWordToken(): boolean {\n const token = this.peek();\n return (\n Array.isArray(token) ||\n token.type === \"word\" ||\n token.type === \"singleQuote\" ||\n token.type === \"doubleQuote\" ||\n token.type === \"variable\" ||\n token.type === \"substitution\" ||\n token.type === \"arithmetic\" ||\n token.type === \"glob\" ||\n token.type === \"heredoc\"\n );\n }\n\n private check(type: Token[\"type\"]): boolean {\n return this.peek().type === type;\n }\n\n private match(type: Token[\"type\"]): boolean {\n if (this.check(type)) {\n this.advance();\n return true;\n }\n return false;\n }\n\n private peek(): Token {\n return this.tokens[this.pos] ?? { type: \"eof\" };\n }\n\n private advance(): Token {\n const token = this.peek();\n this.pos++;\n return token;\n }\n\n private isAtEnd(): boolean {\n return this.peek().type === \"eof\";\n }\n}\n\nexport function parse(tokens: Token[]): ASTNode {\n return new Parser(tokens).parse();\n}\n"
|
|
5
|
+
"import { ParseError } from \"../errors.mjs\";\nimport { Lexer } from \"../lexer/lexer.mjs\";\nimport type { Token, KeywordValue } from \"../lexer/tokens.mjs\";\nimport type {\n ASTNode,\n Redirect,\n RedirectMode,\n CommandNode,\n IfNode,\n ForNode,\n WhileNode,\n UntilNode,\n CaseNode,\n CaseClause,\n WordNode,\n WordPart,\n} from \"./ast.mjs\";\n\nexport class Parser {\n private tokens: Token[];\n private pos: number = 0;\n\n constructor(tokens: Token[]) {\n this.tokens = tokens;\n }\n\n parse(): ASTNode {\n const result = this.parseSequence();\n if (!this.isAtEnd()) {\n throw new ParseError(`Unexpected token: ${JSON.stringify(this.peek())}`);\n }\n return result;\n }\n\n // sequence := and_or ((';'|'\\n') and_or)*\n private parseSequence(): ASTNode {\n this.skipNewlines();\n const commands: ASTNode[] = [];\n commands.push(this.parseAndOr());\n\n while (this.match(\"semicolon\") || this.match(\"newline\")) {\n this.skipNewlines();\n if (this.isAtEnd() || this.check(\"semicolon\") || this.check(\"newline\") || this.isTerminatingKeyword()) continue;\n commands.push(this.parseAndOr());\n }\n\n if (commands.length === 1) {\n return commands[0]!;\n }\n\n return { type: \"sequence\", commands };\n }\n\n private skipNewlines(): void {\n while (this.match(\"newline\")) {\n // keep consuming newlines\n }\n }\n\n private isTerminatingKeyword(): boolean {\n const token = this.peek();\n if (token.type !== \"keyword\") return false;\n return [\"then\", \"elif\", \"else\", \"fi\", \"do\", \"done\", \"esac\"].includes(token.value);\n }\n\n // and_or := pipeline (('&&'|'||') pipeline)*\n private parseAndOr(): ASTNode {\n let left = this.parsePipeline();\n\n while (this.check(\"and\") || this.check(\"or\")) {\n if (this.match(\"and\")) {\n const right = this.parsePipeline();\n left = { type: \"and\", left, right };\n } else if (this.match(\"or\")) {\n const right = this.parsePipeline();\n left = { type: \"or\", left, right };\n }\n }\n\n return left;\n }\n\n // pipeline := command ('|' command)*\n private parsePipeline(): ASTNode {\n const commands: ASTNode[] = [];\n commands.push(this.parseCompoundOrCommand());\n\n while (this.match(\"pipe\")) {\n this.skipNewlines();\n commands.push(this.parseCompoundOrCommand());\n }\n\n if (commands.length === 1) {\n return commands[0]!;\n }\n\n return { type: \"pipeline\", commands };\n }\n\n // compound_or_command := compound_command | simple_command\n private parseCompoundOrCommand(): ASTNode {\n this.skipNewlines();\n const token = this.peek();\n\n if (token.type === \"keyword\") {\n switch (token.value) {\n case \"if\":\n return this.parseIf();\n case \"for\":\n return this.parseFor();\n case \"while\":\n return this.parseWhile();\n case \"until\":\n return this.parseUntil();\n case \"case\":\n return this.parseCase();\n }\n }\n\n return this.parseCommand();\n }\n\n // if := 'if' compound_list 'then' compound_list ('elif' compound_list 'then' compound_list)* ['else' compound_list] 'fi'\n private parseIf(): IfNode {\n this.expectKeyword(\"if\");\n const condition = this.parseCompoundList([\"then\"]);\n this.expectKeyword(\"then\");\n const thenBranch = this.parseCompoundList([\"elif\", \"else\", \"fi\"]);\n\n const elifBranches: Array<{ condition: ASTNode; body: ASTNode }> = [];\n while (this.checkKeyword(\"elif\")) {\n this.expectKeyword(\"elif\");\n const elifCondition = this.parseCompoundList([\"then\"]);\n this.expectKeyword(\"then\");\n const elifBody = this.parseCompoundList([\"elif\", \"else\", \"fi\"]);\n elifBranches.push({ condition: elifCondition, body: elifBody });\n }\n\n let elseBranch: ASTNode | undefined;\n if (this.checkKeyword(\"else\")) {\n this.expectKeyword(\"else\");\n elseBranch = this.parseCompoundList([\"fi\"]);\n }\n\n this.expectKeyword(\"fi\");\n\n return {\n type: \"if\",\n condition,\n thenBranch,\n elifBranches,\n elseBranch,\n };\n }\n\n // for := 'for' NAME ['in' word*] (';'|'\\n') 'do' compound_list 'done'\n private parseFor(): ForNode {\n this.expectKeyword(\"for\");\n\n const varToken = this.peek();\n if (varToken.type !== \"word\") {\n throw new ParseError(\"Expected variable name after 'for'\");\n }\n this.advance();\n const variable = varToken.value;\n\n const items: WordNode[] = [];\n if (this.checkKeyword(\"in\")) {\n this.expectKeyword(\"in\");\n while (!this.isAtEnd() && !this.check(\"semicolon\") && !this.check(\"newline\") && !this.checkKeyword(\"do\")) {\n items.push(this.parseWordArg());\n }\n }\n\n if (!this.match(\"semicolon\")) {\n this.match(\"newline\");\n }\n this.skipNewlines();\n\n this.expectKeyword(\"do\");\n const body = this.parseCompoundList([\"done\"]);\n this.expectKeyword(\"done\");\n\n return {\n type: \"for\",\n variable,\n items,\n body,\n };\n }\n\n // while := 'while' compound_list 'do' compound_list 'done'\n private parseWhile(): WhileNode {\n this.expectKeyword(\"while\");\n const condition = this.parseCompoundList([\"do\"]);\n this.expectKeyword(\"do\");\n const body = this.parseCompoundList([\"done\"]);\n this.expectKeyword(\"done\");\n\n return {\n type: \"while\",\n condition,\n body,\n };\n }\n\n // until := 'until' compound_list 'do' compound_list 'done'\n private parseUntil(): UntilNode {\n this.expectKeyword(\"until\");\n const condition = this.parseCompoundList([\"do\"]);\n this.expectKeyword(\"do\");\n const body = this.parseCompoundList([\"done\"]);\n this.expectKeyword(\"done\");\n\n return {\n type: \"until\",\n condition,\n body,\n };\n }\n\n // case := 'case' word 'in' case_clause* 'esac'\n private parseCase(): CaseNode {\n this.expectKeyword(\"case\");\n const word = this.parseWordArg();\n this.expectKeyword(\"in\");\n this.skipNewlines();\n\n const clauses: CaseClause[] = [];\n\n while (!this.isAtEnd() && !this.checkKeyword(\"esac\")) {\n this.match(\"openParen\");\n\n const patterns: WordNode[] = [];\n patterns.push(this.parseCasePattern());\n\n while (this.match(\"pipe\")) {\n patterns.push(this.parseCasePattern());\n }\n\n if (!this.match(\"closeParen\")) {\n throw new ParseError(\"Expected ')' after case pattern\");\n }\n\n const body = this.parseCaseBody();\n clauses.push({ patterns, body });\n\n this.match(\"doubleSemicolon\");\n this.skipNewlines();\n }\n\n this.expectKeyword(\"esac\");\n\n return {\n type: \"case\",\n word,\n clauses,\n };\n }\n\n private parseCasePattern(): WordNode {\n const token = this.peek();\n\n if (token.type === \"word\" || token.type === \"glob\" || token.type === \"singleQuote\" || token.type === \"doubleQuote\") {\n return this.parseWordArg();\n }\n\n throw new ParseError(`Expected pattern in case clause, got ${token.type}`);\n }\n\n private parseCaseBody(): ASTNode {\n const commands: ASTNode[] = [];\n this.skipNewlines();\n\n while (!this.isAtEnd() && !this.check(\"doubleSemicolon\") && !this.checkKeyword(\"esac\")) {\n commands.push(this.parseAndOr());\n if (!this.match(\"semicolon\") && !this.match(\"newline\")) {\n break;\n }\n this.skipNewlines();\n if (this.check(\"doubleSemicolon\") || this.checkKeyword(\"esac\")) {\n break;\n }\n }\n\n if (commands.length === 0) {\n return this.createNoopCommand();\n }\n if (commands.length === 1) {\n return commands[0]!;\n }\n return { type: \"sequence\", commands };\n }\n\n // compound_list := and_or ((';'|'\\n') and_or)* [';'|'\\n']\n private parseCompoundList(terminators: KeywordValue[]): ASTNode {\n this.skipNewlines();\n const commands: ASTNode[] = [];\n\n if (this.isCompoundListTerminator(terminators)) {\n return this.createNoopCommand();\n }\n\n commands.push(this.parseAndOr());\n\n while ((this.match(\"semicolon\") || this.match(\"newline\")) && !this.isAtEnd()) {\n this.skipNewlines();\n if (this.isCompoundListTerminator(terminators)) {\n break;\n }\n commands.push(this.parseAndOr());\n }\n\n if (commands.length === 1) {\n return commands[0]!;\n }\n\n return { type: \"sequence\", commands };\n }\n\n private createNoopCommand(): CommandNode {\n return {\n type: \"command\",\n name: this.createTextWord(\"true\"),\n args: [],\n redirects: [],\n assignments: [],\n };\n }\n\n private createTextWord(value: string, quoted = false): WordNode {\n return {\n type: \"word\",\n parts: value === \"\" && !quoted ? [] : [{ type: \"text\", value, quoted }],\n };\n }\n\n private isCompoundListTerminator(terminators: KeywordValue[]): boolean {\n const token = this.peek();\n if (token.type !== \"keyword\") return false;\n return terminators.includes(token.value);\n }\n\n private checkKeyword(value: KeywordValue): boolean {\n const token = this.peek();\n return token.type === \"keyword\" && token.value === value;\n }\n\n private expectKeyword(value: KeywordValue): void {\n if (!this.checkKeyword(value)) {\n throw new ParseError(`Expected '${value}'`);\n }\n this.advance();\n }\n\n // command := assignment* word+ redirect*\n private parseCommand(): CommandNode {\n const assignments: Array<{ name: string; value: WordNode }> = [];\n const args: WordNode[] = [];\n const redirects: Redirect[] = [];\n\n while (this.check(\"assignment\")) {\n const token = this.advance() as Token & { type: \"assignment\" };\n assignments.push({\n name: token.name,\n value: this.tokenToWord(token.value),\n });\n }\n\n while (this.isWordToken()) {\n if (this.peek().type === \"heredoc\") {\n const heredocToken = this.advance() as Token & { type: \"heredoc\" };\n redirects.push({\n mode: \"<\",\n target: this.tokenToWord(heredocToken),\n heredocContent: true,\n });\n } else {\n args.push(this.parseWordArg());\n }\n }\n\n while (this.check(\"redirect\")) {\n const redirect = this.parseRedirect();\n redirects.push(redirect);\n while (this.isWordToken()) {\n if (this.peek().type === \"heredoc\") {\n const heredocToken = this.advance() as Token & { type: \"heredoc\" };\n redirects.push({\n mode: \"<\",\n target: this.tokenToWord(heredocToken),\n heredocContent: true,\n });\n } else {\n args.push(this.parseWordArg());\n }\n }\n }\n\n if (args.length === 0 && assignments.length === 0 && redirects.length === 0) {\n throw new ParseError(\"Expected command\");\n }\n\n const name = args.shift() ?? this.createTextWord(redirects.length > 0 ? \":\" : \"\");\n\n return {\n type: \"command\",\n name,\n args,\n redirects,\n assignments,\n };\n }\n\n private parseWordArg(): WordNode {\n const token = this.advance();\n return this.tokenToWord(token);\n }\n\n private tokenToWord(token: Token | string | Token[]): WordNode {\n const parts = this.tokenToWordParts(token);\n return {\n type: \"word\",\n parts,\n };\n }\n\n private tokenToWordParts(token: Token | string | Token[], quoted = false): WordPart[] {\n if (typeof token === \"string\") {\n return [{ type: \"text\", value: token, quoted }];\n }\n\n if (Array.isArray(token)) {\n return token.flatMap((part) => this.tokenToWordParts(part, quoted));\n }\n\n switch (token.type) {\n case \"word\":\n return [{ type: \"text\", value: token.value, quoted }];\n case \"singleQuote\":\n return [{ type: \"text\", value: token.value, quoted: true }];\n case \"doubleQuote\":\n return this.parseDoubleQuoteParts(token.parts);\n case \"variable\":\n return [{ type: \"variable\", name: token.name, quoted }];\n case \"substitution\": {\n const innerParser = new Parser(\n new Lexer(token.command, { preserveNewlines: true }).tokenize()\n );\n return [{ type: \"substitution\", command: innerParser.parse(), quoted }];\n }\n case \"arithmetic\":\n return [{ type: \"arithmetic\", expression: token.expression, quoted }];\n case \"glob\":\n return [{ type: \"text\", value: token.pattern, quoted }];\n case \"assignment\":\n return this.tokenToWordParts(token.value, quoted);\n case \"heredoc\":\n return token.expand\n ? this.parseHeredocContent(token.content).parts\n : [{ type: \"text\", value: token.content, quoted: true }];\n default:\n throw new ParseError(`Unexpected token type: ${(token as Token).type}`);\n }\n }\n\n private parseDoubleQuoteParts(parts: Array<string | Token>): WordPart[] {\n if (parts.length === 0) {\n return [{ type: \"text\", value: \"\", quoted: true }];\n }\n\n return parts.flatMap((part) => this.tokenToWordParts(part, true));\n }\n\n private parseHeredocContent(content: string): WordNode {\n const parts: WordPart[] = [];\n let currentText = \"\";\n let i = 0;\n\n const pushText = () => {\n if (currentText.length > 0) {\n parts.push({ type: \"text\", value: currentText, quoted: false });\n currentText = \"\";\n }\n };\n\n while (i < content.length) {\n if (content[i] !== \"$\") {\n currentText += content[i];\n i++;\n continue;\n }\n\n pushText();\n i++;\n\n if (i >= content.length) {\n currentText += \"$\";\n break;\n }\n\n if (content[i] === \"{\") {\n i++;\n let name = \"\";\n while (i < content.length && content[i] !== \"}\") {\n name += content[i];\n i++;\n }\n if (i < content.length && content[i] === \"}\") {\n i++;\n }\n parts.push({ type: \"variable\", name, quoted: false });\n continue;\n }\n\n if ([\"#\", \"*\", \"@\", \"?\"].includes(content[i] ?? \"\")) {\n parts.push({ type: \"variable\", name: content[i]!, quoted: false });\n i++;\n continue;\n }\n\n if (/[0-9]/.test(content[i] ?? \"\")) {\n parts.push({ type: \"variable\", name: content[i]!, quoted: false });\n i++;\n continue;\n }\n\n if (content[i] === \"(\" && content[i + 1] === \"(\") {\n i += 2;\n let depth = 1;\n let expression = \"\";\n while (i < content.length && depth > 0) {\n if (content[i] === \"(\" && content[i + 1] === \"(\") {\n depth++;\n expression += content[i]! + content[i + 1]!;\n i += 2;\n continue;\n }\n if (content[i] === \")\" && content[i + 1] === \")\") {\n depth--;\n if (depth === 0) {\n i += 2;\n break;\n }\n expression += content[i]! + content[i + 1]!;\n i += 2;\n continue;\n }\n expression += content[i]!;\n i++;\n }\n parts.push({ type: \"arithmetic\", expression, quoted: false });\n continue;\n }\n\n if (content[i] === \"(\") {\n i++;\n let depth = 1;\n let command = \"\";\n while (i < content.length && depth > 0) {\n if (content[i] === \"(\") {\n depth++;\n } else if (content[i] === \")\") {\n depth--;\n if (depth === 0) {\n i++;\n break;\n }\n }\n command += content[i]!;\n i++;\n }\n const innerParser = new Parser(\n new Lexer(command, { preserveNewlines: true }).tokenize()\n );\n parts.push({ type: \"substitution\", command: innerParser.parse(), quoted: false });\n continue;\n }\n\n if (/[a-zA-Z_]/.test(content[i] ?? \"\")) {\n let name = \"\";\n while (i < content.length && /[a-zA-Z0-9_]/.test(content[i] ?? \"\")) {\n name += content[i];\n i++;\n }\n parts.push({ type: \"variable\", name, quoted: false });\n continue;\n }\n\n currentText += \"$\";\n }\n\n pushText();\n\n return {\n type: \"word\",\n parts,\n };\n }\n\n private parseRedirect(): Redirect {\n const token = this.advance() as Token & { type: \"redirect\" };\n const mode = token.mode as RedirectMode;\n\n if (mode === \"2>&1\" || mode === \"1>&2\") {\n return { mode, target: this.createTextWord(\"\") };\n }\n\n if (!this.isWordToken()) {\n throw new ParseError(`Expected redirect target after ${mode}`);\n }\n\n const target = this.parseWordArg();\n return { mode, target };\n }\n\n private isWordToken(): boolean {\n const token = this.peek();\n return (\n Array.isArray(token) ||\n token.type === \"word\" ||\n token.type === \"singleQuote\" ||\n token.type === \"doubleQuote\" ||\n token.type === \"variable\" ||\n token.type === \"substitution\" ||\n token.type === \"arithmetic\" ||\n token.type === \"glob\" ||\n token.type === \"heredoc\"\n );\n }\n\n private check(type: Token[\"type\"]): boolean {\n return this.peek().type === type;\n }\n\n private match(type: Token[\"type\"]): boolean {\n if (this.check(type)) {\n this.advance();\n return true;\n }\n return false;\n }\n\n private peek(): Token {\n return this.tokens[this.pos] ?? { type: \"eof\" };\n }\n\n private advance(): Token {\n const token = this.peek();\n this.pos++;\n return token;\n }\n\n private isAtEnd(): boolean {\n return this.peek().type === \"eof\";\n }\n}\n\nexport function parse(tokens: Token[]): ASTNode {\n return new Parser(tokens).parse();\n}\n"
|
|
6
6
|
],
|
|
7
|
-
"mappings": "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",
|
|
8
|
-
"debugId": "
|
|
7
|
+
"mappings": "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",
|
|
8
|
+
"debugId": "326DB598A25C1C2F64756E2164756E21",
|
|
9
9
|
"names": []
|
|
10
10
|
}
|
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/types.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
|
-
"// Virtual Filesystem Interface\nexport interface VirtualFSWritable {\n write(chunk: Uint8Array): Promise<void>;\n close(): Promise<void>;\n abort?(reason?: unknown): Promise<void>;\n}\n\nexport interface VirtualFS {\n readFile(path: string): Promise<Buffer>;\n readFile(path: string, encoding: BufferEncoding): Promise<string>;\n readStream(path: string): AsyncIterable<Uint8Array>;\n readdir(path: string): Promise<string[]>;\n stat(path: string): Promise<FileStat>;\n exists(path: string): Promise<boolean>;\n\n writeFile(path: string, data: Buffer | string): Promise<void>;\n appendFile(path: string, data: Buffer | string): Promise<void>;\n writeStream(path: string, opts?: { append?: boolean }): Promise<VirtualFSWritable>;\n mkdir(path: string, opts?: { recursive?: boolean }): Promise<void>;\n\n rm(path: string, opts?: { recursive?: boolean; force?: boolean }): Promise<void>;\n\n resolve(...paths: string[]): string;\n dirname(path: string): string;\n basename(path: string): string;\n glob(pattern: string, opts?: { cwd?: string }): Promise<string[]>;\n}\n\nexport interface FileStat {\n isFile(): boolean;\n isDirectory(): boolean;\n size: number;\n mtime: Date;\n mtimeMs: number;\n}\n\n// Command Interfaces\nexport type Command = (ctx: CommandContext) => Promise<number>;\n\nexport interface CommandContext {\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 interface Stdin {\n stream(): AsyncIterable<Uint8Array>;\n buffer(): Promise<Buffer>;\n text(): Promise<string>;\n lines(): AsyncIterable<string>;\n}\n\nexport interface Stdout {\n write(chunk: Uint8Array): Promise<void>;\n writeText(str: string): Promise<void>;\n isTTY: boolean;\n}\n\nexport interface Stderr {\n write(chunk: Uint8Array): Promise<void>;\n writeText(str: string): Promise<void>;\n isTTY: boolean;\n}\n\nexport interface OutputCollector extends Stdout {\n close(): void;\n collect(): Promise<Buffer>;\n getReadableStream(): AsyncIterable<Uint8Array>;\n}\n\n// Execution Result\nexport interface ExecResult {\n stdout: Buffer;\n stderr: Buffer;\n exitCode: number;\n}\n\n// Shell Configuration\nexport interface ShellConfig {\n fs: VirtualFS;\n cwd: string;\n env: Record<string, string>;\n commands: Record<string, Command>;\n isTTY?: boolean;\n}\n\n// Raw escape hatch type\nexport interface RawValue {\n raw: string;\n}\n\nexport function isRawValue(value: unknown): value is RawValue {\n return (\n typeof value === \"object\" &&\n value !== null &&\n \"raw\" in value &&\n typeof (value as RawValue).raw === \"string\"\n );\n}\n\n// JS Object Redirection types\nexport type RedirectObject = Buffer | Blob | Response | string;\n\nexport interface RedirectObjectMap {\n [marker: string]: RedirectObject;\n}\n\nexport function isRedirectObject(value: unknown): value is RedirectObject {\n return (\n Buffer.isBuffer(value) ||\n value instanceof Blob ||\n value instanceof Response ||\n typeof value === \"string\"\n );\n}\n"
|
|
5
|
+
"// Virtual Filesystem Interface\nexport interface VirtualFSWritable {\n write(chunk: Uint8Array): Promise<void>;\n close(): Promise<void>;\n abort?(reason?: unknown): Promise<void>;\n}\n\nexport interface VirtualFS {\n readFile(path: string): Promise<Buffer>;\n readFile(path: string, encoding: BufferEncoding): Promise<string>;\n readStream(path: string): AsyncIterable<Uint8Array>;\n readdir(path: string): Promise<string[]>;\n stat(path: string): Promise<FileStat>;\n exists(path: string): Promise<boolean>;\n\n writeFile(path: string, data: Buffer | string): Promise<void>;\n appendFile(path: string, data: Buffer | string): Promise<void>;\n writeStream(path: string, opts?: { append?: boolean }): Promise<VirtualFSWritable>;\n mkdir(path: string, opts?: { recursive?: boolean }): Promise<void>;\n\n rm(path: string, opts?: { recursive?: boolean; force?: boolean }): Promise<void>;\n\n resolve(...paths: string[]): string;\n dirname(path: string): string;\n basename(path: string): string;\n glob(pattern: string, opts?: { cwd?: string }): Promise<string[]>;\n}\n\nexport interface FileStat {\n isFile(): boolean;\n isDirectory(): boolean;\n size: number;\n mtime: Date;\n mtimeMs: number;\n}\n\n// Command Interfaces\nexport type Command = (ctx: CommandContext) => Promise<number>;\n\nexport interface ShellRunOptions {\n argv0?: string;\n args?: string[];\n}\n\nexport interface ShellCommandApi {\n eval(source: string): Promise<number>;\n source(path: string, args?: string[]): Promise<number>;\n runScript(path: string, args?: string[]): Promise<number>;\n runShell(source: string, options?: ShellRunOptions): Promise<number>;\n getLastExitCode(): number;\n exit(exitCode?: number): never;\n}\n\nexport interface CommandContext {\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 shell?: ShellCommandApi;\n}\n\nexport interface Stdin {\n stream(): AsyncIterable<Uint8Array>;\n buffer(): Promise<Buffer>;\n text(): Promise<string>;\n lines(): AsyncIterable<string>;\n}\n\nexport interface Stdout {\n write(chunk: Uint8Array): Promise<void>;\n writeText(str: string): Promise<void>;\n isTTY: boolean;\n}\n\nexport interface Stderr {\n write(chunk: Uint8Array): Promise<void>;\n writeText(str: string): Promise<void>;\n isTTY: boolean;\n}\n\nexport interface OutputCollector extends Stdout {\n close(): void;\n collect(): Promise<Buffer>;\n getReadableStream(): AsyncIterable<Uint8Array>;\n}\n\n// Execution Result\nexport interface ExecResult {\n stdout: Buffer;\n stderr: Buffer;\n exitCode: number;\n}\n\n// Shell Configuration\nexport interface ShellConfig {\n fs: VirtualFS;\n cwd: string;\n env: Record<string, string>;\n commands: Record<string, Command>;\n isTTY?: boolean;\n}\n\n// Raw escape hatch type\nexport interface RawValue {\n raw: string;\n}\n\nexport function isRawValue(value: unknown): value is RawValue {\n return (\n typeof value === \"object\" &&\n value !== null &&\n \"raw\" in value &&\n typeof (value as RawValue).raw === \"string\"\n );\n}\n\n// JS Object Redirection types\nexport type RedirectObject = Buffer | Blob | Response | string;\n\nexport interface RedirectObjectMap {\n [marker: string]: RedirectObject;\n}\n\nexport function isRedirectObject(value: unknown): value is RedirectObject {\n return (\n Buffer.isBuffer(value) ||\n value instanceof Blob ||\n value instanceof Response ||\n typeof value === \"string\"\n );\n}\n"
|
|
6
6
|
],
|
|
7
|
-
"mappings": ";
|
|
7
|
+
"mappings": ";AAgHO,SAAS,UAAU,CAAC,OAAmC;AAAA,EAC5D,OACE,OAAO,UAAU,YACjB,UAAU,QACV,SAAS,SACT,OAAQ,MAAmB,QAAQ;AAAA;AAWhC,SAAS,gBAAgB,CAAC,OAAyC;AAAA,EACxE,OACE,OAAO,SAAS,KAAK,KACrB,iBAAiB,QACjB,iBAAiB,YACjB,OAAO,UAAU;AAAA;",
|
|
8
8
|
"debugId": "9C8E04A91CC7802764756E2164756E21",
|
|
9
9
|
"names": []
|
|
10
10
|
}
|
|
@@ -28,4 +28,6 @@ export { cd } from "./cd/cd.ts";
|
|
|
28
28
|
export { tr } from "./tr/tr.ts";
|
|
29
29
|
export { cut } from "./cut/cut.ts";
|
|
30
30
|
export { od } from "./od/od.ts";
|
|
31
|
+
export { sh, evalCmd as eval, evalCmd, source, dot } from "./sh/sh.ts";
|
|
32
|
+
export { exitCmd as exit, exitCmd } from "./exit/exit.ts";
|
|
31
33
|
export declare const builtinCommands: Record<string, Command>;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
export { ShellDSL, createShellDSL, type Program } from "./shell-dsl.ts";
|
|
2
2
|
export { ShellPromise, type ShellPromiseOptions } from "./shell-promise.ts";
|
|
3
|
-
export type { VirtualFS, VirtualFSWritable, FileStat, Command, CommandContext, Stdin, Stdout, Stderr, OutputCollector, ExecResult, ShellConfig, RawValue, } from "./types.ts";
|
|
3
|
+
export type { VirtualFS, VirtualFSWritable, FileStat, Command, CommandContext, Stdin, Stdout, Stderr, OutputCollector, ExecResult, ShellConfig, ShellCommandApi, ShellRunOptions, RawValue, } from "./types.ts";
|
|
4
4
|
export { isRawValue } from "./types.ts";
|
|
5
5
|
export { ShellError, LexError, ParseError } from "./errors.ts";
|
|
6
6
|
export { Lexer, lex, tokenToString } from "./lexer/index.ts";
|
|
@@ -8,7 +8,7 @@ export type { Token, RedirectMode } from "./lexer/index.ts";
|
|
|
8
8
|
export { Parser, parse } from "./parser/index.ts";
|
|
9
9
|
export type { ASTNode, Redirect, CommandNode, PipelineNode, AndNode, OrNode, SequenceNode, WordNode, WordPart, TextPart, VariablePart, SubstitutionPart, ArithmeticPart, IfNode, ForNode, WhileNode, UntilNode, CaseNode, CaseClause, } from "./parser/index.ts";
|
|
10
10
|
export { isWordNode, isCommandNode, isPipelineNode, isAndNode, isOrNode, isSequenceNode, isIfNode, isForNode, isWhileNode, isUntilNode, isCaseNode, } from "./parser/index.ts";
|
|
11
|
-
export { Interpreter, type InterpreterOptions, BreakException, ContinueException } from "./interpreter/index.ts";
|
|
11
|
+
export { Interpreter, type InterpreterOptions, BreakException, ContinueException, ExitException } from "./interpreter/index.ts";
|
|
12
12
|
export { createVirtualFS } from "./fs/index.ts";
|
|
13
13
|
export { FileSystem, ReadOnlyFileSystem, WebFileSystem, createWebUnderlyingFS, type PathOps, type Permission, type PermissionRules, type UnderlyingFS, } from "./fs/index.ts";
|
|
14
14
|
export { createStdin, StdinImpl } from "./io/index.ts";
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { CommandContext, VirtualFS, Stdin, Stdout, Stderr, ExecResult } from "../types.ts";
|
|
1
|
+
import type { CommandContext, VirtualFS, Stdin, Stdout, Stderr, ExecResult, ShellCommandApi } from "../types.ts";
|
|
2
2
|
export interface ContextOptions {
|
|
3
3
|
args: string[];
|
|
4
4
|
stdin: Stdin;
|
|
@@ -9,5 +9,6 @@ export interface ContextOptions {
|
|
|
9
9
|
env: Record<string, string>;
|
|
10
10
|
setCwd: (path: string) => void;
|
|
11
11
|
exec?: (name: string, args: string[]) => Promise<ExecResult>;
|
|
12
|
+
shell?: ShellCommandApi;
|
|
12
13
|
}
|
|
13
14
|
export declare function createCommandContext(options: ContextOptions): CommandContext;
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export { Interpreter, type InterpreterOptions, BreakException, ContinueException } from "./interpreter.ts";
|
|
1
|
+
export { Interpreter, type InterpreterOptions, BreakException, ContinueException, ExitException } from "./interpreter.ts";
|
|
2
2
|
export { createCommandContext, type ContextOptions } from "./context.ts";
|
|
@@ -7,6 +7,9 @@ export interface InterpreterOptions {
|
|
|
7
7
|
commands: Record<string, Command>;
|
|
8
8
|
redirectObjects?: RedirectObjectMap;
|
|
9
9
|
isTTY?: boolean;
|
|
10
|
+
argv0?: string;
|
|
11
|
+
positionalParameters?: string[];
|
|
12
|
+
lastExitCode?: number;
|
|
10
13
|
}
|
|
11
14
|
export declare class BreakException extends Error {
|
|
12
15
|
levels: number;
|
|
@@ -16,6 +19,10 @@ export declare class ContinueException extends Error {
|
|
|
16
19
|
levels: number;
|
|
17
20
|
constructor(levels?: number);
|
|
18
21
|
}
|
|
22
|
+
export declare class ExitException extends Error {
|
|
23
|
+
exitCode: number;
|
|
24
|
+
constructor(exitCode: number);
|
|
25
|
+
}
|
|
19
26
|
export declare class Interpreter {
|
|
20
27
|
private fs;
|
|
21
28
|
private cwd;
|
|
@@ -24,11 +31,25 @@ export declare class Interpreter {
|
|
|
24
31
|
private redirectObjects;
|
|
25
32
|
private loopDepth;
|
|
26
33
|
private isTTY;
|
|
34
|
+
private argv0;
|
|
35
|
+
private positionalParameters;
|
|
36
|
+
private lastExitCode;
|
|
27
37
|
constructor(options: InterpreterOptions);
|
|
28
38
|
getLoopDepth(): number;
|
|
29
39
|
execute(ast: ASTNode): Promise<ExecResult>;
|
|
30
40
|
private executeNode;
|
|
31
41
|
private executeCommand;
|
|
42
|
+
private invokeCommand;
|
|
43
|
+
private invokeRegisteredCommand;
|
|
44
|
+
private createExec;
|
|
45
|
+
private createShellApi;
|
|
46
|
+
private executeExecutableFile;
|
|
47
|
+
private sourceFile;
|
|
48
|
+
private executeIsolatedShellSource;
|
|
49
|
+
private executeSourceInCurrentFrame;
|
|
50
|
+
private parseSource;
|
|
51
|
+
private loadScriptSource;
|
|
52
|
+
private parseShebang;
|
|
32
53
|
private handleRedirect;
|
|
33
54
|
private handleObjectRedirect;
|
|
34
55
|
private readFromObject;
|
|
@@ -47,6 +68,8 @@ export declare class Interpreter {
|
|
|
47
68
|
private expandWordScalar;
|
|
48
69
|
private expandWordFields;
|
|
49
70
|
private expandWordPart;
|
|
71
|
+
private getVariableValue;
|
|
72
|
+
private appendQuotedPositionalParameters;
|
|
50
73
|
private executeSubstitution;
|
|
51
74
|
private getIFS;
|
|
52
75
|
private splitUnquotedExpansion;
|
|
@@ -59,6 +82,7 @@ export declare class Interpreter {
|
|
|
59
82
|
private escapeLiteralGlobChars;
|
|
60
83
|
private evaluateArithmetic;
|
|
61
84
|
private parseArithmeticExpr;
|
|
85
|
+
private normalizeExitCode;
|
|
62
86
|
setCwd(cwd: string): void;
|
|
63
87
|
setEnv(vars: Record<string, string>): void;
|
|
64
88
|
getCwd(): string;
|
|
@@ -37,6 +37,18 @@ export interface FileStat {
|
|
|
37
37
|
mtimeMs: number;
|
|
38
38
|
}
|
|
39
39
|
export type Command = (ctx: CommandContext) => Promise<number>;
|
|
40
|
+
export interface ShellRunOptions {
|
|
41
|
+
argv0?: string;
|
|
42
|
+
args?: string[];
|
|
43
|
+
}
|
|
44
|
+
export interface ShellCommandApi {
|
|
45
|
+
eval(source: string): Promise<number>;
|
|
46
|
+
source(path: string, args?: string[]): Promise<number>;
|
|
47
|
+
runScript(path: string, args?: string[]): Promise<number>;
|
|
48
|
+
runShell(source: string, options?: ShellRunOptions): Promise<number>;
|
|
49
|
+
getLastExitCode(): number;
|
|
50
|
+
exit(exitCode?: number): never;
|
|
51
|
+
}
|
|
40
52
|
export interface CommandContext {
|
|
41
53
|
args: string[];
|
|
42
54
|
stdin: Stdin;
|
|
@@ -47,6 +59,7 @@ export interface CommandContext {
|
|
|
47
59
|
env: Record<string, string>;
|
|
48
60
|
setCwd: (path: string) => void;
|
|
49
61
|
exec?: (name: string, args: string[]) => Promise<ExecResult>;
|
|
62
|
+
shell?: ShellCommandApi;
|
|
50
63
|
}
|
|
51
64
|
export interface Stdin {
|
|
52
65
|
stream(): AsyncIterable<Uint8Array>;
|
package/package.json
CHANGED