shell-dsl 0.0.18 → 0.0.20
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 +55 -0
- package/dist/cjs/package.json +1 -1
- package/dist/cjs/src/commands/awk/awk.cjs +4 -2
- package/dist/cjs/src/commands/awk/awk.cjs.map +3 -3
- package/dist/cjs/src/commands/echo/echo.cjs +11 -4
- package/dist/cjs/src/commands/echo/echo.cjs.map +3 -3
- package/dist/cjs/src/commands/grep/grep.cjs +3 -2
- package/dist/cjs/src/commands/grep/grep.cjs.map +3 -3
- package/dist/cjs/src/commands/sed/sed.cjs +3 -2
- package/dist/cjs/src/commands/sed/sed.cjs.map +3 -3
- package/dist/cjs/src/commands/tr/tr.cjs +3 -43
- package/dist/cjs/src/commands/tr/tr.cjs.map +3 -3
- package/dist/cjs/src/fs/real-fs.cjs.map +2 -2
- package/dist/cjs/src/utils/expand-escapes.cjs +77 -0
- package/dist/cjs/src/utils/expand-escapes.cjs.map +10 -0
- package/dist/cjs/src/utils/index.cjs +3 -1
- package/dist/cjs/src/utils/index.cjs.map +3 -3
- package/dist/mjs/package.json +1 -1
- package/dist/mjs/src/commands/awk/awk.mjs +4 -2
- package/dist/mjs/src/commands/awk/awk.mjs.map +3 -3
- package/dist/mjs/src/commands/echo/echo.mjs +11 -4
- package/dist/mjs/src/commands/echo/echo.mjs.map +3 -3
- package/dist/mjs/src/commands/grep/grep.mjs +3 -2
- package/dist/mjs/src/commands/grep/grep.mjs.map +3 -3
- package/dist/mjs/src/commands/sed/sed.mjs +3 -2
- package/dist/mjs/src/commands/sed/sed.mjs.map +3 -3
- package/dist/mjs/src/commands/tr/tr.mjs +2 -42
- package/dist/mjs/src/commands/tr/tr.mjs.map +3 -3
- package/dist/mjs/src/fs/real-fs.mjs.map +2 -2
- package/dist/mjs/src/utils/expand-escapes.mjs +47 -0
- package/dist/mjs/src/utils/expand-escapes.mjs.map +10 -0
- package/dist/mjs/src/utils/index.mjs +3 -1
- package/dist/mjs/src/utils/index.mjs.map +3 -3
- package/dist/types/src/fs/real-fs.d.ts +2 -2
- package/dist/types/src/utils/expand-escapes.d.ts +1 -0
- package/dist/types/src/utils/index.d.ts +1 -0
- package/package.json +1 -1
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../src/commands/awk/awk.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
|
-
"import type { Command } from \"../../types.mjs\";\n\ninterface AwkRule {\n pattern?: RegExp;\n action: string;\n}\n\ninterface AwkOptions {\n fieldSeparator: RegExp;\n program: AwkRule[];\n}\n\ninterface ParseArgsResult {\n options: AwkOptions;\n files: string[];\n error?: { type: \"unrecognized_option\" | \"missing_value\"; option: string };\n}\n\nfunction parseProgram(programStr: string): AwkRule[] {\n const rules: AwkRule[] = [];\n const trimmed = programStr.trim();\n\n // Simple parser for patterns like: /regex/ {action} or {action}\n // Handle multiple rules separated by whitespace/newlines\n\n let remaining = trimmed;\n\n while (remaining.length > 0) {\n remaining = remaining.trim();\n if (remaining.length === 0) break;\n\n let pattern: RegExp | undefined;\n let action = \"\";\n\n // Check for /pattern/ prefix\n if (remaining.startsWith(\"/\")) {\n const endSlash = remaining.indexOf(\"/\", 1);\n if (endSlash > 1) {\n const patternStr = remaining.slice(1, endSlash);\n try {\n pattern = new RegExp(patternStr);\n } catch {\n // Invalid regex, skip\n }\n remaining = remaining.slice(endSlash + 1).trim();\n }\n }\n\n // Check for {action} block\n if (remaining.startsWith(\"{\")) {\n let braceCount = 1;\n let i = 1;\n while (i < remaining.length && braceCount > 0) {\n if (remaining[i] === \"{\") braceCount++;\n else if (remaining[i] === \"}\") braceCount--;\n i++;\n }\n action = remaining.slice(1, i - 1).trim();\n remaining = remaining.slice(i).trim();\n } else if (pattern) {\n // Pattern without action - default action is print\n action = \"print\";\n } else {\n // No pattern and no action block, might be malformed\n break;\n }\n\n if (action || pattern) {\n rules.push({ pattern, action: action || \"print\" });\n }\n }\n\n return rules;\n}\n\nfunction escapeRegex(str: string): string {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\nfunction parseArgs(args: string[]): ParseArgsResult {\n const options: AwkOptions = {\n fieldSeparator: /[ \\t]+/,\n program: [],\n };\n const files: string[] = [];\n\n let i = 0;\n let programFound = false;\n\n while (i < args.length) {\n const arg = args[i]!;\n\n // Handle -- to stop flag parsing\n if (arg === \"--\") {\n i++;\n while (i < args.length) {\n const remaining = args[i]!;\n if (!programFound) {\n options.program = parseProgram(remaining);\n programFound = true;\n } else {\n files.push(remaining);\n }\n i++;\n }\n break;\n }\n\n // Long flag handling\n if (arg.startsWith(\"--\")) {\n return {\n options,\n files,\n error: { type: \"unrecognized_option\", option: arg },\n };\n }\n\n // Short flag handling\n if (arg.startsWith(\"-\") && arg.length > 1) {\n const char = arg[1]!;\n\n if (char === \"F\") {\n // -F takes a field separator argument\n const restOfArg = arg.slice(2);\n let fs: string;\n\n if (restOfArg.length > 0) {\n fs = restOfArg;\n } else if (i + 1 < args.length) {\n fs = args[++i]!;\n } else {\n return {\n options,\n files,\n error: { type: \"missing_value\", option: \"-F\" },\n };\n }\n\n // For single character separators, match exactly\n // For patterns, use as regex\n if (fs.length === 1) {\n options.fieldSeparator = new RegExp(escapeRegex(fs));\n } else {\n try {\n options.fieldSeparator = new RegExp(fs);\n } catch {\n options.fieldSeparator = new RegExp(escapeRegex(fs));\n }\n }\n i++;\n continue;\n } else {\n // Unknown flag\n return {\n options,\n files,\n error: { type: \"unrecognized_option\", option: `-${char}` },\n };\n }\n }\n\n // Non-flag argument\n if (!programFound) {\n options.program = parseProgram(arg);\n programFound = true;\n } else {\n files.push(arg);\n }\n i++;\n }\n\n return { options, files };\n}\n\nfunction formatError(error: NonNullable<ParseArgsResult[\"error\"]>): string {\n let message: string;\n if (error.type === \"unrecognized_option\") {\n if (error.option.startsWith(\"--\")) {\n message = `awk: unrecognized option '${error.option}'\\n`;\n } else {\n message = `awk: invalid option -- '${error.option.slice(1)}'\\n`;\n }\n } else {\n message = `awk: option '${error.option}' requires an argument\\n`;\n }\n return message + `usage: awk [-F fs] 'program' [file ...]\\n`;\n}\n\nfunction splitFields(line: string, separator: RegExp): string[] {\n // Split and filter empty strings for whitespace separation\n const parts = line.split(separator);\n // For whitespace separator, filter leading empty string\n if (separator.source === \"[ \\\\t]+\" && parts[0] === \"\") {\n parts.shift();\n }\n return parts;\n}\n\nfunction executeAction(\n action: string,\n fields: string[],\n line: string,\n lineNumber: number\n): string | null {\n // Parse and execute the action\n // Supported: print, print $0, print $1, print $1, $2, etc.\n\n const trimmedAction = action.trim();\n\n if (trimmedAction === \"\" || trimmedAction === \"print\" || trimmedAction === \"print $0\") {\n return line;\n }\n\n // Check for print with field references\n if (trimmedAction.startsWith(\"print\")) {\n const printArgs = trimmedAction.slice(5).trim();\n return evaluatePrintArgs(printArgs, fields, line, lineNumber);\n }\n\n // Just field reference without print (implicit print)\n if (trimmedAction.startsWith(\"$\")) {\n return evaluatePrintArgs(trimmedAction, fields, line, lineNumber);\n }\n\n return null;\n}\n\nfunction evaluatePrintArgs(\n argsStr: string,\n fields: string[],\n line: string,\n lineNumber: number\n): string {\n const results: string[] = [];\n\n // Split by comma for multiple arguments\n const args = argsStr.split(\",\").map((a) => a.trim());\n\n for (const arg of args) {\n const value = evaluateExpression(arg, fields, line, lineNumber);\n results.push(value);\n }\n\n return results.join(\" \");\n}\n\nfunction tokenizeExpression(expr: string): string[] {\n const tokens: string[] = [];\n let i = 0;\n const str = expr.trim();\n\n while (i < str.length) {\n // Skip whitespace\n while (i < str.length && /\\s/.test(str[i]!)) {\n i++;\n }\n if (i >= str.length) break;\n\n // String literal\n if (str[i] === '\"' || str[i] === \"'\") {\n const quote = str[i]!;\n let j = i + 1;\n while (j < str.length && str[j] !== quote) {\n j++;\n }\n tokens.push(str.slice(i, j + 1));\n i = j + 1;\n }\n // Field reference or variable\n else if (str[i] === '$' || /[a-zA-Z]/.test(str[i]!)) {\n let j = i;\n while (j < str.length && /[\\w$]/.test(str[j]!)) {\n j++;\n }\n tokens.push(str.slice(i, j));\n i = j;\n }\n // Other characters\n else {\n tokens.push(str[i]!);\n i++;\n }\n }\n\n return tokens;\n}\n\nfunction evaluateExpression(\n expr: string,\n fields: string[],\n line: string,\n lineNumber: number\n): string {\n const tokens = tokenizeExpression(expr);\n\n if (tokens.length === 0) {\n return \"\";\n }\n\n // Evaluate each token and concatenate\n const parts: string[] = [];\n for (const token of tokens) {\n // String literal\n if ((token.startsWith('\"') && token.endsWith('\"')) ||\n (token.startsWith(\"'\") && token.endsWith(\"'\"))) {\n parts.push(token.slice(1, -1));\n }\n // Field reference $0, $1, etc.\n else if (token.match(/^\\$(\\d+)$/)) {\n const fieldNum = parseInt(token.slice(1), 10);\n if (fieldNum === 0) {\n parts.push(line);\n } else {\n parts.push(fields[fieldNum - 1] ?? \"\");\n }\n }\n // Built-in variables\n else if (token === \"NF\") {\n parts.push(String(fields.length));\n }\n else if (token === \"NR\") {\n parts.push(String(lineNumber));\n }\n // Unknown - return as-is\n else {\n parts.push(token);\n }\n }\n\n return parts.join(\"\");\n}\n\nfunction processLine(\n line: string,\n lineNumber: number,\n options: AwkOptions\n): string[] {\n const fields = splitFields(line, options.fieldSeparator);\n const outputs: string[] = [];\n\n for (const rule of options.program) {\n // Check pattern match\n if (rule.pattern && !rule.pattern.test(line)) {\n continue;\n }\n\n const result = executeAction(rule.action, fields, line, lineNumber);\n if (result !== null) {\n outputs.push(result);\n }\n }\n\n return outputs;\n}\n\nexport const awk: Command = async (ctx) => {\n const { options, files, error } = parseArgs(ctx.args);\n\n if (error) {\n await ctx.stderr.writeText(formatError(error));\n return 1;\n }\n\n if (options.program.length === 0) {\n await ctx.stderr.writeText(\"awk: missing program\\n\");\n return 1;\n }\n\n let lineNumber = 0;\n\n const processContent = async (content: string): Promise<void> => {\n const lines = content.split(\"\\n\");\n // Handle trailing newline\n if (lines.length > 0 && lines[lines.length - 1] === \"\") {\n lines.pop();\n }\n\n for (const line of lines) {\n lineNumber++;\n const outputs = processLine(line, lineNumber, options);\n for (const output of outputs) {\n await ctx.stdout.writeText(output + \"\\n\");\n }\n }\n };\n\n if (files.length === 0) {\n // Read from stdin\n const content = await ctx.stdin.text();\n await processContent(content);\n } else {\n // Read from files\n for (const file of files) {\n try {\n const path = ctx.fs.resolve(ctx.cwd, file);\n const content = await ctx.fs.readFile(path);\n await processContent(content.toString());\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n await ctx.stderr.writeText(`awk: ${file}: ${message}\\n`);\n return 1;\n }\n }\n }\n\n return 0;\n};\n"
|
|
5
|
+
"import type { Command } from \"../../types.mjs\";\nimport { expandEscapes } from \"../../utils/expand-escapes.mjs\";\n\ninterface AwkRule {\n pattern?: RegExp;\n action: string;\n}\n\ninterface AwkOptions {\n fieldSeparator: RegExp;\n program: AwkRule[];\n}\n\ninterface ParseArgsResult {\n options: AwkOptions;\n files: string[];\n error?: { type: \"unrecognized_option\" | \"missing_value\"; option: string };\n}\n\nfunction parseProgram(programStr: string): AwkRule[] {\n const rules: AwkRule[] = [];\n const trimmed = programStr.trim();\n\n // Simple parser for patterns like: /regex/ {action} or {action}\n // Handle multiple rules separated by whitespace/newlines\n\n let remaining = trimmed;\n\n while (remaining.length > 0) {\n remaining = remaining.trim();\n if (remaining.length === 0) break;\n\n let pattern: RegExp | undefined;\n let action = \"\";\n\n // Check for /pattern/ prefix\n if (remaining.startsWith(\"/\")) {\n const endSlash = remaining.indexOf(\"/\", 1);\n if (endSlash > 1) {\n const patternStr = remaining.slice(1, endSlash);\n try {\n pattern = new RegExp(patternStr);\n } catch {\n // Invalid regex, skip\n }\n remaining = remaining.slice(endSlash + 1).trim();\n }\n }\n\n // Check for {action} block\n if (remaining.startsWith(\"{\")) {\n let braceCount = 1;\n let i = 1;\n while (i < remaining.length && braceCount > 0) {\n if (remaining[i] === \"{\") braceCount++;\n else if (remaining[i] === \"}\") braceCount--;\n i++;\n }\n action = remaining.slice(1, i - 1).trim();\n remaining = remaining.slice(i).trim();\n } else if (pattern) {\n // Pattern without action - default action is print\n action = \"print\";\n } else {\n // No pattern and no action block, might be malformed\n break;\n }\n\n if (action || pattern) {\n rules.push({ pattern, action: action || \"print\" });\n }\n }\n\n return rules;\n}\n\nfunction escapeRegex(str: string): string {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\nfunction parseArgs(args: string[]): ParseArgsResult {\n const options: AwkOptions = {\n fieldSeparator: /[ \\t]+/,\n program: [],\n };\n const files: string[] = [];\n\n let i = 0;\n let programFound = false;\n\n while (i < args.length) {\n const arg = args[i]!;\n\n // Handle -- to stop flag parsing\n if (arg === \"--\") {\n i++;\n while (i < args.length) {\n const remaining = args[i]!;\n if (!programFound) {\n options.program = parseProgram(remaining);\n programFound = true;\n } else {\n files.push(remaining);\n }\n i++;\n }\n break;\n }\n\n // Long flag handling\n if (arg.startsWith(\"--\")) {\n return {\n options,\n files,\n error: { type: \"unrecognized_option\", option: arg },\n };\n }\n\n // Short flag handling\n if (arg.startsWith(\"-\") && arg.length > 1) {\n const char = arg[1]!;\n\n if (char === \"F\") {\n // -F takes a field separator argument\n const restOfArg = arg.slice(2);\n let fs: string;\n\n if (restOfArg.length > 0) {\n fs = restOfArg;\n } else if (i + 1 < args.length) {\n fs = args[++i]!;\n } else {\n return {\n options,\n files,\n error: { type: \"missing_value\", option: \"-F\" },\n };\n }\n\n // Expand escape sequences (e.g. \\t → tab)\n fs = expandEscapes(fs);\n\n // For single character separators, match exactly\n // For patterns, use as regex\n if (fs.length === 1) {\n options.fieldSeparator = new RegExp(escapeRegex(fs));\n } else {\n try {\n options.fieldSeparator = new RegExp(fs);\n } catch {\n options.fieldSeparator = new RegExp(escapeRegex(fs));\n }\n }\n i++;\n continue;\n } else {\n // Unknown flag\n return {\n options,\n files,\n error: { type: \"unrecognized_option\", option: `-${char}` },\n };\n }\n }\n\n // Non-flag argument\n if (!programFound) {\n options.program = parseProgram(arg);\n programFound = true;\n } else {\n files.push(arg);\n }\n i++;\n }\n\n return { options, files };\n}\n\nfunction formatError(error: NonNullable<ParseArgsResult[\"error\"]>): string {\n let message: string;\n if (error.type === \"unrecognized_option\") {\n if (error.option.startsWith(\"--\")) {\n message = `awk: unrecognized option '${error.option}'\\n`;\n } else {\n message = `awk: invalid option -- '${error.option.slice(1)}'\\n`;\n }\n } else {\n message = `awk: option '${error.option}' requires an argument\\n`;\n }\n return message + `usage: awk [-F fs] 'program' [file ...]\\n`;\n}\n\nfunction splitFields(line: string, separator: RegExp): string[] {\n // Split and filter empty strings for whitespace separation\n const parts = line.split(separator);\n // For whitespace separator, filter leading empty string\n if (separator.source === \"[ \\\\t]+\" && parts[0] === \"\") {\n parts.shift();\n }\n return parts;\n}\n\nfunction executeAction(\n action: string,\n fields: string[],\n line: string,\n lineNumber: number\n): string | null {\n // Parse and execute the action\n // Supported: print, print $0, print $1, print $1, $2, etc.\n\n const trimmedAction = action.trim();\n\n if (trimmedAction === \"\" || trimmedAction === \"print\" || trimmedAction === \"print $0\") {\n return line;\n }\n\n // Check for print with field references\n if (trimmedAction.startsWith(\"print\")) {\n const printArgs = trimmedAction.slice(5).trim();\n return evaluatePrintArgs(printArgs, fields, line, lineNumber);\n }\n\n // Just field reference without print (implicit print)\n if (trimmedAction.startsWith(\"$\")) {\n return evaluatePrintArgs(trimmedAction, fields, line, lineNumber);\n }\n\n return null;\n}\n\nfunction evaluatePrintArgs(\n argsStr: string,\n fields: string[],\n line: string,\n lineNumber: number\n): string {\n const results: string[] = [];\n\n // Split by comma for multiple arguments\n const args = argsStr.split(\",\").map((a) => a.trim());\n\n for (const arg of args) {\n const value = evaluateExpression(arg, fields, line, lineNumber);\n results.push(value);\n }\n\n return results.join(\" \");\n}\n\nfunction tokenizeExpression(expr: string): string[] {\n const tokens: string[] = [];\n let i = 0;\n const str = expr.trim();\n\n while (i < str.length) {\n // Skip whitespace\n while (i < str.length && /\\s/.test(str[i]!)) {\n i++;\n }\n if (i >= str.length) break;\n\n // String literal\n if (str[i] === '\"' || str[i] === \"'\") {\n const quote = str[i]!;\n let j = i + 1;\n while (j < str.length && str[j] !== quote) {\n j++;\n }\n tokens.push(str.slice(i, j + 1));\n i = j + 1;\n }\n // Field reference or variable\n else if (str[i] === '$' || /[a-zA-Z]/.test(str[i]!)) {\n let j = i;\n while (j < str.length && /[\\w$]/.test(str[j]!)) {\n j++;\n }\n tokens.push(str.slice(i, j));\n i = j;\n }\n // Other characters\n else {\n tokens.push(str[i]!);\n i++;\n }\n }\n\n return tokens;\n}\n\nfunction evaluateExpression(\n expr: string,\n fields: string[],\n line: string,\n lineNumber: number\n): string {\n const tokens = tokenizeExpression(expr);\n\n if (tokens.length === 0) {\n return \"\";\n }\n\n // Evaluate each token and concatenate\n const parts: string[] = [];\n for (const token of tokens) {\n // String literal\n if ((token.startsWith('\"') && token.endsWith('\"')) ||\n (token.startsWith(\"'\") && token.endsWith(\"'\"))) {\n parts.push(expandEscapes(token.slice(1, -1)));\n }\n // Field reference $0, $1, etc.\n else if (token.match(/^\\$(\\d+)$/)) {\n const fieldNum = parseInt(token.slice(1), 10);\n if (fieldNum === 0) {\n parts.push(line);\n } else {\n parts.push(fields[fieldNum - 1] ?? \"\");\n }\n }\n // Built-in variables\n else if (token === \"NF\") {\n parts.push(String(fields.length));\n }\n else if (token === \"NR\") {\n parts.push(String(lineNumber));\n }\n // Unknown - return as-is\n else {\n parts.push(token);\n }\n }\n\n return parts.join(\"\");\n}\n\nfunction processLine(\n line: string,\n lineNumber: number,\n options: AwkOptions\n): string[] {\n const fields = splitFields(line, options.fieldSeparator);\n const outputs: string[] = [];\n\n for (const rule of options.program) {\n // Check pattern match\n if (rule.pattern && !rule.pattern.test(line)) {\n continue;\n }\n\n const result = executeAction(rule.action, fields, line, lineNumber);\n if (result !== null) {\n outputs.push(result);\n }\n }\n\n return outputs;\n}\n\nexport const awk: Command = async (ctx) => {\n const { options, files, error } = parseArgs(ctx.args);\n\n if (error) {\n await ctx.stderr.writeText(formatError(error));\n return 1;\n }\n\n if (options.program.length === 0) {\n await ctx.stderr.writeText(\"awk: missing program\\n\");\n return 1;\n }\n\n let lineNumber = 0;\n\n const processContent = async (content: string): Promise<void> => {\n const lines = content.split(\"\\n\");\n // Handle trailing newline\n if (lines.length > 0 && lines[lines.length - 1] === \"\") {\n lines.pop();\n }\n\n for (const line of lines) {\n lineNumber++;\n const outputs = processLine(line, lineNumber, options);\n for (const output of outputs) {\n await ctx.stdout.writeText(output + \"\\n\");\n }\n }\n };\n\n if (files.length === 0) {\n // Read from stdin\n const content = await ctx.stdin.text();\n await processContent(content);\n } else {\n // Read from files\n for (const file of files) {\n try {\n const path = ctx.fs.resolve(ctx.cwd, file);\n const content = await ctx.fs.readFile(path);\n await processContent(content.toString());\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n await ctx.stderr.writeText(`awk: ${file}: ${message}\\n`);\n return 1;\n }\n }\n }\n\n return 0;\n};\n"
|
|
6
6
|
],
|
|
7
|
-
"mappings": "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
|
|
8
|
-
"debugId": "
|
|
7
|
+
"mappings": "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",
|
|
8
|
+
"debugId": "07693D1FE74122D064756E2164756E21",
|
|
9
9
|
"names": []
|
|
10
10
|
}
|
|
@@ -1,17 +1,21 @@
|
|
|
1
1
|
// src/commands/echo/echo.ts
|
|
2
2
|
import { createFlagParser } from "../../utils/flag-parser.mjs";
|
|
3
|
+
import { expandEscapes } from "../../utils/expand-escapes.mjs";
|
|
3
4
|
var spec = {
|
|
4
5
|
name: "echo",
|
|
5
6
|
flags: [
|
|
6
|
-
{ short: "n" }
|
|
7
|
+
{ short: "n" },
|
|
8
|
+
{ short: "e" }
|
|
7
9
|
],
|
|
8
|
-
usage: "echo [-
|
|
10
|
+
usage: "echo [-neE] [string ...]",
|
|
9
11
|
stopAfterFirstPositional: true
|
|
10
12
|
};
|
|
11
|
-
var defaults = { noNewline: false };
|
|
13
|
+
var defaults = { noNewline: false, interpretEscapes: false };
|
|
12
14
|
var handler = (flags, flag) => {
|
|
13
15
|
if (flag.short === "n")
|
|
14
16
|
flags.noNewline = true;
|
|
17
|
+
if (flag.short === "e")
|
|
18
|
+
flags.interpretEscapes = true;
|
|
15
19
|
};
|
|
16
20
|
var parser = createFlagParser(spec, defaults, handler);
|
|
17
21
|
var echo = async (ctx) => {
|
|
@@ -21,6 +25,9 @@ var echo = async (ctx) => {
|
|
|
21
25
|
return 1;
|
|
22
26
|
}
|
|
23
27
|
let output = result.args.join(" ");
|
|
28
|
+
if (result.flags.interpretEscapes) {
|
|
29
|
+
output = expandEscapes(output);
|
|
30
|
+
}
|
|
24
31
|
if (!result.flags.noNewline) {
|
|
25
32
|
output += `
|
|
26
33
|
`;
|
|
@@ -32,4 +39,4 @@ export {
|
|
|
32
39
|
echo
|
|
33
40
|
};
|
|
34
41
|
|
|
35
|
-
//# debugId=
|
|
42
|
+
//# debugId=787B2EF8A30EB1EF64756E2164756E21
|
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../src/commands/echo/echo.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
|
-
"import type { Command } from \"../../types.mjs\";\nimport { createFlagParser, type FlagDefinition } from \"../../utils/flag-parser.mjs\";\n\ninterface EchoFlags {\n noNewline: boolean;\n}\n\nconst spec = {\n name: \"echo\",\n flags: [\n { short: \"n\" },\n ] as FlagDefinition[],\n usage: \"echo [-
|
|
5
|
+
"import type { Command } from \"../../types.mjs\";\nimport { createFlagParser, type FlagDefinition } from \"../../utils/flag-parser.mjs\";\nimport { expandEscapes } from \"../../utils/expand-escapes.mjs\";\n\ninterface EchoFlags {\n noNewline: boolean;\n interpretEscapes: boolean;\n}\n\nconst spec = {\n name: \"echo\",\n flags: [\n { short: \"n\" },\n { short: \"e\" },\n ] as FlagDefinition[],\n usage: \"echo [-neE] [string ...]\",\n stopAfterFirstPositional: true,\n};\n\nconst defaults: EchoFlags = { noNewline: false, interpretEscapes: false };\n\nconst handler = (flags: EchoFlags, flag: FlagDefinition) => {\n if (flag.short === \"n\") flags.noNewline = true;\n if (flag.short === \"e\") flags.interpretEscapes = true;\n};\n\nconst parser = createFlagParser(spec, defaults, handler);\n\nexport const echo: Command = async (ctx) => {\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 let output = result.args.join(\" \");\n\n if (result.flags.interpretEscapes) {\n output = expandEscapes(output);\n }\n\n if (!result.flags.noNewline) {\n output += \"\\n\";\n }\n\n await ctx.stdout.writeText(output);\n return 0;\n};\n"
|
|
6
6
|
],
|
|
7
|
-
"mappings": ";AACA;
|
|
8
|
-
"debugId": "
|
|
7
|
+
"mappings": ";AACA;AACA;AAOA,IAAM,OAAO;AAAA,EACX,MAAM;AAAA,EACN,OAAO;AAAA,IACL,EAAE,OAAO,IAAI;AAAA,IACb,EAAE,OAAO,IAAI;AAAA,EACf;AAAA,EACA,OAAO;AAAA,EACP,0BAA0B;AAC5B;AAEA,IAAM,WAAsB,EAAE,WAAW,OAAO,kBAAkB,MAAM;AAExE,IAAM,UAAU,CAAC,OAAkB,SAAyB;AAAA,EAC1D,IAAI,KAAK,UAAU;AAAA,IAAK,MAAM,YAAY;AAAA,EAC1C,IAAI,KAAK,UAAU;AAAA,IAAK,MAAM,mBAAmB;AAAA;AAGnD,IAAM,SAAS,iBAAiB,MAAM,UAAU,OAAO;AAEhD,IAAM,OAAgB,OAAO,QAAQ;AAAA,EAC1C,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,IAAI,SAAS,OAAO,KAAK,KAAK,GAAG;AAAA,EAEjC,IAAI,OAAO,MAAM,kBAAkB;AAAA,IACjC,SAAS,cAAc,MAAM;AAAA,EAC/B;AAAA,EAEA,IAAI,CAAC,OAAO,MAAM,WAAW;AAAA,IAC3B,UAAU;AAAA;AAAA,EACZ;AAAA,EAEA,MAAM,IAAI,OAAO,UAAU,MAAM;AAAA,EACjC,OAAO;AAAA;",
|
|
8
|
+
"debugId": "787B2EF8A30EB1EF64756E2164756E21",
|
|
9
9
|
"names": []
|
|
10
10
|
}
|
|
@@ -151,7 +151,8 @@ function escapeRegex(str) {
|
|
|
151
151
|
return str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
152
152
|
}
|
|
153
153
|
function buildMatcher(options) {
|
|
154
|
-
let patterns = options.patterns
|
|
154
|
+
let patterns = options.patterns.map((p) => p.replace(/\\t/g, "\t").replace(/\\n/g, `
|
|
155
|
+
`));
|
|
155
156
|
if (options.fixedStrings) {
|
|
156
157
|
patterns = patterns.map(escapeRegex);
|
|
157
158
|
} else {
|
|
@@ -529,4 +530,4 @@ export {
|
|
|
529
530
|
grep
|
|
530
531
|
};
|
|
531
532
|
|
|
532
|
-
//# debugId=
|
|
533
|
+
//# debugId=49374EF55D47729864756E2164756E21
|
|
@@ -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.mjs\";\nimport { createFlagParser, type FlagDefinition, type FlagError } from \"../../utils/flag-parser.mjs\";\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"
|
|
5
|
+
"import type { Command } from \"../../types.mjs\";\nimport { createFlagParser, type FlagDefinition, type FlagError } from \"../../utils/flag-parser.mjs\";\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 // Expand common escape sequences in patterns (\\t → tab, \\n → newline)\n let patterns = options.patterns.map(p => p.replace(/\\\\t/g, \"\\t\").replace(/\\\\n/g, \"\\n\"));\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": "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",
|
|
8
|
+
"debugId": "49374EF55D47729864756E2164756E21",
|
|
9
9
|
"names": []
|
|
10
10
|
}
|
|
@@ -7,7 +7,8 @@ function parseSubstitution(script) {
|
|
|
7
7
|
const globalFlag = flags.includes("g");
|
|
8
8
|
const caseInsensitive = flags.includes("i");
|
|
9
9
|
const patternStr = rawPattern.replace(/\\\(/g, "(").replace(/\\\)/g, ")");
|
|
10
|
-
const replacement = rawReplacement.replace(/\\([0-9])/g, "\x00BACKREF$1\x00").replace(
|
|
10
|
+
const replacement = rawReplacement.replace(/\\([0-9])/g, "\x00BACKREF$1\x00").replace(/\\n/g, `
|
|
11
|
+
`).replace(/\\t/g, "\t").replace(/\\\\/g, "\x00BSLASH\x00").replace(/\$/g, "$$$$").replace(/\x00BACKREF([0-9])\x00/g, "$$$1").replace(/\x00BSLASH\x00/g, "\\");
|
|
11
12
|
try {
|
|
12
13
|
const regexFlags = caseInsensitive ? "i" : "";
|
|
13
14
|
return {
|
|
@@ -539,4 +540,4 @@ export {
|
|
|
539
540
|
sed
|
|
540
541
|
};
|
|
541
542
|
|
|
542
|
-
//# debugId=
|
|
543
|
+
//# debugId=4AE153398292798664756E2164756E21
|
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../src/commands/sed/sed.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
|
-
"import type { Command } from \"../../types.mjs\";\n\ninterface SedCommand {\n type: \"s\" | \"d\" | \"p\" | \"h\" | \"H\" | \"g_hold\" | \"G\" | \"x\" | \"n\" | \"N\" | \"P\" | \"D\" | \"b\" | \"label\" | \"group\";\n addressPattern?: RegExp;\n negated?: boolean;\n pattern?: RegExp;\n replacement?: string;\n globalFlag: boolean;\n printFlag: boolean;\n label?: string;\n children?: SedCommand[];\n}\n\ninterface SedOptions {\n suppressOutput: boolean; // -n\n inPlace: boolean; // -i\n commands: SedCommand[];\n}\n\nfunction parseSubstitution(script: string): SedCommand | null {\n const match = script.match(/^s(.)(.+?)\\1(.*?)\\1([gi]*)$/);\n if (!match) return null;\n\n const [, , rawPattern, rawReplacement, flags] = match;\n const globalFlag = flags!.includes(\"g\");\n const caseInsensitive = flags!.includes(\"i\");\n\n const patternStr = rawPattern!.replace(/\\\\\\(/g, \"(\").replace(/\\\\\\)/g, \")\");\n const replacement = rawReplacement!\n .replace(/\\\\([0-9])/g, \"\\x00BACKREF$1\\x00\")\n .replace(/\\$/g, \"$$$$\")\n .replace(/\\x00BACKREF([0-9])\\x00/g, \"$$$1\");\n\n try {\n const regexFlags = caseInsensitive ? \"i\" : \"\";\n return {\n type: \"s\",\n pattern: new RegExp(patternStr, regexFlags),\n replacement,\n globalFlag,\n printFlag: false,\n };\n } catch {\n return null;\n }\n}\n\nfunction parseCommand(script: string): SedCommand | null {\n const trimmed = script.trim();\n\n // Label command :name\n if (trimmed.startsWith(\":\")) {\n return {\n type: \"label\",\n label: trimmed.slice(1).trim(),\n globalFlag: false,\n printFlag: false,\n };\n }\n\n // Branch command: b or b label\n if (trimmed === \"b\" || trimmed.startsWith(\"b \") || trimmed.startsWith(\"b\\t\")) {\n return {\n type: \"b\",\n label: trimmed.length > 1 ? trimmed.slice(1).trim() : undefined,\n globalFlag: false,\n printFlag: false,\n };\n }\n\n // Group { ... }\n if (trimmed.startsWith(\"{\") && trimmed.endsWith(\"}\")) {\n const inner = trimmed.slice(1, -1).trim();\n const parts = splitScriptParts(inner);\n const children: SedCommand[] = [];\n for (const part of parts) {\n const cmd = parseCommand(part);\n if (cmd) children.push(cmd);\n }\n return {\n type: \"group\",\n children,\n globalFlag: false,\n printFlag: false,\n };\n }\n\n // Simple single-char commands (no address)\n const simpleCommands: Record<string, SedCommand[\"type\"]> = {\n h: \"h\",\n H: \"H\",\n g: \"g_hold\",\n G: \"G\",\n x: \"x\",\n n: \"n\",\n N: \"N\",\n P: \"P\",\n D: \"D\",\n d: \"d\",\n p: \"p\",\n };\n if (simpleCommands[trimmed]) {\n return {\n type: simpleCommands[trimmed]!,\n globalFlag: false,\n printFlag: false,\n };\n }\n\n // Check for address pattern: /pattern/ followed by optional ! and command\n const addressWithCmd = trimmed.match(/^\\/(.+?)\\/(!)?\\s*(.*)$/);\n if (addressWithCmd) {\n const [, addressPatternStr, negation, rest] = addressWithCmd;\n const negated = negation === \"!\";\n const restTrimmed = rest!.trim();\n\n try {\n const addressPattern = new RegExp(addressPatternStr!);\n\n // /pattern/ alone — not valid, but handle gracefully\n if (!restTrimmed) return null;\n\n // /pattern/[!]d or /pattern/[!]p etc (simple commands)\n if (simpleCommands[restTrimmed]) {\n return {\n type: simpleCommands[restTrimmed]!,\n addressPattern,\n negated,\n globalFlag: false,\n printFlag: false,\n };\n }\n\n // /pattern/[!]b or /pattern/[!]b label\n if (restTrimmed === \"b\" || restTrimmed.startsWith(\"b \")) {\n return {\n type: \"b\",\n addressPattern,\n negated,\n label: restTrimmed.length > 1 ? restTrimmed.slice(1).trim() : undefined,\n globalFlag: false,\n printFlag: false,\n };\n }\n\n // /pattern/[!]{ ... }\n if (restTrimmed.startsWith(\"{\") && restTrimmed.endsWith(\"}\")) {\n const inner = restTrimmed.slice(1, -1).trim();\n const parts = splitScriptParts(inner);\n const children: SedCommand[] = [];\n for (const part of parts) {\n const cmd = parseCommand(part);\n if (cmd) children.push(cmd);\n }\n return {\n type: \"group\",\n addressPattern,\n negated,\n children,\n globalFlag: false,\n printFlag: false,\n };\n }\n\n // /pattern/[!]s/old/new/flags\n const subCmd = parseSubstitution(restTrimmed);\n if (subCmd) {\n subCmd.addressPattern = addressPattern;\n subCmd.negated = negated;\n return subCmd;\n }\n } catch {\n return null;\n }\n }\n\n // Substitution command (no address)\n const subCmd = parseSubstitution(trimmed);\n if (subCmd) return subCmd;\n\n return null;\n}\n\nfunction splitScriptParts(script: string): string[] {\n const parts: string[] = [];\n let i = 0;\n let current = \"\";\n let braceDepth = 0;\n\n while (i < script.length) {\n if (script[i] === \"{\") {\n braceDepth++;\n current += script[i];\n i++;\n } else if (script[i] === \"}\") {\n braceDepth--;\n current += script[i];\n i++;\n } else if (script[i] === \"s\" && braceDepth === 0 && i + 1 < script.length && !/[a-zA-Z0-9]/.test(script[i + 1]!)) {\n // Detect substitution command — consume s/pattern/replacement/flags\n const delim = script[i + 1]!;\n let j = i + 2;\n let delimCount = 0;\n while (j < script.length && delimCount < 2) {\n if (script[j] === \"\\\\\") {\n j += 2;\n continue;\n }\n if (script[j] === delim) delimCount++;\n j++;\n }\n // Consume trailing flags\n while (j < script.length && /[gi]/.test(script[j]!)) j++;\n current += script.slice(i, j);\n i = j;\n } else if (script[i] === \";\" && braceDepth === 0) {\n const trimmed = current.trim();\n if (trimmed) parts.push(trimmed);\n current = \"\";\n i++;\n } else {\n current += script[i];\n i++;\n }\n }\n const trimmed = current.trim();\n if (trimmed) parts.push(trimmed);\n return parts;\n}\n\ninterface ParseArgsResult {\n options: SedOptions;\n files: string[];\n error?: { type: \"unrecognized_option\" | \"missing_value\"; option: string };\n}\n\nfunction parseArgs(args: string[]): ParseArgsResult {\n const options: SedOptions = {\n suppressOutput: false,\n inPlace: false,\n commands: [],\n };\n const files: string[] = [];\n\n let i = 0;\n while (i < args.length) {\n const arg = args[i]!;\n\n if (arg === \"--\") {\n i++;\n while (i < args.length) {\n const remaining = args[i]!;\n if (options.commands.length === 0) {\n const parts = splitScriptParts(remaining);\n for (const part of parts) {\n const cmd = parseCommand(part);\n if (cmd) options.commands.push(cmd);\n }\n } else {\n files.push(remaining);\n }\n i++;\n }\n break;\n }\n\n if (arg.startsWith(\"--\")) {\n return {\n options,\n files,\n error: { type: \"unrecognized_option\", option: arg },\n };\n }\n\n if (arg.startsWith(\"-\") && arg.length > 1) {\n const flagChars = arg.slice(1);\n\n for (let j = 0; j < flagChars.length; j++) {\n const char = flagChars[j]!;\n\n if (char === \"n\") {\n options.suppressOutput = true;\n } else if (char === \"i\") {\n options.inPlace = true;\n } else if (char === \"e\") {\n const restOfArg = flagChars.slice(j + 1);\n let script: string;\n\n if (restOfArg.length > 0) {\n script = restOfArg;\n } else if (i + 1 < args.length) {\n script = args[++i]!;\n } else {\n return {\n options,\n files,\n error: { type: \"missing_value\", option: \"-e\" },\n };\n }\n\n const parts = splitScriptParts(script);\n for (const part of parts) {\n const cmd = parseCommand(part);\n if (cmd) options.commands.push(cmd);\n }\n break;\n } else {\n return {\n options,\n files,\n error: { type: \"unrecognized_option\", option: `-${char}` },\n };\n }\n }\n i++;\n continue;\n }\n\n if (options.commands.length === 0) {\n const parts = splitScriptParts(arg);\n for (const part of parts) {\n const cmd = parseCommand(part);\n if (cmd) options.commands.push(cmd);\n }\n } else {\n files.push(arg);\n }\n i++;\n }\n\n return { options, files };\n}\n\nfunction formatError(error: NonNullable<ParseArgsResult[\"error\"]>): string {\n let message: string;\n if (error.type === \"unrecognized_option\") {\n if (error.option.startsWith(\"--\")) {\n message = `sed: unrecognized option '${error.option}'\\n`;\n } else {\n message = `sed: invalid option -- '${error.option.slice(1)}'\\n`;\n }\n } else {\n message = `sed: option '${error.option}' requires an argument\\n`;\n }\n return message + `usage: sed [-ni] [-e script] script [file ...]\\n`;\n}\n\nfunction applySubstitution(line: string, cmd: SedCommand): string {\n if (!cmd.pattern) return line;\n\n if (cmd.globalFlag) {\n return line.replace(new RegExp(cmd.pattern.source, cmd.pattern.flags + \"g\"), cmd.replacement!);\n } else {\n return line.replace(cmd.pattern, cmd.replacement!);\n }\n}\n\ninterface SedState {\n patternSpace: string;\n holdSpace: string;\n lineIndex: number;\n lines: string[];\n suppressOutput: boolean;\n output: string[];\n deleted: boolean;\n restart: boolean; // for D command\n}\n\nfunction addressMatches(cmd: SedCommand, state: SedState): boolean {\n if (!cmd.addressPattern) {\n return cmd.negated ? false : true;\n }\n const matches = cmd.addressPattern.test(state.patternSpace);\n return cmd.negated ? !matches : matches;\n}\n\nfunction findLabel(commands: SedCommand[], label: string): number {\n for (let i = 0; i < commands.length; i++) {\n if (commands[i]!.type === \"label\" && commands[i]!.label === label) {\n return i;\n }\n }\n return -1;\n}\n\ninterface ExecResult {\n branchToEnd: boolean;\n branchLabel?: string;\n nextLine: boolean; // n command: output and advance\n deleted: boolean;\n restart: boolean; // D command\n}\n\nfunction executeCommands(\n commands: SedCommand[],\n state: SedState,\n topLevel: boolean\n): ExecResult {\n let pc = 0;\n while (pc < commands.length) {\n const cmd = commands[pc]!;\n\n // Labels are no-ops\n if (cmd.type === \"label\") {\n pc++;\n continue;\n }\n\n // Check address\n if (!addressMatches(cmd, state)) {\n pc++;\n continue;\n }\n\n switch (cmd.type) {\n case \"s\":\n state.patternSpace = applySubstitution(state.patternSpace, cmd);\n break;\n case \"d\":\n state.deleted = true;\n return { branchToEnd: false, deleted: true, nextLine: false, restart: false };\n case \"p\":\n state.output.push(state.patternSpace);\n break;\n case \"h\":\n state.holdSpace = state.patternSpace;\n break;\n case \"H\":\n state.holdSpace = state.holdSpace + \"\\n\" + state.patternSpace;\n break;\n case \"g_hold\":\n state.patternSpace = state.holdSpace;\n break;\n case \"G\":\n state.patternSpace = state.patternSpace + \"\\n\" + state.holdSpace;\n break;\n case \"x\": {\n const tmp = state.patternSpace;\n state.patternSpace = state.holdSpace;\n state.holdSpace = tmp;\n break;\n }\n case \"n\":\n // Output current pattern space, then read next line\n if (!state.suppressOutput) {\n state.output.push(state.patternSpace);\n }\n state.lineIndex++;\n if (state.lineIndex < state.lines.length) {\n state.patternSpace = state.lines[state.lineIndex]!;\n } else {\n // No more lines\n state.deleted = true;\n return { branchToEnd: false, deleted: true, nextLine: false, restart: false };\n }\n break;\n case \"N\":\n // Append next line to pattern space\n state.lineIndex++;\n if (state.lineIndex < state.lines.length) {\n state.patternSpace = state.patternSpace + \"\\n\" + state.lines[state.lineIndex]!;\n } else {\n // No more lines: output pattern space and exit (POSIX behavior)\n if (!state.suppressOutput) {\n state.output.push(state.patternSpace);\n }\n state.deleted = true;\n return { branchToEnd: false, deleted: true, nextLine: false, restart: false };\n }\n break;\n case \"P\": {\n // Print up to first \\n\n const nlIdx = state.patternSpace.indexOf(\"\\n\");\n if (nlIdx >= 0) {\n state.output.push(state.patternSpace.slice(0, nlIdx));\n } else {\n state.output.push(state.patternSpace);\n }\n break;\n }\n case \"D\": {\n // Delete up to first \\n, restart; if no \\n, delete all\n const nlIdx2 = state.patternSpace.indexOf(\"\\n\");\n if (nlIdx2 >= 0) {\n state.patternSpace = state.patternSpace.slice(nlIdx2 + 1);\n state.restart = true;\n return { branchToEnd: false, deleted: false, nextLine: false, restart: true };\n } else {\n state.deleted = true;\n return { branchToEnd: false, deleted: true, nextLine: false, restart: false };\n }\n }\n case \"b\":\n if (cmd.label) {\n // Branch to label — only works at top level\n if (topLevel) {\n const idx = findLabel(commands, cmd.label);\n if (idx >= 0) {\n pc = idx;\n continue;\n }\n }\n // Label not found or not top-level: branch to end\n return { branchToEnd: true, branchLabel: cmd.label, deleted: false, nextLine: false, restart: false };\n }\n // No label: branch to end of script\n return { branchToEnd: true, deleted: false, nextLine: false, restart: false };\n case \"group\":\n if (cmd.children) {\n const result = executeCommands(cmd.children, state, false);\n if (result.deleted || result.branchToEnd || result.restart) {\n // Propagate branch labels up for top-level resolution\n if (result.branchLabel && topLevel) {\n const idx = findLabel(commands, result.branchLabel);\n if (idx >= 0) {\n pc = idx;\n continue;\n }\n }\n return result;\n }\n }\n break;\n }\n pc++;\n }\n return { branchToEnd: false, deleted: false, nextLine: false, restart: false };\n}\n\nexport const sed: Command = async (ctx) => {\n const { options, files, error } = parseArgs(ctx.args);\n\n if (error) {\n await ctx.stderr.writeText(formatError(error));\n return 1;\n }\n\n if (options.commands.length === 0) {\n await ctx.stderr.writeText(\"sed: missing script\\n\");\n return 1;\n }\n\n const processContent = async (content: string): Promise<string[]> => {\n const lines = content.split(\"\\n\");\n if (lines.length > 0 && lines[lines.length - 1] === \"\") {\n lines.pop();\n }\n\n const allOutput: string[] = [];\n const state: SedState = {\n patternSpace: \"\",\n holdSpace: \"\",\n lineIndex: 0,\n lines,\n suppressOutput: options.suppressOutput,\n output: [],\n deleted: false,\n restart: false,\n };\n\n while (state.lineIndex < lines.length) {\n state.patternSpace = lines[state.lineIndex]!;\n state.deleted = false;\n state.output = [];\n\n // Execute commands, possibly restarting on D\n let restarting = true;\n while (restarting) {\n restarting = false;\n state.restart = false;\n const result = executeCommands(options.commands, state, true);\n\n if (result.restart) {\n restarting = true;\n // output collected so far in this cycle goes out\n allOutput.push(...state.output);\n state.output = [];\n continue;\n }\n\n if (result.deleted) {\n allOutput.push(...state.output);\n state.lineIndex++;\n break;\n }\n\n // Normal end: collect printed lines, then auto-print\n allOutput.push(...state.output);\n if (!options.suppressOutput) {\n allOutput.push(state.patternSpace);\n }\n state.lineIndex++;\n }\n }\n\n return allOutput;\n };\n\n if (files.length === 0) {\n const content = await ctx.stdin.text();\n const outputLines = await processContent(content);\n for (const line of outputLines) {\n await ctx.stdout.writeText(line + \"\\n\");\n }\n } else if (options.inPlace) {\n for (const file of files) {\n try {\n const path = ctx.fs.resolve(ctx.cwd, file);\n const content = await ctx.fs.readFile(path);\n const outputLines = await processContent(content.toString());\n const result = outputLines.length > 0 ? outputLines.join(\"\\n\") + \"\\n\" : \"\";\n await ctx.fs.writeFile(path, result);\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n await ctx.stderr.writeText(`sed: ${file}: ${message}\\n`);\n return 1;\n }\n }\n } else {\n for (const file of files) {\n try {\n const path = ctx.fs.resolve(ctx.cwd, file);\n const content = await ctx.fs.readFile(path);\n const outputLines = await processContent(content.toString());\n for (const line of outputLines) {\n await ctx.stdout.writeText(line + \"\\n\");\n }\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n await ctx.stderr.writeText(`sed: ${file}: ${message}\\n`);\n return 1;\n }\n }\n }\n\n return 0;\n};\n"
|
|
5
|
+
"import type { Command } from \"../../types.mjs\";\n\ninterface SedCommand {\n type: \"s\" | \"d\" | \"p\" | \"h\" | \"H\" | \"g_hold\" | \"G\" | \"x\" | \"n\" | \"N\" | \"P\" | \"D\" | \"b\" | \"label\" | \"group\";\n addressPattern?: RegExp;\n negated?: boolean;\n pattern?: RegExp;\n replacement?: string;\n globalFlag: boolean;\n printFlag: boolean;\n label?: string;\n children?: SedCommand[];\n}\n\ninterface SedOptions {\n suppressOutput: boolean; // -n\n inPlace: boolean; // -i\n commands: SedCommand[];\n}\n\nfunction parseSubstitution(script: string): SedCommand | null {\n const match = script.match(/^s(.)(.+?)\\1(.*?)\\1([gi]*)$/);\n if (!match) return null;\n\n const [, , rawPattern, rawReplacement, flags] = match;\n const globalFlag = flags!.includes(\"g\");\n const caseInsensitive = flags!.includes(\"i\");\n\n const patternStr = rawPattern!.replace(/\\\\\\(/g, \"(\").replace(/\\\\\\)/g, \")\");\n const replacement = rawReplacement!\n .replace(/\\\\([0-9])/g, \"\\x00BACKREF$1\\x00\")\n .replace(/\\\\n/g, \"\\n\")\n .replace(/\\\\t/g, \"\\t\")\n .replace(/\\\\\\\\/g, \"\\x00BSLASH\\x00\")\n .replace(/\\$/g, \"$$$$\")\n .replace(/\\x00BACKREF([0-9])\\x00/g, \"$$$1\")\n .replace(/\\x00BSLASH\\x00/g, \"\\\\\");\n\n try {\n const regexFlags = caseInsensitive ? \"i\" : \"\";\n return {\n type: \"s\",\n pattern: new RegExp(patternStr, regexFlags),\n replacement,\n globalFlag,\n printFlag: false,\n };\n } catch {\n return null;\n }\n}\n\nfunction parseCommand(script: string): SedCommand | null {\n const trimmed = script.trim();\n\n // Label command :name\n if (trimmed.startsWith(\":\")) {\n return {\n type: \"label\",\n label: trimmed.slice(1).trim(),\n globalFlag: false,\n printFlag: false,\n };\n }\n\n // Branch command: b or b label\n if (trimmed === \"b\" || trimmed.startsWith(\"b \") || trimmed.startsWith(\"b\\t\")) {\n return {\n type: \"b\",\n label: trimmed.length > 1 ? trimmed.slice(1).trim() : undefined,\n globalFlag: false,\n printFlag: false,\n };\n }\n\n // Group { ... }\n if (trimmed.startsWith(\"{\") && trimmed.endsWith(\"}\")) {\n const inner = trimmed.slice(1, -1).trim();\n const parts = splitScriptParts(inner);\n const children: SedCommand[] = [];\n for (const part of parts) {\n const cmd = parseCommand(part);\n if (cmd) children.push(cmd);\n }\n return {\n type: \"group\",\n children,\n globalFlag: false,\n printFlag: false,\n };\n }\n\n // Simple single-char commands (no address)\n const simpleCommands: Record<string, SedCommand[\"type\"]> = {\n h: \"h\",\n H: \"H\",\n g: \"g_hold\",\n G: \"G\",\n x: \"x\",\n n: \"n\",\n N: \"N\",\n P: \"P\",\n D: \"D\",\n d: \"d\",\n p: \"p\",\n };\n if (simpleCommands[trimmed]) {\n return {\n type: simpleCommands[trimmed]!,\n globalFlag: false,\n printFlag: false,\n };\n }\n\n // Check for address pattern: /pattern/ followed by optional ! and command\n const addressWithCmd = trimmed.match(/^\\/(.+?)\\/(!)?\\s*(.*)$/);\n if (addressWithCmd) {\n const [, addressPatternStr, negation, rest] = addressWithCmd;\n const negated = negation === \"!\";\n const restTrimmed = rest!.trim();\n\n try {\n const addressPattern = new RegExp(addressPatternStr!);\n\n // /pattern/ alone — not valid, but handle gracefully\n if (!restTrimmed) return null;\n\n // /pattern/[!]d or /pattern/[!]p etc (simple commands)\n if (simpleCommands[restTrimmed]) {\n return {\n type: simpleCommands[restTrimmed]!,\n addressPattern,\n negated,\n globalFlag: false,\n printFlag: false,\n };\n }\n\n // /pattern/[!]b or /pattern/[!]b label\n if (restTrimmed === \"b\" || restTrimmed.startsWith(\"b \")) {\n return {\n type: \"b\",\n addressPattern,\n negated,\n label: restTrimmed.length > 1 ? restTrimmed.slice(1).trim() : undefined,\n globalFlag: false,\n printFlag: false,\n };\n }\n\n // /pattern/[!]{ ... }\n if (restTrimmed.startsWith(\"{\") && restTrimmed.endsWith(\"}\")) {\n const inner = restTrimmed.slice(1, -1).trim();\n const parts = splitScriptParts(inner);\n const children: SedCommand[] = [];\n for (const part of parts) {\n const cmd = parseCommand(part);\n if (cmd) children.push(cmd);\n }\n return {\n type: \"group\",\n addressPattern,\n negated,\n children,\n globalFlag: false,\n printFlag: false,\n };\n }\n\n // /pattern/[!]s/old/new/flags\n const subCmd = parseSubstitution(restTrimmed);\n if (subCmd) {\n subCmd.addressPattern = addressPattern;\n subCmd.negated = negated;\n return subCmd;\n }\n } catch {\n return null;\n }\n }\n\n // Substitution command (no address)\n const subCmd = parseSubstitution(trimmed);\n if (subCmd) return subCmd;\n\n return null;\n}\n\nfunction splitScriptParts(script: string): string[] {\n const parts: string[] = [];\n let i = 0;\n let current = \"\";\n let braceDepth = 0;\n\n while (i < script.length) {\n if (script[i] === \"{\") {\n braceDepth++;\n current += script[i];\n i++;\n } else if (script[i] === \"}\") {\n braceDepth--;\n current += script[i];\n i++;\n } else if (script[i] === \"s\" && braceDepth === 0 && i + 1 < script.length && !/[a-zA-Z0-9]/.test(script[i + 1]!)) {\n // Detect substitution command — consume s/pattern/replacement/flags\n const delim = script[i + 1]!;\n let j = i + 2;\n let delimCount = 0;\n while (j < script.length && delimCount < 2) {\n if (script[j] === \"\\\\\") {\n j += 2;\n continue;\n }\n if (script[j] === delim) delimCount++;\n j++;\n }\n // Consume trailing flags\n while (j < script.length && /[gi]/.test(script[j]!)) j++;\n current += script.slice(i, j);\n i = j;\n } else if (script[i] === \";\" && braceDepth === 0) {\n const trimmed = current.trim();\n if (trimmed) parts.push(trimmed);\n current = \"\";\n i++;\n } else {\n current += script[i];\n i++;\n }\n }\n const trimmed = current.trim();\n if (trimmed) parts.push(trimmed);\n return parts;\n}\n\ninterface ParseArgsResult {\n options: SedOptions;\n files: string[];\n error?: { type: \"unrecognized_option\" | \"missing_value\"; option: string };\n}\n\nfunction parseArgs(args: string[]): ParseArgsResult {\n const options: SedOptions = {\n suppressOutput: false,\n inPlace: false,\n commands: [],\n };\n const files: string[] = [];\n\n let i = 0;\n while (i < args.length) {\n const arg = args[i]!;\n\n if (arg === \"--\") {\n i++;\n while (i < args.length) {\n const remaining = args[i]!;\n if (options.commands.length === 0) {\n const parts = splitScriptParts(remaining);\n for (const part of parts) {\n const cmd = parseCommand(part);\n if (cmd) options.commands.push(cmd);\n }\n } else {\n files.push(remaining);\n }\n i++;\n }\n break;\n }\n\n if (arg.startsWith(\"--\")) {\n return {\n options,\n files,\n error: { type: \"unrecognized_option\", option: arg },\n };\n }\n\n if (arg.startsWith(\"-\") && arg.length > 1) {\n const flagChars = arg.slice(1);\n\n for (let j = 0; j < flagChars.length; j++) {\n const char = flagChars[j]!;\n\n if (char === \"n\") {\n options.suppressOutput = true;\n } else if (char === \"i\") {\n options.inPlace = true;\n } else if (char === \"e\") {\n const restOfArg = flagChars.slice(j + 1);\n let script: string;\n\n if (restOfArg.length > 0) {\n script = restOfArg;\n } else if (i + 1 < args.length) {\n script = args[++i]!;\n } else {\n return {\n options,\n files,\n error: { type: \"missing_value\", option: \"-e\" },\n };\n }\n\n const parts = splitScriptParts(script);\n for (const part of parts) {\n const cmd = parseCommand(part);\n if (cmd) options.commands.push(cmd);\n }\n break;\n } else {\n return {\n options,\n files,\n error: { type: \"unrecognized_option\", option: `-${char}` },\n };\n }\n }\n i++;\n continue;\n }\n\n if (options.commands.length === 0) {\n const parts = splitScriptParts(arg);\n for (const part of parts) {\n const cmd = parseCommand(part);\n if (cmd) options.commands.push(cmd);\n }\n } else {\n files.push(arg);\n }\n i++;\n }\n\n return { options, files };\n}\n\nfunction formatError(error: NonNullable<ParseArgsResult[\"error\"]>): string {\n let message: string;\n if (error.type === \"unrecognized_option\") {\n if (error.option.startsWith(\"--\")) {\n message = `sed: unrecognized option '${error.option}'\\n`;\n } else {\n message = `sed: invalid option -- '${error.option.slice(1)}'\\n`;\n }\n } else {\n message = `sed: option '${error.option}' requires an argument\\n`;\n }\n return message + `usage: sed [-ni] [-e script] script [file ...]\\n`;\n}\n\nfunction applySubstitution(line: string, cmd: SedCommand): string {\n if (!cmd.pattern) return line;\n\n if (cmd.globalFlag) {\n return line.replace(new RegExp(cmd.pattern.source, cmd.pattern.flags + \"g\"), cmd.replacement!);\n } else {\n return line.replace(cmd.pattern, cmd.replacement!);\n }\n}\n\ninterface SedState {\n patternSpace: string;\n holdSpace: string;\n lineIndex: number;\n lines: string[];\n suppressOutput: boolean;\n output: string[];\n deleted: boolean;\n restart: boolean; // for D command\n}\n\nfunction addressMatches(cmd: SedCommand, state: SedState): boolean {\n if (!cmd.addressPattern) {\n return cmd.negated ? false : true;\n }\n const matches = cmd.addressPattern.test(state.patternSpace);\n return cmd.negated ? !matches : matches;\n}\n\nfunction findLabel(commands: SedCommand[], label: string): number {\n for (let i = 0; i < commands.length; i++) {\n if (commands[i]!.type === \"label\" && commands[i]!.label === label) {\n return i;\n }\n }\n return -1;\n}\n\ninterface ExecResult {\n branchToEnd: boolean;\n branchLabel?: string;\n nextLine: boolean; // n command: output and advance\n deleted: boolean;\n restart: boolean; // D command\n}\n\nfunction executeCommands(\n commands: SedCommand[],\n state: SedState,\n topLevel: boolean\n): ExecResult {\n let pc = 0;\n while (pc < commands.length) {\n const cmd = commands[pc]!;\n\n // Labels are no-ops\n if (cmd.type === \"label\") {\n pc++;\n continue;\n }\n\n // Check address\n if (!addressMatches(cmd, state)) {\n pc++;\n continue;\n }\n\n switch (cmd.type) {\n case \"s\":\n state.patternSpace = applySubstitution(state.patternSpace, cmd);\n break;\n case \"d\":\n state.deleted = true;\n return { branchToEnd: false, deleted: true, nextLine: false, restart: false };\n case \"p\":\n state.output.push(state.patternSpace);\n break;\n case \"h\":\n state.holdSpace = state.patternSpace;\n break;\n case \"H\":\n state.holdSpace = state.holdSpace + \"\\n\" + state.patternSpace;\n break;\n case \"g_hold\":\n state.patternSpace = state.holdSpace;\n break;\n case \"G\":\n state.patternSpace = state.patternSpace + \"\\n\" + state.holdSpace;\n break;\n case \"x\": {\n const tmp = state.patternSpace;\n state.patternSpace = state.holdSpace;\n state.holdSpace = tmp;\n break;\n }\n case \"n\":\n // Output current pattern space, then read next line\n if (!state.suppressOutput) {\n state.output.push(state.patternSpace);\n }\n state.lineIndex++;\n if (state.lineIndex < state.lines.length) {\n state.patternSpace = state.lines[state.lineIndex]!;\n } else {\n // No more lines\n state.deleted = true;\n return { branchToEnd: false, deleted: true, nextLine: false, restart: false };\n }\n break;\n case \"N\":\n // Append next line to pattern space\n state.lineIndex++;\n if (state.lineIndex < state.lines.length) {\n state.patternSpace = state.patternSpace + \"\\n\" + state.lines[state.lineIndex]!;\n } else {\n // No more lines: output pattern space and exit (POSIX behavior)\n if (!state.suppressOutput) {\n state.output.push(state.patternSpace);\n }\n state.deleted = true;\n return { branchToEnd: false, deleted: true, nextLine: false, restart: false };\n }\n break;\n case \"P\": {\n // Print up to first \\n\n const nlIdx = state.patternSpace.indexOf(\"\\n\");\n if (nlIdx >= 0) {\n state.output.push(state.patternSpace.slice(0, nlIdx));\n } else {\n state.output.push(state.patternSpace);\n }\n break;\n }\n case \"D\": {\n // Delete up to first \\n, restart; if no \\n, delete all\n const nlIdx2 = state.patternSpace.indexOf(\"\\n\");\n if (nlIdx2 >= 0) {\n state.patternSpace = state.patternSpace.slice(nlIdx2 + 1);\n state.restart = true;\n return { branchToEnd: false, deleted: false, nextLine: false, restart: true };\n } else {\n state.deleted = true;\n return { branchToEnd: false, deleted: true, nextLine: false, restart: false };\n }\n }\n case \"b\":\n if (cmd.label) {\n // Branch to label — only works at top level\n if (topLevel) {\n const idx = findLabel(commands, cmd.label);\n if (idx >= 0) {\n pc = idx;\n continue;\n }\n }\n // Label not found or not top-level: branch to end\n return { branchToEnd: true, branchLabel: cmd.label, deleted: false, nextLine: false, restart: false };\n }\n // No label: branch to end of script\n return { branchToEnd: true, deleted: false, nextLine: false, restart: false };\n case \"group\":\n if (cmd.children) {\n const result = executeCommands(cmd.children, state, false);\n if (result.deleted || result.branchToEnd || result.restart) {\n // Propagate branch labels up for top-level resolution\n if (result.branchLabel && topLevel) {\n const idx = findLabel(commands, result.branchLabel);\n if (idx >= 0) {\n pc = idx;\n continue;\n }\n }\n return result;\n }\n }\n break;\n }\n pc++;\n }\n return { branchToEnd: false, deleted: false, nextLine: false, restart: false };\n}\n\nexport const sed: Command = async (ctx) => {\n const { options, files, error } = parseArgs(ctx.args);\n\n if (error) {\n await ctx.stderr.writeText(formatError(error));\n return 1;\n }\n\n if (options.commands.length === 0) {\n await ctx.stderr.writeText(\"sed: missing script\\n\");\n return 1;\n }\n\n const processContent = async (content: string): Promise<string[]> => {\n const lines = content.split(\"\\n\");\n if (lines.length > 0 && lines[lines.length - 1] === \"\") {\n lines.pop();\n }\n\n const allOutput: string[] = [];\n const state: SedState = {\n patternSpace: \"\",\n holdSpace: \"\",\n lineIndex: 0,\n lines,\n suppressOutput: options.suppressOutput,\n output: [],\n deleted: false,\n restart: false,\n };\n\n while (state.lineIndex < lines.length) {\n state.patternSpace = lines[state.lineIndex]!;\n state.deleted = false;\n state.output = [];\n\n // Execute commands, possibly restarting on D\n let restarting = true;\n while (restarting) {\n restarting = false;\n state.restart = false;\n const result = executeCommands(options.commands, state, true);\n\n if (result.restart) {\n restarting = true;\n // output collected so far in this cycle goes out\n allOutput.push(...state.output);\n state.output = [];\n continue;\n }\n\n if (result.deleted) {\n allOutput.push(...state.output);\n state.lineIndex++;\n break;\n }\n\n // Normal end: collect printed lines, then auto-print\n allOutput.push(...state.output);\n if (!options.suppressOutput) {\n allOutput.push(state.patternSpace);\n }\n state.lineIndex++;\n }\n }\n\n return allOutput;\n };\n\n if (files.length === 0) {\n const content = await ctx.stdin.text();\n const outputLines = await processContent(content);\n for (const line of outputLines) {\n await ctx.stdout.writeText(line + \"\\n\");\n }\n } else if (options.inPlace) {\n for (const file of files) {\n try {\n const path = ctx.fs.resolve(ctx.cwd, file);\n const content = await ctx.fs.readFile(path);\n const outputLines = await processContent(content.toString());\n const result = outputLines.length > 0 ? outputLines.join(\"\\n\") + \"\\n\" : \"\";\n await ctx.fs.writeFile(path, result);\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n await ctx.stderr.writeText(`sed: ${file}: ${message}\\n`);\n return 1;\n }\n }\n } else {\n for (const file of files) {\n try {\n const path = ctx.fs.resolve(ctx.cwd, file);\n const content = await ctx.fs.readFile(path);\n const outputLines = await processContent(content.toString());\n for (const line of outputLines) {\n await ctx.stdout.writeText(line + \"\\n\");\n }\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n await ctx.stderr.writeText(`sed: ${file}: ${message}\\n`);\n return 1;\n }\n }\n }\n\n return 0;\n};\n"
|
|
6
6
|
],
|
|
7
|
-
"mappings": "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",
|
|
8
|
-
"debugId": "
|
|
7
|
+
"mappings": ";AAoBA,SAAS,iBAAiB,CAAC,QAAmC;AAAA,EAC5D,MAAM,QAAQ,OAAO,MAAM,6BAA6B;AAAA,EACxD,IAAI,CAAC;AAAA,IAAO,OAAO;AAAA,EAEnB,WAAW,YAAY,gBAAgB,SAAS;AAAA,EAChD,MAAM,aAAa,MAAO,SAAS,GAAG;AAAA,EACtC,MAAM,kBAAkB,MAAO,SAAS,GAAG;AAAA,EAE3C,MAAM,aAAa,WAAY,QAAQ,SAAS,GAAG,EAAE,QAAQ,SAAS,GAAG;AAAA,EACzE,MAAM,cAAc,eACjB,QAAQ,cAAc,mBAAmB,EACzC,QAAQ,QAAQ;AAAA,CAAI,EACpB,QAAQ,QAAQ,IAAI,EACpB,QAAQ,SAAS,gBAAgB,EACjC,QAAQ,OAAO,MAAM,EACrB,QAAQ,2BAA2B,MAAM,EACzC,QAAQ,mBAAmB,IAAI;AAAA,EAElC,IAAI;AAAA,IACF,MAAM,aAAa,kBAAkB,MAAM;AAAA,IAC3C,OAAO;AAAA,MACL,MAAM;AAAA,MACN,SAAS,IAAI,OAAO,YAAY,UAAU;AAAA,MAC1C;AAAA,MACA;AAAA,MACA,WAAW;AAAA,IACb;AAAA,IACA,MAAM;AAAA,IACN,OAAO;AAAA;AAAA;AAIX,SAAS,YAAY,CAAC,QAAmC;AAAA,EACvD,MAAM,UAAU,OAAO,KAAK;AAAA,EAG5B,IAAI,QAAQ,WAAW,GAAG,GAAG;AAAA,IAC3B,OAAO;AAAA,MACL,MAAM;AAAA,MACN,OAAO,QAAQ,MAAM,CAAC,EAAE,KAAK;AAAA,MAC7B,YAAY;AAAA,MACZ,WAAW;AAAA,IACb;AAAA,EACF;AAAA,EAGA,IAAI,YAAY,OAAO,QAAQ,WAAW,IAAI,KAAK,QAAQ,WAAW,KAAK,GAAG;AAAA,IAC5E,OAAO;AAAA,MACL,MAAM;AAAA,MACN,OAAO,QAAQ,SAAS,IAAI,QAAQ,MAAM,CAAC,EAAE,KAAK,IAAI;AAAA,MACtD,YAAY;AAAA,MACZ,WAAW;AAAA,IACb;AAAA,EACF;AAAA,EAGA,IAAI,QAAQ,WAAW,GAAG,KAAK,QAAQ,SAAS,GAAG,GAAG;AAAA,IACpD,MAAM,QAAQ,QAAQ,MAAM,GAAG,EAAE,EAAE,KAAK;AAAA,IACxC,MAAM,QAAQ,iBAAiB,KAAK;AAAA,IACpC,MAAM,WAAyB,CAAC;AAAA,IAChC,WAAW,QAAQ,OAAO;AAAA,MACxB,MAAM,MAAM,aAAa,IAAI;AAAA,MAC7B,IAAI;AAAA,QAAK,SAAS,KAAK,GAAG;AAAA,IAC5B;AAAA,IACA,OAAO;AAAA,MACL,MAAM;AAAA,MACN;AAAA,MACA,YAAY;AAAA,MACZ,WAAW;AAAA,IACb;AAAA,EACF;AAAA,EAGA,MAAM,iBAAqD;AAAA,IACzD,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,EACL;AAAA,EACA,IAAI,eAAe,UAAU;AAAA,IAC3B,OAAO;AAAA,MACL,MAAM,eAAe;AAAA,MACrB,YAAY;AAAA,MACZ,WAAW;AAAA,IACb;AAAA,EACF;AAAA,EAGA,MAAM,iBAAiB,QAAQ,MAAM,wBAAwB;AAAA,EAC7D,IAAI,gBAAgB;AAAA,IAClB,SAAS,mBAAmB,UAAU,QAAQ;AAAA,IAC9C,MAAM,UAAU,aAAa;AAAA,IAC7B,MAAM,cAAc,KAAM,KAAK;AAAA,IAE/B,IAAI;AAAA,MACF,MAAM,iBAAiB,IAAI,OAAO,iBAAkB;AAAA,MAGpD,IAAI,CAAC;AAAA,QAAa,OAAO;AAAA,MAGzB,IAAI,eAAe,cAAc;AAAA,QAC/B,OAAO;AAAA,UACL,MAAM,eAAe;AAAA,UACrB;AAAA,UACA;AAAA,UACA,YAAY;AAAA,UACZ,WAAW;AAAA,QACb;AAAA,MACF;AAAA,MAGA,IAAI,gBAAgB,OAAO,YAAY,WAAW,IAAI,GAAG;AAAA,QACvD,OAAO;AAAA,UACL,MAAM;AAAA,UACN;AAAA,UACA;AAAA,UACA,OAAO,YAAY,SAAS,IAAI,YAAY,MAAM,CAAC,EAAE,KAAK,IAAI;AAAA,UAC9D,YAAY;AAAA,UACZ,WAAW;AAAA,QACb;AAAA,MACF;AAAA,MAGA,IAAI,YAAY,WAAW,GAAG,KAAK,YAAY,SAAS,GAAG,GAAG;AAAA,QAC5D,MAAM,QAAQ,YAAY,MAAM,GAAG,EAAE,EAAE,KAAK;AAAA,QAC5C,MAAM,QAAQ,iBAAiB,KAAK;AAAA,QACpC,MAAM,WAAyB,CAAC;AAAA,QAChC,WAAW,QAAQ,OAAO;AAAA,UACxB,MAAM,MAAM,aAAa,IAAI;AAAA,UAC7B,IAAI;AAAA,YAAK,SAAS,KAAK,GAAG;AAAA,QAC5B;AAAA,QACA,OAAO;AAAA,UACL,MAAM;AAAA,UACN;AAAA,UACA;AAAA,UACA;AAAA,UACA,YAAY;AAAA,UACZ,WAAW;AAAA,QACb;AAAA,MACF;AAAA,MAGA,MAAM,UAAS,kBAAkB,WAAW;AAAA,MAC5C,IAAI,SAAQ;AAAA,QACV,QAAO,iBAAiB;AAAA,QACxB,QAAO,UAAU;AAAA,QACjB,OAAO;AAAA,MACT;AAAA,MACA,MAAM;AAAA,MACN,OAAO;AAAA;AAAA,EAEX;AAAA,EAGA,MAAM,SAAS,kBAAkB,OAAO;AAAA,EACxC,IAAI;AAAA,IAAQ,OAAO;AAAA,EAEnB,OAAO;AAAA;AAGT,SAAS,gBAAgB,CAAC,QAA0B;AAAA,EAClD,MAAM,QAAkB,CAAC;AAAA,EACzB,IAAI,IAAI;AAAA,EACR,IAAI,UAAU;AAAA,EACd,IAAI,aAAa;AAAA,EAEjB,OAAO,IAAI,OAAO,QAAQ;AAAA,IACxB,IAAI,OAAO,OAAO,KAAK;AAAA,MACrB;AAAA,MACA,WAAW,OAAO;AAAA,MAClB;AAAA,IACF,EAAO,SAAI,OAAO,OAAO,KAAK;AAAA,MAC5B;AAAA,MACA,WAAW,OAAO;AAAA,MAClB;AAAA,IACF,EAAO,SAAI,OAAO,OAAO,OAAO,eAAe,KAAK,IAAI,IAAI,OAAO,UAAU,CAAC,cAAc,KAAK,OAAO,IAAI,EAAG,GAAG;AAAA,MAEhH,MAAM,QAAQ,OAAO,IAAI;AAAA,MACzB,IAAI,IAAI,IAAI;AAAA,MACZ,IAAI,aAAa;AAAA,MACjB,OAAO,IAAI,OAAO,UAAU,aAAa,GAAG;AAAA,QAC1C,IAAI,OAAO,OAAO,MAAM;AAAA,UACtB,KAAK;AAAA,UACL;AAAA,QACF;AAAA,QACA,IAAI,OAAO,OAAO;AAAA,UAAO;AAAA,QACzB;AAAA,MACF;AAAA,MAEA,OAAO,IAAI,OAAO,UAAU,OAAO,KAAK,OAAO,EAAG;AAAA,QAAG;AAAA,MACrD,WAAW,OAAO,MAAM,GAAG,CAAC;AAAA,MAC5B,IAAI;AAAA,IACN,EAAO,SAAI,OAAO,OAAO,OAAO,eAAe,GAAG;AAAA,MAChD,MAAM,WAAU,QAAQ,KAAK;AAAA,MAC7B,IAAI;AAAA,QAAS,MAAM,KAAK,QAAO;AAAA,MAC/B,UAAU;AAAA,MACV;AAAA,IACF,EAAO;AAAA,MACL,WAAW,OAAO;AAAA,MAClB;AAAA;AAAA,EAEJ;AAAA,EACA,MAAM,UAAU,QAAQ,KAAK;AAAA,EAC7B,IAAI;AAAA,IAAS,MAAM,KAAK,OAAO;AAAA,EAC/B,OAAO;AAAA;AAST,SAAS,SAAS,CAAC,MAAiC;AAAA,EAClD,MAAM,UAAsB;AAAA,IAC1B,gBAAgB;AAAA,IAChB,SAAS;AAAA,IACT,UAAU,CAAC;AAAA,EACb;AAAA,EACA,MAAM,QAAkB,CAAC;AAAA,EAEzB,IAAI,IAAI;AAAA,EACR,OAAO,IAAI,KAAK,QAAQ;AAAA,IACtB,MAAM,MAAM,KAAK;AAAA,IAEjB,IAAI,QAAQ,MAAM;AAAA,MAChB;AAAA,MACA,OAAO,IAAI,KAAK,QAAQ;AAAA,QACtB,MAAM,YAAY,KAAK;AAAA,QACvB,IAAI,QAAQ,SAAS,WAAW,GAAG;AAAA,UACjC,MAAM,QAAQ,iBAAiB,SAAS;AAAA,UACxC,WAAW,QAAQ,OAAO;AAAA,YACxB,MAAM,MAAM,aAAa,IAAI;AAAA,YAC7B,IAAI;AAAA,cAAK,QAAQ,SAAS,KAAK,GAAG;AAAA,UACpC;AAAA,QACF,EAAO;AAAA,UACL,MAAM,KAAK,SAAS;AAAA;AAAA,QAEtB;AAAA,MACF;AAAA,MACA;AAAA,IACF;AAAA,IAEA,IAAI,IAAI,WAAW,IAAI,GAAG;AAAA,MACxB,OAAO;AAAA,QACL;AAAA,QACA;AAAA,QACA,OAAO,EAAE,MAAM,uBAAuB,QAAQ,IAAI;AAAA,MACpD;AAAA,IACF;AAAA,IAEA,IAAI,IAAI,WAAW,GAAG,KAAK,IAAI,SAAS,GAAG;AAAA,MACzC,MAAM,YAAY,IAAI,MAAM,CAAC;AAAA,MAE7B,SAAS,IAAI,EAAG,IAAI,UAAU,QAAQ,KAAK;AAAA,QACzC,MAAM,OAAO,UAAU;AAAA,QAEvB,IAAI,SAAS,KAAK;AAAA,UAChB,QAAQ,iBAAiB;AAAA,QAC3B,EAAO,SAAI,SAAS,KAAK;AAAA,UACvB,QAAQ,UAAU;AAAA,QACpB,EAAO,SAAI,SAAS,KAAK;AAAA,UACvB,MAAM,YAAY,UAAU,MAAM,IAAI,CAAC;AAAA,UACvC,IAAI;AAAA,UAEJ,IAAI,UAAU,SAAS,GAAG;AAAA,YACxB,SAAS;AAAA,UACX,EAAO,SAAI,IAAI,IAAI,KAAK,QAAQ;AAAA,YAC9B,SAAS,KAAK,EAAE;AAAA,UAClB,EAAO;AAAA,YACL,OAAO;AAAA,cACL;AAAA,cACA;AAAA,cACA,OAAO,EAAE,MAAM,iBAAiB,QAAQ,KAAK;AAAA,YAC/C;AAAA;AAAA,UAGF,MAAM,QAAQ,iBAAiB,MAAM;AAAA,UACrC,WAAW,QAAQ,OAAO;AAAA,YACxB,MAAM,MAAM,aAAa,IAAI;AAAA,YAC7B,IAAI;AAAA,cAAK,QAAQ,SAAS,KAAK,GAAG;AAAA,UACpC;AAAA,UACA;AAAA,QACF,EAAO;AAAA,UACL,OAAO;AAAA,YACL;AAAA,YACA;AAAA,YACA,OAAO,EAAE,MAAM,uBAAuB,QAAQ,IAAI,OAAO;AAAA,UAC3D;AAAA;AAAA,MAEJ;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IAEA,IAAI,QAAQ,SAAS,WAAW,GAAG;AAAA,MACjC,MAAM,QAAQ,iBAAiB,GAAG;AAAA,MAClC,WAAW,QAAQ,OAAO;AAAA,QACxB,MAAM,MAAM,aAAa,IAAI;AAAA,QAC7B,IAAI;AAAA,UAAK,QAAQ,SAAS,KAAK,GAAG;AAAA,MACpC;AAAA,IACF,EAAO;AAAA,MACL,MAAM,KAAK,GAAG;AAAA;AAAA,IAEhB;AAAA,EACF;AAAA,EAEA,OAAO,EAAE,SAAS,MAAM;AAAA;AAG1B,SAAS,WAAW,CAAC,OAAsD;AAAA,EACzE,IAAI;AAAA,EACJ,IAAI,MAAM,SAAS,uBAAuB;AAAA,IACxC,IAAI,MAAM,OAAO,WAAW,IAAI,GAAG;AAAA,MACjC,UAAU,6BAA6B,MAAM;AAAA;AAAA,IAC/C,EAAO;AAAA,MACL,UAAU,2BAA2B,MAAM,OAAO,MAAM,CAAC;AAAA;AAAA;AAAA,EAE7D,EAAO;AAAA,IACL,UAAU,gBAAgB,MAAM;AAAA;AAAA;AAAA,EAElC,OAAO,UAAU;AAAA;AAAA;AAGnB,SAAS,iBAAiB,CAAC,MAAc,KAAyB;AAAA,EAChE,IAAI,CAAC,IAAI;AAAA,IAAS,OAAO;AAAA,EAEzB,IAAI,IAAI,YAAY;AAAA,IAClB,OAAO,KAAK,QAAQ,IAAI,OAAO,IAAI,QAAQ,QAAQ,IAAI,QAAQ,QAAQ,GAAG,GAAG,IAAI,WAAY;AAAA,EAC/F,EAAO;AAAA,IACL,OAAO,KAAK,QAAQ,IAAI,SAAS,IAAI,WAAY;AAAA;AAAA;AAerD,SAAS,cAAc,CAAC,KAAiB,OAA0B;AAAA,EACjE,IAAI,CAAC,IAAI,gBAAgB;AAAA,IACvB,OAAO,IAAI,UAAU,QAAQ;AAAA,EAC/B;AAAA,EACA,MAAM,UAAU,IAAI,eAAe,KAAK,MAAM,YAAY;AAAA,EAC1D,OAAO,IAAI,UAAU,CAAC,UAAU;AAAA;AAGlC,SAAS,SAAS,CAAC,UAAwB,OAAuB;AAAA,EAChE,SAAS,IAAI,EAAG,IAAI,SAAS,QAAQ,KAAK;AAAA,IACxC,IAAI,SAAS,GAAI,SAAS,WAAW,SAAS,GAAI,UAAU,OAAO;AAAA,MACjE,OAAO;AAAA,IACT;AAAA,EACF;AAAA,EACA,OAAO;AAAA;AAWT,SAAS,eAAe,CACtB,UACA,OACA,UACY;AAAA,EACZ,IAAI,KAAK;AAAA,EACT,OAAO,KAAK,SAAS,QAAQ;AAAA,IAC3B,MAAM,MAAM,SAAS;AAAA,IAGrB,IAAI,IAAI,SAAS,SAAS;AAAA,MACxB;AAAA,MACA;AAAA,IACF;AAAA,IAGA,IAAI,CAAC,eAAe,KAAK,KAAK,GAAG;AAAA,MAC/B;AAAA,MACA;AAAA,IACF;AAAA,IAEA,QAAQ,IAAI;AAAA,WACL;AAAA,QACH,MAAM,eAAe,kBAAkB,MAAM,cAAc,GAAG;AAAA,QAC9D;AAAA,WACG;AAAA,QACH,MAAM,UAAU;AAAA,QAChB,OAAO,EAAE,aAAa,OAAO,SAAS,MAAM,UAAU,OAAO,SAAS,MAAM;AAAA,WACzE;AAAA,QACH,MAAM,OAAO,KAAK,MAAM,YAAY;AAAA,QACpC;AAAA,WACG;AAAA,QACH,MAAM,YAAY,MAAM;AAAA,QACxB;AAAA,WACG;AAAA,QACH,MAAM,YAAY,MAAM,YAAY;AAAA,IAAO,MAAM;AAAA,QACjD;AAAA,WACG;AAAA,QACH,MAAM,eAAe,MAAM;AAAA,QAC3B;AAAA,WACG;AAAA,QACH,MAAM,eAAe,MAAM,eAAe;AAAA,IAAO,MAAM;AAAA,QACvD;AAAA,WACG,KAAK;AAAA,QACR,MAAM,MAAM,MAAM;AAAA,QAClB,MAAM,eAAe,MAAM;AAAA,QAC3B,MAAM,YAAY;AAAA,QAClB;AAAA,MACF;AAAA,WACK;AAAA,QAEH,IAAI,CAAC,MAAM,gBAAgB;AAAA,UACzB,MAAM,OAAO,KAAK,MAAM,YAAY;AAAA,QACtC;AAAA,QACA,MAAM;AAAA,QACN,IAAI,MAAM,YAAY,MAAM,MAAM,QAAQ;AAAA,UACxC,MAAM,eAAe,MAAM,MAAM,MAAM;AAAA,QACzC,EAAO;AAAA,UAEL,MAAM,UAAU;AAAA,UAChB,OAAO,EAAE,aAAa,OAAO,SAAS,MAAM,UAAU,OAAO,SAAS,MAAM;AAAA;AAAA,QAE9E;AAAA,WACG;AAAA,QAEH,MAAM;AAAA,QACN,IAAI,MAAM,YAAY,MAAM,MAAM,QAAQ;AAAA,UACxC,MAAM,eAAe,MAAM,eAAe;AAAA,IAAO,MAAM,MAAM,MAAM;AAAA,QACrE,EAAO;AAAA,UAEL,IAAI,CAAC,MAAM,gBAAgB;AAAA,YACzB,MAAM,OAAO,KAAK,MAAM,YAAY;AAAA,UACtC;AAAA,UACA,MAAM,UAAU;AAAA,UAChB,OAAO,EAAE,aAAa,OAAO,SAAS,MAAM,UAAU,OAAO,SAAS,MAAM;AAAA;AAAA,QAE9E;AAAA,WACG,KAAK;AAAA,QAER,MAAM,QAAQ,MAAM,aAAa,QAAQ;AAAA,CAAI;AAAA,QAC7C,IAAI,SAAS,GAAG;AAAA,UACd,MAAM,OAAO,KAAK,MAAM,aAAa,MAAM,GAAG,KAAK,CAAC;AAAA,QACtD,EAAO;AAAA,UACL,MAAM,OAAO,KAAK,MAAM,YAAY;AAAA;AAAA,QAEtC;AAAA,MACF;AAAA,WACK,KAAK;AAAA,QAER,MAAM,SAAS,MAAM,aAAa,QAAQ;AAAA,CAAI;AAAA,QAC9C,IAAI,UAAU,GAAG;AAAA,UACf,MAAM,eAAe,MAAM,aAAa,MAAM,SAAS,CAAC;AAAA,UACxD,MAAM,UAAU;AAAA,UAChB,OAAO,EAAE,aAAa,OAAO,SAAS,OAAO,UAAU,OAAO,SAAS,KAAK;AAAA,QAC9E,EAAO;AAAA,UACL,MAAM,UAAU;AAAA,UAChB,OAAO,EAAE,aAAa,OAAO,SAAS,MAAM,UAAU,OAAO,SAAS,MAAM;AAAA;AAAA,MAEhF;AAAA,WACK;AAAA,QACH,IAAI,IAAI,OAAO;AAAA,UAEb,IAAI,UAAU;AAAA,YACZ,MAAM,MAAM,UAAU,UAAU,IAAI,KAAK;AAAA,YACzC,IAAI,OAAO,GAAG;AAAA,cACZ,KAAK;AAAA,cACL;AAAA,YACF;AAAA,UACF;AAAA,UAEA,OAAO,EAAE,aAAa,MAAM,aAAa,IAAI,OAAO,SAAS,OAAO,UAAU,OAAO,SAAS,MAAM;AAAA,QACtG;AAAA,QAEA,OAAO,EAAE,aAAa,MAAM,SAAS,OAAO,UAAU,OAAO,SAAS,MAAM;AAAA,WACzE;AAAA,QACH,IAAI,IAAI,UAAU;AAAA,UAChB,MAAM,SAAS,gBAAgB,IAAI,UAAU,OAAO,KAAK;AAAA,UACzD,IAAI,OAAO,WAAW,OAAO,eAAe,OAAO,SAAS;AAAA,YAE1D,IAAI,OAAO,eAAe,UAAU;AAAA,cAClC,MAAM,MAAM,UAAU,UAAU,OAAO,WAAW;AAAA,cAClD,IAAI,OAAO,GAAG;AAAA,gBACZ,KAAK;AAAA,gBACL;AAAA,cACF;AAAA,YACF;AAAA,YACA,OAAO;AAAA,UACT;AAAA,QACF;AAAA,QACA;AAAA;AAAA,IAEJ;AAAA,EACF;AAAA,EACA,OAAO,EAAE,aAAa,OAAO,SAAS,OAAO,UAAU,OAAO,SAAS,MAAM;AAAA;AAGxE,IAAM,MAAe,OAAO,QAAQ;AAAA,EACzC,QAAQ,SAAS,OAAO,UAAU,UAAU,IAAI,IAAI;AAAA,EAEpD,IAAI,OAAO;AAAA,IACT,MAAM,IAAI,OAAO,UAAU,YAAY,KAAK,CAAC;AAAA,IAC7C,OAAO;AAAA,EACT;AAAA,EAEA,IAAI,QAAQ,SAAS,WAAW,GAAG;AAAA,IACjC,MAAM,IAAI,OAAO,UAAU;AAAA,CAAuB;AAAA,IAClD,OAAO;AAAA,EACT;AAAA,EAEA,MAAM,iBAAiB,OAAO,YAAuC;AAAA,IACnE,MAAM,QAAQ,QAAQ,MAAM;AAAA,CAAI;AAAA,IAChC,IAAI,MAAM,SAAS,KAAK,MAAM,MAAM,SAAS,OAAO,IAAI;AAAA,MACtD,MAAM,IAAI;AAAA,IACZ;AAAA,IAEA,MAAM,YAAsB,CAAC;AAAA,IAC7B,MAAM,QAAkB;AAAA,MACtB,cAAc;AAAA,MACd,WAAW;AAAA,MACX,WAAW;AAAA,MACX;AAAA,MACA,gBAAgB,QAAQ;AAAA,MACxB,QAAQ,CAAC;AAAA,MACT,SAAS;AAAA,MACT,SAAS;AAAA,IACX;AAAA,IAEA,OAAO,MAAM,YAAY,MAAM,QAAQ;AAAA,MACrC,MAAM,eAAe,MAAM,MAAM;AAAA,MACjC,MAAM,UAAU;AAAA,MAChB,MAAM,SAAS,CAAC;AAAA,MAGhB,IAAI,aAAa;AAAA,MACjB,OAAO,YAAY;AAAA,QACjB,aAAa;AAAA,QACb,MAAM,UAAU;AAAA,QAChB,MAAM,SAAS,gBAAgB,QAAQ,UAAU,OAAO,IAAI;AAAA,QAE5D,IAAI,OAAO,SAAS;AAAA,UAClB,aAAa;AAAA,UAEb,UAAU,KAAK,GAAG,MAAM,MAAM;AAAA,UAC9B,MAAM,SAAS,CAAC;AAAA,UAChB;AAAA,QACF;AAAA,QAEA,IAAI,OAAO,SAAS;AAAA,UAClB,UAAU,KAAK,GAAG,MAAM,MAAM;AAAA,UAC9B,MAAM;AAAA,UACN;AAAA,QACF;AAAA,QAGA,UAAU,KAAK,GAAG,MAAM,MAAM;AAAA,QAC9B,IAAI,CAAC,QAAQ,gBAAgB;AAAA,UAC3B,UAAU,KAAK,MAAM,YAAY;AAAA,QACnC;AAAA,QACA,MAAM;AAAA,MACR;AAAA,IACF;AAAA,IAEA,OAAO;AAAA;AAAA,EAGT,IAAI,MAAM,WAAW,GAAG;AAAA,IACtB,MAAM,UAAU,MAAM,IAAI,MAAM,KAAK;AAAA,IACrC,MAAM,cAAc,MAAM,eAAe,OAAO;AAAA,IAChD,WAAW,QAAQ,aAAa;AAAA,MAC9B,MAAM,IAAI,OAAO,UAAU,OAAO;AAAA,CAAI;AAAA,IACxC;AAAA,EACF,EAAO,SAAI,QAAQ,SAAS;AAAA,IAC1B,WAAW,QAAQ,OAAO;AAAA,MACxB,IAAI;AAAA,QACF,MAAM,OAAO,IAAI,GAAG,QAAQ,IAAI,KAAK,IAAI;AAAA,QACzC,MAAM,UAAU,MAAM,IAAI,GAAG,SAAS,IAAI;AAAA,QAC1C,MAAM,cAAc,MAAM,eAAe,QAAQ,SAAS,CAAC;AAAA,QAC3D,MAAM,SAAS,YAAY,SAAS,IAAI,YAAY,KAAK;AAAA,CAAI,IAAI;AAAA,IAAO;AAAA,QACxE,MAAM,IAAI,GAAG,UAAU,MAAM,MAAM;AAAA,QACnC,OAAO,KAAK;AAAA,QACZ,MAAM,UAAU,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAAA,QAC/D,MAAM,IAAI,OAAO,UAAU,QAAQ,SAAS;AAAA,CAAW;AAAA,QACvD,OAAO;AAAA;AAAA,IAEX;AAAA,EACF,EAAO;AAAA,IACL,WAAW,QAAQ,OAAO;AAAA,MACxB,IAAI;AAAA,QACF,MAAM,OAAO,IAAI,GAAG,QAAQ,IAAI,KAAK,IAAI;AAAA,QACzC,MAAM,UAAU,MAAM,IAAI,GAAG,SAAS,IAAI;AAAA,QAC1C,MAAM,cAAc,MAAM,eAAe,QAAQ,SAAS,CAAC;AAAA,QAC3D,WAAW,QAAQ,aAAa;AAAA,UAC9B,MAAM,IAAI,OAAO,UAAU,OAAO;AAAA,CAAI;AAAA,QACxC;AAAA,QACA,OAAO,KAAK;AAAA,QACZ,MAAM,UAAU,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAAA,QAC/D,MAAM,IAAI,OAAO,UAAU,QAAQ,SAAS;AAAA,CAAW;AAAA,QACvD,OAAO;AAAA;AAAA,IAEX;AAAA;AAAA,EAGF,OAAO;AAAA;",
|
|
8
|
+
"debugId": "4AE153398292798664756E2164756E21",
|
|
9
9
|
"names": []
|
|
10
10
|
}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
// src/commands/tr/tr.ts
|
|
2
2
|
import { createFlagParser } from "../../utils/flag-parser.mjs";
|
|
3
|
+
import { expandEscapes } from "../../utils/expand-escapes.mjs";
|
|
3
4
|
var spec = {
|
|
4
5
|
name: "tr",
|
|
5
6
|
flags: [
|
|
@@ -20,47 +21,6 @@ var handler = (flags, flag) => {
|
|
|
20
21
|
flags.complement = true;
|
|
21
22
|
};
|
|
22
23
|
var parser = createFlagParser(spec, defaults, handler);
|
|
23
|
-
function expandEscapes(s) {
|
|
24
|
-
let result = "";
|
|
25
|
-
for (let i = 0;i < s.length; i++) {
|
|
26
|
-
if (s[i] === "\\" && i + 1 < s.length) {
|
|
27
|
-
i++;
|
|
28
|
-
switch (s[i]) {
|
|
29
|
-
case "n":
|
|
30
|
-
result += `
|
|
31
|
-
`;
|
|
32
|
-
break;
|
|
33
|
-
case "t":
|
|
34
|
-
result += "\t";
|
|
35
|
-
break;
|
|
36
|
-
case "\\":
|
|
37
|
-
result += "\\";
|
|
38
|
-
break;
|
|
39
|
-
case "a":
|
|
40
|
-
result += "\x07";
|
|
41
|
-
break;
|
|
42
|
-
case "b":
|
|
43
|
-
result += "\b";
|
|
44
|
-
break;
|
|
45
|
-
case "f":
|
|
46
|
-
result += "\f";
|
|
47
|
-
break;
|
|
48
|
-
case "r":
|
|
49
|
-
result += "\r";
|
|
50
|
-
break;
|
|
51
|
-
case "v":
|
|
52
|
-
result += "\v";
|
|
53
|
-
break;
|
|
54
|
-
default:
|
|
55
|
-
result += s[i];
|
|
56
|
-
break;
|
|
57
|
-
}
|
|
58
|
-
} else {
|
|
59
|
-
result += s[i];
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
return result;
|
|
63
|
-
}
|
|
64
24
|
function expandCharClass(name) {
|
|
65
25
|
switch (name) {
|
|
66
26
|
case "alpha":
|
|
@@ -190,4 +150,4 @@ export {
|
|
|
190
150
|
tr
|
|
191
151
|
};
|
|
192
152
|
|
|
193
|
-
//# debugId=
|
|
153
|
+
//# debugId=337E93761190174864756E2164756E21
|