shell-dsl 0.0.9 → 0.0.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (89) hide show
  1. package/dist/cjs/package.json +1 -1
  2. package/dist/cjs/src/commands/awk/awk.cjs +79 -32
  3. package/dist/cjs/src/commands/awk/awk.cjs.map +3 -3
  4. package/dist/cjs/src/commands/cat/cat.cjs +16 -3
  5. package/dist/cjs/src/commands/cat/cat.cjs.map +3 -3
  6. package/dist/cjs/src/commands/cp/cp.cjs +26 -20
  7. package/dist/cjs/src/commands/cp/cp.cjs.map +3 -3
  8. package/dist/cjs/src/commands/echo/echo.cjs +22 -7
  9. package/dist/cjs/src/commands/echo/echo.cjs.map +3 -3
  10. package/dist/cjs/src/commands/grep/grep.cjs +126 -140
  11. package/dist/cjs/src/commands/grep/grep.cjs.map +3 -3
  12. package/dist/cjs/src/commands/head/head.cjs +29 -14
  13. package/dist/cjs/src/commands/head/head.cjs.map +3 -3
  14. package/dist/cjs/src/commands/ls/ls.cjs +27 -27
  15. package/dist/cjs/src/commands/ls/ls.cjs.map +3 -3
  16. package/dist/cjs/src/commands/mkdir/mkdir.cjs +21 -10
  17. package/dist/cjs/src/commands/mkdir/mkdir.cjs.map +3 -3
  18. package/dist/cjs/src/commands/mv/mv.cjs +22 -15
  19. package/dist/cjs/src/commands/mv/mv.cjs.map +3 -3
  20. package/dist/cjs/src/commands/pwd/pwd.cjs +13 -1
  21. package/dist/cjs/src/commands/pwd/pwd.cjs.map +3 -3
  22. package/dist/cjs/src/commands/rm/rm.cjs +25 -22
  23. package/dist/cjs/src/commands/rm/rm.cjs.map +3 -3
  24. package/dist/cjs/src/commands/sed/sed.cjs +87 -25
  25. package/dist/cjs/src/commands/sed/sed.cjs.map +3 -3
  26. package/dist/cjs/src/commands/sort/sort.cjs +27 -24
  27. package/dist/cjs/src/commands/sort/sort.cjs.map +3 -3
  28. package/dist/cjs/src/commands/tail/tail.cjs +29 -14
  29. package/dist/cjs/src/commands/tail/tail.cjs.map +3 -3
  30. package/dist/cjs/src/commands/tee/tee.cjs +21 -10
  31. package/dist/cjs/src/commands/tee/tee.cjs.map +3 -3
  32. package/dist/cjs/src/commands/touch/touch.cjs +21 -10
  33. package/dist/cjs/src/commands/touch/touch.cjs.map +3 -3
  34. package/dist/cjs/src/commands/tree/tree.cjs +45 -48
  35. package/dist/cjs/src/commands/tree/tree.cjs.map +3 -3
  36. package/dist/cjs/src/commands/uniq/uniq.cjs +27 -24
  37. package/dist/cjs/src/commands/uniq/uniq.cjs.map +3 -3
  38. package/dist/cjs/src/commands/wc/wc.cjs +28 -24
  39. package/dist/cjs/src/commands/wc/wc.cjs.map +3 -3
  40. package/dist/cjs/src/utils/flag-parser.cjs +162 -0
  41. package/dist/cjs/src/utils/flag-parser.cjs.map +10 -0
  42. package/dist/cjs/src/utils/index.cjs +4 -2
  43. package/dist/cjs/src/utils/index.cjs.map +3 -3
  44. package/dist/mjs/package.json +1 -1
  45. package/dist/mjs/src/commands/awk/awk.mjs +79 -32
  46. package/dist/mjs/src/commands/awk/awk.mjs.map +3 -3
  47. package/dist/mjs/src/commands/cat/cat.mjs +16 -3
  48. package/dist/mjs/src/commands/cat/cat.mjs.map +3 -3
  49. package/dist/mjs/src/commands/cp/cp.mjs +26 -20
  50. package/dist/mjs/src/commands/cp/cp.mjs.map +3 -3
  51. package/dist/mjs/src/commands/echo/echo.mjs +22 -7
  52. package/dist/mjs/src/commands/echo/echo.mjs.map +3 -3
  53. package/dist/mjs/src/commands/grep/grep.mjs +126 -140
  54. package/dist/mjs/src/commands/grep/grep.mjs.map +3 -3
  55. package/dist/mjs/src/commands/head/head.mjs +29 -14
  56. package/dist/mjs/src/commands/head/head.mjs.map +3 -3
  57. package/dist/mjs/src/commands/ls/ls.mjs +27 -27
  58. package/dist/mjs/src/commands/ls/ls.mjs.map +3 -3
  59. package/dist/mjs/src/commands/mkdir/mkdir.mjs +21 -10
  60. package/dist/mjs/src/commands/mkdir/mkdir.mjs.map +3 -3
  61. package/dist/mjs/src/commands/mv/mv.mjs +22 -15
  62. package/dist/mjs/src/commands/mv/mv.mjs.map +3 -3
  63. package/dist/mjs/src/commands/pwd/pwd.mjs +13 -1
  64. package/dist/mjs/src/commands/pwd/pwd.mjs.map +3 -3
  65. package/dist/mjs/src/commands/rm/rm.mjs +25 -22
  66. package/dist/mjs/src/commands/rm/rm.mjs.map +3 -3
  67. package/dist/mjs/src/commands/sed/sed.mjs +87 -25
  68. package/dist/mjs/src/commands/sed/sed.mjs.map +3 -3
  69. package/dist/mjs/src/commands/sort/sort.mjs +27 -24
  70. package/dist/mjs/src/commands/sort/sort.mjs.map +3 -3
  71. package/dist/mjs/src/commands/tail/tail.mjs +29 -14
  72. package/dist/mjs/src/commands/tail/tail.mjs.map +3 -3
  73. package/dist/mjs/src/commands/tee/tee.mjs +21 -10
  74. package/dist/mjs/src/commands/tee/tee.mjs.map +3 -3
  75. package/dist/mjs/src/commands/touch/touch.mjs +21 -10
  76. package/dist/mjs/src/commands/touch/touch.mjs.map +3 -3
  77. package/dist/mjs/src/commands/tree/tree.mjs +45 -48
  78. package/dist/mjs/src/commands/tree/tree.mjs.map +3 -3
  79. package/dist/mjs/src/commands/uniq/uniq.mjs +27 -24
  80. package/dist/mjs/src/commands/uniq/uniq.mjs.map +3 -3
  81. package/dist/mjs/src/commands/wc/wc.mjs +28 -24
  82. package/dist/mjs/src/commands/wc/wc.mjs.map +3 -3
  83. package/dist/mjs/src/utils/flag-parser.mjs +132 -0
  84. package/dist/mjs/src/utils/flag-parser.mjs.map +10 -0
  85. package/dist/mjs/src/utils/index.mjs +6 -2
  86. package/dist/mjs/src/utils/index.mjs.map +3 -3
  87. package/dist/types/src/utils/flag-parser.d.ts +36 -0
  88. package/dist/types/src/utils/index.d.ts +1 -0
  89. package/package.json +1 -1
