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.
- 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/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 +126 -140
- 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/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/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/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 +126 -140
- 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/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/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/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/ls/ls.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 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": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
8
|
-
"debugId": "
|
|
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
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
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=
|
|
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\";\
|
|
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": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
8
|
-
"debugId": "
|
|
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
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
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=
|
|
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\";\
|
|
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": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
8
|
-
"debugId": "
|
|
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=
|
|
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": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
8
|
-
"debugId": "
|
|
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
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
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=
|
|
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\";\
|
|
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": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
8
|
-
"debugId": "
|
|
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 === "
|
|
151
|
-
options.suppressOutput = true;
|
|
150
|
+
if (arg === "--") {
|
|
152
151
|
i++;
|
|
153
|
-
|
|
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
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
168
|
+
if (arg.startsWith("--")) {
|
|
169
|
+
return {
|
|
170
|
+
options,
|
|
171
|
+
files,
|
|
172
|
+
error: { type: "unrecognized_option", option: arg }
|
|
173
|
+
};
|
|
159
174
|
}
|
|
160
|
-
if (arg
|
|
161
|
-
const
|
|
162
|
-
|
|
163
|
-
|
|
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
|
|
209
|
+
i++;
|
|
166
210
|
continue;
|
|
167
211
|
}
|
|
168
|
-
if (
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
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=
|
|
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": "
|
|
7
|
+
"mappings": "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",
|
|
8
|
+
"debugId": "9484A386918DB8C764756E2164756E21",
|
|
9
9
|
"names": []
|
|
10
10
|
}
|