shell-dsl 0.0.20 → 0.0.22

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -496,7 +496,7 @@ import { builtinCommands } from "shell-dsl/commands";
496
496
  Or import individually:
497
497
 
498
498
  ```ts
499
- import { echo, cat, grep, wc, cp, mv, touch, tee, tree, find, sed, awk } from "shell-dsl/commands";
499
+ import { echo, cat, grep, wc, cp, mv, touch, tee, tree, find, sed, awk, cut } from "shell-dsl/commands";
500
500
  ```
501
501
 
502
502
  | Command | Description |
@@ -521,6 +521,7 @@ import { echo, cat, grep, wc, cp, mv, touch, tee, tree, find, sed, awk } from "s
521
521
  | `find` | Search for files (`-name`, `-iname`, `-type f\|d`, `-maxdepth`, `-mindepth`) |
522
522
  | `sed` | Stream editor (`s///`, `d`, `p`, `-n`, `-e`) |
523
523
  | `awk` | Pattern scanning (`{print $1}`, `-F`, `NF`, `NR`) |
524
+ | `cut` | Select fields/characters (`-f`, `-d`, `-c`, `-b`, `-s`, `--complement`) |
524
525
  | `test` / `[` | File and string tests (`-f`, `-d`, `-e`, `-z`, `-n`, `=`, `!=`) |
525
526
  | `true` | Exit with code 0 |
526
527
  | `false` | Exit with code 1 |
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "name": "shell-dsl",
3
- "version": "0.0.20",
3
+ "version": "0.0.22",
4
4
  "type": "commonjs"
5
5
  }
@@ -35,10 +35,69 @@ module.exports = __toCommonJS(exports_cat);
35
35
  var import_flag_parser = require("../../utils/flag-parser.cjs");
36
36
  var spec = {
37
37
  name: "cat",
38
- flags: [],
39
- usage: "cat [file ...]"
38
+ flags: [
39
+ { short: "A", long: "show-all" },
40
+ { short: "b", long: "number-nonblank" },
41
+ { short: "E", long: "show-ends" },
42
+ { short: "n", long: "number" },
43
+ { short: "T", long: "show-tabs" },
44
+ { short: "v", long: "show-nonprinting" }
45
+ ],
46
+ usage: "cat [-AbEnTv] [file ...]"
40
47
  };
