shell-dsl 0.0.9 → 0.0.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/package.json +1 -1
- package/dist/cjs/src/commands/awk/awk.cjs +79 -32
- package/dist/cjs/src/commands/awk/awk.cjs.map +3 -3
- package/dist/cjs/src/commands/cat/cat.cjs +16 -3
- package/dist/cjs/src/commands/cat/cat.cjs.map +3 -3
- package/dist/cjs/src/commands/colon/colon.cjs +39 -0
- package/dist/cjs/src/commands/colon/colon.cjs.map +10 -0
- package/dist/cjs/src/commands/cp/cp.cjs +26 -20
- package/dist/cjs/src/commands/cp/cp.cjs.map +3 -3
- package/dist/cjs/src/commands/echo/echo.cjs +22 -7
- package/dist/cjs/src/commands/echo/echo.cjs.map +3 -3
- package/dist/cjs/src/commands/grep/grep.cjs +166 -139
- package/dist/cjs/src/commands/grep/grep.cjs.map +3 -3
- package/dist/cjs/src/commands/head/head.cjs +29 -14
- package/dist/cjs/src/commands/head/head.cjs.map +3 -3
- package/dist/cjs/src/commands/index.cjs +6 -2
- package/dist/cjs/src/commands/index.cjs.map +3 -3
- package/dist/cjs/src/commands/ls/ls.cjs +27 -27
- package/dist/cjs/src/commands/ls/ls.cjs.map +3 -3
- package/dist/cjs/src/commands/mkdir/mkdir.cjs +21 -10
- package/dist/cjs/src/commands/mkdir/mkdir.cjs.map +3 -3
- package/dist/cjs/src/commands/mv/mv.cjs +22 -15
- package/dist/cjs/src/commands/mv/mv.cjs.map +3 -3
- package/dist/cjs/src/commands/pwd/pwd.cjs +13 -1
- package/dist/cjs/src/commands/pwd/pwd.cjs.map +3 -3
- package/dist/cjs/src/commands/rm/rm.cjs +25 -22
- package/dist/cjs/src/commands/rm/rm.cjs.map +3 -3
- package/dist/cjs/src/commands/sed/sed.cjs +87 -25
- package/dist/cjs/src/commands/sed/sed.cjs.map +3 -3
- package/dist/cjs/src/commands/sort/sort.cjs +27 -24
- package/dist/cjs/src/commands/sort/sort.cjs.map +3 -3
- package/dist/cjs/src/commands/tail/tail.cjs +29 -14
- package/dist/cjs/src/commands/tail/tail.cjs.map +3 -3
- package/dist/cjs/src/commands/tee/tee.cjs +21 -10
- package/dist/cjs/src/commands/tee/tee.cjs.map +3 -3
- package/dist/cjs/src/commands/touch/touch.cjs +21 -10
- package/dist/cjs/src/commands/touch/touch.cjs.map +3 -3
- package/dist/cjs/src/commands/tree/tree.cjs +45 -48
- package/dist/cjs/src/commands/tree/tree.cjs.map +3 -3
- package/dist/cjs/src/commands/uniq/uniq.cjs +27 -24
- package/dist/cjs/src/commands/uniq/uniq.cjs.map +3 -3
- package/dist/cjs/src/commands/wc/wc.cjs +28 -24
- package/dist/cjs/src/commands/wc/wc.cjs.map +3 -3
- package/dist/cjs/src/fs/memfs-adapter.cjs +3 -1
- package/dist/cjs/src/fs/memfs-adapter.cjs.map +3 -3
- package/dist/cjs/src/interpreter/interpreter.cjs +32 -7
- package/dist/cjs/src/interpreter/interpreter.cjs.map +3 -3
- package/dist/cjs/src/parser/parser.cjs +3 -3
- package/dist/cjs/src/parser/parser.cjs.map +3 -3
- package/dist/cjs/src/utils/flag-parser.cjs +162 -0
- package/dist/cjs/src/utils/flag-parser.cjs.map +10 -0
- package/dist/cjs/src/utils/index.cjs +4 -2
- 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 +79 -32
- package/dist/mjs/src/commands/awk/awk.mjs.map +3 -3
- package/dist/mjs/src/commands/cat/cat.mjs +16 -3
- package/dist/mjs/src/commands/cat/cat.mjs.map +3 -3
- package/dist/mjs/src/commands/colon/colon.mjs +9 -0
- package/dist/mjs/src/commands/colon/colon.mjs.map +10 -0
- package/dist/mjs/src/commands/cp/cp.mjs +26 -20
- package/dist/mjs/src/commands/cp/cp.mjs.map +3 -3
- package/dist/mjs/src/commands/echo/echo.mjs +22 -7
- package/dist/mjs/src/commands/echo/echo.mjs.map +3 -3
- package/dist/mjs/src/commands/grep/grep.mjs +166 -139
- package/dist/mjs/src/commands/grep/grep.mjs.map +3 -3
- package/dist/mjs/src/commands/head/head.mjs +29 -14
- package/dist/mjs/src/commands/head/head.mjs.map +3 -3
- package/dist/mjs/src/commands/index.mjs +6 -2
- package/dist/mjs/src/commands/index.mjs.map +3 -3
- package/dist/mjs/src/commands/ls/ls.mjs +27 -27
- package/dist/mjs/src/commands/ls/ls.mjs.map +3 -3
- package/dist/mjs/src/commands/mkdir/mkdir.mjs +21 -10
- package/dist/mjs/src/commands/mkdir/mkdir.mjs.map +3 -3
- package/dist/mjs/src/commands/mv/mv.mjs +22 -15
- package/dist/mjs/src/commands/mv/mv.mjs.map +3 -3
- package/dist/mjs/src/commands/pwd/pwd.mjs +13 -1
- package/dist/mjs/src/commands/pwd/pwd.mjs.map +3 -3
- package/dist/mjs/src/commands/rm/rm.mjs +25 -22
- package/dist/mjs/src/commands/rm/rm.mjs.map +3 -3
- package/dist/mjs/src/commands/sed/sed.mjs +87 -25
- package/dist/mjs/src/commands/sed/sed.mjs.map +3 -3
- package/dist/mjs/src/commands/sort/sort.mjs +27 -24
- package/dist/mjs/src/commands/sort/sort.mjs.map +3 -3
- package/dist/mjs/src/commands/tail/tail.mjs +29 -14
- package/dist/mjs/src/commands/tail/tail.mjs.map +3 -3
- package/dist/mjs/src/commands/tee/tee.mjs +21 -10
- package/dist/mjs/src/commands/tee/tee.mjs.map +3 -3
- package/dist/mjs/src/commands/touch/touch.mjs +21 -10
- package/dist/mjs/src/commands/touch/touch.mjs.map +3 -3
- package/dist/mjs/src/commands/tree/tree.mjs +45 -48
- package/dist/mjs/src/commands/tree/tree.mjs.map +3 -3
- package/dist/mjs/src/commands/uniq/uniq.mjs +27 -24
- package/dist/mjs/src/commands/uniq/uniq.mjs.map +3 -3
- package/dist/mjs/src/commands/wc/wc.mjs +28 -24
- package/dist/mjs/src/commands/wc/wc.mjs.map +3 -3
- package/dist/mjs/src/fs/memfs-adapter.mjs +3 -1
- package/dist/mjs/src/fs/memfs-adapter.mjs.map +3 -3
- package/dist/mjs/src/interpreter/interpreter.mjs +32 -7
- package/dist/mjs/src/interpreter/interpreter.mjs.map +3 -3
- package/dist/mjs/src/parser/parser.mjs +3 -3
- package/dist/mjs/src/parser/parser.mjs.map +3 -3
- package/dist/mjs/src/utils/flag-parser.mjs +132 -0
- package/dist/mjs/src/utils/flag-parser.mjs.map +10 -0
- package/dist/mjs/src/utils/index.mjs +6 -2
- package/dist/mjs/src/utils/index.mjs.map +3 -3
- package/dist/types/src/commands/colon/colon.d.ts +2 -0
- package/dist/types/src/commands/index.d.ts +1 -0
- package/dist/types/src/utils/flag-parser.d.ts +36 -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/sed/sed.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
|
-
"import type { Command } from \"../../types.cjs\";\n\ninterface SedCommand {\n type: \"s\" | \"d\" | \"p\";\n addressPattern?: RegExp;\n pattern?: RegExp;\n replacement?: string;\n globalFlag: boolean;\n printFlag: boolean;\n}\n\ninterface SedOptions {\n suppressOutput: boolean; // -n\n inPlace: boolean; // -i\n commands: SedCommand[];\n}\n\nfunction parseSubstitution(script: string): SedCommand | null {\n // Match s/pattern/replacement/flags format\n // Support different delimiters (first char after 's')\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 // Convert sed-style \\( \\) to JS ( ) for capture groups\n const patternStr = rawPattern!.replace(/\\\\\\(/g, \"(\").replace(/\\\\\\)/g, \")\");\n // Convert sed replacement to JS String.replace format:\n // 1. Mark backreferences \\1..\\9 with placeholders\n // 2. Escape $ so String.replace doesn't treat $$ as special\n // 3. Restore backreference placeholders as $1..$9\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 // Check for address pattern (e.g., /foo/d or /foo/p)\n const addressMatch = trimmed.match(/^\\/(.+?)\\/([dp])$/);\n if (addressMatch) {\n const [, addressPatternStr, cmd] = addressMatch;\n try {\n return {\n type: cmd as \"d\" | \"p\",\n addressPattern: new RegExp(addressPatternStr!),\n globalFlag: false,\n printFlag: false,\n };\n } catch {\n return null;\n }\n }\n\n // Simple d or p command (applies to all lines)\n if (trimmed === \"d\") {\n return { type: \"d\", globalFlag: false, printFlag: false };\n }\n if (trimmed === \"p\") {\n return { type: \"p\", globalFlag: false, printFlag: false };\n }\n\n // Address pattern with substitution: /pattern/s/old/new/flags\n const addressSubMatch = trimmed.match(/^\\/(.+?)\\/s(.)(.+?)\\2(.*?)\\2([gi]*)$/);\n if (addressSubMatch) {\n const [, addressPatternStr, , patternStr, replacement, flags] = addressSubMatch;\n const globalFlag = flags!.includes(\"g\");\n const caseInsensitive = flags!.includes(\"i\");\n try {\n return {\n type: \"s\",\n addressPattern: new RegExp(addressPatternStr!),\n pattern: new RegExp(patternStr!, caseInsensitive ? \"i\" : \"\"),\n replacement: replacement!,\n globalFlag,\n printFlag: false,\n };\n } catch {\n return null;\n }\n }\n\n // Substitution command\n const subCmd = parseSubstitution(trimmed);\n if (subCmd) return subCmd;\n\n return null;\n}\n\nfunction splitScriptParts(script: string): string[] {\n // Split on ';' that are outside of s/// delimiters\n const parts: string[] = [];\n let i = 0;\n let current = \"\";\n while (i < script.length) {\n if (script[i] === \"s\" && i + 1 < script.length) {\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] === \";\") {\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\nfunction parseArgs(args: string[]): { options: SedOptions; files: string[] } {\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\") {\n options.suppressOutput = true;\n i++;\n continue;\n }\n\n if (arg === \"-i\") {\n options.inPlace = true;\n i++;\n continue;\n }\n\n if (arg === \"-e\" && args[i + 1] !== undefined) {\n const cmd = parseCommand(args[i + 1]!);\n if (cmd) {\n options.commands.push(cmd);\n }\n i += 2;\n continue;\n }\n\n // Non-flag argument: either a script or a file\n if (!arg.startsWith(\"-\")) {\n if (options.commands.length === 0) {\n // First non-flag is the script — may contain ;-separated commands\n const parts = splitScriptParts(arg);\n for (const part of parts) {\n const cmd = parseCommand(part);\n if (cmd) {\n options.commands.push(cmd);\n }\n }\n } else {\n // Subsequent non-flags are files\n files.push(arg);\n }\n }\n i++;\n }\n\n return { options, files };\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\nfunction processLine(\n line: string,\n commands: SedCommand[],\n suppressOutput: boolean\n): { output: string | null; deleted: boolean } {\n let currentLine = line;\n let deleted = false;\n let printed = false;\n\n for (const cmd of commands) {\n // Check address pattern first\n if (cmd.addressPattern && !cmd.addressPattern.test(currentLine)) {\n continue; // Skip this command if address doesn't match\n }\n\n switch (cmd.type) {\n case \"s\":\n currentLine = applySubstitution(currentLine, cmd);\n break;\n case \"d\":\n deleted = true;\n return { output: null, deleted: true };\n case \"p\":\n printed = true;\n break;\n }\n }\n\n if (deleted) {\n return { output: null, deleted: true };\n }\n\n if (suppressOutput) {\n // With -n, only output if explicitly printed\n return { output: printed ? currentLine : null, deleted: false };\n }\n\n // Without -n, always output (plus extra if printed)\n if (printed) {\n return { output: currentLine + \"\\n\" + currentLine, deleted: false };\n }\n return { output: currentLine, deleted: false };\n}\n\nexport const sed: Command = async (ctx) => {\n const { options, files } = parseArgs(ctx.args);\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<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 const { output } = processLine(line, options.commands, options.suppressOutput);\n if (output !== null) {\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 if (options.inPlace) {\n // In-place editing: write results back to each file\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 lines = content.toString().split(\"\\n\");\n if (lines.length > 0 && lines[lines.length - 1] === \"\") {\n lines.pop();\n }\n const outputLines: string[] = [];\n for (const line of lines) {\n const { output } = processLine(line, options.commands, options.suppressOutput);\n if (output !== null) {\n outputLines.push(output);\n }\n }\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 // 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(`sed: ${file}: ${message}\\n`);\n return 1;\n }\n }\n }\n\n return 0;\n};\n"
|
|
5
|
+
"import type { Command } from \"../../types.cjs\";\n\ninterface SedCommand {\n type: \"s\" | \"d\" | \"p\";\n addressPattern?: RegExp;\n pattern?: RegExp;\n replacement?: string;\n globalFlag: boolean;\n printFlag: boolean;\n}\n\ninterface SedOptions {\n suppressOutput: boolean; // -n\n inPlace: boolean; // -i\n commands: SedCommand[];\n}\n\nfunction parseSubstitution(script: string): SedCommand | null {\n // Match s/pattern/replacement/flags format\n // Support different delimiters (first char after 's')\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 // Convert sed-style \\( \\) to JS ( ) for capture groups\n const patternStr = rawPattern!.replace(/\\\\\\(/g, \"(\").replace(/\\\\\\)/g, \")\");\n // Convert sed replacement to JS String.replace format:\n // 1. Mark backreferences \\1..\\9 with placeholders\n // 2. Escape $ so String.replace doesn't treat $$ as special\n // 3. Restore backreference placeholders as $1..$9\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 // Check for address pattern (e.g., /foo/d or /foo/p)\n const addressMatch = trimmed.match(/^\\/(.+?)\\/([dp])$/);\n if (addressMatch) {\n const [, addressPatternStr, cmd] = addressMatch;\n try {\n return {\n type: cmd as \"d\" | \"p\",\n addressPattern: new RegExp(addressPatternStr!),\n globalFlag: false,\n printFlag: false,\n };\n } catch {\n return null;\n }\n }\n\n // Simple d or p command (applies to all lines)\n if (trimmed === \"d\") {\n return { type: \"d\", globalFlag: false, printFlag: false };\n }\n if (trimmed === \"p\") {\n return { type: \"p\", globalFlag: false, printFlag: false };\n }\n\n // Address pattern with substitution: /pattern/s/old/new/flags\n const addressSubMatch = trimmed.match(/^\\/(.+?)\\/s(.)(.+?)\\2(.*?)\\2([gi]*)$/);\n if (addressSubMatch) {\n const [, addressPatternStr, , patternStr, replacement, flags] = addressSubMatch;\n const globalFlag = flags!.includes(\"g\");\n const caseInsensitive = flags!.includes(\"i\");\n try {\n return {\n type: \"s\",\n addressPattern: new RegExp(addressPatternStr!),\n pattern: new RegExp(patternStr!, caseInsensitive ? \"i\" : \"\"),\n replacement: replacement!,\n globalFlag,\n printFlag: false,\n };\n } catch {\n return null;\n }\n }\n\n // Substitution command\n const subCmd = parseSubstitution(trimmed);\n if (subCmd) return subCmd;\n\n return null;\n}\n\nfunction splitScriptParts(script: string): string[] {\n // Split on ';' that are outside of s/// delimiters\n const parts: string[] = [];\n let i = 0;\n let current = \"\";\n while (i < script.length) {\n if (script[i] === \"s\" && i + 1 < script.length) {\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] === \";\") {\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 // Handle -- to stop flag parsing\n if (arg === \"--\") {\n i++;\n // Rest are files or script\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 // 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 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 // -e takes a script argument\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 cmd = parseCommand(script);\n if (cmd) options.commands.push(cmd);\n break; // -e consumes rest of this arg\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 // Non-flag argument: either a script or a file\n if (options.commands.length === 0) {\n // First non-flag is the script — may contain ;-separated commands\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 // Subsequent non-flags are files\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\nfunction processLine(\n line: string,\n commands: SedCommand[],\n suppressOutput: boolean\n): { output: string | null; deleted: boolean } {\n let currentLine = line;\n let deleted = false;\n let printed = false;\n\n for (const cmd of commands) {\n // Check address pattern first\n if (cmd.addressPattern && !cmd.addressPattern.test(currentLine)) {\n continue; // Skip this command if address doesn't match\n }\n\n switch (cmd.type) {\n case \"s\":\n currentLine = applySubstitution(currentLine, cmd);\n break;\n case \"d\":\n deleted = true;\n return { output: null, deleted: true };\n case \"p\":\n printed = true;\n break;\n }\n }\n\n if (deleted) {\n return { output: null, deleted: true };\n }\n\n if (suppressOutput) {\n // With -n, only output if explicitly printed\n return { output: printed ? currentLine : null, deleted: false };\n }\n\n // Without -n, always output (plus extra if printed)\n if (printed) {\n return { output: currentLine + \"\\n\" + currentLine, deleted: false };\n }\n return { output: currentLine, deleted: 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<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 const { output } = processLine(line, options.commands, options.suppressOutput);\n if (output !== null) {\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 if (options.inPlace) {\n // In-place editing: write results back to each file\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 lines = content.toString().split(\"\\n\");\n if (lines.length > 0 && lines[lines.length - 1] === \"\") {\n lines.pop();\n }\n const outputLines: string[] = [];\n for (const line of lines) {\n const { output } = processLine(line, options.commands, options.suppressOutput);\n if (output !== null) {\n outputLines.push(output);\n }\n }\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 // 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(`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": "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",
|
|
8
|
+
"debugId": "9484A386918DB8C764756E2164756E21",
|
|
9
9
|
"names": []
|
|
10
10
|
}
|
|
@@ -32,31 +32,34 @@ __export(exports_sort, {
|
|
|
32
32
|
sort: () => sort
|
|
33
33
|
});
|
|
34
34
|
module.exports = __toCommonJS(exports_sort);
|
|
35
|
+
var import_flag_parser = require("../../utils/flag-parser.cjs");
|
|
36
|
+
var spec = {
|
|
37
|
+
name: "sort",
|
|
38
|
+
flags: [
|
|
39
|
+
{ short: "r", long: "reverse" },
|
|
40
|
+
{ short: "n", long: "numeric-sort" },
|
|
41
|
+
{ short: "u", long: "unique" }
|
|
42
|
+
],
|
|
43
|
+
usage: "sort [-rnu] [file ...]"
|
|
44
|
+
};
|
|
45
|
+
var defaults = { reverse: false, numeric: false, unique: false };
|
|
46
|
+
var handler = (flags, flag) => {
|
|
47
|
+
if (flag.short === "r")
|
|
48
|
+
flags.reverse = true;
|
|
49
|
+
if (flag.short === "n")
|
|
50
|
+
flags.numeric = true;
|
|
51
|
+
if (flag.short === "u")
|
|
52
|
+
flags.unique = true;
|
|
53
|
+
};
|
|
54
|
+
var parser = import_flag_parser.createFlagParser(spec, defaults, handler);
|
|
35
55
|
var sort = async (ctx) => {
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
for (const arg of ctx.args) {
|
|
41
|
-
if (arg === "-r") {
|
|
42
|
-
reverse = true;
|
|
43
|
-
} else if (arg === "-n") {
|
|
44
|
-
numeric = true;
|
|
45
|
-
} else if (arg === "-u") {
|
|
46
|
-
unique = true;
|
|
47
|
-
} else if (arg.startsWith("-")) {
|
|
48
|
-
for (const flag of arg.slice(1)) {
|
|
49
|
-
if (flag === "r")
|
|
50
|
-
reverse = true;
|
|
51
|
-
else if (flag === "n")
|
|
52
|
-
numeric = true;
|
|
53
|
-
else if (flag === "u")
|
|
54
|
-
unique = true;
|
|
55
|
-
}
|
|
56
|
-
} else {
|
|
57
|
-
files.push(arg);
|
|
58
|
-
}
|
|
56
|
+
const result = parser.parse(ctx.args);
|
|
57
|
+
if (result.error) {
|
|
58
|
+
await parser.writeError(result.error, ctx.stderr);
|
|
59
|
+
return 1;
|
|
59
60
|
}
|
|
61
|
+
const { reverse, numeric, unique } = result.flags;
|
|
62
|
+
const files = result.args;
|
|
60
63
|
let allLines = [];
|
|
61
64
|
if (files.length === 0) {
|
|
62
65
|
for await (const line of ctx.stdin.lines()) {
|
|
@@ -102,4 +105,4 @@ var sort = async (ctx) => {
|
|
|
102
105
|
return 0;
|
|
103
106
|
};
|
|
104
107
|
|
|
105
|
-
//# debugId=
|
|
108
|
+
//# debugId=05AE9C71387FE59164756E2164756E21
|
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../src/commands/sort/sort.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
|
-
"import type { Command } from \"../../types.cjs\";\
|
|
5
|
+
"import type { Command } from \"../../types.cjs\";\nimport { createFlagParser, type FlagDefinition } from \"../../utils/flag-parser.cjs\";\n\ninterface SortFlags {\n reverse: boolean;\n numeric: boolean;\n unique: boolean;\n}\n\nconst spec = {\n name: \"sort\",\n flags: [\n { short: \"r\", long: \"reverse\" },\n { short: \"n\", long: \"numeric-sort\" },\n { short: \"u\", long: \"unique\" },\n ] as FlagDefinition[],\n usage: \"sort [-rnu] [file ...]\",\n};\n\nconst defaults: SortFlags = { reverse: false, numeric: false, unique: false };\n\nconst handler = (flags: SortFlags, flag: FlagDefinition) => {\n if (flag.short === \"r\") flags.reverse = true;\n if (flag.short === \"n\") flags.numeric = true;\n if (flag.short === \"u\") flags.unique = true;\n};\n\nconst parser = createFlagParser(spec, defaults, handler);\n\nexport const sort: 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 const { reverse, numeric, unique } = result.flags;\n const files = result.args;\n\n let allLines: string[] = [];\n\n if (files.length === 0) {\n // Read from stdin\n for await (const line of ctx.stdin.lines()) {\n allLines.push(line);\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)).toString();\n const lines = content.split(\"\\n\");\n if (lines[lines.length - 1] === \"\") {\n lines.pop();\n }\n allLines.push(...lines);\n } catch (err) {\n await ctx.stderr.writeText(`sort: ${file}: No such file or directory\\n`);\n return 1;\n }\n }\n }\n\n // Sort\n if (numeric) {\n allLines.sort((a, b) => {\n const numA = parseFloat(a) || 0;\n const numB = parseFloat(b) || 0;\n return numA - numB;\n });\n } else {\n allLines.sort();\n }\n\n if (reverse) {\n allLines.reverse();\n }\n\n if (unique) {\n allLines = [...new Set(allLines)];\n }\n\n for (const line of allLines) {\n await ctx.stdout.writeText(line + \"\\n\");\n }\n\n return 0;\n};\n"
|
|
6
6
|
],
|
|
7
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
8
|
-
"debugId": "
|
|
7
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACsD,IAAtD;AAQA,IAAM,OAAO;AAAA,EACX,MAAM;AAAA,EACN,OAAO;AAAA,IACL,EAAE,OAAO,KAAK,MAAM,UAAU;AAAA,IAC9B,EAAE,OAAO,KAAK,MAAM,eAAe;AAAA,IACnC,EAAE,OAAO,KAAK,MAAM,SAAS;AAAA,EAC/B;AAAA,EACA,OAAO;AACT;AAEA,IAAM,WAAsB,EAAE,SAAS,OAAO,SAAS,OAAO,QAAQ,MAAM;AAE5E,IAAM,UAAU,CAAC,OAAkB,SAAyB;AAAA,EAC1D,IAAI,KAAK,UAAU;AAAA,IAAK,MAAM,UAAU;AAAA,EACxC,IAAI,KAAK,UAAU;AAAA,IAAK,MAAM,UAAU;AAAA,EACxC,IAAI,KAAK,UAAU;AAAA,IAAK,MAAM,SAAS;AAAA;AAGzC,IAAM,SAAS,oCAAiB,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,QAAQ,SAAS,SAAS,WAAW,OAAO;AAAA,EAC5C,MAAM,QAAQ,OAAO;AAAA,EAErB,IAAI,WAAqB,CAAC;AAAA,EAE1B,IAAI,MAAM,WAAW,GAAG;AAAA,IAEtB,iBAAiB,QAAQ,IAAI,MAAM,MAAM,GAAG;AAAA,MAC1C,SAAS,KAAK,IAAI;AAAA,IACpB;AAAA,EACF,EAAO;AAAA,IACL,WAAW,QAAQ,OAAO;AAAA,MACxB,IAAI;AAAA,QACF,MAAM,OAAO,IAAI,GAAG,QAAQ,IAAI,KAAK,IAAI;AAAA,QACzC,MAAM,WAAW,MAAM,IAAI,GAAG,SAAS,IAAI,GAAG,SAAS;AAAA,QACvD,MAAM,QAAQ,QAAQ,MAAM;AAAA,CAAI;AAAA,QAChC,IAAI,MAAM,MAAM,SAAS,OAAO,IAAI;AAAA,UAClC,MAAM,IAAI;AAAA,QACZ;AAAA,QACA,SAAS,KAAK,GAAG,KAAK;AAAA,QACtB,OAAO,KAAK;AAAA,QACZ,MAAM,IAAI,OAAO,UAAU,SAAS;AAAA,CAAmC;AAAA,QACvE,OAAO;AAAA;AAAA,IAEX;AAAA;AAAA,EAIF,IAAI,SAAS;AAAA,IACX,SAAS,KAAK,CAAC,GAAG,MAAM;AAAA,MACtB,MAAM,OAAO,WAAW,CAAC,KAAK;AAAA,MAC9B,MAAM,OAAO,WAAW,CAAC,KAAK;AAAA,MAC9B,OAAO,OAAO;AAAA,KACf;AAAA,EACH,EAAO;AAAA,IACL,SAAS,KAAK;AAAA;AAAA,EAGhB,IAAI,SAAS;AAAA,IACX,SAAS,QAAQ;AAAA,EACnB;AAAA,EAEA,IAAI,QAAQ;AAAA,IACV,WAAW,CAAC,GAAG,IAAI,IAAI,QAAQ,CAAC;AAAA,EAClC;AAAA,EAEA,WAAW,QAAQ,UAAU;AAAA,IAC3B,MAAM,IAAI,OAAO,UAAU,OAAO;AAAA,CAAI;AAAA,EACxC;AAAA,EAEA,OAAO;AAAA;",
|
|
8
|
+
"debugId": "05AE9C71387FE59164756E2164756E21",
|
|
9
9
|
"names": []
|
|
10
10
|
}
|
|
@@ -32,22 +32,37 @@ __export(exports_tail, {
|
|
|
32
32
|
tail: () => tail
|
|
33
33
|
});
|
|
34
34
|
module.exports = __toCommonJS(exports_tail);
|
|
35
|
+
var import_flag_parser = require("../../utils/flag-parser.cjs");
|
|
36
|
+
var spec = {
|
|
37
|
+
name: "tail",
|
|
38
|
+
flags: [
|
|
39
|
+
{ short: "n", long: "lines", takesValue: true }
|
|
40
|
+
],
|
|
41
|
+
usage: "tail [-n lines] [file ...]"
|
|
42
|
+
};
|
|
43
|
+
var defaults = { lines: 10 };
|
|
44
|
+
var handler = (flags, flag, value) => {
|
|
45
|
+
if (flag.short === "n" && value) {
|
|
46
|
+
flags.lines = parseInt(value, 10);
|
|
47
|
+
}
|
|
48
|
+
};
|
|
49
|
+
var parser = import_flag_parser.createFlagParser(spec, defaults, handler);
|
|
35
50
|
var tail = async (ctx) => {
|
|
36
|
-
|
|
37
|
-
const
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
i++;
|
|
43
|
-
} else if (arg.startsWith("-n")) {
|
|
44
|
-
numLines = parseInt(arg.slice(2), 10);
|
|
45
|
-
} else if (arg.startsWith("-") && /^\d+$/.test(arg.slice(1))) {
|
|
46
|
-
numLines = parseInt(arg.slice(1), 10);
|
|
47
|
-
} else if (!arg.startsWith("-")) {
|
|
48
|
-
files.push(arg);
|
|
51
|
+
const processedArgs = [];
|
|
52
|
+
for (const arg of ctx.args) {
|
|
53
|
+
if (arg.startsWith("-") && /^-\d+$/.test(arg)) {
|
|
54
|
+
processedArgs.push("-n", arg.slice(1));
|
|
55
|
+
} else {
|
|
56
|
+
processedArgs.push(arg);
|
|
49
57
|
}
|
|
50
58
|
}
|
|
59
|
+
const result = parser.parse(processedArgs);
|
|
60
|
+
if (result.error) {
|
|
61
|
+
await parser.writeError(result.error, ctx.stderr);
|
|
62
|
+
return 1;
|
|
63
|
+
}
|
|
64
|
+
const numLines = result.flags.lines;
|
|
65
|
+
const files = result.args;
|
|
51
66
|
if (isNaN(numLines) || numLines < 0) {
|
|
52
67
|
await ctx.stderr.writeText(`tail: invalid number of lines
|
|
53
68
|
`);
|
|
@@ -92,4 +107,4 @@ var tail = async (ctx) => {
|
|
|
92
107
|
return 0;
|
|
93
108
|
};
|
|
94
109
|
|
|
95
|
-
//# debugId=
|
|
110
|
+
//# debugId=E9792D7DF74F817164756E2164756E21
|
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../src/commands/tail/tail.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
|
-
"import type { Command } from \"../../types.cjs\";\
|
|
5
|
+
"import type { Command } from \"../../types.cjs\";\nimport { createFlagParser, type FlagDefinition } from \"../../utils/flag-parser.cjs\";\n\ninterface TailFlags {\n lines: number;\n}\n\nconst spec = {\n name: \"tail\",\n flags: [\n { short: \"n\", long: \"lines\", takesValue: true },\n ] as FlagDefinition[],\n usage: \"tail [-n lines] [file ...]\",\n};\n\nconst defaults: TailFlags = { lines: 10 };\n\nconst handler = (flags: TailFlags, flag: FlagDefinition, value?: string) => {\n if (flag.short === \"n\" && value) {\n flags.lines = parseInt(value, 10);\n }\n};\n\nconst parser = createFlagParser(spec, defaults, handler);\n\nexport const tail: Command = async (ctx) => {\n // Pre-process args to handle legacy -N format (e.g., -5 means -n 5)\n const processedArgs: string[] = [];\n for (const arg of ctx.args) {\n if (arg.startsWith(\"-\") && /^-\\d+$/.test(arg)) {\n processedArgs.push(\"-n\", arg.slice(1));\n } else {\n processedArgs.push(arg);\n }\n }\n\n const result = parser.parse(processedArgs);\n\n if (result.error) {\n await parser.writeError(result.error, ctx.stderr);\n return 1;\n }\n\n const numLines = result.flags.lines;\n const files = result.args;\n\n if (isNaN(numLines) || numLines < 0) {\n await ctx.stderr.writeText(\"tail: invalid number of lines\\n\");\n return 1;\n }\n\n const outputLines = async (content: string) => {\n const lines = content.split(\"\\n\");\n // Remove trailing empty line if present\n if (lines[lines.length - 1] === \"\") {\n lines.pop();\n }\n const toOutput = lines.slice(-numLines);\n for (const line of toOutput) {\n await ctx.stdout.writeText(line + \"\\n\");\n }\n };\n\n if (files.length === 0) {\n // Read from stdin\n const content = await ctx.stdin.text();\n await outputLines(content);\n } else {\n for (let i = 0; i < files.length; i++) {\n const file = files[i]!;\n try {\n if (files.length > 1) {\n if (i > 0) await ctx.stdout.writeText(\"\\n\");\n await ctx.stdout.writeText(`==> ${file} <==\\n`);\n }\n const path = ctx.fs.resolve(ctx.cwd, file);\n const content = (await ctx.fs.readFile(path)).toString();\n await outputLines(content);\n } catch (err) {\n await ctx.stderr.writeText(`tail: ${file}: No such file or directory\\n`);\n return 1;\n }\n }\n }\n\n return 0;\n};\n"
|
|
6
6
|
],
|
|
7
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
8
|
-
"debugId": "
|
|
7
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACsD,IAAtD;AAMA,IAAM,OAAO;AAAA,EACX,MAAM;AAAA,EACN,OAAO;AAAA,IACL,EAAE,OAAO,KAAK,MAAM,SAAS,YAAY,KAAK;AAAA,EAChD;AAAA,EACA,OAAO;AACT;AAEA,IAAM,WAAsB,EAAE,OAAO,GAAG;AAExC,IAAM,UAAU,CAAC,OAAkB,MAAsB,UAAmB;AAAA,EAC1E,IAAI,KAAK,UAAU,OAAO,OAAO;AAAA,IAC/B,MAAM,QAAQ,SAAS,OAAO,EAAE;AAAA,EAClC;AAAA;AAGF,IAAM,SAAS,oCAAiB,MAAM,UAAU,OAAO;AAEhD,IAAM,OAAgB,OAAO,QAAQ;AAAA,EAE1C,MAAM,gBAA0B,CAAC;AAAA,EACjC,WAAW,OAAO,IAAI,MAAM;AAAA,IAC1B,IAAI,IAAI,WAAW,GAAG,KAAK,SAAS,KAAK,GAAG,GAAG;AAAA,MAC7C,cAAc,KAAK,MAAM,IAAI,MAAM,CAAC,CAAC;AAAA,IACvC,EAAO;AAAA,MACL,cAAc,KAAK,GAAG;AAAA;AAAA,EAE1B;AAAA,EAEA,MAAM,SAAS,OAAO,MAAM,aAAa;AAAA,EAEzC,IAAI,OAAO,OAAO;AAAA,IAChB,MAAM,OAAO,WAAW,OAAO,OAAO,IAAI,MAAM;AAAA,IAChD,OAAO;AAAA,EACT;AAAA,EAEA,MAAM,WAAW,OAAO,MAAM;AAAA,EAC9B,MAAM,QAAQ,OAAO;AAAA,EAErB,IAAI,MAAM,QAAQ,KAAK,WAAW,GAAG;AAAA,IACnC,MAAM,IAAI,OAAO,UAAU;AAAA,CAAiC;AAAA,IAC5D,OAAO;AAAA,EACT;AAAA,EAEA,MAAM,cAAc,OAAO,YAAoB;AAAA,IAC7C,MAAM,QAAQ,QAAQ,MAAM;AAAA,CAAI;AAAA,IAEhC,IAAI,MAAM,MAAM,SAAS,OAAO,IAAI;AAAA,MAClC,MAAM,IAAI;AAAA,IACZ;AAAA,IACA,MAAM,WAAW,MAAM,MAAM,CAAC,QAAQ;AAAA,IACtC,WAAW,QAAQ,UAAU;AAAA,MAC3B,MAAM,IAAI,OAAO,UAAU,OAAO;AAAA,CAAI;AAAA,IACxC;AAAA;AAAA,EAGF,IAAI,MAAM,WAAW,GAAG;AAAA,IAEtB,MAAM,UAAU,MAAM,IAAI,MAAM,KAAK;AAAA,IACrC,MAAM,YAAY,OAAO;AAAA,EAC3B,EAAO;AAAA,IACL,SAAS,IAAI,EAAG,IAAI,MAAM,QAAQ,KAAK;AAAA,MACrC,MAAM,OAAO,MAAM;AAAA,MACnB,IAAI;AAAA,QACF,IAAI,MAAM,SAAS,GAAG;AAAA,UACpB,IAAI,IAAI;AAAA,YAAG,MAAM,IAAI,OAAO,UAAU;AAAA,CAAI;AAAA,UAC1C,MAAM,IAAI,OAAO,UAAU,OAAO;AAAA,CAAY;AAAA,QAChD;AAAA,QACA,MAAM,OAAO,IAAI,GAAG,QAAQ,IAAI,KAAK,IAAI;AAAA,QACzC,MAAM,WAAW,MAAM,IAAI,GAAG,SAAS,IAAI,GAAG,SAAS;AAAA,QACvD,MAAM,YAAY,OAAO;AAAA,QACzB,OAAO,KAAK;AAAA,QACZ,MAAM,IAAI,OAAO,UAAU,SAAS;AAAA,CAAmC;AAAA,QACvE,OAAO;AAAA;AAAA,IAEX;AAAA;AAAA,EAGF,OAAO;AAAA;",
|
|
8
|
+
"debugId": "E9792D7DF74F817164756E2164756E21",
|
|
9
9
|
"names": []
|
|
10
10
|
}
|
|
@@ -32,22 +32,33 @@ __export(exports_tee, {
|
|
|
32
32
|
tee: () => tee
|
|
33
33
|
});
|
|
34
34
|
module.exports = __toCommonJS(exports_tee);
|
|
35
|
+
var import_flag_parser = require("../../utils/flag-parser.cjs");
|
|
36
|
+
var spec = {
|
|
37
|
+
name: "tee",
|
|
38
|
+
flags: [
|
|
39
|
+
{ short: "a", long: "append" }
|
|
40
|
+
],
|
|
41
|
+
usage: "tee [-a] [file ...]"
|
|
42
|
+
};
|
|
43
|
+
var defaults = { append: false };
|
|
44
|
+
var handler = (flags, flag) => {
|
|
45
|
+
if (flag.short === "a")
|
|
46
|
+
flags.append = true;
|
|
47
|
+
};
|
|
48
|
+
var parser = import_flag_parser.createFlagParser(spec, defaults, handler);
|
|
35
49
|
var tee = async (ctx) => {
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
append = true;
|
|
41
|
-
} else if (!arg.startsWith("-")) {
|
|
42
|
-
files.push(arg);
|
|
43
|
-
}
|
|
50
|
+
const result = parser.parse(ctx.args);
|
|
51
|
+
if (result.error) {
|
|
52
|
+
await parser.writeError(result.error, ctx.stderr);
|
|
53
|
+
return 1;
|
|
44
54
|
}
|
|
55
|
+
const files = result.args;
|
|
45
56
|
const content = await ctx.stdin.buffer();
|
|
46
57
|
await ctx.stdout.write(new Uint8Array(content));
|
|
47
58
|
for (const file of files) {
|
|
48
59
|
const path = ctx.fs.resolve(ctx.cwd, file);
|
|
49
60
|
try {
|
|
50
|
-
if (append) {
|
|
61
|
+
if (result.flags.append) {
|
|
51
62
|
await ctx.fs.appendFile(path, content);
|
|
52
63
|
} else {
|
|
53
64
|
await ctx.fs.writeFile(path, content);
|
|
@@ -62,4 +73,4 @@ var tee = async (ctx) => {
|
|
|
62
73
|
return 0;
|
|
63
74
|
};
|
|
64
75
|
|
|
65
|
-
//# debugId=
|
|
76
|
+
//# debugId=1F98F785435DBD0064756E2164756E21
|
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../src/commands/tee/tee.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
|
-
"import type { Command } from \"../../types.cjs\";\
|
|
5
|
+
"import type { Command } from \"../../types.cjs\";\nimport { createFlagParser, type FlagDefinition } from \"../../utils/flag-parser.cjs\";\n\ninterface TeeFlags {\n append: boolean;\n}\n\nconst spec = {\n name: \"tee\",\n flags: [\n { short: \"a\", long: \"append\" },\n ] as FlagDefinition[],\n usage: \"tee [-a] [file ...]\",\n};\n\nconst defaults: TeeFlags = { append: false };\n\nconst handler = (flags: TeeFlags, flag: FlagDefinition) => {\n if (flag.short === \"a\") flags.append = true;\n};\n\nconst parser = createFlagParser(spec, defaults, handler);\n\nexport const tee: 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 const files = result.args;\n\n // Read all stdin content\n const content = await ctx.stdin.buffer();\n\n // Write to stdout\n await ctx.stdout.write(new Uint8Array(content));\n\n // Write to each file\n for (const file of files) {\n const path = ctx.fs.resolve(ctx.cwd, file);\n try {\n if (result.flags.append) {\n await ctx.fs.appendFile(path, content);\n } else {\n await ctx.fs.writeFile(path, content);\n }\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n await ctx.stderr.writeText(`tee: ${file}: ${message}\\n`);\n return 1;\n }\n }\n\n return 0;\n};\n"
|
|
6
6
|
],
|
|
7
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
8
|
-
"debugId": "
|
|
7
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACsD,IAAtD;AAMA,IAAM,OAAO;AAAA,EACX,MAAM;AAAA,EACN,OAAO;AAAA,IACL,EAAE,OAAO,KAAK,MAAM,SAAS;AAAA,EAC/B;AAAA,EACA,OAAO;AACT;AAEA,IAAM,WAAqB,EAAE,QAAQ,MAAM;AAE3C,IAAM,UAAU,CAAC,OAAiB,SAAyB;AAAA,EACzD,IAAI,KAAK,UAAU;AAAA,IAAK,MAAM,SAAS;AAAA;AAGzC,IAAM,SAAS,oCAAiB,MAAM,UAAU,OAAO;AAEhD,IAAM,MAAe,OAAO,QAAQ;AAAA,EACzC,MAAM,SAAS,OAAO,MAAM,IAAI,IAAI;AAAA,EAEpC,IAAI,OAAO,OAAO;AAAA,IAChB,MAAM,OAAO,WAAW,OAAO,OAAO,IAAI,MAAM;AAAA,IAChD,OAAO;AAAA,EACT;AAAA,EAEA,MAAM,QAAQ,OAAO;AAAA,EAGrB,MAAM,UAAU,MAAM,IAAI,MAAM,OAAO;AAAA,EAGvC,MAAM,IAAI,OAAO,MAAM,IAAI,WAAW,OAAO,CAAC;AAAA,EAG9C,WAAW,QAAQ,OAAO;AAAA,IACxB,MAAM,OAAO,IAAI,GAAG,QAAQ,IAAI,KAAK,IAAI;AAAA,IACzC,IAAI;AAAA,MACF,IAAI,OAAO,MAAM,QAAQ;AAAA,QACvB,MAAM,IAAI,GAAG,WAAW,MAAM,OAAO;AAAA,MACvC,EAAO;AAAA,QACL,MAAM,IAAI,GAAG,UAAU,MAAM,OAAO;AAAA;AAAA,MAEtC,OAAO,KAAK;AAAA,MACZ,MAAM,UAAU,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAAA,MAC/D,MAAM,IAAI,OAAO,UAAU,QAAQ,SAAS;AAAA,CAAW;AAAA,MACvD,OAAO;AAAA;AAAA,EAEX;AAAA,EAEA,OAAO;AAAA;",
|
|
8
|
+
"debugId": "1F98F785435DBD0064756E2164756E21",
|
|
9
9
|
"names": []
|
|
10
10
|
}
|
|
@@ -32,16 +32,27 @@ __export(exports_touch, {
|
|
|
32
32
|
touch: () => touch
|
|
33
33
|
});
|
|
34
34
|
module.exports = __toCommonJS(exports_touch);
|
|
35
|
+
var import_flag_parser = require("../../utils/flag-parser.cjs");
|
|
36
|
+
var spec = {
|
|
37
|
+
name: "touch",
|
|
38
|
+
flags: [
|
|
39
|
+
{ short: "c", long: "no-create" }
|
|
40
|
+
],
|
|
41
|
+
usage: "touch [-c] file ..."
|
|
42
|
+
};
|
|
43
|
+
var defaults = { noCreate: false };
|
|
44
|
+
var handler = (flags, flag) => {
|
|
45
|
+
if (flag.short === "c")
|
|
46
|
+
flags.noCreate = true;
|
|
47
|
+
};
|
|
48
|
+
var parser = import_flag_parser.createFlagParser(spec, defaults, handler);
|
|
35
49
|
var touch = async (ctx) => {
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
noCreate = true;
|
|
41
|
-
} else if (!arg.startsWith("-")) {
|
|
42
|
-
files.push(arg);
|
|
43
|
-
}
|
|
50
|
+
const result = parser.parse(ctx.args);
|
|
51
|
+
if (result.error) {
|
|
52
|
+
await parser.writeError(result.error, ctx.stderr);
|
|
53
|
+
return 1;
|
|
44
54
|
}
|
|
55
|
+
const files = result.args;
|
|
45
56
|
if (files.length === 0) {
|
|
46
57
|
await ctx.stderr.writeText(`touch: missing file operand
|
|
47
58
|
`);
|
|
@@ -54,7 +65,7 @@ var touch = async (ctx) => {
|
|
|
54
65
|
if (exists) {
|
|
55
66
|
const content = await ctx.fs.readFile(path);
|
|
56
67
|
await ctx.fs.writeFile(path, content);
|
|
57
|
-
} else if (!noCreate) {
|
|
68
|
+
} else if (!result.flags.noCreate) {
|
|
58
69
|
await ctx.fs.writeFile(path, "");
|
|
59
70
|
}
|
|
60
71
|
} catch (err) {
|
|
@@ -67,4 +78,4 @@ var touch = async (ctx) => {
|
|
|
67
78
|
return 0;
|
|
68
79
|
};
|
|
69
80
|
|
|
70
|
-
//# debugId=
|
|
81
|
+
//# debugId=FAC4D5A2D9D7A3BD64756E2164756E21
|
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../src/commands/touch/touch.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
|
-
"import type { Command } from \"../../types.cjs\";\
|
|
5
|
+
"import type { Command } from \"../../types.cjs\";\nimport { createFlagParser, type FlagDefinition } from \"../../utils/flag-parser.cjs\";\n\ninterface TouchFlags {\n noCreate: boolean;\n}\n\nconst spec = {\n name: \"touch\",\n flags: [\n { short: \"c\", long: \"no-create\" },\n ] as FlagDefinition[],\n usage: \"touch [-c] file ...\",\n};\n\nconst defaults: TouchFlags = { noCreate: false };\n\nconst handler = (flags: TouchFlags, flag: FlagDefinition) => {\n if (flag.short === \"c\") flags.noCreate = true;\n};\n\nconst parser = createFlagParser(spec, defaults, handler);\n\nexport const touch: 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 const files = result.args;\n\n if (files.length === 0) {\n await ctx.stderr.writeText(\"touch: missing file operand\\n\");\n return 1;\n }\n\n for (const file of files) {\n const path = ctx.fs.resolve(ctx.cwd, file);\n try {\n const exists = await ctx.fs.exists(path);\n if (exists) {\n // Update mtime by reading and writing back\n const content = await ctx.fs.readFile(path);\n await ctx.fs.writeFile(path, content);\n } else if (!result.flags.noCreate) {\n // Create empty file\n await ctx.fs.writeFile(path, \"\");\n }\n // If noCreate and doesn't exist, skip silently\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n await ctx.stderr.writeText(`touch: cannot touch '${file}': ${message}\\n`);\n return 1;\n }\n }\n\n return 0;\n};\n"
|
|
6
6
|
],
|
|
7
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
8
|
-
"debugId": "
|
|
7
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACsD,IAAtD;AAMA,IAAM,OAAO;AAAA,EACX,MAAM;AAAA,EACN,OAAO;AAAA,IACL,EAAE,OAAO,KAAK,MAAM,YAAY;AAAA,EAClC;AAAA,EACA,OAAO;AACT;AAEA,IAAM,WAAuB,EAAE,UAAU,MAAM;AAE/C,IAAM,UAAU,CAAC,OAAmB,SAAyB;AAAA,EAC3D,IAAI,KAAK,UAAU;AAAA,IAAK,MAAM,WAAW;AAAA;AAG3C,IAAM,SAAS,oCAAiB,MAAM,UAAU,OAAO;AAEhD,IAAM,QAAiB,OAAO,QAAQ;AAAA,EAC3C,MAAM,SAAS,OAAO,MAAM,IAAI,IAAI;AAAA,EAEpC,IAAI,OAAO,OAAO;AAAA,IAChB,MAAM,OAAO,WAAW,OAAO,OAAO,IAAI,MAAM;AAAA,IAChD,OAAO;AAAA,EACT;AAAA,EAEA,MAAM,QAAQ,OAAO;AAAA,EAErB,IAAI,MAAM,WAAW,GAAG;AAAA,IACtB,MAAM,IAAI,OAAO,UAAU;AAAA,CAA+B;AAAA,IAC1D,OAAO;AAAA,EACT;AAAA,EAEA,WAAW,QAAQ,OAAO;AAAA,IACxB,MAAM,OAAO,IAAI,GAAG,QAAQ,IAAI,KAAK,IAAI;AAAA,IACzC,IAAI;AAAA,MACF,MAAM,SAAS,MAAM,IAAI,GAAG,OAAO,IAAI;AAAA,MACvC,IAAI,QAAQ;AAAA,QAEV,MAAM,UAAU,MAAM,IAAI,GAAG,SAAS,IAAI;AAAA,QAC1C,MAAM,IAAI,GAAG,UAAU,MAAM,OAAO;AAAA,MACtC,EAAO,SAAI,CAAC,OAAO,MAAM,UAAU;AAAA,QAEjC,MAAM,IAAI,GAAG,UAAU,MAAM,EAAE;AAAA,MACjC;AAAA,MAEA,OAAO,KAAK;AAAA,MACZ,MAAM,UAAU,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAAA,MAC/D,MAAM,IAAI,OAAO,UAAU,wBAAwB,UAAU;AAAA,CAAW;AAAA,MACxE,OAAO;AAAA;AAAA,EAEX;AAAA,EAEA,OAAO;AAAA;",
|
|
8
|
+
"debugId": "FAC4D5A2D9D7A3BD64756E2164756E21",
|
|
9
9
|
"names": []
|
|
10
10
|
}
|
|
@@ -32,56 +32,53 @@ __export(exports_tree, {
|
|
|
32
32
|
tree: () => tree
|
|
33
33
|
});
|
|
34
34
|
module.exports = __toCommonJS(exports_tree);
|
|
35
|
-
var
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
return 1;
|
|
59
|
-
}
|
|
60
|
-
} else if (arg.startsWith("-L")) {
|
|
61
|
-
const depthStr = arg.slice(2);
|
|
62
|
-
const depth = parseInt(depthStr, 10);
|
|
63
|
-
if (isNaN(depth) || depth < 1) {
|
|
64
|
-
await ctx.stderr.writeText(`tree: Invalid level, must be greater than 0
|
|
65
|
-
`);
|
|
66
|
-
return 1;
|
|
67
|
-
}
|
|
68
|
-
maxDepth = depth;
|
|
69
|
-
} else if (arg.startsWith("-") && arg !== "-") {
|
|
70
|
-
for (const flag of arg.slice(1)) {
|
|
71
|
-
if (flag === "a")
|
|
72
|
-
showAll = true;
|
|
73
|
-
else if (flag === "d")
|
|
74
|
-
directoriesOnly = true;
|
|
75
|
-
else {
|
|
76
|
-
await ctx.stderr.writeText(`tree: Invalid argument -${flag}
|
|
77
|
-
`);
|
|
78
|
-
return 1;
|
|
79
|
-
}
|
|
80
|
-
}
|
|
35
|
+
var import_flag_parser = require("../../utils/flag-parser.cjs");
|
|
36
|
+
var spec = {
|
|
37
|
+
name: "tree",
|
|
38
|
+
flags: [
|
|
39
|
+
{ short: "a", long: "all" },
|
|
40
|
+
{ short: "d" },
|
|
41
|
+
{ short: "L", takesValue: true }
|
|
42
|
+
],
|
|
43
|
+
usage: "tree [-ad] [-L level] [directory ...]"
|
|
44
|
+
};
|
|
45
|
+
var defaults = { all: false, directoriesOnly: false, maxDepth: Infinity };
|
|
46
|
+
var handlerResult = {};
|
|
47
|
+
var handler = (flags, flag, value) => {
|
|
48
|
+
if (flag.short === "a")
|
|
49
|
+
flags.all = true;
|
|
50
|
+
if (flag.short === "d")
|
|
51
|
+
flags.directoriesOnly = true;
|
|
52
|
+
if (flag.short === "L" && value) {
|
|
53
|
+
const depth = parseInt(value, 10);
|
|
54
|
+
if (isNaN(depth) || !/^\d+$/.test(value)) {
|
|
55
|
+
handlerResult.error = `tree: -L option requires a numeric argument
|
|
56
|
+
usage: ${spec.usage}
|
|
57
|
+
`;
|
|
81
58
|
} else {
|
|
82
|
-
|
|
59
|
+
flags.maxDepth = depth;
|
|
83
60
|
}
|
|
84
61
|
}
|
|
62
|
+
};
|
|
63
|
+
var parser = import_flag_parser.createFlagParser(spec, defaults, handler);
|
|
64
|
+
var tree = async (ctx) => {
|
|
65
|
+
handlerResult = {};
|
|
66
|
+
const result = parser.parse(ctx.args);
|
|
67
|
+
if (result.error) {
|
|
68
|
+
await parser.writeError(result.error, ctx.stderr);
|
|
69
|
+
return 1;
|
|
70
|
+
}
|
|
71
|
+
if (handlerResult.error) {
|
|
72
|
+
await ctx.stderr.writeText(handlerResult.error);
|
|
73
|
+
return 1;
|
|
74
|
+
}
|
|
75
|
+
const { all: showAll, directoriesOnly, maxDepth } = result.flags;
|
|
76
|
+
const targetPath = result.args[0] ?? ".";
|
|
77
|
+
if (maxDepth < 1) {
|
|
78
|
+
await ctx.stderr.writeText(`tree: Invalid level, must be greater than 0
|
|
79
|
+
`);
|
|
80
|
+
return 1;
|
|
81
|
+
}
|
|
85
82
|
const resolvedPath = ctx.fs.resolve(ctx.cwd, targetPath);
|
|
86
83
|
let stat;
|
|
87
84
|
try {
|
|
@@ -158,4 +155,4 @@ ${dirCount} ${dirWord}, ${fileCount} ${fileWord}
|
|
|
158
155
|
return 0;
|
|
159
156
|
};
|
|
160
157
|
|
|
161
|
-
//# debugId=
|
|
158
|
+
//# debugId=395AE290EA1D094564756E2164756E21
|
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../src/commands/tree/tree.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
|
-
"import type { Command } from \"../../types.cjs\";\
|
|
5
|
+
"import type { Command } from \"../../types.cjs\";\nimport { createFlagParser, type FlagDefinition } from \"../../utils/flag-parser.cjs\";\n\ninterface TreeFlags {\n all: boolean;\n directoriesOnly: boolean;\n maxDepth: number;\n}\n\nconst spec = {\n name: \"tree\",\n flags: [\n { short: \"a\", long: \"all\" },\n { short: \"d\" },\n { short: \"L\", takesValue: true },\n ] as FlagDefinition[],\n usage: \"tree [-ad] [-L level] [directory ...]\",\n};\n\nconst defaults: TreeFlags = { all: false, directoriesOnly: false, maxDepth: Infinity };\n\ninterface HandlerResult {\n error?: string;\n}\n\nlet handlerResult: HandlerResult = {};\n\nconst handler = (flags: TreeFlags, flag: FlagDefinition, value?: string) => {\n if (flag.short === \"a\") flags.all = true;\n if (flag.short === \"d\") flags.directoriesOnly = true;\n if (flag.short === \"L\" && value) {\n const depth = parseInt(value, 10);\n if (isNaN(depth) || !/^\\d+$/.test(value)) {\n handlerResult.error = `tree: -L option requires a numeric argument\\nusage: ${spec.usage}\\n`;\n } else {\n flags.maxDepth = depth;\n }\n }\n};\n\nconst parser = createFlagParser(spec, defaults, handler);\n\nexport const tree: Command = async (ctx) => {\n // Reset handler result for each invocation\n handlerResult = {};\n\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 if (handlerResult.error) {\n await ctx.stderr.writeText(handlerResult.error);\n return 1;\n }\n\n const { all: showAll, directoriesOnly, maxDepth } = result.flags;\n const targetPath = result.args[0] ?? \".\";\n\n // Validate maxDepth\n if (maxDepth < 1) {\n await ctx.stderr.writeText(\"tree: Invalid level, must be greater than 0\\n\");\n return 1;\n }\n\n const resolvedPath = ctx.fs.resolve(ctx.cwd, targetPath);\n\n // Check if path exists\n let stat;\n try {\n stat = await ctx.fs.stat(resolvedPath);\n } catch {\n await ctx.stderr.writeText(`tree: ${targetPath}: No such file or directory\\n`);\n return 1;\n }\n\n // If it's a file, just print the filename\n if (stat.isFile()) {\n await ctx.stdout.writeText(targetPath + \"\\n\\n0 directories, 1 file\\n\");\n return 0;\n }\n\n let dirCount = 0;\n let fileCount = 0;\n\n // Print root\n await ctx.stdout.writeText(targetPath + \"\\n\");\n\n // Recursive function to build tree\n async function printTree(path: string, prefix: string, depth: number): Promise<void> {\n if (depth > maxDepth) return;\n\n let entries = await ctx.fs.readdir(path);\n\n // Filter hidden files unless -a\n if (!showAll) {\n entries = entries.filter((e) => !e.startsWith(\".\"));\n }\n\n // Sort entries\n entries.sort();\n\n // Separate dirs and files, dirs first\n const dirEntries: string[] = [];\n const fileEntries: string[] = [];\n\n for (const entry of entries) {\n const entryPath = ctx.fs.resolve(path, entry);\n try {\n const entryStat = await ctx.fs.stat(entryPath);\n if (entryStat.isDirectory()) {\n dirEntries.push(entry);\n } else {\n fileEntries.push(entry);\n }\n } catch {\n // Skip entries we can't stat\n }\n }\n\n // Combine: directories first, then files (unless directoriesOnly)\n const sortedEntries = directoriesOnly\n ? dirEntries\n : [...dirEntries, ...fileEntries];\n\n for (let i = 0; i < sortedEntries.length; i++) {\n const entry = sortedEntries[i]!;\n const isLast = i === sortedEntries.length - 1;\n const connector = isLast ? \"└── \" : \"├── \";\n const entryPath = ctx.fs.resolve(path, entry);\n\n let isDir = false;\n try {\n const entryStat = await ctx.fs.stat(entryPath);\n isDir = entryStat.isDirectory();\n } catch {\n continue;\n }\n\n await ctx.stdout.writeText(prefix + connector + entry + \"\\n\");\n\n if (isDir) {\n dirCount++;\n if (depth < maxDepth) {\n const newPrefix = prefix + (isLast ? \" \" : \"│ \");\n await printTree(entryPath, newPrefix, depth + 1);\n }\n } else {\n fileCount++;\n }\n }\n }\n\n await printTree(resolvedPath, \"\", 1);\n\n // Print summary\n const dirWord = dirCount === 1 ? \"directory\" : \"directories\";\n const fileWord = fileCount === 1 ? \"file\" : \"files\";\n await ctx.stdout.writeText(`\\n${dirCount} ${dirWord}, ${fileCount} ${fileWord}\\n`);\n\n return 0;\n};\n"
|
|
6
6
|
],
|
|
7
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
8
|
-
"debugId": "
|
|
7
|
+
"mappings": "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",
|
|
8
|
+
"debugId": "395AE290EA1D094564756E2164756E21",
|
|
9
9
|
"names": []
|
|
10
10
|
}
|