@@ -2,9 +2,9 @@
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/commands/ls/ls.ts"],
4
4
  "sourcesContent": [
5
- "import type { Command } from \"../../types.cjs\";\n\nexport const ls: Command = async (ctx) => {\n let showAll = false;\n let longFormat = false;\n let onePerLine = false;\n const paths: string[] = [];\n\n // Parse arguments\n for (const arg of ctx.args) {\n if (arg === \"-a\" || arg === \"--all\") {\n showAll = true;\n } else if (arg === \"-l\") {\n longFormat = true;\n } else if (arg === \"-1\") {\n onePerLine = true;\n } else if (arg.startsWith(\"-\")) {\n for (const flag of arg.slice(1)) {\n if (flag === \"a\") showAll = true;\n else if (flag === \"l\") longFormat = true;\n else if (flag === \"1\") onePerLine = true;\n }\n } else {\n paths.push(arg);\n }\n }\n\n if (paths.length === 0) {\n paths.push(\".\");\n }\n\n for (let i = 0; i < paths.length; i++) {\n const pathArg = paths[i]!;\n const path = ctx.fs.resolve(ctx.cwd, pathArg);\n\n try {\n const stat = await ctx.fs.stat(path);\n\n if (stat.isFile()) {\n // It's a file, just print the name\n await ctx.stdout.writeText(ctx.fs.basename(path) + \"\\n\");\n continue;\n }\n\n // It's a directory\n if (paths.length > 1) {\n if (i > 0) await ctx.stdout.writeText(\"\\n\");\n await ctx.stdout.writeText(`${pathArg}:\\n`);\n }\n\n let entries = await ctx.fs.readdir(path);\n\n if (!showAll) {\n entries = entries.filter((e) => !e.startsWith(\".\"));\n }\n\n entries.sort();\n\n if (longFormat) {\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 const type = entryStat.isDirectory() ? \"d\" : \"-\";\n const perms = \"rwxr-xr-x\"; // Simplified permissions\n const size = String(entryStat.size).padStart(8);\n const date = entryStat.mtime.toISOString().slice(0, 10);\n await ctx.stdout.writeText(`${type}${perms} ${size} ${date} ${entry}\\n`);\n } catch {\n await ctx.stdout.writeText(`?????????? ${entry}\\n`);\n }\n }\n } else if (onePerLine) {\n for (const entry of entries) {\n await ctx.stdout.writeText(entry + \"\\n\");\n }\n } else {\n // Default: space-separated\n await ctx.stdout.writeText(entries.join(\" \") + \"\\n\");\n }\n } catch (err) {\n await ctx.stderr.writeText(`ls: cannot access '${pathArg}': No such file or directory\\n`);\n return 1;\n }\n }\n\n return 0;\n};\n"
5
+ "import type { Command } from \"../../types.cjs\";\nimport { createFlagParser, type FlagDefinition } from \"../../utils/flag-parser.cjs\";\n\ninterface LsFlags {\n all: boolean;\n long: boolean;\n onePerLine: boolean;\n}\n\nconst spec = {\n name: \"ls\",\n flags: [\n { short: \"a\", long: \"all\" },\n { short: \"l\" },\n { short: \"1\" },\n ] as FlagDefinition[],\n usage: \"ls [-al1] [file ...]\",\n};\n\nconst defaults: LsFlags = { all: false, long: false, onePerLine: false };\n\nconst handler = (flags: LsFlags, flag: FlagDefinition) => {\n if (flag.short === \"a\") flags.all = true;\n if (flag.short === \"l\") flags.long = true;\n if (flag.short === \"1\") flags.onePerLine = true;\n};\n\nconst parser = createFlagParser(spec, defaults, handler);\n\nexport const ls: 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 { all: showAll, long: longFormat, onePerLine } = result.flags;\n const paths = result.args.length === 0 ? [\".\"] : result.args;\n\n for (let i = 0; i < paths.length; i++) {\n const pathArg = paths[i]!;\n const path = ctx.fs.resolve(ctx.cwd, pathArg);\n\n try {\n const stat = await ctx.fs.stat(path);\n\n if (stat.isFile()) {\n // It's a file, just print the name\n await ctx.stdout.writeText(ctx.fs.basename(path) + \"\\n\");\n continue;\n }\n\n // It's a directory\n if (paths.length > 1) {\n if (i > 0) await ctx.stdout.writeText(\"\\n\");\n await ctx.stdout.writeText(`${pathArg}:\\n`);\n }\n\n let entries = await ctx.fs.readdir(path);\n\n if (!showAll) {\n entries = entries.filter((e) => !e.startsWith(\".\"));\n }\n\n entries.sort();\n\n if (longFormat) {\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 const type = entryStat.isDirectory() ? \"d\" : \"-\";\n const perms = \"rwxr-xr-x\"; // Simplified permissions\n const size = String(entryStat.size).padStart(8);\n const date = entryStat.mtime.toISOString().slice(0, 10);\n await ctx.stdout.writeText(`${type}${perms} ${size} ${date} ${entry}\\n`);\n } catch {\n await ctx.stdout.writeText(`?????????? ${entry}\\n`);\n }\n }\n } else if (onePerLine) {\n for (const entry of entries) {\n await ctx.stdout.writeText(entry + \"\\n\");\n }\n } else {\n // Default: space-separated\n await ctx.stdout.writeText(entries.join(\" \") + \"\\n\");\n }\n } catch (err) {\n await ctx.stderr.writeText(`ls: cannot access '${pathArg}': No such file or directory\\n`);\n return 1;\n }\n }\n\n return 0;\n};\n"
6
6
  ],
