shell-dsl 0.0.14 → 0.0.15
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
CHANGED
|
@@ -38,11 +38,12 @@ var spec = {
|
|
|
38
38
|
flags: [
|
|
39
39
|
{ short: "a", long: "all" },
|
|
40
40
|
{ short: "l" },
|
|
41
|
-
{ short: "1" }
|
|
41
|
+
{ short: "1" },
|
|
42
|
+
{ short: "R" }
|
|
42
43
|
],
|
|
43
|
-
usage: "ls [-
|
|
44
|
+
usage: "ls [-alR1] [file ...]"
|
|
44
45
|
};
|
|
45
|
-
var defaults = { all: false, long: false, onePerLine: false };
|
|
46
|
+
var defaults = { all: false, long: false, onePerLine: false, recursive: false };
|
|
46
47
|
var handler = (flags, flag) => {
|
|
47
48
|
if (flag.short === "a")
|
|
48
49
|
flags.all = true;
|
|
@@ -50,6 +51,8 @@ var handler = (flags, flag) => {
|
|
|
50
51
|
flags.long = true;
|
|
51
52
|
if (flag.short === "1")
|
|
52
53
|
flags.onePerLine = true;
|
|
54
|
+
if (flag.short === "R")
|
|
55
|
+
flags.recursive = true;
|
|
53
56
|
};
|
|
54
57
|
var parser = import_flag_parser.createFlagParser(spec, defaults, handler);
|
|
55
58
|
var ls = async (ctx) => {
|
|
@@ -58,8 +61,63 @@ var ls = async (ctx) => {
|
|
|
58
61
|
await parser.writeError(result.error, ctx.stderr);
|
|
59
62
|
return 1;
|
|
60
63
|
}
|
|
61
|
-
const { all: showAll, long: longFormat, onePerLine } = result.flags;
|
|
64
|
+
const { all: showAll, long: longFormat, onePerLine, recursive } = result.flags;
|
|
62
65
|
const paths = result.args.length === 0 ? ["."] : result.args;
|
|
66
|
+
let needsBlankLine = false;
|
|
67
|
+
const listDir = async (dirPath, displayPath, showHeader) => {
|
|
68
|
+
if (needsBlankLine)
|
|
69
|
+
await ctx.stdout.writeText(`
|
|
70
|
+
`);
|
|
71
|
+
needsBlankLine = true;
|
|
72
|
+
if (showHeader) {
|
|
73
|
+
await ctx.stdout.writeText(`${displayPath}:
|
|
74
|
+
`);
|
|
75
|
+
}
|
|
76
|
+
let entries = await ctx.fs.readdir(dirPath);
|
|
77
|
+
if (!showAll) {
|
|
78
|
+
entries = entries.filter((e) => !e.startsWith("."));
|
|
79
|
+
}
|
|
80
|
+
entries.sort();
|
|
81
|
+
if (longFormat) {
|
|
82
|
+
for (const entry of entries) {
|
|
83
|
+
const entryPath = ctx.fs.resolve(dirPath, entry);
|
|
84
|
+
try {
|
|
85
|
+
const entryStat = await ctx.fs.stat(entryPath);
|
|
86
|
+
const type = entryStat.isDirectory() ? "d" : "-";
|
|
87
|
+
const perms = "rwxr-xr-x";
|
|
88
|
+
const size = String(entryStat.size).padStart(8);
|
|
89
|
+
const date = entryStat.mtime.toISOString().slice(0, 10);
|
|
90
|
+
await ctx.stdout.writeText(`${type}${perms} ${size} ${date} ${entry}
|
|
91
|
+
`);
|
|
92
|
+
} catch {
|
|
93
|
+
await ctx.stdout.writeText(`?????????? ${entry}
|
|
94
|
+
`);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
} else if (onePerLine) {
|
|
98
|
+
for (const entry of entries) {
|
|
99
|
+
await ctx.stdout.writeText(entry + `
|
|
100
|
+
`);
|
|
101
|
+
}
|
|
102
|
+
} else {
|
|
103
|
+
if (entries.length > 0) {
|
|
104
|
+
await ctx.stdout.writeText(entries.join(" ") + `
|
|
105
|
+
`);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
if (recursive) {
|
|
109
|
+
for (const entry of entries) {
|
|
110
|
+
const entryPath = ctx.fs.resolve(dirPath, entry);
|
|
111
|
+
try {
|
|
112
|
+
const entryStat = await ctx.fs.stat(entryPath);
|
|
113
|
+
if (entryStat.isDirectory()) {
|
|
114
|
+
const subDisplay = displayPath === "." ? entry : `${displayPath}/${entry}`;
|
|
115
|
+
await listDir(entryPath, subDisplay, true);
|
|
116
|
+
}
|
|
117
|
+
} catch {}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
};
|
|
63
121
|
for (let i = 0;i < paths.length; i++) {
|
|
64
122
|
const pathArg = paths[i];
|
|
65
123
|
const path = ctx.fs.resolve(ctx.cwd, pathArg);
|
|
@@ -70,43 +128,8 @@ var ls = async (ctx) => {
|
|
|
70
128
|
`);
|
|
71
129
|
continue;
|
|
72
130
|
}
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
await ctx.stdout.writeText(`
|
|
76
|
-
`);
|
|
77
|
-
await ctx.stdout.writeText(`${pathArg}:
|
|
78
|
-
`);
|
|
79
|
-
}
|
|
80
|
-
let entries = await ctx.fs.readdir(path);
|
|
81
|
-
if (!showAll) {
|
|
82
|
-
entries = entries.filter((e) => !e.startsWith("."));
|
|
83
|
-
}
|
|
84
|
-
entries.sort();
|
|
85
|
-
if (longFormat) {
|
|
86
|
-
for (const entry of entries) {
|
|
87
|
-
const entryPath = ctx.fs.resolve(path, entry);
|
|
88
|
-
try {
|
|
89
|
-
const entryStat = await ctx.fs.stat(entryPath);
|
|
90
|
-
const type = entryStat.isDirectory() ? "d" : "-";
|
|
91
|
-
const perms = "rwxr-xr-x";
|
|
92
|
-
const size = String(entryStat.size).padStart(8);
|
|
93
|
-
const date = entryStat.mtime.toISOString().slice(0, 10);
|
|
94
|
-
await ctx.stdout.writeText(`${type}${perms} ${size} ${date} ${entry}
|
|
95
|
-
`);
|
|
96
|
-
} catch {
|
|
97
|
-
await ctx.stdout.writeText(`?????????? ${entry}
|
|
98
|
-
`);
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
} else if (onePerLine) {
|
|
102
|
-
for (const entry of entries) {
|
|
103
|
-
await ctx.stdout.writeText(entry + `
|
|
104
|
-
`);
|
|
105
|
-
}
|
|
106
|
-
} else {
|
|
107
|
-
await ctx.stdout.writeText(entries.join(" ") + `
|
|
108
|
-
`);
|
|
109
|
-
}
|
|
131
|
+
const showHeader = recursive || paths.length > 1;
|
|
132
|
+
await listDir(path, pathArg, showHeader);
|
|
110
133
|
} catch (err) {
|
|
111
134
|
await ctx.stderr.writeText(`ls: cannot access '${pathArg}': No such file or directory
|
|
112
135
|
`);
|
|
@@ -116,4 +139,4 @@ var ls = async (ctx) => {
|
|
|
116
139
|
return 0;
|
|
117
140
|
};
|
|
118
141
|
|
|
119
|
-
//# debugId=
|
|
142
|
+
//# debugId=5A080C64ADFFC97C64756E2164756E21
|
|
@@ -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\";\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 [-
|
|
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 recursive: boolean;\n}\n\nconst spec = {\n name: \"ls\",\n flags: [\n { short: \"a\", long: \"all\" },\n { short: \"l\" },\n { short: \"1\" },\n { short: \"R\" },\n ] as FlagDefinition[],\n usage: \"ls [-alR1] [file ...]\",\n};\n\nconst defaults: LsFlags = { all: false, long: false, onePerLine: false, recursive: 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 if (flag.short === \"R\") flags.recursive = 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, recursive } = result.flags;\n const paths = result.args.length === 0 ? [\".\"] : result.args;\n let needsBlankLine = false;\n\n const listDir = async (dirPath: string, displayPath: string, showHeader: boolean) => {\n if (needsBlankLine) await ctx.stdout.writeText(\"\\n\");\n needsBlankLine = true;\n\n if (showHeader) {\n await ctx.stdout.writeText(`${displayPath}:\\n`);\n }\n\n let entries = await ctx.fs.readdir(dirPath);\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(dirPath, entry);\n try {\n const entryStat = await ctx.fs.stat(entryPath);\n const type = entryStat.isDirectory() ? \"d\" : \"-\";\n const perms = \"rwxr-xr-x\";\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 if (entries.length > 0) {\n await ctx.stdout.writeText(entries.join(\" \") + \"\\n\");\n }\n }\n\n if (recursive) {\n for (const entry of entries) {\n const entryPath = ctx.fs.resolve(dirPath, entry);\n try {\n const entryStat = await ctx.fs.stat(entryPath);\n if (entryStat.isDirectory()) {\n const subDisplay = displayPath === \".\" ? entry : `${displayPath}/${entry}`;\n await listDir(entryPath, subDisplay, true);\n }\n } catch {\n // skip entries we can't stat\n }\n }\n }\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 await ctx.stdout.writeText(ctx.fs.basename(path) + \"\\n\");\n continue;\n }\n\n const showHeader = recursive || paths.length > 1;\n await listDir(path, pathArg, showHeader);\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": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACsD,IAAtD;
|
|
8
|
-
"debugId": "
|
|
7
|
+
"mappings": "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",
|
|
8
|
+
"debugId": "5A080C64ADFFC97C64756E2164756E21",
|
|
9
9
|
"names": []
|
|
10
10
|
}
|
package/dist/mjs/package.json
CHANGED
|
@@ -5,11 +5,12 @@ var spec = {
|
|
|
5
5
|
flags: [
|
|
6
6
|
{ short: "a", long: "all" },
|
|
7
7
|
{ short: "l" },
|
|
8
|
-
{ short: "1" }
|
|
8
|
+
{ short: "1" },
|
|
9
|
+
{ short: "R" }
|
|
9
10
|
],
|
|
10
|
-
usage: "ls [-
|
|
11
|
+
usage: "ls [-alR1] [file ...]"
|
|
11
12
|
};
|
|
12
|
-
var defaults = { all: false, long: false, onePerLine: false };
|
|
13
|
+
var defaults = { all: false, long: false, onePerLine: false, recursive: false };
|
|
13
14
|
var handler = (flags, flag) => {
|
|
14
15
|
if (flag.short === "a")
|
|
15
16
|
flags.all = true;
|
|
@@ -17,6 +18,8 @@ var handler = (flags, flag) => {
|
|
|
17
18
|
flags.long = true;
|
|
18
19
|
if (flag.short === "1")
|
|
19
20
|
flags.onePerLine = true;
|
|
21
|
+
if (flag.short === "R")
|
|
22
|
+
flags.recursive = true;
|
|
20
23
|
};
|
|
21
24
|
var parser = createFlagParser(spec, defaults, handler);
|
|
22
25
|
var ls = async (ctx) => {
|
|
@@ -25,8 +28,63 @@ var ls = async (ctx) => {
|
|
|
25
28
|
await parser.writeError(result.error, ctx.stderr);
|
|
26
29
|
return 1;
|
|
27
30
|
}
|
|
28
|
-
const { all: showAll, long: longFormat, onePerLine } = result.flags;
|
|
31
|
+
const { all: showAll, long: longFormat, onePerLine, recursive } = result.flags;
|
|
29
32
|
const paths = result.args.length === 0 ? ["."] : result.args;
|
|
33
|
+
let needsBlankLine = false;
|
|
34
|
+
const listDir = async (dirPath, displayPath, showHeader) => {
|
|
35
|
+
if (needsBlankLine)
|
|
36
|
+
await ctx.stdout.writeText(`
|
|
37
|
+
`);
|
|
38
|
+
needsBlankLine = true;
|
|
39
|
+
if (showHeader) {
|
|
40
|
+
await ctx.stdout.writeText(`${displayPath}:
|
|
41
|
+
`);
|
|
42
|
+
}
|
|
43
|
+
let entries = await ctx.fs.readdir(dirPath);
|
|
44
|
+
if (!showAll) {
|
|
45
|
+
entries = entries.filter((e) => !e.startsWith("."));
|
|
46
|
+
}
|
|
47
|
+
entries.sort();
|
|
48
|
+
if (longFormat) {
|
|
49
|
+
for (const entry of entries) {
|
|
50
|
+
const entryPath = ctx.fs.resolve(dirPath, entry);
|
|
51
|
+
try {
|
|
52
|
+
const entryStat = await ctx.fs.stat(entryPath);
|
|
53
|
+
const type = entryStat.isDirectory() ? "d" : "-";
|
|
54
|
+
const perms = "rwxr-xr-x";
|
|
55
|
+
const size = String(entryStat.size).padStart(8);
|
|
56
|
+
const date = entryStat.mtime.toISOString().slice(0, 10);
|
|
57
|
+
await ctx.stdout.writeText(`${type}${perms} ${size} ${date} ${entry}
|
|
58
|
+
`);
|
|
59
|
+
} catch {
|
|
60
|
+
await ctx.stdout.writeText(`?????????? ${entry}
|
|
61
|
+
`);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
} else if (onePerLine) {
|
|
65
|
+
for (const entry of entries) {
|
|
66
|
+
await ctx.stdout.writeText(entry + `
|
|
67
|
+
`);
|
|
68
|
+
}
|
|
69
|
+
} else {
|
|
70
|
+
if (entries.length > 0) {
|
|
71
|
+
await ctx.stdout.writeText(entries.join(" ") + `
|
|
72
|
+
`);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
if (recursive) {
|
|
76
|
+
for (const entry of entries) {
|
|
77
|
+
const entryPath = ctx.fs.resolve(dirPath, entry);
|
|
78
|
+
try {
|
|
79
|
+
const entryStat = await ctx.fs.stat(entryPath);
|
|
80
|
+
if (entryStat.isDirectory()) {
|
|
81
|
+
const subDisplay = displayPath === "." ? entry : `${displayPath}/${entry}`;
|
|
82
|
+
await listDir(entryPath, subDisplay, true);
|
|
83
|
+
}
|
|
84
|
+
} catch {}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
};
|
|
30
88
|
for (let i = 0;i < paths.length; i++) {
|
|
31
89
|
const pathArg = paths[i];
|
|
32
90
|
const path = ctx.fs.resolve(ctx.cwd, pathArg);
|
|
@@ -37,43 +95,8 @@ var ls = async (ctx) => {
|
|
|
37
95
|
`);
|
|
38
96
|
continue;
|
|
39
97
|
}
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
await ctx.stdout.writeText(`
|
|
43
|
-
`);
|
|
44
|
-
await ctx.stdout.writeText(`${pathArg}:
|
|
45
|
-
`);
|
|
46
|
-
}
|
|
47
|
-
let entries = await ctx.fs.readdir(path);
|
|
48
|
-
if (!showAll) {
|
|
49
|
-
entries = entries.filter((e) => !e.startsWith("."));
|
|
50
|
-
}
|
|
51
|
-
entries.sort();
|
|
52
|
-
if (longFormat) {
|
|
53
|
-
for (const entry of entries) {
|
|
54
|
-
const entryPath = ctx.fs.resolve(path, entry);
|
|
55
|
-
try {
|
|
56
|
-
const entryStat = await ctx.fs.stat(entryPath);
|
|
57
|
-
const type = entryStat.isDirectory() ? "d" : "-";
|
|
58
|
-
const perms = "rwxr-xr-x";
|
|
59
|
-
const size = String(entryStat.size).padStart(8);
|
|
60
|
-
const date = entryStat.mtime.toISOString().slice(0, 10);
|
|
61
|
-
await ctx.stdout.writeText(`${type}${perms} ${size} ${date} ${entry}
|
|
62
|
-
`);
|
|
63
|
-
} catch {
|
|
64
|
-
await ctx.stdout.writeText(`?????????? ${entry}
|
|
65
|
-
`);
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
} else if (onePerLine) {
|
|
69
|
-
for (const entry of entries) {
|
|
70
|
-
await ctx.stdout.writeText(entry + `
|
|
71
|
-
`);
|
|
72
|
-
}
|
|
73
|
-
} else {
|
|
74
|
-
await ctx.stdout.writeText(entries.join(" ") + `
|
|
75
|
-
`);
|
|
76
|
-
}
|
|
98
|
+
const showHeader = recursive || paths.length > 1;
|
|
99
|
+
await listDir(path, pathArg, showHeader);
|
|
77
100
|
} catch (err) {
|
|
78
101
|
await ctx.stderr.writeText(`ls: cannot access '${pathArg}': No such file or directory
|
|
79
102
|
`);
|
|
@@ -86,4 +109,4 @@ export {
|
|
|
86
109
|
ls
|
|
87
110
|
};
|
|
88
111
|
|
|
89
|
-
//# debugId=
|
|
112
|
+
//# debugId=C0BF60626A0B8D0564756E2164756E21
|
|
@@ -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.mjs\";\nimport { createFlagParser, type FlagDefinition } from \"../../utils/flag-parser.mjs\";\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 [-
|
|
5
|
+
"import type { Command } from \"../../types.mjs\";\nimport { createFlagParser, type FlagDefinition } from \"../../utils/flag-parser.mjs\";\n\ninterface LsFlags {\n all: boolean;\n long: boolean;\n onePerLine: boolean;\n recursive: boolean;\n}\n\nconst spec = {\n name: \"ls\",\n flags: [\n { short: \"a\", long: \"all\" },\n { short: \"l\" },\n { short: \"1\" },\n { short: \"R\" },\n ] as FlagDefinition[],\n usage: \"ls [-alR1] [file ...]\",\n};\n\nconst defaults: LsFlags = { all: false, long: false, onePerLine: false, recursive: 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 if (flag.short === \"R\") flags.recursive = 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, recursive } = result.flags;\n const paths = result.args.length === 0 ? [\".\"] : result.args;\n let needsBlankLine = false;\n\n const listDir = async (dirPath: string, displayPath: string, showHeader: boolean) => {\n if (needsBlankLine) await ctx.stdout.writeText(\"\\n\");\n needsBlankLine = true;\n\n if (showHeader) {\n await ctx.stdout.writeText(`${displayPath}:\\n`);\n }\n\n let entries = await ctx.fs.readdir(dirPath);\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(dirPath, entry);\n try {\n const entryStat = await ctx.fs.stat(entryPath);\n const type = entryStat.isDirectory() ? \"d\" : \"-\";\n const perms = \"rwxr-xr-x\";\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 if (entries.length > 0) {\n await ctx.stdout.writeText(entries.join(\" \") + \"\\n\");\n }\n }\n\n if (recursive) {\n for (const entry of entries) {\n const entryPath = ctx.fs.resolve(dirPath, entry);\n try {\n const entryStat = await ctx.fs.stat(entryPath);\n if (entryStat.isDirectory()) {\n const subDisplay = displayPath === \".\" ? entry : `${displayPath}/${entry}`;\n await listDir(entryPath, subDisplay, true);\n }\n } catch {\n // skip entries we can't stat\n }\n }\n }\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 await ctx.stdout.writeText(ctx.fs.basename(path) + \"\\n\");\n continue;\n }\n\n const showHeader = recursive || paths.length > 1;\n await listDir(path, pathArg, showHeader);\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": ";AACA;
|
|
8
|
-
"debugId": "
|
|
7
|
+
"mappings": "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",
|
|
8
|
+
"debugId": "C0BF60626A0B8D0564756E2164756E21",
|
|
9
9
|
"names": []
|
|
10
10
|
}
|
package/package.json
CHANGED