41
- var parser = import_flag_parser.createFlagParser(spec, {}, () => {});
48
+ var defaultFlags = {
49
+ A: false,
50
+ b: false,
51
+ E: false,
52
+ n: false,
53
+ T: false,
54
+ v: false
55
+ };
56
+ var parser = import_flag_parser.createFlagParser(spec, defaultFlags, (flags, flagDef) => {
57
+ if (flagDef.short) {
58
+ flags[flagDef.short] = true;
59
+ }
60
+ });
61
+ function showNonPrintingChar(charCode) {
62
+ if (charCode === 9) {
63
+ return "\t";
64
+ } else if (charCode === 10) {
65
+ return `
66
+ `;
67
+ } else if (charCode < 32) {
68
+ return "^" + String.fromCharCode(charCode + 64);
69
+ } else if (charCode === 127) {
70
+ return "^?";
71
+ } else if (charCode >= 128 && charCode < 160) {
72
+ return "M-^" + String.fromCharCode(charCode - 128 + 64);
73
+ } else if (charCode >= 160 && charCode < 255) {
74
+ return "M-" + String.fromCharCode(charCode - 128);
75
+ } else if (charCode === 255) {
76
+ return "M-^?";
77
+ }
78
+ return String.fromCharCode(charCode);
79
+ }
80
+ function processLine(line, flags) {
81
+ let result = "";
82
+ for (let i = 0;i < line.length; i++) {
83
+ const char = line[i];
84
+ const charCode = char.charCodeAt(0);
85
+ if (flags.T && charCode === 9) {
86
+ result += "^I";
87
+ } else if (flags.v && (charCode < 32 || charCode >= 127) && charCode !== 9 && charCode !== 10) {
88
+ result += showNonPrintingChar(charCode);
89
+ } else {
90
+ result += char;
91
+ }
92
+ }
93
+ if (flags.E) {
94
+ result += "$";
95
+ }
96
+ return result;
97
+ }
98
+ function formatLineNumber(num) {
99
+ return num.toString().padStart(6, " ") + "\t";
100
+ }
42
101
  var cat = async (ctx) => {
43
102
  const result = parser.parse(ctx.args);
44
103
  if (result.error) {
@@ -46,16 +105,56 @@ var cat = async (ctx) => {
46
105
  return 1;
47
106
  }
48
107
  const files = result.args;
108
+ const flags = { ...result.flags };
109
+ if (flags.A) {
110
+ flags.v = true;
111
+ flags.E = true;
112
+ flags.T = true;
113
+ }
114
+ const needsProcessing = flags.n || flags.b || flags.E || flags.T || flags.v;
115
+ let lineNumber = 1;
116
+ const processContent = async (content) => {
117
+ if (!needsProcessing) {
118
+ await ctx.stdout.write(new Uint8Array(content));
119
+ return;
120
+ }
121
+ const text = Buffer.from(content).toString("utf-8");
122
+ const lines = text.split(`
123
+ `);
124
+ for (let i = 0;i < lines.length; i++) {
125
+ const line = lines[i];
126
+ const isLastLine = i === lines.length - 1;
127
+ const isEmpty = line === "";
128
+ if (isLastLine && isEmpty) {
129
+ continue;
130
+ }
131
+ let output = processLine(line, flags);
132
+ if (flags.b) {
133
+ if (!isEmpty) {
134
+ output = formatLineNumber(lineNumber++) + output;
135
+ }
136
+ } else if (flags.n) {
137
+ output = formatLineNumber(lineNumber++) + output;
138
+ }
139
+ await ctx.stdout.writeText(output + `
140
+ `);
141
+ }
142
+ };
49
143
  if (files.length === 0) {
50
- for await (const chunk of ctx.stdin.stream()) {
51
- await ctx.stdout.write(chunk);
144
+ if (!needsProcessing) {
145
+ for await (const chunk of ctx.stdin.stream()) {
146
+ await ctx.stdout.write(chunk);
147
+ }
148
+ } else {
149
+ const content = await ctx.stdin.buffer();
150
+ await processContent(content);
52
151
  }
53
152
  } else {
54
153
  for (const file of files) {
55
154
  try {
56
155
  const path = ctx.fs.resolve(ctx.cwd, file);
57
156
  const content = await ctx.fs.readFile(path);
58
- await ctx.stdout.write(new Uint8Array(content));
157
+ await processContent(new Uint8Array(content));
59
158
  } catch (err) {
60
159
  const message = err instanceof Error ? err.message : String(err);
61
160
  await ctx.stderr.writeText(`cat: ${file}: ${message}
@@ -67,4 +166,4 @@ var cat = async (ctx) => {
67
166
  return 0;
68
167
  };
69
168
 
70
- //# debugId=7AEDA05FD385954E64756E2164756E21
169
+ //# debugId=51CCC0B7373826B964756E2164756E21
@@ -2,9 +2,9 @@
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/commands/cat/cat.ts"],
4
4
  "sourcesContent": [
5
- "import type { Command } from \"../../types.cjs\";\nimport { createFlagParser, type FlagDefinition } from \"../../utils/flag-parser.cjs\";\n\nconst spec = {\n name: \"cat\",\n flags: [] as FlagDefinition[],\n usage: \"cat [file ...]\",\n};\n\nconst parser = createFlagParser(spec, {}, () => {});\n\nexport const cat: 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 // Read from stdin\n for await (const chunk of ctx.stdin.stream()) {\n await ctx.stdout.write(chunk);\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 ctx.stdout.write(new Uint8Array(content));\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n await ctx.stderr.writeText(`cat: ${file}: ${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 CatFlags {\n A: boolean; // show all (equivalent to -vET)\n b: boolean; // number non-blank lines\n E: boolean; // show $ at end of lines\n n: boolean; // number all lines\n T: boolean; // show tabs as ^I\n v: boolean; // show non-printing characters\n}\n\nconst spec = {\n name: \"cat\",\n flags: [\n { short: \"A\", long: \"show-all\" },\n { short: \"b\", long: \"number-nonblank\" },\n { short: \"E\", long: \"show-ends\" },\n { short: \"n\", long: \"number\" },\n { short: \"T\", long: \"show-tabs\" },\n { short: \"v\", long: \"show-nonprinting\" },\n ] as FlagDefinition[],\n usage: \"cat [-AbEnTv] [file ...]\",\n};\n\nconst defaultFlags: CatFlags = {\n A: false,\n b: false,\n E: false,\n n: false,\n T: false,\n v: false,\n};\n\nconst parser = createFlagParser(spec, defaultFlags, (flags, flagDef) => {\n if (flagDef.short) {\n flags[flagDef.short as keyof CatFlags] = true;\n }\n});\n\nfunction showNonPrintingChar(charCode: number): string {\n if (charCode === 9) {\n // Tab - handled separately\n return \"\\t\";\n } else if (charCode === 10) {\n // Newline - pass through\n return \"\\n\";\n } else if (charCode < 32) {\n // Control characters 0-31 (except tab/newline)\n return \"^\" + String.fromCharCode(charCode + 64);\n } else if (charCode === 127) {\n // DEL\n return \"^?\";\n } else if (charCode >= 128 && charCode < 160) {\n // High control characters (M-^@, M-^A, etc.)\n return \"M-^\" + String.fromCharCode(charCode - 128 + 64);\n } else if (charCode >= 160 && charCode < 255) {\n // High printable characters (M-<space>, etc.)\n return \"M-\" + String.fromCharCode(charCode - 128);\n } else if (charCode === 255) {\n // M-^?\n return \"M-^?\";\n }\n return String.fromCharCode(charCode);\n}\n\nfunction processLine(line: string, flags: CatFlags): string {\n let result = \"\";\n\n for (let i = 0; i < line.length; i++) {\n const char = line[i]!;\n const charCode = char.charCodeAt(0);\n\n if (flags.T && charCode === 9) {\n result += \"^I\";\n } else if (flags.v && (charCode < 32 || charCode >= 127) && charCode !== 9 && charCode !== 10) {\n result += showNonPrintingChar(charCode);\n } else {\n result += char;\n }\n }\n\n if (flags.E) {\n result += \"$\";\n }\n\n return result;\n}\n\nfunction formatLineNumber(num: number): string {\n return num.toString().padStart(6, \" \") + \"\\t\";\n}\n\nexport const cat: 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 const flags: CatFlags = { ...result.flags };\n\n // -A is equivalent to -vET\n if (flags.A) {\n flags.v = true;\n flags.E = true;\n flags.T = true;\n }\n\n const needsProcessing = flags.n || flags.b || flags.E || flags.T || flags.v;\n let lineNumber = 1;\n\n const processContent = async (content: Buffer | Uint8Array) => {\n if (!needsProcessing) {\n await ctx.stdout.write(new Uint8Array(content));\n return;\n }\n\n const text = Buffer.from(content).toString(\"utf-8\");\n const lines = text.split(\"\\n\");\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i]!;\n const isLastLine = i === lines.length - 1;\n const isEmpty = line === \"\";\n\n // Skip the final empty element from split (no trailing output)\n if (isLastLine && isEmpty) {\n continue;\n }\n\n let output = processLine(line, flags);\n\n // Line numbering\n if (flags.b) {\n // Number non-blank lines only\n if (!isEmpty) {\n output = formatLineNumber(lineNumber++) + output;\n }\n } else if (flags.n) {\n // Number all lines\n output = formatLineNumber(lineNumber++) + output;\n }\n\n await ctx.stdout.writeText(output + \"\\n\");\n }\n };\n\n if (files.length === 0) {\n // Read from stdin\n if (!needsProcessing) {\n for await (const chunk of ctx.stdin.stream()) {\n await ctx.stdout.write(chunk);\n }\n } else {\n const content = await ctx.stdin.buffer();\n await processContent(content);\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(new Uint8Array(content));\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n await ctx.stderr.writeText(`cat: ${file}: ${message}\\n`);\n return 1;\n }\n }\n }\n return 0;\n};\n"
6
6
  ],
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,QAAQ,OAAO;AAAA,EAErB,IAAI,MAAM,WAAW,GAAG;AAAA,IAEtB,iBAAiB,SAAS,IAAI,MAAM,OAAO,GAAG;AAAA,MAC5C,MAAM,IAAI,OAAO,MAAM,KAAK;AAAA,IAC9B;AAAA,EACF,EAAO;AAAA,IAEL,WAAW,QAAQ,OAAO;AAAA,MACxB,IAAI;AAAA,QACF,MAAM,OAAO,IAAI,GAAG,QAAQ,IAAI,KAAK,IAAI;AAAA,QACzC,MAAM,UAAU,MAAM,IAAI,GAAG,SAAS,IAAI;AAAA,QAC1C,MAAM,IAAI,OAAO,MAAM,IAAI,WAAW,OAAO,CAAC;AAAA,QAC9C,OAAO,KAAK;AAAA,QACZ,MAAM,UAAU,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAAA,QAC/D,MAAM,IAAI,OAAO,UAAU,QAAQ,SAAS;AAAA,CAAW;AAAA,QACvD,OAAO;AAAA;AAAA,IAEX;AAAA;AAAA,EAEF,OAAO;AAAA;",
8
- "debugId": "7AEDA05FD385954E64756E2164756E21",
7
+ "mappings": "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",
8
+ "debugId": "51CCC0B7373826B964756E2164756E21",
9
9
  "names": []
10
10
  }
@@ -0,0 +1,188 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __getOwnPropNames = Object.getOwnPropertyNames;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
5
+ var __moduleCache = /* @__PURE__ */ new WeakMap;
6
+ var __toCommonJS = (from) => {
7
+ var entry = __moduleCache.get(from), desc;
8
+ if (entry)
9
+ return entry;
10
+ entry = __defProp({}, "__esModule", { value: true });
11
+ if (from && typeof from === "object" || typeof from === "function")
12
+ __getOwnPropNames(from).map((key) => !__hasOwnProp.call(entry, key) && __defProp(entry, key, {
13
+ get: () => from[key],
14
+ enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
15
+ }));
16
+ __moduleCache.set(from, entry);
17
+ return entry;
18
+ };
19
+ var __export = (target, all) => {
20
+ for (var name in all)
21
+ __defProp(target, name, {
22
+ get: all[name],
23
+ enumerable: true,
24
+ configurable: true,
25
+ set: (newValue) => all[name] = () => newValue
26
+ });
27
+ };
28
+
29
+ // src/commands/cut/cut.ts
30
+ var exports_cut = {};
31
+ __export(exports_cut, {
32
+ cut: () => cut
33
+ });
34
+ module.exports = __toCommonJS(exports_cut);
35
+ var import_flag_parser = require("../../utils/flag-parser.cjs");
36
+ var spec = {
37
+ name: "cut",
38
+ flags: [
39
+ { short: "b", long: "bytes", takesValue: true },
40
+ { short: "c", long: "characters", takesValue: true },
41
+ { short: "d", long: "delimiter", takesValue: true },
42
+ { short: "f", long: "fields", takesValue: true },
43
+ { short: "s", long: "only-delimited" },
44
+ { long: "complement" },
45
+ { long: "output-delimiter", takesValue: true }
46
+ ],
47
+ usage: `cut -b list [-n] [file ...]
48
+ cut -c list [file ...]
49
+ cut -f list [-d delim] [-s] [file ...]`
50
+ };
51
+ var defaults = {
52
+ bytes: null,
53
+ characters: null,
54
+ delimiter: "\t",
55
+ fields: null,
56
+ onlyDelimited: false,
57
+ complement: false,
58
+ outputDelimiter: null
59
+ };
60
+ var handler = (flags, flag, value) => {
61
+ if (flag.short === "b")
62
+ flags.bytes = value ?? null;
63
+ if (flag.short === "c")
64
+ flags.characters = value ?? null;
65
+ if (flag.short === "d")
66
+ flags.delimiter = value ?? "\t";
67
+ if (flag.short === "f")
68
+ flags.fields = value ?? null;
69
+ if (flag.short === "s")
70
+ flags.onlyDelimited = true;
71
+ if (flag.long === "complement")
72
+ flags.complement = true;
73
+ if (flag.long === "output-delimiter")
74
+ flags.outputDelimiter = value ?? null;
75
+ };
76
+ var parser = import_flag_parser.createFlagParser(spec, defaults, handler);
77
+ function parseListSpec(listStr) {
78
+ const ranges = [];
79
+ for (const part of listStr.split(",")) {
80
+ const trimmed = part.trim();
81
+ if (trimmed.includes("-")) {
82
+ const [startStr, endStr] = trimmed.split("-", 2);
83
+ const start = startStr === "" ? null : parseInt(startStr, 10);
84
+ const end = endStr === "" ? null : parseInt(endStr, 10);
85
+ ranges.push({ start, end });
86
+ } else {
87
+ const n = parseInt(trimmed, 10);
88
+ ranges.push({ start: n, end: n });
89
+ }
90
+ }
91
+ return (index, total) => {
92
+ for (const { start, end } of ranges) {
93
+ const s = start ?? 1;
94
+ const e = end ?? total;
95
+ if (index >= s && index <= e)
96
+ return true;
97
+ }
98
+ return false;
99
+ };
100
+ }
101
+ var cut = async (ctx) => {
102
+ const result = parser.parse(ctx.args);
103
+ if (result.error) {
104
+ await parser.writeError(result.error, ctx.stderr);
105
+ return 1;
106
+ }
107
+ const { bytes, characters, fields, delimiter, onlyDelimited, complement, outputDelimiter } = result.flags;
108
+ const modeCount = [bytes, characters, fields].filter((v) => v !== null).length;
109
+ if (modeCount === 0) {
110
+ await ctx.stderr.writeText(`cut: you must specify a list of bytes, characters, or fields
111
+ `);
112
+ return 1;
113
+ }
114
+ if (modeCount > 1) {
115
+ await ctx.stderr.writeText(`cut: only one type of list may be specified
116
+ `);
117
+ return 1;
118
+ }
119
+ const listStr = bytes ?? characters ?? fields;
120
+ const selector = parseListSpec(listStr);
121
+ const mode = bytes !== null ? "bytes" : characters !== null ? "chars" : "fields";
122
+ const processLine = async (line) => {
123
+ if (mode === "fields") {
124
+ if (!line.includes(delimiter)) {
125
+ if (onlyDelimited)
126
+ return;
127
+ await ctx.stdout.writeText(line + `
128
+ `);
129
+ return;
130
+ }
131
+ const parts = line.split(delimiter);
132
+ const total = parts.length;
133
+ const selected = [];
134
+ for (let i = 0;i < total; i++) {
135
+ const idx = i + 1;
136
+ const isSelected = selector(idx, total);
137
+ if (complement ? !isSelected : isSelected) {
138
+ selected.push(parts[i]);
139
+ }
140
+ }
141
+ const outDelim = outputDelimiter ?? delimiter;
142
+ await ctx.stdout.writeText(selected.join(outDelim) + `
143
+ `);
144
+ } else {
145
+ const chars = [...line];
146
+ const total = chars.length;
147
+ const selected = [];
148
+ for (let i = 0;i < total; i++) {
149
+ const idx = i + 1;
150
+ const isSelected = selector(idx, total);
151
+ if (complement ? !isSelected : isSelected) {
152
+ selected.push(chars[i]);
153
+ }
154
+ }
155
+ const outDelim = outputDelimiter ?? "";
156
+ await ctx.stdout.writeText(selected.join(outDelim) + `
157
+ `);
158
+ }
159
+ };
160
+ const files = result.args;
161
+ if (files.length === 0) {
162
+ for await (const line of ctx.stdin.lines()) {
163
+ await processLine(line);
164
+ }
165
+ } else {
166
+ for (const file of files) {
167
+ try {
168
+ const path = ctx.fs.resolve(ctx.cwd, file);
169
+ const content = (await ctx.fs.readFile(path)).toString();
170
+ const lines = content.split(`
171
+ `);
172
+ if (lines.length > 0 && lines[lines.length - 1] === "") {
173
+ lines.pop();
174
+ }
175
+ for (const line of lines) {
176
+ await processLine(line);
177
+ }
178
+ } catch {
179
+ await ctx.stderr.writeText(`cut: ${file}: No such file or directory
180
+ `);
181
+ return 1;
182
+ }
183
+ }
184
+ }
185
+ return 0;
186
+ };
187
+
188
+ //# debugId=27E02324E2E46D1D64756E2164756E21
@@ -0,0 +1,10 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/commands/cut/cut.ts"],
4
+ "sourcesContent": [
5
+ "import type { Command } from \"../../types.cjs\";\nimport { createFlagParser, type FlagDefinition } from \"../../utils/flag-parser.cjs\";\n\ninterface CutFlags {\n bytes: string | null;\n characters: string | null;\n delimiter: string;\n fields: string | null;\n onlyDelimited: boolean;\n complement: boolean;\n outputDelimiter: string | null;\n}\n\nconst spec = {\n name: \"cut\",\n flags: [\n { short: \"b\", long: \"bytes\", takesValue: true },\n { short: \"c\", long: \"characters\", takesValue: true },\n { short: \"d\", long: \"delimiter\", takesValue: true },\n { short: \"f\", long: \"fields\", takesValue: true },\n { short: \"s\", long: \"only-delimited\" },\n { long: \"complement\" },\n { long: \"output-delimiter\", takesValue: true },\n ] as FlagDefinition[],\n usage: \"cut -b list [-n] [file ...]\\n cut -c list [file ...]\\n cut -f list [-d delim] [-s] [file ...]\",\n};\n\nconst defaults: CutFlags = {\n bytes: null,\n characters: null,\n delimiter: \"\\t\",\n fields: null,\n onlyDelimited: false,\n complement: false,\n outputDelimiter: null,\n};\n\nconst handler = (flags: CutFlags, flag: FlagDefinition, value?: string) => {\n if (flag.short === \"b\") flags.bytes = value ?? null;\n if (flag.short === \"c\") flags.characters = value ?? null;\n if (flag.short === \"d\") flags.delimiter = value ?? \"\\t\";\n if (flag.short === \"f\") flags.fields = value ?? null;\n if (flag.short === \"s\") flags.onlyDelimited = true;\n if (flag.long === \"complement\") flags.complement = true;\n if (flag.long === \"output-delimiter\") flags.outputDelimiter = value ?? null;\n};\n\nconst parser = createFlagParser(spec, defaults, handler);\n\n/**\n * Parse a list specification like \"1\", \"1,3,5\", \"1-3\", \"1-\", \"-3\", \"1-3,7,9-\"\n * Returns a function that checks if a 1-based index is selected.\n */\nfunction parseListSpec(\n listStr: string\n): (index: number, total: number) => boolean {\n const ranges: Array<{ start: number | null; end: number | null }> = [];\n\n for (const part of listStr.split(\",\")) {\n const trimmed = part.trim();\n if (trimmed.includes(\"-\")) {\n const [startStr, endStr] = trimmed.split(\"-\", 2);\n const start = startStr === \"\" ? null : parseInt(startStr!, 10);\n const end = endStr === \"\" ? null : parseInt(endStr!, 10);\n ranges.push({ start, end });\n } else {\n const n = parseInt(trimmed, 10);\n ranges.push({ start: n, end: n });\n }\n }\n\n return (index: number, total: number): boolean => {\n for (const { start, end } of ranges) {\n const s = start ?? 1;\n const e = end ?? total;\n if (index >= s && index <= e) return true;\n }\n return false;\n };\n}\n\nexport const cut: 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 { bytes, characters, fields, delimiter, onlyDelimited, complement, outputDelimiter } =\n result.flags;\n\n // Validate: exactly one of -b, -c, -f must be given\n const modeCount = [bytes, characters, fields].filter((v) => v !== null).length;\n if (modeCount === 0) {\n await ctx.stderr.writeText(\n \"cut: you must specify a list of bytes, characters, or fields\\n\"\n );\n return 1;\n }\n if (modeCount > 1) {\n await ctx.stderr.writeText(\n \"cut: only one type of list may be specified\\n\"\n );\n return 1;\n }\n\n const listStr = (bytes ?? characters ?? fields)!;\n const selector = parseListSpec(listStr);\n const mode = bytes !== null ? \"bytes\" : characters !== null ? \"chars\" : \"fields\";\n\n const processLine = async (line: string) => {\n if (mode === \"fields\") {\n // Check if delimiter exists in line\n if (!line.includes(delimiter)) {\n if (onlyDelimited) return;\n await ctx.stdout.writeText(line + \"\\n\");\n return;\n }\n\n const parts = line.split(delimiter);\n const total = parts.length;\n const selected: string[] = [];\n\n for (let i = 0; i < total; i++) {\n const idx = i + 1; // 1-based\n const isSelected = selector(idx, total);\n if (complement ? !isSelected : isSelected) {\n selected.push(parts[i]!);\n }\n }\n\n const outDelim = outputDelimiter ?? delimiter;\n await ctx.stdout.writeText(selected.join(outDelim) + \"\\n\");\n } else {\n // bytes/chars mode (equivalent for simplicity)\n const chars = [...line];\n const total = chars.length;\n const selected: string[] = [];\n\n for (let i = 0; i < total; i++) {\n const idx = i + 1; // 1-based\n const isSelected = selector(idx, total);\n if (complement ? !isSelected : isSelected) {\n selected.push(chars[i]!);\n }\n }\n\n const outDelim = outputDelimiter ?? \"\";\n await ctx.stdout.writeText(selected.join(outDelim) + \"\\n\");\n }\n };\n\n const files = result.args;\n\n if (files.length === 0) {\n // Read from stdin\n for await (const line of ctx.stdin.lines()) {\n await processLine(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 // Remove trailing empty line from final newline\n if (lines.length > 0 && lines[lines.length - 1] === \"\") {\n lines.pop();\n }\n for (const line of lines) {\n await processLine(line);\n }\n } catch {\n await ctx.stderr.writeText(`cut: ${file}: No such file or directory\\n`);\n return 1;\n }\n }\n }\n\n return 0;\n};\n"
6
+ ],
7
+ "mappings": "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",
8
+ "debugId": "27E02324E2E46D1D64756E2164756E21",
9
+ "names": []
10
+ }
@@ -50,6 +50,7 @@ __export(exports_commands, {
50
50
  find: () => import_find.find,
51
51
  falseCmd: () => import_true_false.falseCmd,
52
52
  echo: () => import_echo.echo,
53
+ cut: () => import_cut.cut,
53
54
  cp: () => import_cp.cp,
54
55
  continueCmd: () => import_break_continue.continueCmd,
55
56
  colon: () => import_colon.colon,
@@ -87,6 +88,7 @@ var import_break_continue = require("./break-continue/break-continue.cjs");
87
88
  var import_colon = require("./colon/colon.cjs");
88
89
  var import_cd = require("./cd/cd.cjs");
89
90
  var import_tr = require("./tr/tr.cjs");
91
+ var import_cut = require("./cut/cut.cjs");
90
92
  var import_echo2 = require("./echo/echo.cjs");
91
93
  var import_cat2 = require("./cat/cat.cjs");
92
94
  var import_grep2 = require("./grep/grep.cjs");
@@ -113,6 +115,7 @@ var import_break_continue2 = require("./break-continue/break-continue.cjs");
113
115
  var import_colon2 = require("./colon/colon.cjs");
114
116
  var import_cd2 = require("./cd/cd.cjs");
115
117
  var import_tr2 = require("./tr/tr.cjs");
118
+ var import_cut2 = require("./cut/cut.cjs");
116
119
  var builtinCommands = {
117
120
  echo: import_echo2.echo,
118
121
  cat: import_cat2.cat,
@@ -142,7 +145,8 @@ var builtinCommands = {
142
145
  continue: import_break_continue2.continueCmd,
143
146
  ":": import_colon2.colon,
144
147
  cd: import_cd2.cd,
145
- tr: import_tr2.tr
148
+ tr: import_tr2.tr,
149
+ cut: import_cut2.cut
146
150
  };
147
151
 
148
- //# debugId=17598CDDC0006B1664756E2164756E21
152
+ //# debugId=BFE70ED48B7DB93D64756E2164756E21
@@ -2,9 +2,9 @@
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/commands/index.ts"],
4
4
  "sourcesContent": [
5
- "import type { Command } from \"../types.cjs\";\n\nexport { echo } from \"./echo/echo.cjs\";\nexport { cat } from \"./cat/cat.cjs\";\nexport { grep } from \"./grep/grep.cjs\";\nexport { wc } from \"./wc/wc.cjs\";\nexport { head } from \"./head/head.cjs\";\nexport { tail } from \"./tail/tail.cjs\";\nexport { sort } from \"./sort/sort.cjs\";\nexport { uniq } from \"./uniq/uniq.cjs\";\nexport { pwd } from \"./pwd/pwd.cjs\";\nexport { ls } from \"./ls/ls.cjs\";\nexport { mkdir } from \"./mkdir/mkdir.cjs\";\nexport { rm } from \"./rm/rm.cjs\";\nexport { test, bracket } from \"./test/test.cjs\";\nexport { trueCmd, falseCmd } from \"./true-false/true-false.cjs\";\nexport { touch } from \"./touch/touch.cjs\";\nexport { cp } from \"./cp/cp.cjs\";\nexport { mv } from \"./mv/mv.cjs\";\nexport { tee } from \"./tee/tee.cjs\";\nexport { tree } from \"./tree/tree.cjs\";\nexport { find } from \"./find/find.cjs\";\nexport { sed } from \"./sed/sed.cjs\";\nexport { awk } from \"./awk/awk.cjs\";\nexport { breakCmd, continueCmd } from \"./break-continue/break-continue.cjs\";\nexport { colon } from \"./colon/colon.cjs\";\nexport { cd } from \"./cd/cd.cjs\";\nexport { tr } from \"./tr/tr.cjs\";\n\n// Re-export all commands as a bundle\nimport { echo } from \"./echo/echo.cjs\";\nimport { cat } from \"./cat/cat.cjs\";\nimport { grep } from \"./grep/grep.cjs\";\nimport { wc } from \"./wc/wc.cjs\";\nimport { head } from \"./head/head.cjs\";\nimport { tail } from \"./tail/tail.cjs\";\nimport { sort } from \"./sort/sort.cjs\";\nimport { uniq } from \"./uniq/uniq.cjs\";\nimport { pwd } from \"./pwd/pwd.cjs\";\nimport { ls } from \"./ls/ls.cjs\";\nimport { mkdir } from \"./mkdir/mkdir.cjs\";\nimport { rm } from \"./rm/rm.cjs\";\nimport { test, bracket } from \"./test/test.cjs\";\nimport { trueCmd, falseCmd } from \"./true-false/true-false.cjs\";\nimport { touch } from \"./touch/touch.cjs\";\nimport { cp } from \"./cp/cp.cjs\";\nimport { mv } from \"./mv/mv.cjs\";\nimport { tee } from \"./tee/tee.cjs\";\nimport { tree } from \"./tree/tree.cjs\";\nimport { find } from \"./find/find.cjs\";\nimport { sed } from \"./sed/sed.cjs\";\nimport { awk } from \"./awk/awk.cjs\";\nimport { breakCmd, continueCmd } from \"./break-continue/break-continue.cjs\";\nimport { colon } from \"./colon/colon.cjs\";\nimport { cd } from \"./cd/cd.cjs\";\nimport { tr } from \"./tr/tr.cjs\";\n\nexport const builtinCommands: Record<string, Command> = {\n echo,\n cat,\n grep,\n wc,\n head,\n tail,\n sort,\n uniq,\n pwd,\n ls,\n mkdir,\n rm,\n test,\n \"[\": bracket,\n true: trueCmd,\n false: falseCmd,\n touch,\n cp,\n mv,\n tee,\n tree,\n find,\n sed,\n awk,\n break: breakCmd,\n continue: continueCmd,\n \":\": colon,\n cd,\n tr,\n};\n"
5
+ "import type { Command } from \"../types.cjs\";\n\nexport { echo } from \"./echo/echo.cjs\";\nexport { cat } from \"./cat/cat.cjs\";\nexport { grep } from \"./grep/grep.cjs\";\nexport { wc } from \"./wc/wc.cjs\";\nexport { head } from \"./head/head.cjs\";\nexport { tail } from \"./tail/tail.cjs\";\nexport { sort } from \"./sort/sort.cjs\";\nexport { uniq } from \"./uniq/uniq.cjs\";\nexport { pwd } from \"./pwd/pwd.cjs\";\nexport { ls } from \"./ls/ls.cjs\";\nexport { mkdir } from \"./mkdir/mkdir.cjs\";\nexport { rm } from \"./rm/rm.cjs\";\nexport { test, bracket } from \"./test/test.cjs\";\nexport { trueCmd, falseCmd } from \"./true-false/true-false.cjs\";\nexport { touch } from \"./touch/touch.cjs\";\nexport { cp } from \"./cp/cp.cjs\";\nexport { mv } from \"./mv/mv.cjs\";\nexport { tee } from \"./tee/tee.cjs\";\nexport { tree } from \"./tree/tree.cjs\";\nexport { find } from \"./find/find.cjs\";\nexport { sed } from \"./sed/sed.cjs\";\nexport { awk } from \"./awk/awk.cjs\";\nexport { breakCmd, continueCmd } from \"./break-continue/break-continue.cjs\";\nexport { colon } from \"./colon/colon.cjs\";\nexport { cd } from \"./cd/cd.cjs\";\nexport { tr } from \"./tr/tr.cjs\";\nexport { cut } from \"./cut/cut.cjs\";\n\n// Re-export all commands as a bundle\nimport { echo } from \"./echo/echo.cjs\";\nimport { cat } from \"./cat/cat.cjs\";\nimport { grep } from \"./grep/grep.cjs\";\nimport { wc } from \"./wc/wc.cjs\";\nimport { head } from \"./head/head.cjs\";\nimport { tail } from \"./tail/tail.cjs\";\nimport { sort } from \"./sort/sort.cjs\";\nimport { uniq } from \"./uniq/uniq.cjs\";\nimport { pwd } from \"./pwd/pwd.cjs\";\nimport { ls } from \"./ls/ls.cjs\";\nimport { mkdir } from \"./mkdir/mkdir.cjs\";\nimport { rm } from \"./rm/rm.cjs\";\nimport { test, bracket } from \"./test/test.cjs\";\nimport { trueCmd, falseCmd } from \"./true-false/true-false.cjs\";\nimport { touch } from \"./touch/touch.cjs\";\nimport { cp } from \"./cp/cp.cjs\";\nimport { mv } from \"./mv/mv.cjs\";\nimport { tee } from \"./tee/tee.cjs\";\nimport { tree } from \"./tree/tree.cjs\";\nimport { find } from \"./find/find.cjs\";\nimport { sed } from \"./sed/sed.cjs\";\nimport { awk } from \"./awk/awk.cjs\";\nimport { breakCmd, continueCmd } from \"./break-continue/break-continue.cjs\";\nimport { colon } from \"./colon/colon.cjs\";\nimport { cd } from \"./cd/cd.cjs\";\nimport { tr } from \"./tr/tr.cjs\";\nimport { cut } from \"./cut/cut.cjs\";\n\nexport const builtinCommands: Record<string, Command> = {\n echo,\n cat,\n grep,\n wc,\n head,\n tail,\n sort,\n uniq,\n pwd,\n ls,\n mkdir,\n rm,\n test,\n \"[\": bracket,\n true: trueCmd,\n false: falseCmd,\n touch,\n cp,\n mv,\n tee,\n tree,\n find,\n sed,\n awk,\n break: breakCmd,\n continue: continueCmd,\n \":\": colon,\n cd,\n tr,\n cut,\n};\n"
6
6
  ],
7
- "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEqB,IAArB;AACoB,IAApB;AACqB,IAArB;AACmB,IAAnB;AACqB,IAArB;AACqB,IAArB;AACqB,IAArB;AACqB,IAArB;AACoB,IAApB;AACmB,IAAnB;AACsB,IAAtB;AACmB,IAAnB;AAC8B,IAA9B;AACkC,IAAlC;AACsB,IAAtB;AACmB,IAAnB;AACmB,IAAnB;AACoB,IAApB;AACqB,IAArB;AACqB,IAArB;AACoB,IAApB;AACoB,IAApB;AACsC,IAAtC;AACsB,IAAtB;AACmB,IAAnB;AACmB,IAAnB;AAGqB,IAArB;AACoB,IAApB;AACqB,IAArB;AACmB,IAAnB;AACqB,IAArB;AACqB,IAArB;AACqB,IAArB;AACqB,IAArB;AACoB,IAApB;AACmB,IAAnB;AACsB,IAAtB;AACmB,IAAnB;AAC8B,IAA9B;AACkC,IAAlC;AACsB,IAAtB;AACmB,IAAnB;AACmB,IAAnB;AACoB,IAApB;AACqB,IAArB;AACqB,IAArB;AACoB,IAApB;AACoB,IAApB;AACsC,IAAtC;AACsB,IAAtB;AACmB,IAAnB;AACmB,IAAnB;AAEO,IAAM,kBAA2C;AAAA,EACtD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,KAAK;AAAA,EACL,MAAM;AAAA,EACN,OAAO;AAAA,EACP;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,OAAO;AAAA,EACP,UAAU;AAAA,EACV,KAAK;AAAA,EACL;AAAA,EACA;AACF;",
8
- "debugId": "17598CDDC0006B1664756E2164756E21",
7
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEqB,IAArB;AACoB,IAApB;AACqB,IAArB;AACmB,IAAnB;AACqB,IAArB;AACqB,IAArB;AACqB,IAArB;AACqB,IAArB;AACoB,IAApB;AACmB,IAAnB;AACsB,IAAtB;AACmB,IAAnB;AAC8B,IAA9B;AACkC,IAAlC;AACsB,IAAtB;AACmB,IAAnB;AACmB,IAAnB;AACoB,IAApB;AACqB,IAArB;AACqB,IAArB;AACoB,IAApB;AACoB,IAApB;AACsC,IAAtC;AACsB,IAAtB;AACmB,IAAnB;AACmB,IAAnB;AACoB,IAApB;AAGqB,IAArB;AACoB,IAApB;AACqB,IAArB;AACmB,IAAnB;AACqB,IAArB;AACqB,IAArB;AACqB,IAArB;AACqB,IAArB;AACoB,IAApB;AACmB,IAAnB;AACsB,IAAtB;AACmB,IAAnB;AAC8B,IAA9B;AACkC,IAAlC;AACsB,IAAtB;AACmB,IAAnB;AACmB,IAAnB;AACoB,IAApB;AACqB,IAArB;AACqB,IAArB;AACoB,IAApB;AACoB,IAApB;AACsC,IAAtC;AACsB,IAAtB;AACmB,IAAnB;AACmB,IAAnB;AACoB,IAApB;AAEO,IAAM,kBAA2C;AAAA,EACtD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,KAAK;AAAA,EACL,MAAM;AAAA,EACN,OAAO;AAAA,EACP;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,OAAO;AAAA,EACP,UAAU;AAAA,EACV,KAAK;AAAA,EACL;AAAA,EACA;AAAA,EACA;AACF;",
8
+ "debugId": "BFE70ED48B7DB93D64756E2164756E21",
9
9
  "names": []
10
10
  }