shell-dsl 0.0.16 → 0.0.18
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/dist/cjs/package.json +1 -1
- package/dist/cjs/src/commands/grep/grep.cjs +25 -2
- package/dist/cjs/src/commands/grep/grep.cjs.map +3 -3
- package/dist/cjs/src/lexer/lexer.cjs +16 -2
- package/dist/cjs/src/lexer/lexer.cjs.map +3 -3
- package/dist/cjs/src/parser/parser.cjs +2 -2
- package/dist/cjs/src/parser/parser.cjs.map +3 -3
- package/dist/mjs/package.json +1 -1
- package/dist/mjs/src/commands/grep/grep.mjs +25 -2
- package/dist/mjs/src/commands/grep/grep.mjs.map +3 -3
- package/dist/mjs/src/lexer/lexer.mjs +16 -2
- package/dist/mjs/src/lexer/lexer.mjs.map +3 -3
- package/dist/mjs/src/parser/parser.mjs +2 -2
- package/dist/mjs/src/parser/parser.mjs.map +3 -3
- package/dist/types/src/lexer/lexer.d.ts +1 -0
- package/package.json +1 -1
package/dist/cjs/package.json
CHANGED
|
@@ -188,7 +188,30 @@ function buildMatcher(options) {
|
|
|
188
188
|
if (options.fixedStrings) {
|
|
189
189
|
patterns = patterns.map(escapeRegex);
|
|
190
190
|
} else {
|
|
191
|
-
patterns = patterns.map((p) =>
|
|
191
|
+
patterns = patterns.map((p) => {
|
|
192
|
+
const hasBRE = /\\\||\\\(|\\\)/.test(p);
|
|
193
|
+
if (!hasBRE)
|
|
194
|
+
return p;
|
|
195
|
+
let result = "";
|
|
196
|
+
for (let i = 0;i < p.length; i++) {
|
|
197
|
+
const ch = p[i];
|
|
198
|
+
if (ch === "\\" && i + 1 < p.length) {
|
|
199
|
+
const next = p[i + 1];
|
|
200
|
+
if (next === "|" || next === "(" || next === ")") {
|
|
201
|
+
result += next;
|
|
202
|
+
i++;
|
|
203
|
+
} else {
|
|
204
|
+
result += ch + next;
|
|
205
|
+
i++;
|
|
206
|
+
}
|
|
207
|
+
} else if ("()+?{}".includes(ch)) {
|
|
208
|
+
result += "\\" + ch;
|
|
209
|
+
} else {
|
|
210
|
+
result += ch;
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
return result;
|
|
214
|
+
});
|
|
192
215
|
}
|
|
193
216
|
let combined = patterns.length > 1 ? patterns.map((p) => `(?:${p})`).join("|") : patterns[0] || "";
|
|
194
217
|
if (options.wholeWord) {
|
|
@@ -536,4 +559,4 @@ var grep = async (ctx) => {
|
|
|
536
559
|
return globalFound ? 0 : 1;
|
|
537
560
|
};
|
|
538
561
|
|
|
539
|
-
//# debugId=
|
|
562
|
+
//# debugId=0DA7A6C9DEDCF42D64756E2164756E21
|
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../src/commands/grep/grep.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
|
-
"import type { Command } from \"../../types.cjs\";\nimport { createFlagParser, type FlagDefinition, type FlagError } from \"../../utils/flag-parser.cjs\";\n\ninterface GrepOptions {\n patterns: string[];\n extendedRegex: boolean; // -E (default for JS)\n fixedStrings: boolean; // -F\n ignoreCase: boolean; // -i\n wholeWord: boolean; // -w\n wholeLine: boolean; // -x\n invert: boolean; // -v\n countOnly: boolean; // -c\n filesWithMatches: boolean; // -l\n filesWithoutMatches: boolean; // -L\n showLineNumbers: boolean; // -n\n onlyMatching: boolean; // -o\n quiet: boolean; // -q\n maxMatches: number; // -m (0 = unlimited)\n showFilename: boolean | null; // null=auto, true=-H, false=-h\n beforeContext: number; // -B\n afterContext: number; // -A\n recursive: boolean; // -r/-R\n include: string[]; // --include\n exclude: string[]; // --exclude\n}\n\nconst spec = {\n name: \"grep\",\n flags: [\n { short: \"E\", long: \"extended-regexp\" },\n { short: \"F\", long: \"fixed-strings\" },\n { short: \"i\", long: \"ignore-case\" },\n { short: \"w\", long: \"word-regexp\" },\n { short: \"x\", long: \"line-regexp\" },\n { short: \"v\", long: \"invert-match\" },\n { short: \"c\", long: \"count\" },\n { short: \"l\", long: \"files-with-matches\" },\n { short: \"L\", long: \"files-without-match\" },\n { short: \"n\", long: \"line-number\" },\n { short: \"o\", long: \"only-matching\" },\n { short: \"q\", long: \"quiet\" },\n { short: \"H\", long: \"with-filename\" },\n { short: \"h\", long: \"no-filename\" },\n { short: \"r\", long: \"recursive\" },\n { short: \"R\" },\n { short: \"e\", long: \"regexp\", takesValue: true },\n { short: \"m\", long: \"max-count\", takesValue: true },\n { short: \"A\", long: \"after-context\", takesValue: true },\n { short: \"B\", long: \"before-context\", takesValue: true },\n { short: \"C\", long: \"context\", takesValue: true },\n { long: \"include\", takesValue: true },\n { long: \"exclude\", takesValue: true },\n ] as FlagDefinition[],\n usage: \"grep [-ivnclLqHhEFwxorR] [-e pattern] [-m num] pattern [file ...]\",\n};\n\nfunction createDefaults(): GrepOptions {\n return {\n patterns: [],\n extendedRegex: true, // JS regex is extended by default\n fixedStrings: false,\n ignoreCase: false,\n wholeWord: false,\n wholeLine: false,\n invert: false,\n countOnly: false,\n filesWithMatches: false,\n filesWithoutMatches: false,\n showLineNumbers: false,\n onlyMatching: false,\n quiet: false,\n maxMatches: 0,\n showFilename: null,\n beforeContext: 0,\n afterContext: 0,\n recursive: false,\n include: [],\n exclude: [],\n };\n}\n\nconst handler = (flags: GrepOptions, flag: FlagDefinition, value?: string) => {\n switch (flag.short) {\n case \"E\": flags.extendedRegex = true; break;\n case \"F\": flags.fixedStrings = true; break;\n case \"i\": flags.ignoreCase = true; break;\n case \"w\": flags.wholeWord = true; break;\n case \"x\": flags.wholeLine = true; break;\n case \"v\": flags.invert = true; break;\n case \"c\": flags.countOnly = true; break;\n case \"l\": flags.filesWithMatches = true; break;\n case \"L\": flags.filesWithoutMatches = true; break;\n case \"n\": flags.showLineNumbers = true; break;\n case \"o\": flags.onlyMatching = true; break;\n case \"q\": flags.quiet = true; break;\n case \"H\": flags.showFilename = true; break;\n case \"h\": flags.showFilename = false; break;\n case \"r\":\n case \"R\": flags.recursive = true; break;\n case \"e\": if (value) flags.patterns.push(value); break;\n case \"m\": if (value) flags.maxMatches = parseInt(value, 10); break;\n case \"A\": if (value) flags.afterContext = parseInt(value, 10); break;\n case \"B\": if (value) flags.beforeContext = parseInt(value, 10); break;\n case \"C\":\n if (value) {\n const num = parseInt(value, 10);\n flags.beforeContext = num;\n flags.afterContext = num;\n }\n break;\n default:\n // Handle long-only flags\n if (flag.long === \"include\" && value) flags.include.push(value);\n else if (flag.long === \"exclude\" && value) flags.exclude.push(value);\n break;\n }\n};\n\nfunction matchGlob(str: string, pattern: string): boolean {\n // Convert shell glob to regex: * -> .*, ? -> ., rest escaped\n let re = \"^\";\n for (const ch of pattern) {\n if (ch === \"*\") re += \".*\";\n else if (ch === \"?\") re += \".\";\n else if (/[.+^${}()|[\\]\\\\]/.test(ch)) re += \"\\\\\" + ch;\n else re += ch;\n }\n re += \"$\";\n return new RegExp(re).test(str);\n}\n\nfunction escapeRegex(str: string): string {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\nfunction buildMatcher(options: GrepOptions): RegExp {\n let patterns = options.patterns;\n\n // If fixed strings mode, escape regex metacharacters\n if (options.fixedStrings) {\n patterns = patterns.map(escapeRegex);\n } else {\n // Support BRE-style \\| \\( \\) even in ERE mode for compatibility\n patterns = patterns.map(p => p.replace(/\\\\\\|/g, \"|\").replace(/\\\\\\(/g, \"(\").replace(/\\\\\\)/g, \")\"));\n }\n\n // Combine multiple patterns with OR\n let combined = patterns.length > 1 ? patterns.map(p => `(?:${p})`).join(\"|\") : patterns[0] || \"\";\n\n // Whole word match\n if (options.wholeWord) {\n combined = `\\\\b(?:${combined})\\\\b`;\n }\n\n // Whole line match\n if (options.wholeLine) {\n combined = `^(?:${combined})$`;\n }\n\n const flags = options.ignoreCase ? \"gi\" : \"g\";\n return new RegExp(combined, flags);\n}\n\nexport const grep: Command = async (ctx) => {\n // Create fresh parser with fresh defaults for each invocation\n const parser = createFlagParser(spec, createDefaults(), handler);\n const result = parser.parse(ctx.args);\n\n if (result.error) {\n await parser.writeError(result.error, ctx.stderr);\n return 1;\n }\n\n const options = result.flags;\n const args = result.args;\n\n // First positional arg is pattern if no -e patterns\n let files: string[];\n if (options.patterns.length === 0) {\n if (args.length === 0) {\n await ctx.stderr.writeText(\"grep: missing pattern\\n\");\n return 1;\n }\n options.patterns.push(args[0]!);\n files = args.slice(1);\n } else {\n files = args;\n }\n\n let regex: RegExp;\n try {\n regex = buildMatcher(options);\n } catch (err) {\n await ctx.stderr.writeText(`grep: invalid pattern: ${options.patterns.join(\", \")}\\n`);\n return 1;\n }\n\n let globalFound = false;\n let globalMatchCount = 0;\n let earlyExit = false;\n\n // Determine filename display mode\n let showFilenames = options.showFilename;\n\n // Expand files if recursive\n let expandedFiles = files;\n if (options.recursive && files.length > 0) {\n expandedFiles = [];\n for (const file of files) {\n const path = ctx.fs.resolve(ctx.cwd, file);\n try {\n const stat = await ctx.fs.stat(path);\n if (stat.isDirectory()) {\n // Glob all files in directory\n const globbed = await ctx.fs.glob(\"**/*\", { cwd: path });\n for (const f of globbed) {\n const fullPath = ctx.fs.resolve(path, f);\n try {\n const s = await ctx.fs.stat(fullPath);\n if (s.isFile()) {\n expandedFiles.push(fullPath);\n }\n } catch {\n // Skip if can't stat\n }\n }\n } else {\n expandedFiles.push(path);\n }\n } catch {\n expandedFiles.push(path); // Will error later\n }\n }\n // Filter by include/exclude patterns\n if (options.include.length > 0 || options.exclude.length > 0) {\n expandedFiles = expandedFiles.filter((f) => {\n const basename = ctx.fs.basename(f);\n if (options.include.length > 0) {\n const included = options.include.some((pat) => matchGlob(basename, pat));\n if (!included) return false;\n }\n if (options.exclude.length > 0) {\n const excluded = options.exclude.some((pat) => matchGlob(basename, pat));\n if (excluded) return false;\n }\n return true;\n });\n }\n\n // Default to showing filenames for recursive\n if (showFilenames === null) {\n showFilenames = true;\n }\n }\n\n // Default: show filenames if multiple files\n if (showFilenames === null) {\n showFilenames = expandedFiles.length > 1;\n }\n\n const processContent = async (\n lines: string[],\n filename?: string\n ): Promise<{ found: boolean; count: number }> => {\n let fileFound = false;\n let fileMatchCount = 0;\n\n // For context lines, we need a buffer approach\n const hasContext = options.beforeContext > 0 || options.afterContext > 0;\n\n if (hasContext) {\n return await processWithContext(lines, filename);\n }\n\n for (let lineIdx = 0; lineIdx < lines.length && !earlyExit; lineIdx++) {\n const line = lines[lineIdx]!;\n const lineNum = lineIdx + 1;\n\n // Reset regex lastIndex for each line\n regex.lastIndex = 0;\n const matches = regex.test(line);\n const shouldOutput = options.invert ? !matches : matches;\n\n if (shouldOutput) {\n fileFound = true;\n fileMatchCount++;\n\n // Quiet mode: exit immediately on first match\n if (options.quiet) {\n earlyExit = true;\n return { found: true, count: 1 };\n }\n\n // -l mode: we found a match in this file, stop processing this file\n if (options.filesWithMatches) {\n return { found: true, count: 1 };\n }\n\n // Output the match (unless countOnly or filesWithoutMatches)\n if (!options.countOnly && !options.filesWithoutMatches) {\n if (options.onlyMatching && !options.invert) {\n // Output only the matched parts\n regex.lastIndex = 0;\n let match;\n while ((match = regex.exec(line)) !== null) {\n let output = \"\";\n if (filename && showFilenames) output += filename + \":\";\n if (options.showLineNumbers) output += lineNum + \":\";\n output += match[0] + \"\\n\";\n await ctx.stdout.writeText(output);\n // Prevent infinite loop for zero-width matches\n if (match[0].length === 0) regex.lastIndex++;\n }\n } else {\n let output = \"\";\n if (filename && showFilenames) output += filename + \":\";\n if (options.showLineNumbers) output += lineNum + \":\";\n output += line + \"\\n\";\n await ctx.stdout.writeText(output);\n }\n }\n\n // Check max matches\n if (options.maxMatches > 0 && fileMatchCount >= options.maxMatches) {\n earlyExit = true;\n return { found: true, count: fileMatchCount };\n }\n }\n }\n\n return { found: fileFound, count: fileMatchCount };\n };\n\n const processWithContext = async (\n lines: string[],\n filename?: string\n ): Promise<{ found: boolean; count: number }> => {\n let fileFound = false;\n let fileMatchCount = 0;\n let lastPrintedLine = -1;\n\n // First pass: find all matching lines\n const matchingLines = new Set<number>();\n for (let lineIdx = 0; lineIdx < lines.length; lineIdx++) {\n const line = lines[lineIdx]!;\n regex.lastIndex = 0;\n const matches = regex.test(line);\n const shouldOutput = options.invert ? !matches : matches;\n if (shouldOutput) {\n matchingLines.add(lineIdx);\n }\n }\n\n // Determine which lines to print (matches + context)\n const linesToPrint = new Set<number>();\n for (const matchIdx of matchingLines) {\n // Add before context\n for (let i = Math.max(0, matchIdx - options.beforeContext); i < matchIdx; i++) {\n linesToPrint.add(i);\n }\n // Add the match itself\n linesToPrint.add(matchIdx);\n // Add after context\n for (let i = matchIdx + 1; i <= Math.min(lines.length - 1, matchIdx + options.afterContext); i++) {\n linesToPrint.add(i);\n }\n }\n\n // Sort and print\n const sortedLines = Array.from(linesToPrint).sort((a, b) => a - b);\n\n for (let i = 0; i < sortedLines.length && !earlyExit; i++) {\n const lineIdx = sortedLines[i]!;\n const line = lines[lineIdx]!;\n const lineNum = lineIdx + 1;\n const isMatch = matchingLines.has(lineIdx);\n\n // Print separator if there's a gap\n if (lastPrintedLine >= 0 && lineIdx > lastPrintedLine + 1) {\n await ctx.stdout.writeText(\"--\\n\");\n }\n\n if (isMatch) {\n fileFound = true;\n fileMatchCount++;\n\n if (options.quiet) {\n earlyExit = true;\n return { found: true, count: 1 };\n }\n\n if (options.filesWithMatches) {\n return { found: true, count: 1 };\n }\n\n if (!options.countOnly && !options.filesWithoutMatches) {\n if (options.onlyMatching && !options.invert) {\n regex.lastIndex = 0;\n let match;\n while ((match = regex.exec(line)) !== null) {\n let output = \"\";\n if (filename && showFilenames) output += filename + \":\";\n if (options.showLineNumbers) output += lineNum + \":\";\n output += match[0] + \"\\n\";\n await ctx.stdout.writeText(output);\n if (match[0].length === 0) regex.lastIndex++;\n }\n } else {\n let output = \"\";\n if (filename && showFilenames) output += filename + \":\";\n if (options.showLineNumbers) output += lineNum + \":\";\n output += line + \"\\n\";\n await ctx.stdout.writeText(output);\n }\n }\n\n if (options.maxMatches > 0 && fileMatchCount >= options.maxMatches) {\n // Still need to output remaining context lines after this match\n // Continue to output context but mark we should stop looking for more matches\n const remainingContextLines = sortedLines.slice(i + 1).filter(idx => !matchingLines.has(idx));\n for (const contextIdx of remainingContextLines) {\n const contextLine = lines[contextIdx]!;\n const contextLineNum = contextIdx + 1;\n // Check if it's within after-context of current match\n if (contextIdx <= lineIdx + options.afterContext) {\n if (lastPrintedLine >= 0 && contextIdx > lastPrintedLine + 1) {\n await ctx.stdout.writeText(\"--\\n\");\n }\n if (!options.countOnly && !options.filesWithoutMatches) {\n let output = \"\";\n if (filename && showFilenames) output += filename + \"-\";\n if (options.showLineNumbers) output += contextLineNum + \"-\";\n output += contextLine + \"\\n\";\n await ctx.stdout.writeText(output);\n }\n lastPrintedLine = contextIdx;\n }\n }\n earlyExit = true;\n return { found: true, count: fileMatchCount };\n }\n } else {\n // Context line\n if (!options.countOnly && !options.filesWithoutMatches) {\n let output = \"\";\n if (filename && showFilenames) output += filename + \"-\";\n if (options.showLineNumbers) output += lineNum + \"-\";\n output += line + \"\\n\";\n await ctx.stdout.writeText(output);\n }\n }\n\n lastPrintedLine = lineIdx;\n }\n\n return { found: fileFound, count: fileMatchCount };\n };\n\n if (expandedFiles.length === 0) {\n // Read from stdin\n const content = await ctx.stdin.text();\n const lines = content.split(\"\\n\");\n // Remove trailing empty line if content ends with newline\n if (lines.length > 0 && lines[lines.length - 1] === \"\") {\n lines.pop();\n }\n\n const { found, count } = await processContent(lines);\n globalFound = found;\n globalMatchCount = count;\n\n if (options.countOnly && !options.quiet && !options.filesWithMatches && !options.filesWithoutMatches) {\n await ctx.stdout.writeText(globalMatchCount + \"\\n\");\n }\n } else {\n // Read from files\n const perFileResults: Map<string, { found: boolean; count: number }> = new Map();\n\n for (const file of expandedFiles) {\n if (earlyExit && options.quiet) break;\n\n try {\n const path = file.startsWith(\"/\") ? file : ctx.fs.resolve(ctx.cwd, file);\n const stat = await ctx.fs.stat(path);\n\n if (stat.isDirectory()) {\n if (!options.recursive) {\n await ctx.stderr.writeText(`grep: ${file}: Is a directory\\n`);\n }\n continue;\n }\n\n const content = await ctx.fs.readFile(path);\n const lines = content.toString().split(\"\\n\");\n\n // Remove trailing empty line if file ends with newline\n if (lines.length > 0 && lines[lines.length - 1] === \"\") {\n lines.pop();\n }\n\n // Use original filename for display, not resolved path\n const displayName = files.includes(file) ? file :\n (options.recursive ? path : file);\n\n const { found, count } = await processContent(lines, displayName);\n perFileResults.set(displayName, { found, count });\n\n if (found) {\n globalFound = true;\n globalMatchCount += count;\n }\n } catch (err) {\n await ctx.stderr.writeText(`grep: ${file}: No such file or directory\\n`);\n // Continue to other files instead of immediately returning\n if (expandedFiles.length === 1) {\n return 1;\n }\n }\n }\n\n // Handle -l, -L, -c output modes\n let hasFilesWithoutMatches = false;\n if (options.filesWithMatches) {\n for (const [filename, result] of perFileResults) {\n if (result.found && !options.quiet) {\n await ctx.stdout.writeText(filename + \"\\n\");\n }\n }\n } else if (options.filesWithoutMatches) {\n for (const [filename, result] of perFileResults) {\n if (!result.found) {\n hasFilesWithoutMatches = true;\n await ctx.stdout.writeText(filename + \"\\n\");\n }\n }\n } else if (options.countOnly && !options.quiet) {\n for (const [filename, result] of perFileResults) {\n if (showFilenames) {\n await ctx.stdout.writeText(`${filename}:${result.count}\\n`);\n } else {\n await ctx.stdout.writeText(result.count + \"\\n\");\n }\n }\n }\n\n // Determine exit code for file processing\n if (options.filesWithoutMatches) {\n // -L: success if any file had NO matches\n return hasFilesWithoutMatches ? 0 : 1;\n }\n }\n\n // Determine exit code\n return globalFound ? 0 : 1;\n};\n"
|
|
5
|
+
"import type { Command } from \"../../types.cjs\";\nimport { createFlagParser, type FlagDefinition, type FlagError } from \"../../utils/flag-parser.cjs\";\n\ninterface GrepOptions {\n patterns: string[];\n extendedRegex: boolean; // -E (default for JS)\n fixedStrings: boolean; // -F\n ignoreCase: boolean; // -i\n wholeWord: boolean; // -w\n wholeLine: boolean; // -x\n invert: boolean; // -v\n countOnly: boolean; // -c\n filesWithMatches: boolean; // -l\n filesWithoutMatches: boolean; // -L\n showLineNumbers: boolean; // -n\n onlyMatching: boolean; // -o\n quiet: boolean; // -q\n maxMatches: number; // -m (0 = unlimited)\n showFilename: boolean | null; // null=auto, true=-H, false=-h\n beforeContext: number; // -B\n afterContext: number; // -A\n recursive: boolean; // -r/-R\n include: string[]; // --include\n exclude: string[]; // --exclude\n}\n\nconst spec = {\n name: \"grep\",\n flags: [\n { short: \"E\", long: \"extended-regexp\" },\n { short: \"F\", long: \"fixed-strings\" },\n { short: \"i\", long: \"ignore-case\" },\n { short: \"w\", long: \"word-regexp\" },\n { short: \"x\", long: \"line-regexp\" },\n { short: \"v\", long: \"invert-match\" },\n { short: \"c\", long: \"count\" },\n { short: \"l\", long: \"files-with-matches\" },\n { short: \"L\", long: \"files-without-match\" },\n { short: \"n\", long: \"line-number\" },\n { short: \"o\", long: \"only-matching\" },\n { short: \"q\", long: \"quiet\" },\n { short: \"H\", long: \"with-filename\" },\n { short: \"h\", long: \"no-filename\" },\n { short: \"r\", long: \"recursive\" },\n { short: \"R\" },\n { short: \"e\", long: \"regexp\", takesValue: true },\n { short: \"m\", long: \"max-count\", takesValue: true },\n { short: \"A\", long: \"after-context\", takesValue: true },\n { short: \"B\", long: \"before-context\", takesValue: true },\n { short: \"C\", long: \"context\", takesValue: true },\n { long: \"include\", takesValue: true },\n { long: \"exclude\", takesValue: true },\n ] as FlagDefinition[],\n usage: \"grep [-ivnclLqHhEFwxorR] [-e pattern] [-m num] pattern [file ...]\",\n};\n\nfunction createDefaults(): GrepOptions {\n return {\n patterns: [],\n extendedRegex: true, // JS regex is extended by default\n fixedStrings: false,\n ignoreCase: false,\n wholeWord: false,\n wholeLine: false,\n invert: false,\n countOnly: false,\n filesWithMatches: false,\n filesWithoutMatches: false,\n showLineNumbers: false,\n onlyMatching: false,\n quiet: false,\n maxMatches: 0,\n showFilename: null,\n beforeContext: 0,\n afterContext: 0,\n recursive: false,\n include: [],\n exclude: [],\n };\n}\n\nconst handler = (flags: GrepOptions, flag: FlagDefinition, value?: string) => {\n switch (flag.short) {\n case \"E\": flags.extendedRegex = true; break;\n case \"F\": flags.fixedStrings = true; break;\n case \"i\": flags.ignoreCase = true; break;\n case \"w\": flags.wholeWord = true; break;\n case \"x\": flags.wholeLine = true; break;\n case \"v\": flags.invert = true; break;\n case \"c\": flags.countOnly = true; break;\n case \"l\": flags.filesWithMatches = true; break;\n case \"L\": flags.filesWithoutMatches = true; break;\n case \"n\": flags.showLineNumbers = true; break;\n case \"o\": flags.onlyMatching = true; break;\n case \"q\": flags.quiet = true; break;\n case \"H\": flags.showFilename = true; break;\n case \"h\": flags.showFilename = false; break;\n case \"r\":\n case \"R\": flags.recursive = true; break;\n case \"e\": if (value) flags.patterns.push(value); break;\n case \"m\": if (value) flags.maxMatches = parseInt(value, 10); break;\n case \"A\": if (value) flags.afterContext = parseInt(value, 10); break;\n case \"B\": if (value) flags.beforeContext = parseInt(value, 10); break;\n case \"C\":\n if (value) {\n const num = parseInt(value, 10);\n flags.beforeContext = num;\n flags.afterContext = num;\n }\n break;\n default:\n // Handle long-only flags\n if (flag.long === \"include\" && value) flags.include.push(value);\n else if (flag.long === \"exclude\" && value) flags.exclude.push(value);\n break;\n }\n};\n\nfunction matchGlob(str: string, pattern: string): boolean {\n // Convert shell glob to regex: * -> .*, ? -> ., rest escaped\n let re = \"^\";\n for (const ch of pattern) {\n if (ch === \"*\") re += \".*\";\n else if (ch === \"?\") re += \".\";\n else if (/[.+^${}()|[\\]\\\\]/.test(ch)) re += \"\\\\\" + ch;\n else re += ch;\n }\n re += \"$\";\n return new RegExp(re).test(str);\n}\n\nfunction escapeRegex(str: string): string {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\nfunction buildMatcher(options: GrepOptions): RegExp {\n let patterns = options.patterns;\n\n // If fixed strings mode, escape regex metacharacters\n if (options.fixedStrings) {\n patterns = patterns.map(escapeRegex);\n } else {\n // Convert BRE patterns to ERE/JavaScript RegExp\n // In BRE: \\| \\( \\) are special; bare ( ) + ? { } are literal\n // In ERE/JS: | ( ) + ? { } are special; \\| \\( \\) are literal\n patterns = patterns.map(p => {\n const hasBRE = /\\\\\\||\\\\\\(|\\\\\\)/.test(p);\n if (!hasBRE) return p;\n let result = \"\";\n for (let i = 0; i < p.length; i++) {\n const ch = p[i]!;\n if (ch === \"\\\\\" && i + 1 < p.length) {\n const next = p[i + 1]!;\n if (next === \"|\" || next === \"(\" || next === \")\") {\n // BRE special → ERE special (emit unescaped)\n result += next;\n i++;\n } else {\n result += ch + next;\n i++;\n }\n } else if (\"()+?{}\".includes(ch)) {\n // Bare metachar is literal in BRE → escape for ERE\n result += \"\\\\\" + ch;\n } else {\n result += ch;\n }\n }\n return result;\n });\n }\n\n // Combine multiple patterns with OR\n let combined = patterns.length > 1 ? patterns.map(p => `(?:${p})`).join(\"|\") : patterns[0] || \"\";\n\n // Whole word match\n if (options.wholeWord) {\n combined = `\\\\b(?:${combined})\\\\b`;\n }\n\n // Whole line match\n if (options.wholeLine) {\n combined = `^(?:${combined})$`;\n }\n\n const flags = options.ignoreCase ? \"gi\" : \"g\";\n return new RegExp(combined, flags);\n}\n\nexport const grep: Command = async (ctx) => {\n // Create fresh parser with fresh defaults for each invocation\n const parser = createFlagParser(spec, createDefaults(), handler);\n const result = parser.parse(ctx.args);\n\n if (result.error) {\n await parser.writeError(result.error, ctx.stderr);\n return 1;\n }\n\n const options = result.flags;\n const args = result.args;\n\n // First positional arg is pattern if no -e patterns\n let files: string[];\n if (options.patterns.length === 0) {\n if (args.length === 0) {\n await ctx.stderr.writeText(\"grep: missing pattern\\n\");\n return 1;\n }\n options.patterns.push(args[0]!);\n files = args.slice(1);\n } else {\n files = args;\n }\n\n let regex: RegExp;\n try {\n regex = buildMatcher(options);\n } catch (err) {\n await ctx.stderr.writeText(`grep: invalid pattern: ${options.patterns.join(\", \")}\\n`);\n return 1;\n }\n\n let globalFound = false;\n let globalMatchCount = 0;\n let earlyExit = false;\n\n // Determine filename display mode\n let showFilenames = options.showFilename;\n\n // Expand files if recursive\n let expandedFiles = files;\n if (options.recursive && files.length > 0) {\n expandedFiles = [];\n for (const file of files) {\n const path = ctx.fs.resolve(ctx.cwd, file);\n try {\n const stat = await ctx.fs.stat(path);\n if (stat.isDirectory()) {\n // Glob all files in directory\n const globbed = await ctx.fs.glob(\"**/*\", { cwd: path });\n for (const f of globbed) {\n const fullPath = ctx.fs.resolve(path, f);\n try {\n const s = await ctx.fs.stat(fullPath);\n if (s.isFile()) {\n expandedFiles.push(fullPath);\n }\n } catch {\n // Skip if can't stat\n }\n }\n } else {\n expandedFiles.push(path);\n }\n } catch {\n expandedFiles.push(path); // Will error later\n }\n }\n // Filter by include/exclude patterns\n if (options.include.length > 0 || options.exclude.length > 0) {\n expandedFiles = expandedFiles.filter((f) => {\n const basename = ctx.fs.basename(f);\n if (options.include.length > 0) {\n const included = options.include.some((pat) => matchGlob(basename, pat));\n if (!included) return false;\n }\n if (options.exclude.length > 0) {\n const excluded = options.exclude.some((pat) => matchGlob(basename, pat));\n if (excluded) return false;\n }\n return true;\n });\n }\n\n // Default to showing filenames for recursive\n if (showFilenames === null) {\n showFilenames = true;\n }\n }\n\n // Default: show filenames if multiple files\n if (showFilenames === null) {\n showFilenames = expandedFiles.length > 1;\n }\n\n const processContent = async (\n lines: string[],\n filename?: string\n ): Promise<{ found: boolean; count: number }> => {\n let fileFound = false;\n let fileMatchCount = 0;\n\n // For context lines, we need a buffer approach\n const hasContext = options.beforeContext > 0 || options.afterContext > 0;\n\n if (hasContext) {\n return await processWithContext(lines, filename);\n }\n\n for (let lineIdx = 0; lineIdx < lines.length && !earlyExit; lineIdx++) {\n const line = lines[lineIdx]!;\n const lineNum = lineIdx + 1;\n\n // Reset regex lastIndex for each line\n regex.lastIndex = 0;\n const matches = regex.test(line);\n const shouldOutput = options.invert ? !matches : matches;\n\n if (shouldOutput) {\n fileFound = true;\n fileMatchCount++;\n\n // Quiet mode: exit immediately on first match\n if (options.quiet) {\n earlyExit = true;\n return { found: true, count: 1 };\n }\n\n // -l mode: we found a match in this file, stop processing this file\n if (options.filesWithMatches) {\n return { found: true, count: 1 };\n }\n\n // Output the match (unless countOnly or filesWithoutMatches)\n if (!options.countOnly && !options.filesWithoutMatches) {\n if (options.onlyMatching && !options.invert) {\n // Output only the matched parts\n regex.lastIndex = 0;\n let match;\n while ((match = regex.exec(line)) !== null) {\n let output = \"\";\n if (filename && showFilenames) output += filename + \":\";\n if (options.showLineNumbers) output += lineNum + \":\";\n output += match[0] + \"\\n\";\n await ctx.stdout.writeText(output);\n // Prevent infinite loop for zero-width matches\n if (match[0].length === 0) regex.lastIndex++;\n }\n } else {\n let output = \"\";\n if (filename && showFilenames) output += filename + \":\";\n if (options.showLineNumbers) output += lineNum + \":\";\n output += line + \"\\n\";\n await ctx.stdout.writeText(output);\n }\n }\n\n // Check max matches\n if (options.maxMatches > 0 && fileMatchCount >= options.maxMatches) {\n earlyExit = true;\n return { found: true, count: fileMatchCount };\n }\n }\n }\n\n return { found: fileFound, count: fileMatchCount };\n };\n\n const processWithContext = async (\n lines: string[],\n filename?: string\n ): Promise<{ found: boolean; count: number }> => {\n let fileFound = false;\n let fileMatchCount = 0;\n let lastPrintedLine = -1;\n\n // First pass: find all matching lines\n const matchingLines = new Set<number>();\n for (let lineIdx = 0; lineIdx < lines.length; lineIdx++) {\n const line = lines[lineIdx]!;\n regex.lastIndex = 0;\n const matches = regex.test(line);\n const shouldOutput = options.invert ? !matches : matches;\n if (shouldOutput) {\n matchingLines.add(lineIdx);\n }\n }\n\n // Determine which lines to print (matches + context)\n const linesToPrint = new Set<number>();\n for (const matchIdx of matchingLines) {\n // Add before context\n for (let i = Math.max(0, matchIdx - options.beforeContext); i < matchIdx; i++) {\n linesToPrint.add(i);\n }\n // Add the match itself\n linesToPrint.add(matchIdx);\n // Add after context\n for (let i = matchIdx + 1; i <= Math.min(lines.length - 1, matchIdx + options.afterContext); i++) {\n linesToPrint.add(i);\n }\n }\n\n // Sort and print\n const sortedLines = Array.from(linesToPrint).sort((a, b) => a - b);\n\n for (let i = 0; i < sortedLines.length && !earlyExit; i++) {\n const lineIdx = sortedLines[i]!;\n const line = lines[lineIdx]!;\n const lineNum = lineIdx + 1;\n const isMatch = matchingLines.has(lineIdx);\n\n // Print separator if there's a gap\n if (lastPrintedLine >= 0 && lineIdx > lastPrintedLine + 1) {\n await ctx.stdout.writeText(\"--\\n\");\n }\n\n if (isMatch) {\n fileFound = true;\n fileMatchCount++;\n\n if (options.quiet) {\n earlyExit = true;\n return { found: true, count: 1 };\n }\n\n if (options.filesWithMatches) {\n return { found: true, count: 1 };\n }\n\n if (!options.countOnly && !options.filesWithoutMatches) {\n if (options.onlyMatching && !options.invert) {\n regex.lastIndex = 0;\n let match;\n while ((match = regex.exec(line)) !== null) {\n let output = \"\";\n if (filename && showFilenames) output += filename + \":\";\n if (options.showLineNumbers) output += lineNum + \":\";\n output += match[0] + \"\\n\";\n await ctx.stdout.writeText(output);\n if (match[0].length === 0) regex.lastIndex++;\n }\n } else {\n let output = \"\";\n if (filename && showFilenames) output += filename + \":\";\n if (options.showLineNumbers) output += lineNum + \":\";\n output += line + \"\\n\";\n await ctx.stdout.writeText(output);\n }\n }\n\n if (options.maxMatches > 0 && fileMatchCount >= options.maxMatches) {\n // Still need to output remaining context lines after this match\n // Continue to output context but mark we should stop looking for more matches\n const remainingContextLines = sortedLines.slice(i + 1).filter(idx => !matchingLines.has(idx));\n for (const contextIdx of remainingContextLines) {\n const contextLine = lines[contextIdx]!;\n const contextLineNum = contextIdx + 1;\n // Check if it's within after-context of current match\n if (contextIdx <= lineIdx + options.afterContext) {\n if (lastPrintedLine >= 0 && contextIdx > lastPrintedLine + 1) {\n await ctx.stdout.writeText(\"--\\n\");\n }\n if (!options.countOnly && !options.filesWithoutMatches) {\n let output = \"\";\n if (filename && showFilenames) output += filename + \"-\";\n if (options.showLineNumbers) output += contextLineNum + \"-\";\n output += contextLine + \"\\n\";\n await ctx.stdout.writeText(output);\n }\n lastPrintedLine = contextIdx;\n }\n }\n earlyExit = true;\n return { found: true, count: fileMatchCount };\n }\n } else {\n // Context line\n if (!options.countOnly && !options.filesWithoutMatches) {\n let output = \"\";\n if (filename && showFilenames) output += filename + \"-\";\n if (options.showLineNumbers) output += lineNum + \"-\";\n output += line + \"\\n\";\n await ctx.stdout.writeText(output);\n }\n }\n\n lastPrintedLine = lineIdx;\n }\n\n return { found: fileFound, count: fileMatchCount };\n };\n\n if (expandedFiles.length === 0) {\n // Read from stdin\n const content = await ctx.stdin.text();\n const lines = content.split(\"\\n\");\n // Remove trailing empty line if content ends with newline\n if (lines.length > 0 && lines[lines.length - 1] === \"\") {\n lines.pop();\n }\n\n const { found, count } = await processContent(lines);\n globalFound = found;\n globalMatchCount = count;\n\n if (options.countOnly && !options.quiet && !options.filesWithMatches && !options.filesWithoutMatches) {\n await ctx.stdout.writeText(globalMatchCount + \"\\n\");\n }\n } else {\n // Read from files\n const perFileResults: Map<string, { found: boolean; count: number }> = new Map();\n\n for (const file of expandedFiles) {\n if (earlyExit && options.quiet) break;\n\n try {\n const path = file.startsWith(\"/\") ? file : ctx.fs.resolve(ctx.cwd, file);\n const stat = await ctx.fs.stat(path);\n\n if (stat.isDirectory()) {\n if (!options.recursive) {\n await ctx.stderr.writeText(`grep: ${file}: Is a directory\\n`);\n }\n continue;\n }\n\n const content = await ctx.fs.readFile(path);\n const lines = content.toString().split(\"\\n\");\n\n // Remove trailing empty line if file ends with newline\n if (lines.length > 0 && lines[lines.length - 1] === \"\") {\n lines.pop();\n }\n\n // Use original filename for display, not resolved path\n const displayName = files.includes(file) ? file :\n (options.recursive ? path : file);\n\n const { found, count } = await processContent(lines, displayName);\n perFileResults.set(displayName, { found, count });\n\n if (found) {\n globalFound = true;\n globalMatchCount += count;\n }\n } catch (err) {\n await ctx.stderr.writeText(`grep: ${file}: No such file or directory\\n`);\n // Continue to other files instead of immediately returning\n if (expandedFiles.length === 1) {\n return 1;\n }\n }\n }\n\n // Handle -l, -L, -c output modes\n let hasFilesWithoutMatches = false;\n if (options.filesWithMatches) {\n for (const [filename, result] of perFileResults) {\n if (result.found && !options.quiet) {\n await ctx.stdout.writeText(filename + \"\\n\");\n }\n }\n } else if (options.filesWithoutMatches) {\n for (const [filename, result] of perFileResults) {\n if (!result.found) {\n hasFilesWithoutMatches = true;\n await ctx.stdout.writeText(filename + \"\\n\");\n }\n }\n } else if (options.countOnly && !options.quiet) {\n for (const [filename, result] of perFileResults) {\n if (showFilenames) {\n await ctx.stdout.writeText(`${filename}:${result.count}\\n`);\n } else {\n await ctx.stdout.writeText(result.count + \"\\n\");\n }\n }\n }\n\n // Determine exit code for file processing\n if (options.filesWithoutMatches) {\n // -L: success if any file had NO matches\n return hasFilesWithoutMatches ? 0 : 1;\n }\n }\n\n // Determine exit code\n return globalFound ? 0 : 1;\n};\n"
|
|
6
6
|
],
|
|
7
|
-
"mappings": "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",
|
|
8
|
-
"debugId": "
|
|
7
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACsE,IAAtE;AAyBA,IAAM,OAAO;AAAA,EACX,MAAM;AAAA,EACN,OAAO;AAAA,IACL,EAAE,OAAO,KAAK,MAAM,kBAAkB;AAAA,IACtC,EAAE,OAAO,KAAK,MAAM,gBAAgB;AAAA,IACpC,EAAE,OAAO,KAAK,MAAM,cAAc;AAAA,IAClC,EAAE,OAAO,KAAK,MAAM,cAAc;AAAA,IAClC,EAAE,OAAO,KAAK,MAAM,cAAc;AAAA,IAClC,EAAE,OAAO,KAAK,MAAM,eAAe;AAAA,IACnC,EAAE,OAAO,KAAK,MAAM,QAAQ;AAAA,IAC5B,EAAE,OAAO,KAAK,MAAM,qBAAqB;AAAA,IACzC,EAAE,OAAO,KAAK,MAAM,sBAAsB;AAAA,IAC1C,EAAE,OAAO,KAAK,MAAM,cAAc;AAAA,IAClC,EAAE,OAAO,KAAK,MAAM,gBAAgB;AAAA,IACpC,EAAE,OAAO,KAAK,MAAM,QAAQ;AAAA,IAC5B,EAAE,OAAO,KAAK,MAAM,gBAAgB;AAAA,IACpC,EAAE,OAAO,KAAK,MAAM,cAAc;AAAA,IAClC,EAAE,OAAO,KAAK,MAAM,YAAY;AAAA,IAChC,EAAE,OAAO,IAAI;AAAA,IACb,EAAE,OAAO,KAAK,MAAM,UAAU,YAAY,KAAK;AAAA,IAC/C,EAAE,OAAO,KAAK,MAAM,aAAa,YAAY,KAAK;AAAA,IAClD,EAAE,OAAO,KAAK,MAAM,iBAAiB,YAAY,KAAK;AAAA,IACtD,EAAE,OAAO,KAAK,MAAM,kBAAkB,YAAY,KAAK;AAAA,IACvD,EAAE,OAAO,KAAK,MAAM,WAAW,YAAY,KAAK;AAAA,IAChD,EAAE,MAAM,WAAW,YAAY,KAAK;AAAA,IACpC,EAAE,MAAM,WAAW,YAAY,KAAK;AAAA,EACtC;AAAA,EACA,OAAO;AACT;AAEA,SAAS,cAAc,GAAgB;AAAA,EACrC,OAAO;AAAA,IACL,UAAU,CAAC;AAAA,IACX,eAAe;AAAA,IACf,cAAc;AAAA,IACd,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,WAAW;AAAA,IACX,QAAQ;AAAA,IACR,WAAW;AAAA,IACX,kBAAkB;AAAA,IAClB,qBAAqB;AAAA,IACrB,iBAAiB;AAAA,IACjB,cAAc;AAAA,IACd,OAAO;AAAA,IACP,YAAY;AAAA,IACZ,cAAc;AAAA,IACd,eAAe;AAAA,IACf,cAAc;AAAA,IACd,WAAW;AAAA,IACX,SAAS,CAAC;AAAA,IACV,SAAS,CAAC;AAAA,EACZ;AAAA;AAGF,IAAM,UAAU,CAAC,OAAoB,MAAsB,UAAmB;AAAA,EAC5E,QAAQ,KAAK;AAAA,SACN;AAAA,MAAK,MAAM,gBAAgB;AAAA,MAAM;AAAA,SACjC;AAAA,MAAK,MAAM,eAAe;AAAA,MAAM;AAAA,SAChC;AAAA,MAAK,MAAM,aAAa;AAAA,MAAM;AAAA,SAC9B;AAAA,MAAK,MAAM,YAAY;AAAA,MAAM;AAAA,SAC7B;AAAA,MAAK,MAAM,YAAY;AAAA,MAAM;AAAA,SAC7B;AAAA,MAAK,MAAM,SAAS;AAAA,MAAM;AAAA,SAC1B;AAAA,MAAK,MAAM,YAAY;AAAA,MAAM;AAAA,SAC7B;AAAA,MAAK,MAAM,mBAAmB;AAAA,MAAM;AAAA,SACpC;AAAA,MAAK,MAAM,sBAAsB;AAAA,MAAM;AAAA,SACvC;AAAA,MAAK,MAAM,kBAAkB;AAAA,MAAM;AAAA,SACnC;AAAA,MAAK,MAAM,eAAe;AAAA,MAAM;AAAA,SAChC;AAAA,MAAK,MAAM,QAAQ;AAAA,MAAM;AAAA,SACzB;AAAA,MAAK,MAAM,eAAe;AAAA,MAAM;AAAA,SAChC;AAAA,MAAK,MAAM,eAAe;AAAA,MAAO;AAAA,SACjC;AAAA,SACA;AAAA,MAAK,MAAM,YAAY;AAAA,MAAM;AAAA,SAC7B;AAAA,MAAK,IAAI;AAAA,QAAO,MAAM,SAAS,KAAK,KAAK;AAAA,MAAG;AAAA,SAC5C;AAAA,MAAK,IAAI;AAAA,QAAO,MAAM,aAAa,SAAS,OAAO,EAAE;AAAA,MAAG;AAAA,SACxD;AAAA,MAAK,IAAI;AAAA,QAAO,MAAM,eAAe,SAAS,OAAO,EAAE;AAAA,MAAG;AAAA,SAC1D;AAAA,MAAK,IAAI;AAAA,QAAO,MAAM,gBAAgB,SAAS,OAAO,EAAE;AAAA,MAAG;AAAA,SAC3D;AAAA,MACH,IAAI,OAAO;AAAA,QACT,MAAM,MAAM,SAAS,OAAO,EAAE;AAAA,QAC9B,MAAM,gBAAgB;AAAA,QACtB,MAAM,eAAe;AAAA,MACvB;AAAA,MACA;AAAA;AAAA,MAGA,IAAI,KAAK,SAAS,aAAa;AAAA,QAAO,MAAM,QAAQ,KAAK,KAAK;AAAA,MACzD,SAAI,KAAK,SAAS,aAAa;AAAA,QAAO,MAAM,QAAQ,KAAK,KAAK;AAAA,MACnE;AAAA;AAAA;AAIN,SAAS,SAAS,CAAC,KAAa,SAA0B;AAAA,EAExD,IAAI,KAAK;AAAA,EACT,WAAW,MAAM,SAAS;AAAA,IACxB,IAAI,OAAO;AAAA,MAAK,MAAM;AAAA,IACjB,SAAI,OAAO;AAAA,MAAK,MAAM;AAAA,IACtB,SAAI,mBAAmB,KAAK,EAAE;AAAA,MAAG,MAAM,OAAO;AAAA,IAC9C;AAAA,YAAM;AAAA,EACb;AAAA,EACA,MAAM;AAAA,EACN,OAAO,IAAI,OAAO,EAAE,EAAE,KAAK,GAAG;AAAA;AAGhC,SAAS,WAAW,CAAC,KAAqB;AAAA,EACxC,OAAO,IAAI,QAAQ,uBAAuB,MAAM;AAAA;AAGlD,SAAS,YAAY,CAAC,SAA8B;AAAA,EAClD,IAAI,WAAW,QAAQ;AAAA,EAGvB,IAAI,QAAQ,cAAc;AAAA,IACxB,WAAW,SAAS,IAAI,WAAW;AAAA,EACrC,EAAO;AAAA,IAIL,WAAW,SAAS,IAAI,OAAK;AAAA,MAC3B,MAAM,SAAS,iBAAiB,KAAK,CAAC;AAAA,MACtC,IAAI,CAAC;AAAA,QAAQ,OAAO;AAAA,MACpB,IAAI,SAAS;AAAA,MACb,SAAS,IAAI,EAAG,IAAI,EAAE,QAAQ,KAAK;AAAA,QACjC,MAAM,KAAK,EAAE;AAAA,QACb,IAAI,OAAO,QAAQ,IAAI,IAAI,EAAE,QAAQ;AAAA,UACnC,MAAM,OAAO,EAAE,IAAI;AAAA,UACnB,IAAI,SAAS,OAAO,SAAS,OAAO,SAAS,KAAK;AAAA,YAEhD,UAAU;AAAA,YACV;AAAA,UACF,EAAO;AAAA,YACL,UAAU,KAAK;AAAA,YACf;AAAA;AAAA,QAEJ,EAAO,SAAI,SAAS,SAAS,EAAE,GAAG;AAAA,UAEhC,UAAU,OAAO;AAAA,QACnB,EAAO;AAAA,UACL,UAAU;AAAA;AAAA,MAEd;AAAA,MACA,OAAO;AAAA,KACR;AAAA;AAAA,EAIH,IAAI,WAAW,SAAS,SAAS,IAAI,SAAS,IAAI,OAAK,MAAM,IAAI,EAAE,KAAK,GAAG,IAAI,SAAS,MAAM;AAAA,EAG9F,IAAI,QAAQ,WAAW;AAAA,IACrB,WAAW,SAAS;AAAA,EACtB;AAAA,EAGA,IAAI,QAAQ,WAAW;AAAA,IACrB,WAAW,OAAO;AAAA,EACpB;AAAA,EAEA,MAAM,QAAQ,QAAQ,aAAa,OAAO;AAAA,EAC1C,OAAO,IAAI,OAAO,UAAU,KAAK;AAAA;AAG5B,IAAM,OAAgB,OAAO,QAAQ;AAAA,EAE1C,MAAM,SAAS,oCAAiB,MAAM,eAAe,GAAG,OAAO;AAAA,EAC/D,MAAM,SAAS,OAAO,MAAM,IAAI,IAAI;AAAA,EAEpC,IAAI,OAAO,OAAO;AAAA,IAChB,MAAM,OAAO,WAAW,OAAO,OAAO,IAAI,MAAM;AAAA,IAChD,OAAO;AAAA,EACT;AAAA,EAEA,MAAM,UAAU,OAAO;AAAA,EACvB,MAAM,OAAO,OAAO;AAAA,EAGpB,IAAI;AAAA,EACJ,IAAI,QAAQ,SAAS,WAAW,GAAG;AAAA,IACjC,IAAI,KAAK,WAAW,GAAG;AAAA,MACrB,MAAM,IAAI,OAAO,UAAU;AAAA,CAAyB;AAAA,MACpD,OAAO;AAAA,IACT;AAAA,IACA,QAAQ,SAAS,KAAK,KAAK,EAAG;AAAA,IAC9B,QAAQ,KAAK,MAAM,CAAC;AAAA,EACtB,EAAO;AAAA,IACL,QAAQ;AAAA;AAAA,EAGV,IAAI;AAAA,EACJ,IAAI;AAAA,IACF,QAAQ,aAAa,OAAO;AAAA,IAC5B,OAAO,KAAK;AAAA,IACZ,MAAM,IAAI,OAAO,UAAU,0BAA0B,QAAQ,SAAS,KAAK,IAAI;AAAA,CAAK;AAAA,IACpF,OAAO;AAAA;AAAA,EAGT,IAAI,cAAc;AAAA,EAClB,IAAI,mBAAmB;AAAA,EACvB,IAAI,YAAY;AAAA,EAGhB,IAAI,gBAAgB,QAAQ;AAAA,EAG5B,IAAI,gBAAgB;AAAA,EACpB,IAAI,QAAQ,aAAa,MAAM,SAAS,GAAG;AAAA,IACzC,gBAAgB,CAAC;AAAA,IACjB,WAAW,QAAQ,OAAO;AAAA,MACxB,MAAM,OAAO,IAAI,GAAG,QAAQ,IAAI,KAAK,IAAI;AAAA,MACzC,IAAI;AAAA,QACF,MAAM,OAAO,MAAM,IAAI,GAAG,KAAK,IAAI;AAAA,QACnC,IAAI,KAAK,YAAY,GAAG;AAAA,UAEtB,MAAM,UAAU,MAAM,IAAI,GAAG,KAAK,QAAQ,EAAE,KAAK,KAAK,CAAC;AAAA,UACvD,WAAW,KAAK,SAAS;AAAA,YACvB,MAAM,WAAW,IAAI,GAAG,QAAQ,MAAM,CAAC;AAAA,YACvC,IAAI;AAAA,cACF,MAAM,IAAI,MAAM,IAAI,GAAG,KAAK,QAAQ;AAAA,cACpC,IAAI,EAAE,OAAO,GAAG;AAAA,gBACd,cAAc,KAAK,QAAQ;AAAA,cAC7B;AAAA,cACA,MAAM;AAAA,UAGV;AAAA,QACF,EAAO;AAAA,UACL,cAAc,KAAK,IAAI;AAAA;AAAA,QAEzB,MAAM;AAAA,QACN,cAAc,KAAK,IAAI;AAAA;AAAA,IAE3B;AAAA,IAEA,IAAI,QAAQ,QAAQ,SAAS,KAAK,QAAQ,QAAQ,SAAS,GAAG;AAAA,MAC5D,gBAAgB,cAAc,OAAO,CAAC,MAAM;AAAA,QAC1C,MAAM,WAAW,IAAI,GAAG,SAAS,CAAC;AAAA,QAClC,IAAI,QAAQ,QAAQ,SAAS,GAAG;AAAA,UAC9B,MAAM,WAAW,QAAQ,QAAQ,KAAK,CAAC,QAAQ,UAAU,UAAU,GAAG,CAAC;AAAA,UACvE,IAAI,CAAC;AAAA,YAAU,OAAO;AAAA,QACxB;AAAA,QACA,IAAI,QAAQ,QAAQ,SAAS,GAAG;AAAA,UAC9B,MAAM,WAAW,QAAQ,QAAQ,KAAK,CAAC,QAAQ,UAAU,UAAU,GAAG,CAAC;AAAA,UACvE,IAAI;AAAA,YAAU,OAAO;AAAA,QACvB;AAAA,QACA,OAAO;AAAA,OACR;AAAA,IACH;AAAA,IAGA,IAAI,kBAAkB,MAAM;AAAA,MAC1B,gBAAgB;AAAA,IAClB;AAAA,EACF;AAAA,EAGA,IAAI,kBAAkB,MAAM;AAAA,IAC1B,gBAAgB,cAAc,SAAS;AAAA,EACzC;AAAA,EAEA,MAAM,iBAAiB,OACrB,OACA,aAC+C;AAAA,IAC/C,IAAI,YAAY;AAAA,IAChB,IAAI,iBAAiB;AAAA,IAGrB,MAAM,aAAa,QAAQ,gBAAgB,KAAK,QAAQ,eAAe;AAAA,IAEvE,IAAI,YAAY;AAAA,MACd,OAAO,MAAM,mBAAmB,OAAO,QAAQ;AAAA,IACjD;AAAA,IAEA,SAAS,UAAU,EAAG,UAAU,MAAM,UAAU,CAAC,WAAW,WAAW;AAAA,MACrE,MAAM,OAAO,MAAM;AAAA,MACnB,MAAM,UAAU,UAAU;AAAA,MAG1B,MAAM,YAAY;AAAA,MAClB,MAAM,UAAU,MAAM,KAAK,IAAI;AAAA,MAC/B,MAAM,eAAe,QAAQ,SAAS,CAAC,UAAU;AAAA,MAEjD,IAAI,cAAc;AAAA,QAChB,YAAY;AAAA,QACZ;AAAA,QAGA,IAAI,QAAQ,OAAO;AAAA,UACjB,YAAY;AAAA,UACZ,OAAO,EAAE,OAAO,MAAM,OAAO,EAAE;AAAA,QACjC;AAAA,QAGA,IAAI,QAAQ,kBAAkB;AAAA,UAC5B,OAAO,EAAE,OAAO,MAAM,OAAO,EAAE;AAAA,QACjC;AAAA,QAGA,IAAI,CAAC,QAAQ,aAAa,CAAC,QAAQ,qBAAqB;AAAA,UACtD,IAAI,QAAQ,gBAAgB,CAAC,QAAQ,QAAQ;AAAA,YAE3C,MAAM,YAAY;AAAA,YAClB,IAAI;AAAA,YACJ,QAAQ,QAAQ,MAAM,KAAK,IAAI,OAAO,MAAM;AAAA,cAC1C,IAAI,SAAS;AAAA,cACb,IAAI,YAAY;AAAA,gBAAe,UAAU,WAAW;AAAA,cACpD,IAAI,QAAQ;AAAA,gBAAiB,UAAU,UAAU;AAAA,cACjD,UAAU,MAAM,KAAK;AAAA;AAAA,cACrB,MAAM,IAAI,OAAO,UAAU,MAAM;AAAA,cAEjC,IAAI,MAAM,GAAG,WAAW;AAAA,gBAAG,MAAM;AAAA,YACnC;AAAA,UACF,EAAO;AAAA,YACL,IAAI,SAAS;AAAA,YACb,IAAI,YAAY;AAAA,cAAe,UAAU,WAAW;AAAA,YACpD,IAAI,QAAQ;AAAA,cAAiB,UAAU,UAAU;AAAA,YACjD,UAAU,OAAO;AAAA;AAAA,YACjB,MAAM,IAAI,OAAO,UAAU,MAAM;AAAA;AAAA,QAErC;AAAA,QAGA,IAAI,QAAQ,aAAa,KAAK,kBAAkB,QAAQ,YAAY;AAAA,UAClE,YAAY;AAAA,UACZ,OAAO,EAAE,OAAO,MAAM,OAAO,eAAe;AAAA,QAC9C;AAAA,MACF;AAAA,IACF;AAAA,IAEA,OAAO,EAAE,OAAO,WAAW,OAAO,eAAe;AAAA;AAAA,EAGnD,MAAM,qBAAqB,OACzB,OACA,aAC+C;AAAA,IAC/C,IAAI,YAAY;AAAA,IAChB,IAAI,iBAAiB;AAAA,IACrB,IAAI,kBAAkB;AAAA,IAGtB,MAAM,gBAAgB,IAAI;AAAA,IAC1B,SAAS,UAAU,EAAG,UAAU,MAAM,QAAQ,WAAW;AAAA,MACvD,MAAM,OAAO,MAAM;AAAA,MACnB,MAAM,YAAY;AAAA,MAClB,MAAM,UAAU,MAAM,KAAK,IAAI;AAAA,MAC/B,MAAM,eAAe,QAAQ,SAAS,CAAC,UAAU;AAAA,MACjD,IAAI,cAAc;AAAA,QAChB,cAAc,IAAI,OAAO;AAAA,MAC3B;AAAA,IACF;AAAA,IAGA,MAAM,eAAe,IAAI;AAAA,IACzB,WAAW,YAAY,eAAe;AAAA,MAEpC,SAAS,IAAI,KAAK,IAAI,GAAG,WAAW,QAAQ,aAAa,EAAG,IAAI,UAAU,KAAK;AAAA,QAC7E,aAAa,IAAI,CAAC;AAAA,MACpB;AAAA,MAEA,aAAa,IAAI,QAAQ;AAAA,MAEzB,SAAS,IAAI,WAAW,EAAG,KAAK,KAAK,IAAI,MAAM,SAAS,GAAG,WAAW,QAAQ,YAAY,GAAG,KAAK;AAAA,QAChG,aAAa,IAAI,CAAC;AAAA,MACpB;AAAA,IACF;AAAA,IAGA,MAAM,cAAc,MAAM,KAAK,YAAY,EAAE,KAAK,CAAC,GAAG,MAAM,IAAI,CAAC;AAAA,IAEjE,SAAS,IAAI,EAAG,IAAI,YAAY,UAAU,CAAC,WAAW,KAAK;AAAA,MACzD,MAAM,UAAU,YAAY;AAAA,MAC5B,MAAM,OAAO,MAAM;AAAA,MACnB,MAAM,UAAU,UAAU;AAAA,MAC1B,MAAM,UAAU,cAAc,IAAI,OAAO;AAAA,MAGzC,IAAI,mBAAmB,KAAK,UAAU,kBAAkB,GAAG;AAAA,QACzD,MAAM,IAAI,OAAO,UAAU;AAAA,CAAM;AAAA,MACnC;AAAA,MAEA,IAAI,SAAS;AAAA,QACX,YAAY;AAAA,QACZ;AAAA,QAEA,IAAI,QAAQ,OAAO;AAAA,UACjB,YAAY;AAAA,UACZ,OAAO,EAAE,OAAO,MAAM,OAAO,EAAE;AAAA,QACjC;AAAA,QAEA,IAAI,QAAQ,kBAAkB;AAAA,UAC5B,OAAO,EAAE,OAAO,MAAM,OAAO,EAAE;AAAA,QACjC;AAAA,QAEA,IAAI,CAAC,QAAQ,aAAa,CAAC,QAAQ,qBAAqB;AAAA,UACtD,IAAI,QAAQ,gBAAgB,CAAC,QAAQ,QAAQ;AAAA,YAC3C,MAAM,YAAY;AAAA,YAClB,IAAI;AAAA,YACJ,QAAQ,QAAQ,MAAM,KAAK,IAAI,OAAO,MAAM;AAAA,cAC1C,IAAI,SAAS;AAAA,cACb,IAAI,YAAY;AAAA,gBAAe,UAAU,WAAW;AAAA,cACpD,IAAI,QAAQ;AAAA,gBAAiB,UAAU,UAAU;AAAA,cACjD,UAAU,MAAM,KAAK;AAAA;AAAA,cACrB,MAAM,IAAI,OAAO,UAAU,MAAM;AAAA,cACjC,IAAI,MAAM,GAAG,WAAW;AAAA,gBAAG,MAAM;AAAA,YACnC;AAAA,UACF,EAAO;AAAA,YACL,IAAI,SAAS;AAAA,YACb,IAAI,YAAY;AAAA,cAAe,UAAU,WAAW;AAAA,YACpD,IAAI,QAAQ;AAAA,cAAiB,UAAU,UAAU;AAAA,YACjD,UAAU,OAAO;AAAA;AAAA,YACjB,MAAM,IAAI,OAAO,UAAU,MAAM;AAAA;AAAA,QAErC;AAAA,QAEA,IAAI,QAAQ,aAAa,KAAK,kBAAkB,QAAQ,YAAY;AAAA,UAGlE,MAAM,wBAAwB,YAAY,MAAM,IAAI,CAAC,EAAE,OAAO,SAAO,CAAC,cAAc,IAAI,GAAG,CAAC;AAAA,UAC5F,WAAW,cAAc,uBAAuB;AAAA,YAC9C,MAAM,cAAc,MAAM;AAAA,YAC1B,MAAM,iBAAiB,aAAa;AAAA,YAEpC,IAAI,cAAc,UAAU,QAAQ,cAAc;AAAA,cAChD,IAAI,mBAAmB,KAAK,aAAa,kBAAkB,GAAG;AAAA,gBAC5D,MAAM,IAAI,OAAO,UAAU;AAAA,CAAM;AAAA,cACnC;AAAA,cACA,IAAI,CAAC,QAAQ,aAAa,CAAC,QAAQ,qBAAqB;AAAA,gBACtD,IAAI,SAAS;AAAA,gBACb,IAAI,YAAY;AAAA,kBAAe,UAAU,WAAW;AAAA,gBACpD,IAAI,QAAQ;AAAA,kBAAiB,UAAU,iBAAiB;AAAA,gBACxD,UAAU,cAAc;AAAA;AAAA,gBACxB,MAAM,IAAI,OAAO,UAAU,MAAM;AAAA,cACnC;AAAA,cACA,kBAAkB;AAAA,YACpB;AAAA,UACF;AAAA,UACA,YAAY;AAAA,UACZ,OAAO,EAAE,OAAO,MAAM,OAAO,eAAe;AAAA,QAC9C;AAAA,MACF,EAAO;AAAA,QAEL,IAAI,CAAC,QAAQ,aAAa,CAAC,QAAQ,qBAAqB;AAAA,UACtD,IAAI,SAAS;AAAA,UACb,IAAI,YAAY;AAAA,YAAe,UAAU,WAAW;AAAA,UACpD,IAAI,QAAQ;AAAA,YAAiB,UAAU,UAAU;AAAA,UACjD,UAAU,OAAO;AAAA;AAAA,UACjB,MAAM,IAAI,OAAO,UAAU,MAAM;AAAA,QACnC;AAAA;AAAA,MAGF,kBAAkB;AAAA,IACpB;AAAA,IAEA,OAAO,EAAE,OAAO,WAAW,OAAO,eAAe;AAAA;AAAA,EAGnD,IAAI,cAAc,WAAW,GAAG;AAAA,IAE9B,MAAM,UAAU,MAAM,IAAI,MAAM,KAAK;AAAA,IACrC,MAAM,QAAQ,QAAQ,MAAM;AAAA,CAAI;AAAA,IAEhC,IAAI,MAAM,SAAS,KAAK,MAAM,MAAM,SAAS,OAAO,IAAI;AAAA,MACtD,MAAM,IAAI;AAAA,IACZ;AAAA,IAEA,QAAQ,OAAO,UAAU,MAAM,eAAe,KAAK;AAAA,IACnD,cAAc;AAAA,IACd,mBAAmB;AAAA,IAEnB,IAAI,QAAQ,aAAa,CAAC,QAAQ,SAAS,CAAC,QAAQ,oBAAoB,CAAC,QAAQ,qBAAqB;AAAA,MACpG,MAAM,IAAI,OAAO,UAAU,mBAAmB;AAAA,CAAI;AAAA,IACpD;AAAA,EACF,EAAO;AAAA,IAEL,MAAM,iBAAiE,IAAI;AAAA,IAE3E,WAAW,QAAQ,eAAe;AAAA,MAChC,IAAI,aAAa,QAAQ;AAAA,QAAO;AAAA,MAEhC,IAAI;AAAA,QACF,MAAM,OAAO,KAAK,WAAW,GAAG,IAAI,OAAO,IAAI,GAAG,QAAQ,IAAI,KAAK,IAAI;AAAA,QACvE,MAAM,OAAO,MAAM,IAAI,GAAG,KAAK,IAAI;AAAA,QAEnC,IAAI,KAAK,YAAY,GAAG;AAAA,UACtB,IAAI,CAAC,QAAQ,WAAW;AAAA,YACtB,MAAM,IAAI,OAAO,UAAU,SAAS;AAAA,CAAwB;AAAA,UAC9D;AAAA,UACA;AAAA,QACF;AAAA,QAEA,MAAM,UAAU,MAAM,IAAI,GAAG,SAAS,IAAI;AAAA,QAC1C,MAAM,QAAQ,QAAQ,SAAS,EAAE,MAAM;AAAA,CAAI;AAAA,QAG3C,IAAI,MAAM,SAAS,KAAK,MAAM,MAAM,SAAS,OAAO,IAAI;AAAA,UACtD,MAAM,IAAI;AAAA,QACZ;AAAA,QAGA,MAAM,cAAc,MAAM,SAAS,IAAI,IAAI,OACxC,QAAQ,YAAY,OAAO;AAAA,QAE9B,QAAQ,OAAO,UAAU,MAAM,eAAe,OAAO,WAAW;AAAA,QAChE,eAAe,IAAI,aAAa,EAAE,OAAO,MAAM,CAAC;AAAA,QAEhD,IAAI,OAAO;AAAA,UACT,cAAc;AAAA,UACd,oBAAoB;AAAA,QACtB;AAAA,QACA,OAAO,KAAK;AAAA,QACZ,MAAM,IAAI,OAAO,UAAU,SAAS;AAAA,CAAmC;AAAA,QAEvE,IAAI,cAAc,WAAW,GAAG;AAAA,UAC9B,OAAO;AAAA,QACT;AAAA;AAAA,IAEJ;AAAA,IAGA,IAAI,yBAAyB;AAAA,IAC7B,IAAI,QAAQ,kBAAkB;AAAA,MAC5B,YAAY,UAAU,YAAW,gBAAgB;AAAA,QAC/C,IAAI,QAAO,SAAS,CAAC,QAAQ,OAAO;AAAA,UAClC,MAAM,IAAI,OAAO,UAAU,WAAW;AAAA,CAAI;AAAA,QAC5C;AAAA,MACF;AAAA,IACF,EAAO,SAAI,QAAQ,qBAAqB;AAAA,MACtC,YAAY,UAAU,YAAW,gBAAgB;AAAA,QAC/C,IAAI,CAAC,QAAO,OAAO;AAAA,UACjB,yBAAyB;AAAA,UACzB,MAAM,IAAI,OAAO,UAAU,WAAW;AAAA,CAAI;AAAA,QAC5C;AAAA,MACF;AAAA,IACF,EAAO,SAAI,QAAQ,aAAa,CAAC,QAAQ,OAAO;AAAA,MAC9C,YAAY,UAAU,YAAW,gBAAgB;AAAA,QAC/C,IAAI,eAAe;AAAA,UACjB,MAAM,IAAI,OAAO,UAAU,GAAG,YAAY,QAAO;AAAA,CAAS;AAAA,QAC5D,EAAO;AAAA,UACL,MAAM,IAAI,OAAO,UAAU,QAAO,QAAQ;AAAA,CAAI;AAAA;AAAA,MAElD;AAAA,IACF;AAAA,IAGA,IAAI,QAAQ,qBAAqB;AAAA,MAE/B,OAAO,yBAAyB,IAAI;AAAA,IACtC;AAAA;AAAA,EAIF,OAAO,cAAc,IAAI;AAAA;",
|
|
8
|
+
"debugId": "0DA7A6C9DEDCF42D64756E2164756E21",
|
|
9
9
|
"names": []
|
|
10
10
|
}
|
|
@@ -66,6 +66,9 @@ class Lexer {
|
|
|
66
66
|
this.source = source;
|
|
67
67
|
this.preserveNewlines = options?.preserveNewlines ?? false;
|
|
68
68
|
}
|
|
69
|
+
isWordLikeToken(token) {
|
|
70
|
+
return token.type === "word" || token.type === "singleQuote" || token.type === "doubleQuote" || token.type === "variable" || token.type === "substitution" || token.type === "arithmetic" || token.type === "glob";
|
|
71
|
+
}
|
|
69
72
|
tokenize() {
|
|
70
73
|
const tokens = [];
|
|
71
74
|
while (!this.isAtEnd() || this.tokenQueue.length > 0) {
|
|
@@ -73,12 +76,23 @@ class Lexer {
|
|
|
73
76
|
tokens.push(this.tokenQueue.shift());
|
|
74
77
|
continue;
|
|
75
78
|
}
|
|
79
|
+
const posBeforeWhitespace = this.pos;
|
|
76
80
|
this.skipWhitespaceExceptNewlines();
|
|
81
|
+
const hadWhitespace = this.pos > posBeforeWhitespace;
|
|
77
82
|
if (this.isAtEnd())
|
|
78
83
|
break;
|
|
79
84
|
const token = this.nextToken();
|
|
80
85
|
if (token) {
|
|
81
|
-
tokens.
|
|
86
|
+
const prev = tokens[tokens.length - 1];
|
|
87
|
+
if (!hadWhitespace && prev && this.isWordLikeToken(token) && (Array.isArray(prev) || this.isWordLikeToken(prev))) {
|
|
88
|
+
if (Array.isArray(prev)) {
|
|
89
|
+
prev.push(token);
|
|
90
|
+
} else {
|
|
91
|
+
tokens[tokens.length - 1] = [prev, token];
|
|
92
|
+
}
|
|
93
|
+
} else {
|
|
94
|
+
tokens.push(token);
|
|
95
|
+
}
|
|
82
96
|
}
|
|
83
97
|
}
|
|
84
98
|
tokens.push({ type: "eof" });
|
|
@@ -683,4 +697,4 @@ function lex(source, options) {
|
|
|
683
697
|
return new Lexer(source, options).tokenize();
|
|
684
698
|
}
|
|
685
699
|
|
|
686
|
-
//# debugId=
|
|
700
|
+
//# debugId=637CA619A6A223D764756E2164756E21
|
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/lexer/lexer.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
|
-
"import { LexError } from \"../errors.cjs\";\nimport type { Token, RedirectMode, KeywordValue } from \"./tokens.cjs\";\nimport { KEYWORDS } from \"./tokens.cjs\";\n\nconst GLOB_CHARS = new Set([\"*\", \"?\", \"[\", \"{\", \"}\"]);\nconst WORD_BREAK_CHARS = new Set([\n \" \",\n \"\\t\",\n \"\\n\",\n \"\\r\",\n \"|\",\n \"&\",\n \";\",\n \">\",\n \"<\",\n \"(\",\n \")\",\n \"$\",\n \"'\",\n '\"',\n \"`\",\n]);\n\nexport class Lexer {\n private source: string;\n private pos: number = 0;\n private line: number = 1;\n private column: number = 1;\n private tokenQueue: Token[] = [];\n private preserveNewlines: boolean;\n\n constructor(source: string, options?: { preserveNewlines?: boolean }) {\n this.source = source;\n this.preserveNewlines = options?.preserveNewlines ?? false;\n }\n\n tokenize(): Token[] {\n const tokens: Token[] = [];\n\n while (!this.isAtEnd() || this.tokenQueue.length > 0) {\n // Drain token queue first (for heredoc handling)\n if (this.tokenQueue.length > 0) {\n tokens.push(this.tokenQueue.shift()!);\n continue;\n }\n\n this.skipWhitespaceExceptNewlines();\n if (this.isAtEnd()) break;\n\n const token = this.nextToken();\n if (token) {\n tokens.push(token);\n }\n }\n\n tokens.push({ type: \"eof\" });\n return tokens;\n }\n\n private nextToken(): Token | null {\n // Check token queue first (used for heredoc handling)\n if (this.tokenQueue.length > 0) {\n return this.tokenQueue.shift()!;\n }\n\n const char = this.peek();\n\n // Newlines - significant for control flow\n if (char === \"\\n\") {\n this.advance();\n // Skip consecutive newlines\n while (this.peek() === \"\\n\") {\n this.advance();\n }\n if (this.preserveNewlines) {\n return { type: \"newline\" };\n }\n return null;\n }\n\n // Comments\n if (char === \"#\") {\n this.skipComment();\n return null;\n }\n\n // Parentheses - for case pattern grouping\n if (char === \"(\") {\n this.advance();\n return { type: \"openParen\" };\n }\n\n if (char === \")\") {\n this.advance();\n return { type: \"closeParen\" };\n }\n\n // Operators and redirects\n if (char === \"|\") {\n this.advance();\n if (this.peek() === \"|\") {\n this.advance();\n return { type: \"or\" };\n }\n return { type: \"pipe\" };\n }\n\n if (char === \"&\") {\n this.advance();\n if (this.peek() === \"&\") {\n this.advance();\n return { type: \"and\" };\n }\n if (this.peek() === \">\") {\n this.advance();\n if (this.peek() === \">\") {\n this.advance();\n return { type: \"redirect\", mode: \"&>>\" };\n }\n return { type: \"redirect\", mode: \"&>\" };\n }\n // Background execution (&) - treat as word for now\n return { type: \"word\", value: \"&\" };\n }\n\n if (char === \";\") {\n this.advance();\n // Check for double semicolon (case terminator)\n if (this.peek() === \";\") {\n this.advance();\n return { type: \"doubleSemicolon\" };\n }\n return { type: \"semicolon\" };\n }\n\n // Redirects\n if (char === \">\") {\n this.advance();\n if (this.peek() === \">\") {\n this.advance();\n return { type: \"redirect\", mode: \">>\" };\n }\n return { type: \"redirect\", mode: \">\" };\n }\n\n if (char === \"<\") {\n this.advance();\n if (this.peek() === \"<\") {\n this.advance();\n return this.readHeredoc();\n }\n return { type: \"redirect\", mode: \"<\" };\n }\n\n // File descriptor redirects (2>, 2>>, 2>&1, 1>&2)\n if (char === \"1\" || char === \"2\") {\n const fd = char;\n const nextChar = this.peekAhead(1);\n if (nextChar === \">\") {\n this.advance(); // consume fd\n this.advance(); // consume >\n if (fd === \"2\") {\n if (this.peek() === \"&\" && this.peekAhead(1) === \"1\") {\n this.advance(); // consume &\n this.advance(); // consume 1\n return { type: \"redirect\", mode: \"2>&1\" };\n }\n if (this.peek() === \">\") {\n this.advance();\n return { type: \"redirect\", mode: \"2>>\" };\n }\n return { type: \"redirect\", mode: \"2>\" };\n } else {\n // 1>&2\n if (this.peek() === \"&\" && this.peekAhead(1) === \"2\") {\n this.advance(); // consume &\n this.advance(); // consume 2\n return { type: \"redirect\", mode: \"1>&2\" };\n }\n if (this.peek() === \">\") {\n this.advance();\n return { type: \"redirect\", mode: \">>\" };\n }\n return { type: \"redirect\", mode: \">\" };\n }\n }\n }\n\n // Variables and substitutions\n if (char === \"$\") {\n return this.readVariable();\n }\n\n // Single quotes\n if (char === \"'\") {\n return this.readSingleQuote();\n }\n\n // Double quotes\n if (char === '\"') {\n return this.readDoubleQuote();\n }\n\n // Word (including potential globs and assignments)\n return this.readWord();\n }\n\n private readVariable(): Token {\n this.advance(); // consume $\n\n // Arithmetic expansion $((...)) or command substitution $(...)\n if (this.peek() === \"(\") {\n this.advance(); // consume first (\n // Check for arithmetic expansion $((...))\n if (this.peek() === \"(\") {\n this.advance(); // consume second (\n const expression = this.readUntilDoubleCloseParen();\n return { type: \"arithmetic\", expression };\n }\n const command = this.readUntilMatchingParen();\n return { type: \"substitution\", command };\n }\n\n // ${VAR} syntax\n if (this.peek() === \"{\") {\n this.advance(); // consume {\n let name = \"\";\n while (!this.isAtEnd() && this.peek() !== \"}\") {\n name += this.advance();\n }\n if (this.peek() === \"}\") {\n this.advance(); // consume }\n }\n return { type: \"variable\", name };\n }\n\n // $VAR syntax\n let name = \"\";\n while (!this.isAtEnd() && this.isVarChar(this.peek())) {\n name += this.advance();\n }\n\n if (name === \"\") {\n return { type: \"word\", value: \"$\" };\n }\n\n return { type: \"variable\", name };\n }\n\n private readUntilDoubleCloseParen(): string {\n let depth = 1;\n let result = \"\";\n\n while (!this.isAtEnd() && depth > 0) {\n const char = this.peek();\n if (char === \"(\" && this.peekAhead(1) === \"(\") {\n depth++;\n result += this.advance();\n result += this.advance();\n } else if (char === \")\" && this.peekAhead(1) === \")\") {\n depth--;\n if (depth === 0) {\n this.advance(); // consume first )\n this.advance(); // consume second )\n break;\n }\n result += this.advance();\n result += this.advance();\n } else {\n result += this.advance();\n }\n }\n\n return result;\n }\n\n private readUntilMatchingParen(): string {\n let depth = 1;\n let result = \"\";\n\n while (!this.isAtEnd() && depth > 0) {\n const char = this.peek();\n if (char === \"(\") {\n depth++;\n } else if (char === \")\") {\n depth--;\n if (depth === 0) {\n this.advance(); // consume closing )\n break;\n }\n }\n result += this.advance();\n }\n\n return result;\n }\n\n private readSingleQuote(): Token {\n this.advance(); // consume opening '\n let value = \"\";\n\n while (!this.isAtEnd() && this.peek() !== \"'\") {\n value += this.advance();\n }\n\n if (this.peek() === \"'\") {\n this.advance(); // consume closing '\n } else {\n throw new LexError(\"Unterminated single quote\", this.pos, this.line, this.column);\n }\n\n return { type: \"singleQuote\", value };\n }\n\n private readDoubleQuote(): Token {\n this.advance(); // consume opening \"\n const parts: Array<string | Token> = [];\n let currentString = \"\";\n\n while (!this.isAtEnd() && this.peek() !== '\"') {\n const char = this.peek();\n\n if (char === \"\\\\\") {\n this.advance();\n if (!this.isAtEnd()) {\n const escaped = this.advance();\n // In double quotes, only certain chars are special\n if ([\"$\", '\"', \"\\\\\", \"`\", \"\\n\"].includes(escaped)) {\n currentString += escaped;\n } else {\n currentString += \"\\\\\" + escaped;\n }\n }\n } else if (char === \"$\") {\n if (currentString) {\n parts.push(currentString);\n currentString = \"\";\n }\n parts.push(this.readVariable());\n } else {\n currentString += this.advance();\n }\n }\n\n if (currentString) {\n parts.push(currentString);\n }\n\n if (this.peek() === '\"') {\n this.advance(); // consume closing \"\n } else {\n throw new LexError(\"Unterminated double quote\", this.pos, this.line, this.column);\n }\n\n return { type: \"doubleQuote\", parts };\n }\n\n private readWord(): Token {\n let value = \"\";\n let hasGlobChars = false;\n\n while (!this.isAtEnd() && !this.isWordBreak(this.peek())) {\n const char = this.peek();\n\n if (char === \"\\\\\") {\n this.advance();\n if (!this.isAtEnd()) {\n value += this.advance();\n }\n } else {\n if (GLOB_CHARS.has(char)) {\n hasGlobChars = true;\n }\n value += this.advance();\n }\n }\n\n // Check if this looks like an assignment with value starting with $ or quote\n // e.g., VAR=$(...) or VAR=\"...\" or VAR='...'\n const assignmentPrefixMatch = value.match(/^([a-zA-Z_][a-zA-Z0-9_]*)=$/);\n if (assignmentPrefixMatch && (this.peek() === \"$\" || this.peek() === \"'\" || this.peek() === '\"')) {\n const name = assignmentPrefixMatch[1]!;\n // Read the value part\n const valueTokens = this.readAssignmentValueTokens();\n return {\n type: \"assignment\",\n name,\n value: valueTokens.length === 1 && valueTokens[0]!.type === \"word\"\n ? (valueTokens[0] as { type: \"word\"; value: string }).value\n : valueTokens,\n };\n }\n\n // Check if this is an assignment (VAR=value)\n const assignmentMatch = value.match(/^([a-zA-Z_][a-zA-Z0-9_]*)=(.*)$/);\n if (assignmentMatch) {\n const name = assignmentMatch[1]!;\n const rawValue = assignmentMatch[2]!;\n\n // Parse the value to handle variables and arithmetic\n const parsedValue = this.parseAssignmentValue(rawValue);\n return {\n type: \"assignment\",\n name,\n value: parsedValue,\n };\n }\n\n // Check if this is a keyword\n if (KEYWORDS.has(value)) {\n return { type: \"keyword\", value: value as KeywordValue };\n }\n\n if (hasGlobChars) {\n return { type: \"glob\", pattern: value };\n }\n\n return { type: \"word\", value };\n }\n\n private readAssignmentValueTokens(): Token[] {\n const tokens: Token[] = [];\n\n // Read tokens until we hit a space, newline, semicolon, etc.\n while (!this.isAtEnd()) {\n const char = this.peek();\n\n // Stop at whitespace or command terminators\n if (char === \" \" || char === \"\\t\" || char === \"\\n\" || char === \"\\r\" ||\n char === \";\" || char === \"|\" || char === \"&\" || char === \">\" || char === \"<\") {\n break;\n }\n\n if (char === \"$\") {\n tokens.push(this.readVariable());\n } else if (char === \"'\") {\n tokens.push(this.readSingleQuote());\n } else if (char === '\"') {\n tokens.push(this.readDoubleQuote());\n } else {\n // Read until word break\n let word = \"\";\n while (!this.isAtEnd() && !this.isWordBreak(this.peek())) {\n word += this.advance();\n }\n if (word) {\n tokens.push({ type: \"word\", value: word });\n } else {\n break;\n }\n }\n }\n\n return tokens;\n }\n\n private parseAssignmentValue(value: string): string | Token[] {\n // If value contains no special characters, return as string\n if (!value.includes(\"$\")) {\n return value;\n }\n\n // Parse the value to handle $VAR, ${VAR}, $((expr))\n const tokens: Token[] = [];\n let i = 0;\n let currentString = \"\";\n\n while (i < value.length) {\n if (value[i] === \"$\") {\n if (currentString) {\n tokens.push({ type: \"word\", value: currentString });\n currentString = \"\";\n }\n\n i++; // consume $\n if (i >= value.length) {\n tokens.push({ type: \"word\", value: \"$\" });\n break;\n }\n\n // Arithmetic expansion $((expr))\n if (value[i] === \"(\" && value[i + 1] === \"(\") {\n i += 2; // consume ((\n let depth = 1;\n let expr = \"\";\n while (i < value.length && depth > 0) {\n if (value[i] === \"(\" && value[i + 1] === \"(\") {\n depth++;\n expr += value[i]! + value[i + 1]!;\n i += 2;\n } else if (value[i] === \")\" && value[i + 1] === \")\") {\n depth--;\n if (depth > 0) {\n expr += value[i]! + value[i + 1]!;\n i += 2;\n } else {\n i += 2; // consume ))\n }\n } else {\n expr += value[i];\n i++;\n }\n }\n tokens.push({ type: \"arithmetic\", expression: expr });\n }\n // ${VAR} syntax\n else if (value[i] === \"{\") {\n i++; // consume {\n let varName = \"\";\n while (i < value.length && value[i] !== \"}\") {\n varName += value[i];\n i++;\n }\n if (i < value.length && value[i] === \"}\") {\n i++; // consume }\n }\n tokens.push({ type: \"variable\", name: varName });\n }\n // $VAR syntax\n else if (/[a-zA-Z_]/.test(value[i]!)) {\n let varName = \"\";\n while (i < value.length && /[a-zA-Z0-9_]/.test(value[i]!)) {\n varName += value[i];\n i++;\n }\n tokens.push({ type: \"variable\", name: varName });\n }\n // $(cmd) command substitution\n else if (value[i] === \"(\") {\n i++; // consume (\n let depth = 1;\n let cmd = \"\";\n while (i < value.length && depth > 0) {\n if (value[i] === \"(\") depth++;\n else if (value[i] === \")\") depth--;\n if (depth > 0) {\n cmd += value[i];\n }\n i++;\n }\n tokens.push({ type: \"substitution\", command: cmd });\n }\n else {\n // Not a variable, just a $\n currentString += \"$\";\n }\n } else {\n currentString += value[i];\n i++;\n }\n }\n\n if (currentString) {\n tokens.push({ type: \"word\", value: currentString });\n }\n\n if (tokens.length === 1 && tokens[0]!.type === \"word\") {\n return (tokens[0] as { type: \"word\"; value: string }).value;\n }\n\n return tokens.length > 0 ? tokens : value;\n }\n\n private readHeredoc(): Token {\n // Check for tab-stripping variant (<<-)\n const stripTabs = this.peek() === \"-\";\n if (stripTabs) {\n this.advance();\n }\n\n // Skip whitespace before delimiter\n while (this.peek() === \" \" || this.peek() === \"\\t\") {\n this.advance();\n }\n\n // Read delimiter and determine if expansion is enabled\n const { delimiter, expand } = this.readHeredocDelimiter();\n\n // Tokenize the rest of the current line and queue those tokens\n this.tokenizeRestOfLine();\n\n // Skip the newline that starts the heredoc content\n if (this.peek() === \"\\n\") {\n this.advance();\n }\n\n // Read content until closing delimiter\n let content = \"\";\n while (!this.isAtEnd()) {\n const lineStart = this.pos;\n let line = \"\";\n\n // Read until end of line or end of input\n while (!this.isAtEnd() && this.peek() !== \"\\n\") {\n line += this.advance();\n }\n\n // Check if this line is the delimiter (after stripping leading tabs if <<-)\n const strippedLine = stripTabs ? line.replace(/^\\t+/, \"\") : line;\n if (strippedLine === delimiter) {\n // Found closing delimiter, consume newline if present\n if (this.peek() === \"\\n\") {\n this.advance();\n }\n break;\n }\n\n // Add the line to content\n if (stripTabs) {\n content += line.replace(/^\\t+/, \"\");\n } else {\n content += line;\n }\n\n // Add newline if present\n if (this.peek() === \"\\n\") {\n content += this.advance();\n }\n }\n\n return { type: \"heredoc\", content, expand };\n }\n\n private readHeredocDelimiter(): { delimiter: string; expand: boolean } {\n const quoteChar = this.peek();\n\n // Quoted delimiter - no expansion\n if (quoteChar === \"'\" || quoteChar === '\"') {\n this.advance(); // consume opening quote\n let delimiter = \"\";\n while (!this.isAtEnd() && this.peek() !== quoteChar && this.peek() !== \"\\n\") {\n delimiter += this.advance();\n }\n if (this.peek() === quoteChar) {\n this.advance(); // consume closing quote\n }\n return { delimiter, expand: false };\n }\n\n // Unquoted delimiter - expansion enabled\n let delimiter = \"\";\n while (!this.isAtEnd() && !this.isWordBreak(this.peek()) && this.peek() !== \"\\n\") {\n if (this.peek() === \"\\\\\") {\n this.advance();\n if (!this.isAtEnd()) {\n delimiter += this.advance();\n }\n } else {\n delimiter += this.advance();\n }\n }\n\n return { delimiter, expand: true };\n }\n\n private tokenizeRestOfLine(): void {\n // Tokenize the rest of the line (until newline or end)\n while (!this.isAtEnd() && this.peek() !== \"\\n\") {\n // Skip only spaces and tabs, not newlines\n while (this.peek() === \" \" || this.peek() === \"\\t\") {\n this.advance();\n }\n if (this.isAtEnd() || this.peek() === \"\\n\") break;\n\n const token = this.readRestOfLineToken();\n if (token) {\n this.tokenQueue.push(token);\n }\n }\n }\n\n private readRestOfLineToken(): Token | null {\n const char = this.peek();\n\n if (char === \"|\") {\n this.advance();\n if (this.peek() === \"|\") {\n this.advance();\n return { type: \"or\" };\n }\n return { type: \"pipe\" };\n }\n\n if (char === \"&\") {\n this.advance();\n if (this.peek() === \"&\") {\n this.advance();\n return { type: \"and\" };\n }\n return { type: \"word\", value: \"&\" };\n }\n\n if (char === \";\") {\n this.advance();\n return { type: \"semicolon\" };\n }\n\n if (char === \">\") {\n this.advance();\n if (this.peek() === \">\") {\n this.advance();\n return { type: \"redirect\", mode: \">>\" };\n }\n return { type: \"redirect\", mode: \">\" };\n }\n\n if (char === \"<\") {\n this.advance();\n return { type: \"redirect\", mode: \"<\" };\n }\n\n if (char === \"$\") {\n return this.readVariable();\n }\n\n if (char === \"'\") {\n return this.readSingleQuote();\n }\n\n if (char === '\"') {\n return this.readDoubleQuote();\n }\n\n // Read a word but stop at newline\n let value = \"\";\n while (!this.isAtEnd() && !this.isWordBreak(this.peek()) && this.peek() !== \"\\n\") {\n if (this.peek() === \"\\\\\") {\n this.advance();\n if (!this.isAtEnd()) {\n value += this.advance();\n }\n } else {\n value += this.advance();\n }\n }\n\n if (value === \"\") return null;\n return { type: \"word\", value };\n }\n\n private isWordBreak(char: string): boolean {\n return WORD_BREAK_CHARS.has(char);\n }\n\n private isVarChar(char: string): boolean {\n return /[a-zA-Z0-9_]/.test(char);\n }\n\n private skipWhitespace(): void {\n while (!this.isAtEnd() && /\\s/.test(this.peek())) {\n this.advance();\n }\n }\n\n private skipWhitespaceExceptNewlines(): void {\n while (!this.isAtEnd() && /[ \\t\\r]/.test(this.peek())) {\n this.advance();\n }\n }\n\n private skipComment(): void {\n while (!this.isAtEnd() && this.peek() !== \"\\n\") {\n this.advance();\n }\n }\n\n private peek(): string {\n return this.source[this.pos] ?? \"\";\n }\n\n private peekAhead(n: number): string {\n return this.source[this.pos + n] ?? \"\";\n }\n\n private advance(): string {\n const char = this.source[this.pos]!;\n this.pos++;\n if (char === \"\\n\") {\n this.line++;\n this.column = 1;\n } else {\n this.column++;\n }\n return char;\n }\n\n private isAtEnd(): boolean {\n return this.pos >= this.source.length;\n }\n}\n\nexport function lex(source: string, options?: { preserveNewlines?: boolean }): Token[] {\n return new Lexer(source, options).tokenize();\n}\n"
|
|
5
|
+
"import { LexError } from \"../errors.cjs\";\nimport type { Token, RedirectMode, KeywordValue } from \"./tokens.cjs\";\nimport { KEYWORDS } from \"./tokens.cjs\";\n\nconst GLOB_CHARS = new Set([\"*\", \"?\", \"[\", \"{\", \"}\"]);\nconst WORD_BREAK_CHARS = new Set([\n \" \",\n \"\\t\",\n \"\\n\",\n \"\\r\",\n \"|\",\n \"&\",\n \";\",\n \">\",\n \"<\",\n \"(\",\n \")\",\n \"$\",\n \"'\",\n '\"',\n \"`\",\n]);\n\nexport class Lexer {\n private source: string;\n private pos: number = 0;\n private line: number = 1;\n private column: number = 1;\n private tokenQueue: Token[] = [];\n private preserveNewlines: boolean;\n\n constructor(source: string, options?: { preserveNewlines?: boolean }) {\n this.source = source;\n this.preserveNewlines = options?.preserveNewlines ?? false;\n }\n\n private isWordLikeToken(token: Token): boolean {\n return (\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 );\n }\n\n tokenize(): Token[] {\n const tokens: Token[] = [];\n\n while (!this.isAtEnd() || this.tokenQueue.length > 0) {\n // Drain token queue first (for heredoc handling)\n if (this.tokenQueue.length > 0) {\n tokens.push(this.tokenQueue.shift()!);\n continue;\n }\n\n const posBeforeWhitespace = this.pos;\n this.skipWhitespaceExceptNewlines();\n const hadWhitespace = this.pos > posBeforeWhitespace;\n if (this.isAtEnd()) break;\n\n const token = this.nextToken();\n if (token) {\n // Merge adjacent word-like tokens (no whitespace between them)\n const prev = tokens[tokens.length - 1];\n if (!hadWhitespace && prev && this.isWordLikeToken(token) && (Array.isArray(prev) || this.isWordLikeToken(prev))) {\n // Merge into an array token (concat)\n if (Array.isArray(prev)) {\n (prev as Token[]).push(token);\n } else {\n tokens[tokens.length - 1] = [prev, token] as unknown as Token;\n }\n } else {\n tokens.push(token);\n }\n }\n }\n\n tokens.push({ type: \"eof\" });\n return tokens;\n }\n\n private nextToken(): Token | null {\n // Check token queue first (used for heredoc handling)\n if (this.tokenQueue.length > 0) {\n return this.tokenQueue.shift()!;\n }\n\n const char = this.peek();\n\n // Newlines - significant for control flow\n if (char === \"\\n\") {\n this.advance();\n // Skip consecutive newlines\n while (this.peek() === \"\\n\") {\n this.advance();\n }\n if (this.preserveNewlines) {\n return { type: \"newline\" };\n }\n return null;\n }\n\n // Comments\n if (char === \"#\") {\n this.skipComment();\n return null;\n }\n\n // Parentheses - for case pattern grouping\n if (char === \"(\") {\n this.advance();\n return { type: \"openParen\" };\n }\n\n if (char === \")\") {\n this.advance();\n return { type: \"closeParen\" };\n }\n\n // Operators and redirects\n if (char === \"|\") {\n this.advance();\n if (this.peek() === \"|\") {\n this.advance();\n return { type: \"or\" };\n }\n return { type: \"pipe\" };\n }\n\n if (char === \"&\") {\n this.advance();\n if (this.peek() === \"&\") {\n this.advance();\n return { type: \"and\" };\n }\n if (this.peek() === \">\") {\n this.advance();\n if (this.peek() === \">\") {\n this.advance();\n return { type: \"redirect\", mode: \"&>>\" };\n }\n return { type: \"redirect\", mode: \"&>\" };\n }\n // Background execution (&) - treat as word for now\n return { type: \"word\", value: \"&\" };\n }\n\n if (char === \";\") {\n this.advance();\n // Check for double semicolon (case terminator)\n if (this.peek() === \";\") {\n this.advance();\n return { type: \"doubleSemicolon\" };\n }\n return { type: \"semicolon\" };\n }\n\n // Redirects\n if (char === \">\") {\n this.advance();\n if (this.peek() === \">\") {\n this.advance();\n return { type: \"redirect\", mode: \">>\" };\n }\n return { type: \"redirect\", mode: \">\" };\n }\n\n if (char === \"<\") {\n this.advance();\n if (this.peek() === \"<\") {\n this.advance();\n return this.readHeredoc();\n }\n return { type: \"redirect\", mode: \"<\" };\n }\n\n // File descriptor redirects (2>, 2>>, 2>&1, 1>&2)\n if (char === \"1\" || char === \"2\") {\n const fd = char;\n const nextChar = this.peekAhead(1);\n if (nextChar === \">\") {\n this.advance(); // consume fd\n this.advance(); // consume >\n if (fd === \"2\") {\n if (this.peek() === \"&\" && this.peekAhead(1) === \"1\") {\n this.advance(); // consume &\n this.advance(); // consume 1\n return { type: \"redirect\", mode: \"2>&1\" };\n }\n if (this.peek() === \">\") {\n this.advance();\n return { type: \"redirect\", mode: \"2>>\" };\n }\n return { type: \"redirect\", mode: \"2>\" };\n } else {\n // 1>&2\n if (this.peek() === \"&\" && this.peekAhead(1) === \"2\") {\n this.advance(); // consume &\n this.advance(); // consume 2\n return { type: \"redirect\", mode: \"1>&2\" };\n }\n if (this.peek() === \">\") {\n this.advance();\n return { type: \"redirect\", mode: \">>\" };\n }\n return { type: \"redirect\", mode: \">\" };\n }\n }\n }\n\n // Variables and substitutions\n if (char === \"$\") {\n return this.readVariable();\n }\n\n // Single quotes\n if (char === \"'\") {\n return this.readSingleQuote();\n }\n\n // Double quotes\n if (char === '\"') {\n return this.readDoubleQuote();\n }\n\n // Word (including potential globs and assignments)\n return this.readWord();\n }\n\n private readVariable(): Token {\n this.advance(); // consume $\n\n // Arithmetic expansion $((...)) or command substitution $(...)\n if (this.peek() === \"(\") {\n this.advance(); // consume first (\n // Check for arithmetic expansion $((...))\n if (this.peek() === \"(\") {\n this.advance(); // consume second (\n const expression = this.readUntilDoubleCloseParen();\n return { type: \"arithmetic\", expression };\n }\n const command = this.readUntilMatchingParen();\n return { type: \"substitution\", command };\n }\n\n // ${VAR} syntax\n if (this.peek() === \"{\") {\n this.advance(); // consume {\n let name = \"\";\n while (!this.isAtEnd() && this.peek() !== \"}\") {\n name += this.advance();\n }\n if (this.peek() === \"}\") {\n this.advance(); // consume }\n }\n return { type: \"variable\", name };\n }\n\n // $VAR syntax\n let name = \"\";\n while (!this.isAtEnd() && this.isVarChar(this.peek())) {\n name += this.advance();\n }\n\n if (name === \"\") {\n return { type: \"word\", value: \"$\" };\n }\n\n return { type: \"variable\", name };\n }\n\n private readUntilDoubleCloseParen(): string {\n let depth = 1;\n let result = \"\";\n\n while (!this.isAtEnd() && depth > 0) {\n const char = this.peek();\n if (char === \"(\" && this.peekAhead(1) === \"(\") {\n depth++;\n result += this.advance();\n result += this.advance();\n } else if (char === \")\" && this.peekAhead(1) === \")\") {\n depth--;\n if (depth === 0) {\n this.advance(); // consume first )\n this.advance(); // consume second )\n break;\n }\n result += this.advance();\n result += this.advance();\n } else {\n result += this.advance();\n }\n }\n\n return result;\n }\n\n private readUntilMatchingParen(): string {\n let depth = 1;\n let result = \"\";\n\n while (!this.isAtEnd() && depth > 0) {\n const char = this.peek();\n if (char === \"(\") {\n depth++;\n } else if (char === \")\") {\n depth--;\n if (depth === 0) {\n this.advance(); // consume closing )\n break;\n }\n }\n result += this.advance();\n }\n\n return result;\n }\n\n private readSingleQuote(): Token {\n this.advance(); // consume opening '\n let value = \"\";\n\n while (!this.isAtEnd() && this.peek() !== \"'\") {\n value += this.advance();\n }\n\n if (this.peek() === \"'\") {\n this.advance(); // consume closing '\n } else {\n throw new LexError(\"Unterminated single quote\", this.pos, this.line, this.column);\n }\n\n return { type: \"singleQuote\", value };\n }\n\n private readDoubleQuote(): Token {\n this.advance(); // consume opening \"\n const parts: Array<string | Token> = [];\n let currentString = \"\";\n\n while (!this.isAtEnd() && this.peek() !== '\"') {\n const char = this.peek();\n\n if (char === \"\\\\\") {\n this.advance();\n if (!this.isAtEnd()) {\n const escaped = this.advance();\n // In double quotes, only certain chars are special\n if ([\"$\", '\"', \"\\\\\", \"`\", \"\\n\"].includes(escaped)) {\n currentString += escaped;\n } else {\n currentString += \"\\\\\" + escaped;\n }\n }\n } else if (char === \"$\") {\n if (currentString) {\n parts.push(currentString);\n currentString = \"\";\n }\n parts.push(this.readVariable());\n } else {\n currentString += this.advance();\n }\n }\n\n if (currentString) {\n parts.push(currentString);\n }\n\n if (this.peek() === '\"') {\n this.advance(); // consume closing \"\n } else {\n throw new LexError(\"Unterminated double quote\", this.pos, this.line, this.column);\n }\n\n return { type: \"doubleQuote\", parts };\n }\n\n private readWord(): Token {\n let value = \"\";\n let hasGlobChars = false;\n\n while (!this.isAtEnd() && !this.isWordBreak(this.peek())) {\n const char = this.peek();\n\n if (char === \"\\\\\") {\n this.advance();\n if (!this.isAtEnd()) {\n value += this.advance();\n }\n } else {\n if (GLOB_CHARS.has(char)) {\n hasGlobChars = true;\n }\n value += this.advance();\n }\n }\n\n // Check if this looks like an assignment with value starting with $ or quote\n // e.g., VAR=$(...) or VAR=\"...\" or VAR='...'\n const assignmentPrefixMatch = value.match(/^([a-zA-Z_][a-zA-Z0-9_]*)=$/);\n if (assignmentPrefixMatch && (this.peek() === \"$\" || this.peek() === \"'\" || this.peek() === '\"')) {\n const name = assignmentPrefixMatch[1]!;\n // Read the value part\n const valueTokens = this.readAssignmentValueTokens();\n return {\n type: \"assignment\",\n name,\n value: valueTokens.length === 1 && valueTokens[0]!.type === \"word\"\n ? (valueTokens[0] as { type: \"word\"; value: string }).value\n : valueTokens,\n };\n }\n\n // Check if this is an assignment (VAR=value)\n const assignmentMatch = value.match(/^([a-zA-Z_][a-zA-Z0-9_]*)=(.*)$/);\n if (assignmentMatch) {\n const name = assignmentMatch[1]!;\n const rawValue = assignmentMatch[2]!;\n\n // Parse the value to handle variables and arithmetic\n const parsedValue = this.parseAssignmentValue(rawValue);\n return {\n type: \"assignment\",\n name,\n value: parsedValue,\n };\n }\n\n // Check if this is a keyword\n if (KEYWORDS.has(value)) {\n return { type: \"keyword\", value: value as KeywordValue };\n }\n\n if (hasGlobChars) {\n return { type: \"glob\", pattern: value };\n }\n\n return { type: \"word\", value };\n }\n\n private readAssignmentValueTokens(): Token[] {\n const tokens: Token[] = [];\n\n // Read tokens until we hit a space, newline, semicolon, etc.\n while (!this.isAtEnd()) {\n const char = this.peek();\n\n // Stop at whitespace or command terminators\n if (char === \" \" || char === \"\\t\" || char === \"\\n\" || char === \"\\r\" ||\n char === \";\" || char === \"|\" || char === \"&\" || char === \">\" || char === \"<\") {\n break;\n }\n\n if (char === \"$\") {\n tokens.push(this.readVariable());\n } else if (char === \"'\") {\n tokens.push(this.readSingleQuote());\n } else if (char === '\"') {\n tokens.push(this.readDoubleQuote());\n } else {\n // Read until word break\n let word = \"\";\n while (!this.isAtEnd() && !this.isWordBreak(this.peek())) {\n word += this.advance();\n }\n if (word) {\n tokens.push({ type: \"word\", value: word });\n } else {\n break;\n }\n }\n }\n\n return tokens;\n }\n\n private parseAssignmentValue(value: string): string | Token[] {\n // If value contains no special characters, return as string\n if (!value.includes(\"$\")) {\n return value;\n }\n\n // Parse the value to handle $VAR, ${VAR}, $((expr))\n const tokens: Token[] = [];\n let i = 0;\n let currentString = \"\";\n\n while (i < value.length) {\n if (value[i] === \"$\") {\n if (currentString) {\n tokens.push({ type: \"word\", value: currentString });\n currentString = \"\";\n }\n\n i++; // consume $\n if (i >= value.length) {\n tokens.push({ type: \"word\", value: \"$\" });\n break;\n }\n\n // Arithmetic expansion $((expr))\n if (value[i] === \"(\" && value[i + 1] === \"(\") {\n i += 2; // consume ((\n let depth = 1;\n let expr = \"\";\n while (i < value.length && depth > 0) {\n if (value[i] === \"(\" && value[i + 1] === \"(\") {\n depth++;\n expr += value[i]! + value[i + 1]!;\n i += 2;\n } else if (value[i] === \")\" && value[i + 1] === \")\") {\n depth--;\n if (depth > 0) {\n expr += value[i]! + value[i + 1]!;\n i += 2;\n } else {\n i += 2; // consume ))\n }\n } else {\n expr += value[i];\n i++;\n }\n }\n tokens.push({ type: \"arithmetic\", expression: expr });\n }\n // ${VAR} syntax\n else if (value[i] === \"{\") {\n i++; // consume {\n let varName = \"\";\n while (i < value.length && value[i] !== \"}\") {\n varName += value[i];\n i++;\n }\n if (i < value.length && value[i] === \"}\") {\n i++; // consume }\n }\n tokens.push({ type: \"variable\", name: varName });\n }\n // $VAR syntax\n else if (/[a-zA-Z_]/.test(value[i]!)) {\n let varName = \"\";\n while (i < value.length && /[a-zA-Z0-9_]/.test(value[i]!)) {\n varName += value[i];\n i++;\n }\n tokens.push({ type: \"variable\", name: varName });\n }\n // $(cmd) command substitution\n else if (value[i] === \"(\") {\n i++; // consume (\n let depth = 1;\n let cmd = \"\";\n while (i < value.length && depth > 0) {\n if (value[i] === \"(\") depth++;\n else if (value[i] === \")\") depth--;\n if (depth > 0) {\n cmd += value[i];\n }\n i++;\n }\n tokens.push({ type: \"substitution\", command: cmd });\n }\n else {\n // Not a variable, just a $\n currentString += \"$\";\n }\n } else {\n currentString += value[i];\n i++;\n }\n }\n\n if (currentString) {\n tokens.push({ type: \"word\", value: currentString });\n }\n\n if (tokens.length === 1 && tokens[0]!.type === \"word\") {\n return (tokens[0] as { type: \"word\"; value: string }).value;\n }\n\n return tokens.length > 0 ? tokens : value;\n }\n\n private readHeredoc(): Token {\n // Check for tab-stripping variant (<<-)\n const stripTabs = this.peek() === \"-\";\n if (stripTabs) {\n this.advance();\n }\n\n // Skip whitespace before delimiter\n while (this.peek() === \" \" || this.peek() === \"\\t\") {\n this.advance();\n }\n\n // Read delimiter and determine if expansion is enabled\n const { delimiter, expand } = this.readHeredocDelimiter();\n\n // Tokenize the rest of the current line and queue those tokens\n this.tokenizeRestOfLine();\n\n // Skip the newline that starts the heredoc content\n if (this.peek() === \"\\n\") {\n this.advance();\n }\n\n // Read content until closing delimiter\n let content = \"\";\n while (!this.isAtEnd()) {\n const lineStart = this.pos;\n let line = \"\";\n\n // Read until end of line or end of input\n while (!this.isAtEnd() && this.peek() !== \"\\n\") {\n line += this.advance();\n }\n\n // Check if this line is the delimiter (after stripping leading tabs if <<-)\n const strippedLine = stripTabs ? line.replace(/^\\t+/, \"\") : line;\n if (strippedLine === delimiter) {\n // Found closing delimiter, consume newline if present\n if (this.peek() === \"\\n\") {\n this.advance();\n }\n break;\n }\n\n // Add the line to content\n if (stripTabs) {\n content += line.replace(/^\\t+/, \"\");\n } else {\n content += line;\n }\n\n // Add newline if present\n if (this.peek() === \"\\n\") {\n content += this.advance();\n }\n }\n\n return { type: \"heredoc\", content, expand };\n }\n\n private readHeredocDelimiter(): { delimiter: string; expand: boolean } {\n const quoteChar = this.peek();\n\n // Quoted delimiter - no expansion\n if (quoteChar === \"'\" || quoteChar === '\"') {\n this.advance(); // consume opening quote\n let delimiter = \"\";\n while (!this.isAtEnd() && this.peek() !== quoteChar && this.peek() !== \"\\n\") {\n delimiter += this.advance();\n }\n if (this.peek() === quoteChar) {\n this.advance(); // consume closing quote\n }\n return { delimiter, expand: false };\n }\n\n // Unquoted delimiter - expansion enabled\n let delimiter = \"\";\n while (!this.isAtEnd() && !this.isWordBreak(this.peek()) && this.peek() !== \"\\n\") {\n if (this.peek() === \"\\\\\") {\n this.advance();\n if (!this.isAtEnd()) {\n delimiter += this.advance();\n }\n } else {\n delimiter += this.advance();\n }\n }\n\n return { delimiter, expand: true };\n }\n\n private tokenizeRestOfLine(): void {\n // Tokenize the rest of the line (until newline or end)\n while (!this.isAtEnd() && this.peek() !== \"\\n\") {\n // Skip only spaces and tabs, not newlines\n while (this.peek() === \" \" || this.peek() === \"\\t\") {\n this.advance();\n }\n if (this.isAtEnd() || this.peek() === \"\\n\") break;\n\n const token = this.readRestOfLineToken();\n if (token) {\n this.tokenQueue.push(token);\n }\n }\n }\n\n private readRestOfLineToken(): Token | null {\n const char = this.peek();\n\n if (char === \"|\") {\n this.advance();\n if (this.peek() === \"|\") {\n this.advance();\n return { type: \"or\" };\n }\n return { type: \"pipe\" };\n }\n\n if (char === \"&\") {\n this.advance();\n if (this.peek() === \"&\") {\n this.advance();\n return { type: \"and\" };\n }\n return { type: \"word\", value: \"&\" };\n }\n\n if (char === \";\") {\n this.advance();\n return { type: \"semicolon\" };\n }\n\n if (char === \">\") {\n this.advance();\n if (this.peek() === \">\") {\n this.advance();\n return { type: \"redirect\", mode: \">>\" };\n }\n return { type: \"redirect\", mode: \">\" };\n }\n\n if (char === \"<\") {\n this.advance();\n return { type: \"redirect\", mode: \"<\" };\n }\n\n if (char === \"$\") {\n return this.readVariable();\n }\n\n if (char === \"'\") {\n return this.readSingleQuote();\n }\n\n if (char === '\"') {\n return this.readDoubleQuote();\n }\n\n // Read a word but stop at newline\n let value = \"\";\n while (!this.isAtEnd() && !this.isWordBreak(this.peek()) && this.peek() !== \"\\n\") {\n if (this.peek() === \"\\\\\") {\n this.advance();\n if (!this.isAtEnd()) {\n value += this.advance();\n }\n } else {\n value += this.advance();\n }\n }\n\n if (value === \"\") return null;\n return { type: \"word\", value };\n }\n\n private isWordBreak(char: string): boolean {\n return WORD_BREAK_CHARS.has(char);\n }\n\n private isVarChar(char: string): boolean {\n return /[a-zA-Z0-9_]/.test(char);\n }\n\n private skipWhitespace(): void {\n while (!this.isAtEnd() && /\\s/.test(this.peek())) {\n this.advance();\n }\n }\n\n private skipWhitespaceExceptNewlines(): void {\n while (!this.isAtEnd() && /[ \\t\\r]/.test(this.peek())) {\n this.advance();\n }\n }\n\n private skipComment(): void {\n while (!this.isAtEnd() && this.peek() !== \"\\n\") {\n this.advance();\n }\n }\n\n private peek(): string {\n return this.source[this.pos] ?? \"\";\n }\n\n private peekAhead(n: number): string {\n return this.source[this.pos + n] ?? \"\";\n }\n\n private advance(): string {\n const char = this.source[this.pos]!;\n this.pos++;\n if (char === \"\\n\") {\n this.line++;\n this.column = 1;\n } else {\n this.column++;\n }\n return char;\n }\n\n private isAtEnd(): boolean {\n return this.pos >= this.source.length;\n }\n}\n\nexport function lex(source: string, options?: { preserveNewlines?: boolean }): Token[] {\n return new Lexer(source, options).tokenize();\n}\n"
|
|
6
6
|
],
|
|
7
|
-
"mappings": "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",
|
|
8
|
-
"debugId": "
|
|
7
|
+
"mappings": "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",
|
|
8
|
+
"debugId": "637CA619A6A223D764756E2164756E21",
|
|
9
9
|
"names": []
|
|
10
10
|
}
|
|
@@ -466,7 +466,7 @@ class Parser {
|
|
|
466
466
|
}
|
|
467
467
|
isWordToken() {
|
|
468
468
|
const token = this.peek();
|
|
469
|
-
return token.type === "word" || token.type === "singleQuote" || token.type === "doubleQuote" || token.type === "variable" || token.type === "substitution" || token.type === "arithmetic" || token.type === "glob" || token.type === "heredoc";
|
|
469
|
+
return Array.isArray(token) || token.type === "word" || token.type === "singleQuote" || token.type === "doubleQuote" || token.type === "variable" || token.type === "substitution" || token.type === "arithmetic" || token.type === "glob" || token.type === "heredoc";
|
|
470
470
|
}
|
|
471
471
|
check(type) {
|
|
472
472
|
return this.peek().type === type;
|
|
@@ -494,4 +494,4 @@ function parse(tokens) {
|
|
|
494
494
|
return new Parser(tokens).parse();
|
|
495
495
|
}
|
|
496
496
|
|
|
497
|
-
//# debugId=
|
|
497
|
+
//# debugId=5FEDDF7D68ED292664756E2164756E21
|