7
- "mappings": "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",
8
- "debugId": "89B66624CF96A45064756E2164756E21",
7
+ "mappings": "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",
8
+ "debugId": "4890CAC52EAF1A2264756E2164756E21",
9
9
  "names": []
10
10
  }
@@ -32,16 +32,27 @@ __export(exports_mkdir, {
32
32
  mkdir: () => mkdir
33
33
  });
34
34
  module.exports = __toCommonJS(exports_mkdir);
35
+ var import_flag_parser = require("../../utils/flag-parser.cjs");
36
+ var spec = {
37
+ name: "mkdir",
38
+ flags: [
39
+ { short: "p", long: "parents" }
40
+ ],
41
+ usage: "mkdir [-p] directory ..."
42
+ };
43
+ var defaults = { parents: false };
44
+ var handler = (flags, flag) => {
45
+ if (flag.short === "p")
46
+ flags.parents = true;
47
+ };
48
+ var parser = import_flag_parser.createFlagParser(spec, defaults, handler);
35
49
  var mkdir = async (ctx) => {
36
- let parents = false;
37
- const dirs = [];
38
- for (const arg of ctx.args) {
39
- if (arg === "-p" || arg === "--parents") {
40
- parents = true;
41
- } else if (!arg.startsWith("-")) {
42
- dirs.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 dirs = result.args;
45
56
  if (dirs.length === 0) {
46
57
  await ctx.stderr.writeText(`mkdir: missing operand
47
58
  `);
@@ -50,7 +61,7 @@ var mkdir = async (ctx) => {
50
61
  for (const dir of dirs) {
51
62
  const path = ctx.fs.resolve(ctx.cwd, dir);
52
63
  try {
53
- await ctx.fs.mkdir(path, { recursive: parents });
64
+ await ctx.fs.mkdir(path, { recursive: result.flags.parents });
54
65
  } catch (err) {
55
66
  const message = err instanceof Error ? err.message : String(err);
56
67
  await ctx.stderr.writeText(`mkdir: cannot create directory '${dir}': ${message}
@@ -61,4 +72,4 @@ var mkdir = async (ctx) => {
61
72
  return 0;
62
73
  };
63
74
 
64
- //# debugId=2AD69A2DF49B79D164756E2164756E21
75
+ //# debugId=20ED31C829967E7364756E2164756E21
@@ -2,9 +2,9 @@
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/commands/mkdir/mkdir.ts"],
4
4
  "sourcesContent": [
5
- "import type { Command } from \"../../types.cjs\";\n\nexport const mkdir: Command = async (ctx) => {\n let parents = false;\n const dirs: string[] = [];\n\n for (const arg of ctx.args) {\n if (arg === \"-p\" || arg === \"--parents\") {\n parents = true;\n } else if (!arg.startsWith(\"-\")) {\n dirs.push(arg);\n }\n }\n\n if (dirs.length === 0) {\n await ctx.stderr.writeText(\"mkdir: missing operand\\n\");\n return 1;\n }\n\n for (const dir of dirs) {\n const path = ctx.fs.resolve(ctx.cwd, dir);\n try {\n await ctx.fs.mkdir(path, { recursive: parents });\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n await ctx.stderr.writeText(`mkdir: cannot create directory '${dir}': ${message}\\n`);\n return 1;\n }\n }\n\n return 0;\n};\n"
5
+ "import type { Command } from \"../../types.cjs\";\nimport { createFlagParser, type FlagDefinition } from \"../../utils/flag-parser.cjs\";\n\ninterface MkdirFlags {\n parents: boolean;\n}\n\nconst spec = {\n name: \"mkdir\",\n flags: [\n { short: \"p\", long: \"parents\" },\n ] as FlagDefinition[],\n usage: \"mkdir [-p] directory ...\",\n};\n\nconst defaults: MkdirFlags = { parents: false };\n\nconst handler = (flags: MkdirFlags, flag: FlagDefinition) => {\n if (flag.short === \"p\") flags.parents = true;\n};\n\nconst parser = createFlagParser(spec, defaults, handler);\n\nexport const mkdir: 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 dirs = result.args;\n\n if (dirs.length === 0) {\n await ctx.stderr.writeText(\"mkdir: missing operand\\n\");\n return 1;\n }\n\n for (const dir of dirs) {\n const path = ctx.fs.resolve(ctx.cwd, dir);\n try {\n await ctx.fs.mkdir(path, { recursive: result.flags.parents });\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n await ctx.stderr.writeText(`mkdir: cannot create directory '${dir}': ${message}\\n`);\n return 1;\n }\n }\n\n return 0;\n};\n"
6
6
  ],
7
- "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEO,IAAM,QAAiB,OAAO,QAAQ;AAAA,EAC3C,IAAI,UAAU;AAAA,EACd,MAAM,OAAiB,CAAC;AAAA,EAExB,WAAW,OAAO,IAAI,MAAM;AAAA,IAC1B,IAAI,QAAQ,QAAQ,QAAQ,aAAa;AAAA,MACvC,UAAU;AAAA,IACZ,EAAO,SAAI,CAAC,IAAI,WAAW,GAAG,GAAG;AAAA,MAC/B,KAAK,KAAK,GAAG;AAAA,IACf;AAAA,EACF;AAAA,EAEA,IAAI,KAAK,WAAW,GAAG;AAAA,IACrB,MAAM,IAAI,OAAO,UAAU;AAAA,CAA0B;AAAA,IACrD,OAAO;AAAA,EACT;AAAA,EAEA,WAAW,OAAO,MAAM;AAAA,IACtB,MAAM,OAAO,IAAI,GAAG,QAAQ,IAAI,KAAK,GAAG;AAAA,IACxC,IAAI;AAAA,MACF,MAAM,IAAI,GAAG,MAAM,MAAM,EAAE,WAAW,QAAQ,CAAC;AAAA,MAC/C,OAAO,KAAK;AAAA,MACZ,MAAM,UAAU,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAAA,MAC/D,MAAM,IAAI,OAAO,UAAU,mCAAmC,SAAS;AAAA,CAAW;AAAA,MAClF,OAAO;AAAA;AAAA,EAEX;AAAA,EAEA,OAAO;AAAA;",
8
- "debugId": "2AD69A2DF49B79D164756E2164756E21",
7
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACsD,IAAtD;AAMA,IAAM,OAAO;AAAA,EACX,MAAM;AAAA,EACN,OAAO;AAAA,IACL,EAAE,OAAO,KAAK,MAAM,UAAU;AAAA,EAChC;AAAA,EACA,OAAO;AACT;AAEA,IAAM,WAAuB,EAAE,SAAS,MAAM;AAE9C,IAAM,UAAU,CAAC,OAAmB,SAAyB;AAAA,EAC3D,IAAI,KAAK,UAAU;AAAA,IAAK,MAAM,UAAU;AAAA;AAG1C,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,OAAO,OAAO;AAAA,EAEpB,IAAI,KAAK,WAAW,GAAG;AAAA,IACrB,MAAM,IAAI,OAAO,UAAU;AAAA,CAA0B;AAAA,IACrD,OAAO;AAAA,EACT;AAAA,EAEA,WAAW,OAAO,MAAM;AAAA,IACtB,MAAM,OAAO,IAAI,GAAG,QAAQ,IAAI,KAAK,GAAG;AAAA,IACxC,IAAI;AAAA,MACF,MAAM,IAAI,GAAG,MAAM,MAAM,EAAE,WAAW,OAAO,MAAM,QAAQ,CAAC;AAAA,MAC5D,OAAO,KAAK;AAAA,MACZ,MAAM,UAAU,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAAA,MAC/D,MAAM,IAAI,OAAO,UAAU,mCAAmC,SAAS;AAAA,CAAW;AAAA,MAClF,OAAO;AAAA;AAAA,EAEX;AAAA,EAEA,OAAO;AAAA;",
8
+ "debugId": "20ED31C829967E7364756E2164756E21",
9
9
  "names": []
10
10
  }
@@ -32,22 +32,29 @@ __export(exports_mv, {
32
32
  mv: () => mv
33
33
  });
34
34
  module.exports = __toCommonJS(exports_mv);
35
+ var import_flag_parser = require("../../utils/flag-parser.cjs");
36
+ var spec = {
37
+ name: "mv",
38
+ flags: [
39
+ { short: "n", long: "no-clobber" },
40
+ { short: "f", long: "force" }
41
+ ],
42
+ usage: "mv [-nf] source ... dest"
43
+ };
44
+ var defaults = { noClobber: false };
45
+ var handler = (flags, flag) => {
46
+ if (flag.short === "n")
47
+ flags.noClobber = true;
48
+ };
49
+ var parser = import_flag_parser.createFlagParser(spec, defaults, handler);
35
50
  var mv = async (ctx) => {
36
- let noClobber = false;
37
- const paths = [];
38
- for (const arg of ctx.args) {
39
- if (arg === "-n" || arg === "--no-clobber") {
40
- noClobber = true;
41
- } else if (arg === "-f" || arg === "--force") {} else if (arg.startsWith("-")) {
42
- for (const flag of arg.slice(1)) {
43
- if (flag === "n")
44
- noClobber = true;
45
- else if (flag === "f") {}
46
- }
47
- } else {
48
- paths.push(arg);
49
- }
51
+ const result = parser.parse(ctx.args);
52
+ if (result.error) {
53
+ await parser.writeError(result.error, ctx.stderr);
54
+ return 1;
50
55
  }
56
+ const { noClobber } = result.flags;
57
+ const paths = result.args;
51
58
  if (paths.length < 2) {
52
59
  await ctx.stderr.writeText(`mv: missing destination file operand
53
60
  `);
@@ -115,4 +122,4 @@ async function moveDirectory(ctx, src, dest, noClobber) {
115
122
  await ctx.fs.rm(src, { recursive: true });
116
123
  }
117
124
 
118
- //# debugId=0192C128C538B0F564756E2164756E21
125
+ //# debugId=8A90C10112D65AC464756E2164756E21
@@ -2,9 +2,9 @@
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/commands/mv/mv.ts"],
4
4
  "sourcesContent": [
5
- "import type { Command } from \"../../types.cjs\";\n\nexport const mv: Command = async (ctx) => {\n let noClobber = false;\n const paths: string[] = [];\n\n for (const arg of ctx.args) {\n if (arg === \"-n\" || arg === \"--no-clobber\") {\n noClobber = true;\n } else if (arg === \"-f\" || arg === \"--force\") {\n // Force is default behavior, just accept the flag\n } else if (arg.startsWith(\"-\")) {\n // Parse combined flags\n for (const flag of arg.slice(1)) {\n if (flag === \"n\") noClobber = true;\n else if (flag === \"f\") { /* force is default */ }\n }\n } else {\n paths.push(arg);\n }\n }\n\n if (paths.length < 2) {\n await ctx.stderr.writeText(\"mv: missing destination file operand\\n\");\n return 1;\n }\n\n const sources = paths.slice(0, -1);\n const dest = paths[paths.length - 1]!;\n const destPath = ctx.fs.resolve(ctx.cwd, dest);\n\n // Check if destination is a directory\n let destIsDir = false;\n try {\n const stat = await ctx.fs.stat(destPath);\n destIsDir = stat.isDirectory();\n } catch {\n // Destination doesn't exist\n }\n\n // If multiple sources, dest must be a directory\n if (sources.length > 1 && !destIsDir) {\n await ctx.stderr.writeText(`mv: target '${dest}' is not a directory\\n`);\n return 1;\n }\n\n for (const source of sources) {\n const srcPath = ctx.fs.resolve(ctx.cwd, source);\n\n try {\n // Check source exists\n await ctx.fs.stat(srcPath);\n\n // Determine final destination path\n const finalDest = destIsDir\n ? ctx.fs.resolve(destPath, ctx.fs.basename(srcPath))\n : destPath;\n\n // Check if dest exists and noClobber\n if (noClobber) {\n const exists = await ctx.fs.exists(finalDest);\n if (exists) continue; // Skip silently\n }\n\n // Move: copy then delete\n const srcStat = await ctx.fs.stat(srcPath);\n if (srcStat.isDirectory()) {\n await moveDirectory(ctx, srcPath, finalDest, noClobber);\n } else {\n const content = await ctx.fs.readFile(srcPath);\n await ctx.fs.writeFile(finalDest, content);\n await ctx.fs.rm(srcPath);\n }\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n await ctx.stderr.writeText(`mv: cannot stat '${source}': ${message}\\n`);\n return 1;\n }\n }\n\n return 0;\n};\n\nasync function moveDirectory(\n ctx: Parameters<Command>[0],\n src: string,\n dest: string,\n noClobber: boolean\n): Promise<void> {\n // Create destination directory\n await ctx.fs.mkdir(dest, { recursive: true });\n\n // Read source directory contents\n const entries = await ctx.fs.readdir(src);\n\n for (const entry of entries) {\n const srcPath = ctx.fs.resolve(src, entry);\n const destPath = ctx.fs.resolve(dest, entry);\n\n const stat = await ctx.fs.stat(srcPath);\n\n if (stat.isDirectory()) {\n await moveDirectory(ctx, srcPath, destPath, noClobber);\n } else {\n if (noClobber) {\n const exists = await ctx.fs.exists(destPath);\n if (exists) continue;\n }\n const content = await ctx.fs.readFile(srcPath);\n await ctx.fs.writeFile(destPath, content);\n }\n }\n\n // Remove source directory after copying\n await ctx.fs.rm(src, { recursive: true });\n}\n"
5
+ "import type { Command } from \"../../types.cjs\";\nimport { createFlagParser, type FlagDefinition } from \"../../utils/flag-parser.cjs\";\n\ninterface MvFlags {\n noClobber: boolean;\n}\n\nconst spec = {\n name: \"mv\",\n flags: [\n { short: \"n\", long: \"no-clobber\" },\n { short: \"f\", long: \"force\" },\n ] as FlagDefinition[],\n usage: \"mv [-nf] source ... dest\",\n};\n\nconst defaults: MvFlags = { noClobber: false };\n\nconst handler = (flags: MvFlags, flag: FlagDefinition) => {\n if (flag.short === \"n\") flags.noClobber = true;\n // -f is default behavior, so we don't need to do anything\n};\n\nconst parser = createFlagParser(spec, defaults, handler);\n\nexport const mv: 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 { noClobber } = result.flags;\n const paths = result.args;\n\n if (paths.length < 2) {\n await ctx.stderr.writeText(\"mv: missing destination file operand\\n\");\n return 1;\n }\n\n const sources = paths.slice(0, -1);\n const dest = paths[paths.length - 1]!;\n const destPath = ctx.fs.resolve(ctx.cwd, dest);\n\n // Check if destination is a directory\n let destIsDir = false;\n try {\n const stat = await ctx.fs.stat(destPath);\n destIsDir = stat.isDirectory();\n } catch {\n // Destination doesn't exist\n }\n\n // If multiple sources, dest must be a directory\n if (sources.length > 1 && !destIsDir) {\n await ctx.stderr.writeText(`mv: target '${dest}' is not a directory\\n`);\n return 1;\n }\n\n for (const source of sources) {\n const srcPath = ctx.fs.resolve(ctx.cwd, source);\n\n try {\n // Check source exists\n await ctx.fs.stat(srcPath);\n\n // Determine final destination path\n const finalDest = destIsDir\n ? ctx.fs.resolve(destPath, ctx.fs.basename(srcPath))\n : destPath;\n\n // Check if dest exists and noClobber\n if (noClobber) {\n const exists = await ctx.fs.exists(finalDest);\n if (exists) continue; // Skip silently\n }\n\n // Move: copy then delete\n const srcStat = await ctx.fs.stat(srcPath);\n if (srcStat.isDirectory()) {\n await moveDirectory(ctx, srcPath, finalDest, noClobber);\n } else {\n const content = await ctx.fs.readFile(srcPath);\n await ctx.fs.writeFile(finalDest, content);\n await ctx.fs.rm(srcPath);\n }\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n await ctx.stderr.writeText(`mv: cannot stat '${source}': ${message}\\n`);\n return 1;\n }\n }\n\n return 0;\n};\n\nasync function moveDirectory(\n ctx: Parameters<Command>[0],\n src: string,\n dest: string,\n noClobber: boolean\n): Promise<void> {\n // Create destination directory\n await ctx.fs.mkdir(dest, { recursive: true });\n\n // Read source directory contents\n const entries = await ctx.fs.readdir(src);\n\n for (const entry of entries) {\n const srcPath = ctx.fs.resolve(src, entry);\n const destPath = ctx.fs.resolve(dest, entry);\n\n const stat = await ctx.fs.stat(srcPath);\n\n if (stat.isDirectory()) {\n await moveDirectory(ctx, srcPath, destPath, noClobber);\n } else {\n if (noClobber) {\n const exists = await ctx.fs.exists(destPath);\n if (exists) continue;\n }\n const content = await ctx.fs.readFile(srcPath);\n await ctx.fs.writeFile(destPath, content);\n }\n }\n\n // Remove source directory after copying\n await ctx.fs.rm(src, { recursive: true });\n}\n"
6
6
  ],
7
- "mappings": "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",
8
- "debugId": "0192C128C538B0F564756E2164756E21",
7
+ "mappings": "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",
8
+ "debugId": "8A90C10112D65AC464756E2164756E21",
9
9
  "names": []
10
10
  }
@@ -32,10 +32,22 @@ __export(exports_pwd, {
32
32
  pwd: () => pwd
33
33
  });
34
34
  module.exports = __toCommonJS(exports_pwd);
35
+ var import_flag_parser = require("../../utils/flag-parser.cjs");
36
+ var spec = {
37
+ name: "pwd",
38
+ flags: [],
39
+ usage: "pwd"
40
+ };
41
+ var parser = import_flag_parser.createFlagParser(spec, {}, () => {});
35
42
  var pwd = async (ctx) => {
43
+ const result = parser.parse(ctx.args);
44
+ if (result.error) {
45
+ await parser.writeError(result.error, ctx.stderr);
46
+ return 1;
47
+ }
36
48
  await ctx.stdout.writeText(ctx.cwd + `
37
49
  `);
38
50
  return 0;
39
51
  };
40
52
 
41
- //# debugId=6FDDD73F29F478B464756E2164756E21
53
+ //# debugId=E85D963E473EBB6F64756E2164756E21
@@ -2,9 +2,9 @@
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/commands/pwd/pwd.ts"],
4
4
  "sourcesContent": [
5
- "import type { Command } from \"../../types.cjs\";\n\nexport const pwd: Command = async (ctx) => {\n await ctx.stdout.writeText(ctx.cwd + \"\\n\");\n return 0;\n};\n"
5
+ "import type { Command } from \"../../types.cjs\";\nimport { createFlagParser, type FlagDefinition } from \"../../utils/flag-parser.cjs\";\n\nconst spec = {\n name: \"pwd\",\n flags: [] as FlagDefinition[],\n usage: \"pwd\",\n};\n\nconst parser = createFlagParser(spec, {}, () => {});\n\nexport const pwd: 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 await ctx.stdout.writeText(ctx.cwd + \"\\n\");\n return 0;\n};\n"
6
6
  ],
7
- "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEO,IAAM,MAAe,OAAO,QAAQ;AAAA,EACzC,MAAM,IAAI,OAAO,UAAU,IAAI,MAAM;AAAA,CAAI;AAAA,EACzC,OAAO;AAAA;",
8
- "debugId": "6FDDD73F29F478B464756E2164756E21",
7
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACsD,IAAtD;AAEA,IAAM,OAAO;AAAA,EACX,MAAM;AAAA,EACN,OAAO,CAAC;AAAA,EACR,OAAO;AACT;AAEA,IAAM,SAAS,oCAAiB,MAAM,CAAC,GAAG,MAAM,EAAE;AAE3C,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,IAAI,OAAO,UAAU,IAAI,MAAM;AAAA,CAAI;AAAA,EACzC,OAAO;AAAA;",
8
+ "debugId": "E85D963E473EBB6F64756E2164756E21",
9
9
  "names": []
10
10
  }
@@ -32,29 +32,32 @@ __export(exports_rm, {
32
32
  rm: () => rm
33
33
  });
34
34
  module.exports = __toCommonJS(exports_rm);
35
+ var import_flag_parser = require("../../utils/flag-parser.cjs");
36
+ var spec = {
37
+ name: "rm",
38
+ flags: [
39
+ { short: "r", long: "recursive" },
40
+ { short: "R" },
41
+ { short: "f", long: "force" }
42
+ ],
43
+ usage: "rm [-rf] file ..."
44
+ };
45
+ var defaults = { recursive: false, force: false };
46
+ var handler = (flags, flag) => {
47
+ if (flag.short === "r" || flag.short === "R")
48
+ flags.recursive = true;
49
+ if (flag.short === "f")
50
+ flags.force = true;
51
+ };
52
+ var parser = import_flag_parser.createFlagParser(spec, defaults, handler);
35
53
  var rm = async (ctx) => {
36
- let recursive = false;
37
- let force = false;
38
- const targets = [];
39
- for (const arg of ctx.args) {
40
- if (arg === "-r" || arg === "-R" || arg === "--recursive") {
41
- recursive = true;
42
- } else if (arg === "-f" || arg === "--force") {
43
- force = true;
44
- } else if (arg === "-rf" || arg === "-fr") {
45
- recursive = true;
46
- force = true;
47
- } else if (arg.startsWith("-")) {
48
- for (const flag of arg.slice(1)) {
49
- if (flag === "r" || flag === "R")
50
- recursive = true;
51
- else if (flag === "f")
52
- force = true;
53
- }
54
- } else {
55
- targets.push(arg);
56
- }
54
+ const result = parser.parse(ctx.args);
55
+ if (result.error) {
56
+ await parser.writeError(result.error, ctx.stderr);
57
+ return 1;
57
58
  }
59
+ const { recursive, force } = result.flags;
60
+ const targets = result.args;
58
61
  if (targets.length === 0) {
59
62
  if (!force) {
60
63
  await ctx.stderr.writeText(`rm: missing operand
@@ -79,4 +82,4 @@ var rm = async (ctx) => {
79
82
  return 0;
80
83
  };
81
84
 
82
- //# debugId=886A912A24D7A5C264756E2164756E21
85
+ //# debugId=E8259020AB1AC90264756E2164756E21
@@ -2,9 +2,9 @@
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/commands/rm/rm.ts"],
4
4
  "sourcesContent": [
5
- "import type { Command } from \"../../types.cjs\";\n\nexport const rm: Command = async (ctx) => {\n let recursive = false;\n let force = false;\n const targets: string[] = [];\n\n for (const arg of ctx.args) {\n if (arg === \"-r\" || arg === \"-R\" || arg === \"--recursive\") {\n recursive = true;\n } else if (arg === \"-f\" || arg === \"--force\") {\n force = true;\n } else if (arg === \"-rf\" || arg === \"-fr\") {\n recursive = true;\n force = true;\n } else if (arg.startsWith(\"-\")) {\n for (const flag of arg.slice(1)) {\n if (flag === \"r\" || flag === \"R\") recursive = true;\n else if (flag === \"f\") force = true;\n }\n } else {\n targets.push(arg);\n }\n }\n\n if (targets.length === 0) {\n if (!force) {\n await ctx.stderr.writeText(\"rm: missing operand\\n\");\n return 1;\n }\n return 0;\n }\n\n for (const target of targets) {\n const path = ctx.fs.resolve(ctx.cwd, target);\n try {\n await ctx.fs.rm(path, { recursive, force });\n } catch (err) {\n if (!force) {\n const message = err instanceof Error ? err.message : String(err);\n await ctx.stderr.writeText(`rm: cannot remove '${target}': ${message}\\n`);\n return 1;\n }\n }\n }\n\n return 0;\n};\n"
5
+ "import type { Command } from \"../../types.cjs\";\nimport { createFlagParser, type FlagDefinition } from \"../../utils/flag-parser.cjs\";\n\ninterface RmFlags {\n recursive: boolean;\n force: boolean;\n}\n\nconst spec = {\n name: \"rm\",\n flags: [\n { short: \"r\", long: \"recursive\" },\n { short: \"R\" },\n { short: \"f\", long: \"force\" },\n ] as FlagDefinition[],\n usage: \"rm [-rf] file ...\",\n};\n\nconst defaults: RmFlags = { recursive: false, force: false };\n\nconst handler = (flags: RmFlags, flag: FlagDefinition) => {\n if (flag.short === \"r\" || flag.short === \"R\") flags.recursive = true;\n if (flag.short === \"f\") flags.force = true;\n};\n\nconst parser = createFlagParser(spec, defaults, handler);\n\nexport const rm: 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 { recursive, force } = result.flags;\n const targets = result.args;\n\n if (targets.length === 0) {\n if (!force) {\n await ctx.stderr.writeText(\"rm: missing operand\\n\");\n return 1;\n }\n return 0;\n }\n\n for (const target of targets) {\n const path = ctx.fs.resolve(ctx.cwd, target);\n try {\n await ctx.fs.rm(path, { recursive, force });\n } catch (err) {\n if (!force) {\n const message = err instanceof Error ? err.message : String(err);\n await ctx.stderr.writeText(`rm: cannot remove '${target}': ${message}\\n`);\n return 1;\n }\n }\n }\n\n return 0;\n};\n"
6
6
  ],
7
- "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEO,IAAM,KAAc,OAAO,QAAQ;AAAA,EACxC,IAAI,YAAY;AAAA,EAChB,IAAI,QAAQ;AAAA,EACZ,MAAM,UAAoB,CAAC;AAAA,EAE3B,WAAW,OAAO,IAAI,MAAM;AAAA,IAC1B,IAAI,QAAQ,QAAQ,QAAQ,QAAQ,QAAQ,eAAe;AAAA,MACzD,YAAY;AAAA,IACd,EAAO,SAAI,QAAQ,QAAQ,QAAQ,WAAW;AAAA,MAC5C,QAAQ;AAAA,IACV,EAAO,SAAI,QAAQ,SAAS,QAAQ,OAAO;AAAA,MACzC,YAAY;AAAA,MACZ,QAAQ;AAAA,IACV,EAAO,SAAI,IAAI,WAAW,GAAG,GAAG;AAAA,MAC9B,WAAW,QAAQ,IAAI,MAAM,CAAC,GAAG;AAAA,QAC/B,IAAI,SAAS,OAAO,SAAS;AAAA,UAAK,YAAY;AAAA,QACzC,SAAI,SAAS;AAAA,UAAK,QAAQ;AAAA,MACjC;AAAA,IACF,EAAO;AAAA,MACL,QAAQ,KAAK,GAAG;AAAA;AAAA,EAEpB;AAAA,EAEA,IAAI,QAAQ,WAAW,GAAG;AAAA,IACxB,IAAI,CAAC,OAAO;AAAA,MACV,MAAM,IAAI,OAAO,UAAU;AAAA,CAAuB;AAAA,MAClD,OAAO;AAAA,IACT;AAAA,IACA,OAAO;AAAA,EACT;AAAA,EAEA,WAAW,UAAU,SAAS;AAAA,IAC5B,MAAM,OAAO,IAAI,GAAG,QAAQ,IAAI,KAAK,MAAM;AAAA,IAC3C,IAAI;AAAA,MACF,MAAM,IAAI,GAAG,GAAG,MAAM,EAAE,WAAW,MAAM,CAAC;AAAA,MAC1C,OAAO,KAAK;AAAA,MACZ,IAAI,CAAC,OAAO;AAAA,QACV,MAAM,UAAU,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAAA,QAC/D,MAAM,IAAI,OAAO,UAAU,sBAAsB,YAAY;AAAA,CAAW;AAAA,QACxE,OAAO;AAAA,MACT;AAAA;AAAA,EAEJ;AAAA,EAEA,OAAO;AAAA;",
8
- "debugId": "886A912A24D7A5C264756E2164756E21",
7
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACsD,IAAtD;AAOA,IAAM,OAAO;AAAA,EACX,MAAM;AAAA,EACN,OAAO;AAAA,IACL,EAAE,OAAO,KAAK,MAAM,YAAY;AAAA,IAChC,EAAE,OAAO,IAAI;AAAA,IACb,EAAE,OAAO,KAAK,MAAM,QAAQ;AAAA,EAC9B;AAAA,EACA,OAAO;AACT;AAEA,IAAM,WAAoB,EAAE,WAAW,OAAO,OAAO,MAAM;AAE3D,IAAM,UAAU,CAAC,OAAgB,SAAyB;AAAA,EACxD,IAAI,KAAK,UAAU,OAAO,KAAK,UAAU;AAAA,IAAK,MAAM,YAAY;AAAA,EAChE,IAAI,KAAK,UAAU;AAAA,IAAK,MAAM,QAAQ;AAAA;AAGxC,IAAM,SAAS,oCAAiB,MAAM,UAAU,OAAO;AAEhD,IAAM,KAAc,OAAO,QAAQ;AAAA,EACxC,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,WAAW,UAAU,OAAO;AAAA,EACpC,MAAM,UAAU,OAAO;AAAA,EAEvB,IAAI,QAAQ,WAAW,GAAG;AAAA,IACxB,IAAI,CAAC,OAAO;AAAA,MACV,MAAM,IAAI,OAAO,UAAU;AAAA,CAAuB;AAAA,MAClD,OAAO;AAAA,IACT;AAAA,IACA,OAAO;AAAA,EACT;AAAA,EAEA,WAAW,UAAU,SAAS;AAAA,IAC5B,MAAM,OAAO,IAAI,GAAG,QAAQ,IAAI,KAAK,MAAM;AAAA,IAC3C,IAAI;AAAA,MACF,MAAM,IAAI,GAAG,GAAG,MAAM,EAAE,WAAW,MAAM,CAAC;AAAA,MAC1C,OAAO,KAAK;AAAA,MACZ,IAAI,CAAC,OAAO;AAAA,QACV,MAAM,UAAU,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAAA,QAC/D,MAAM,IAAI,OAAO,UAAU,sBAAsB,YAAY;AAAA,CAAW;AAAA,QACxE,OAAO;AAAA,MACT;AAAA;AAAA,EAEJ;AAAA,EAEA,OAAO;AAAA;",
8
+ "debugId": "E8259020AB1AC90264756E2164756E21",
9
9
  "names": []
10
10
  }
@@ -147,41 +147,99 @@ function parseArgs(args) {
147
147
  let i = 0;
148
148
  while (i < args.length) {
149
149
  const arg = args[i];
150
- if (arg === "-n") {
151
- options.suppressOutput = true;
150
+ if (arg === "--") {
152
151
  i++;
153
- continue;
152
+ while (i < args.length) {
153
+ const remaining = args[i];
154
+ if (options.commands.length === 0) {
155
+ const parts = splitScriptParts(remaining);
156
+ for (const part of parts) {
157
+ const cmd = parseCommand(part);
158
+ if (cmd)
159
+ options.commands.push(cmd);
160
+ }
161
+ } else {
162
+ files.push(remaining);
163
+ }
164
+ i++;
165
+ }
166
+ break;
154
167
  }
155
- if (arg === "-i") {
156
- options.inPlace = true;
157
- i++;
158
- continue;
168
+ if (arg.startsWith("--")) {
169
+ return {
170
+ options,
171
+ files,
172
+ error: { type: "unrecognized_option", option: arg }
173
+ };
159
174
  }
160
- if (arg === "-e" && args[i + 1] !== undefined) {
161
- const cmd = parseCommand(args[i + 1]);
162
- if (cmd) {
163
- options.commands.push(cmd);
175
+ if (arg.startsWith("-") && arg.length > 1) {
176
+ const flagChars = arg.slice(1);
177
+ for (let j = 0;j < flagChars.length; j++) {
178
+ const char = flagChars[j];
179
+ if (char === "n") {
180
+ options.suppressOutput = true;
181
+ } else if (char === "i") {
182
+ options.inPlace = true;
183
+ } else if (char === "e") {
184
+ const restOfArg = flagChars.slice(j + 1);
185
+ let script;
186
+ if (restOfArg.length > 0) {
187
+ script = restOfArg;
188
+ } else if (i + 1 < args.length) {
189
+ script = args[++i];
190
+ } else {
191
+ return {
192
+ options,
193
+ files,
194
+ error: { type: "missing_value", option: "-e" }
195
+ };
196
+ }
197
+ const cmd = parseCommand(script);
198
+ if (cmd)
199
+ options.commands.push(cmd);
200
+ break;
201
+ } else {
202
+ return {
203
+ options,
204
+ files,
205
+ error: { type: "unrecognized_option", option: `-${char}` }
206
+ };
207
+ }
164
208
  }
165
- i += 2;
209
+ i++;
166
210
  continue;
167
211
  }
168
- if (!arg.startsWith("-")) {
169
- if (options.commands.length === 0) {
170
- const parts = splitScriptParts(arg);
171
- for (const part of parts) {
172
- const cmd = parseCommand(part);
173
- if (cmd) {
174
- options.commands.push(cmd);
175
- }
176
- }
177
- } else {
178
- files.push(arg);
212
+ if (options.commands.length === 0) {
213
+ const parts = splitScriptParts(arg);
214
+ for (const part of parts) {
215
+ const cmd = parseCommand(part);
216
+ if (cmd)
217
+ options.commands.push(cmd);
179
218
  }
219
+ } else {
220
+ files.push(arg);
180
221
  }
181
222
  i++;
182
223
  }
183
224
  return { options, files };
184
225
  }
226
+ function formatError(error) {
227
+ let message;
228
+ if (error.type === "unrecognized_option") {
229
+ if (error.option.startsWith("--")) {
230
+ message = `sed: unrecognized option '${error.option}'
231
+ `;
232
+ } else {
233
+ message = `sed: invalid option -- '${error.option.slice(1)}'
234
+ `;
235
+ }
236
+ } else {
237
+ message = `sed: option '${error.option}' requires an argument
238
+ `;
239
+ }
240
+ return message + `usage: sed [-ni] [-e script] script [file ...]
241
+ `;
242
+ }
185
243
  function applySubstitution(line, cmd) {
186
244
  if (!cmd.pattern)
187
245
  return line;
@@ -224,7 +282,11 @@ function processLine(line, commands, suppressOutput) {
224
282
  return { output: currentLine, deleted: false };
225
283
  }
226
284
  var sed = async (ctx) => {
227
- const { options, files } = parseArgs(ctx.args);
285
+ const { options, files, error } = parseArgs(ctx.args);
286
+ if (error) {
287
+ await ctx.stderr.writeText(formatError(error));
288
+ return 1;
289
+ }
228
290
  if (options.commands.length === 0) {
229
291
  await ctx.stderr.writeText(`sed: missing script
230
292
  `);
@@ -292,4 +354,4 @@ var sed = async (ctx) => {
292
354
  return 0;
293
355
  };
294
356
 
295
- //# debugId=C4AEC38FC548256C64756E2164756E21
357
+ //# debugId=9484A386918DB8C764756E2164756E21
@@ -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": "C4AEC38FC548256C64756E2164756E21",
7
+ "mappings": "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",
8
+ "debugId": "9484A386918DB8C764756E2164756E21",
9
9
  "names": []
10
10
  }