@ecmaos/coreutils 0.2.0 → 0.3.0
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/.turbo/turbo-build.log +1 -1
- package/CHANGELOG.md +25 -0
- package/LICENSE +1 -1
- package/dist/commands/cal.js +2 -2
- package/dist/commands/cal.js.map +1 -1
- package/dist/commands/cat.js +2 -2
- package/dist/commands/cd.js +2 -2
- package/dist/commands/chmod.d.ts.map +1 -1
- package/dist/commands/chmod.js +16 -11
- package/dist/commands/chmod.js.map +1 -1
- package/dist/commands/cp.js +2 -2
- package/dist/commands/cp.js.map +1 -1
- package/dist/commands/date.js +2 -2
- package/dist/commands/date.js.map +1 -1
- package/dist/commands/echo.js +2 -2
- package/dist/commands/echo.js.map +1 -1
- package/dist/commands/false.js +2 -2
- package/dist/commands/fetch.d.ts +4 -0
- package/dist/commands/fetch.d.ts.map +1 -0
- package/dist/commands/fetch.js +210 -0
- package/dist/commands/fetch.js.map +1 -0
- package/dist/commands/format.d.ts +4 -0
- package/dist/commands/format.d.ts.map +1 -0
- package/dist/commands/format.js +178 -0
- package/dist/commands/format.js.map +1 -0
- package/dist/commands/hash.d.ts +4 -0
- package/dist/commands/hash.d.ts.map +1 -0
- package/dist/commands/hash.js +200 -0
- package/dist/commands/hash.js.map +1 -0
- package/dist/commands/head.js +2 -2
- package/dist/commands/id.js +2 -2
- package/dist/commands/id.js.map +1 -1
- package/dist/commands/less.d.ts.map +1 -1
- package/dist/commands/less.js +53 -2
- package/dist/commands/less.js.map +1 -1
- package/dist/commands/ls.d.ts.map +1 -1
- package/dist/commands/ls.js +120 -97
- package/dist/commands/ls.js.map +1 -1
- package/dist/commands/man.d.ts +4 -0
- package/dist/commands/man.d.ts.map +1 -0
- package/dist/commands/man.js +554 -0
- package/dist/commands/man.js.map +1 -0
- package/dist/commands/mkdir.js +2 -2
- package/dist/commands/mkdir.js.map +1 -1
- package/dist/commands/mktemp.d.ts +4 -0
- package/dist/commands/mktemp.d.ts.map +1 -0
- package/dist/commands/mktemp.js +229 -0
- package/dist/commands/mktemp.js.map +1 -0
- package/dist/commands/nc.js +2 -2
- package/dist/commands/nc.js.map +1 -1
- package/dist/commands/passkey.js +3 -3
- package/dist/commands/pwd.js +2 -2
- package/dist/commands/pwd.js.map +1 -1
- package/dist/commands/rm.d.ts.map +1 -1
- package/dist/commands/rm.js +57 -12
- package/dist/commands/rm.js.map +1 -1
- package/dist/commands/rmdir.js +2 -2
- package/dist/commands/rmdir.js.map +1 -1
- package/dist/commands/sockets.js +1 -1
- package/dist/commands/stat.d.ts.map +1 -1
- package/dist/commands/stat.js +37 -15
- package/dist/commands/stat.js.map +1 -1
- package/dist/commands/tail.js +2 -2
- package/dist/commands/tar.d.ts +4 -0
- package/dist/commands/tar.d.ts.map +1 -0
- package/dist/commands/tar.js +693 -0
- package/dist/commands/tar.js.map +1 -0
- package/dist/commands/touch.js +2 -2
- package/dist/commands/touch.js.map +1 -1
- package/dist/commands/true.js +2 -2
- package/dist/commands/unzip.d.ts +4 -0
- package/dist/commands/unzip.d.ts.map +1 -0
- package/dist/commands/unzip.js +443 -0
- package/dist/commands/unzip.js.map +1 -0
- package/dist/commands/user.d.ts +4 -0
- package/dist/commands/user.d.ts.map +1 -0
- package/dist/commands/user.js +427 -0
- package/dist/commands/user.js.map +1 -0
- package/dist/commands/whoami.js +2 -2
- package/dist/commands/whoami.js.map +1 -1
- package/dist/commands/zip.d.ts +4 -0
- package/dist/commands/zip.d.ts.map +1 -0
- package/dist/commands/zip.js +264 -0
- package/dist/commands/zip.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +28 -1
- package/dist/index.js.map +1 -1
- package/package.json +6 -4
- package/src/commands/cal.ts +2 -2
- package/src/commands/cat.ts +2 -2
- package/src/commands/cd.ts +2 -2
- package/src/commands/chmod.ts +19 -11
- package/src/commands/cp.ts +2 -2
- package/src/commands/date.ts +2 -2
- package/src/commands/echo.ts +2 -2
- package/src/commands/false.ts +2 -2
- package/src/commands/fetch.ts +205 -0
- package/src/commands/format.ts +204 -0
- package/src/commands/hash.ts +215 -0
- package/src/commands/head.ts +2 -2
- package/src/commands/id.ts +2 -2
- package/src/commands/less.ts +50 -2
- package/src/commands/ls.ts +131 -91
- package/src/commands/man.ts +643 -0
- package/src/commands/mkdir.ts +2 -2
- package/src/commands/mktemp.ts +235 -0
- package/src/commands/nc.ts +2 -2
- package/src/commands/passkey.ts +3 -3
- package/src/commands/pwd.ts +2 -2
- package/src/commands/rm.ts +54 -12
- package/src/commands/rmdir.ts +2 -2
- package/src/commands/sockets.ts +1 -1
- package/src/commands/stat.ts +44 -16
- package/src/commands/tail.ts +2 -2
- package/src/commands/tar.ts +737 -0
- package/src/commands/touch.ts +2 -2
- package/src/commands/true.ts +2 -2
- package/src/commands/unzip.ts +517 -0
- package/src/commands/user.ts +436 -0
- package/src/commands/whoami.ts +2 -2
- package/src/commands/zip.ts +319 -0
- package/src/index.ts +28 -1
|
@@ -0,0 +1,554 @@
|
|
|
1
|
+
import ansi from 'ansi-escape-sequences';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
import { TerminalCommand } from '../shared/terminal-command.js';
|
|
4
|
+
import { writelnStderr } from '../shared/helpers.js';
|
|
5
|
+
function printUsage(process, terminal) {
|
|
6
|
+
const usage = `Usage: man [OPTION]... [@scope/]package[/topic[/subtopic...]]
|
|
7
|
+
Display manual pages.
|
|
8
|
+
|
|
9
|
+
-l, --list list available topics for a package
|
|
10
|
+
--where PATH override default documentation path
|
|
11
|
+
--help display this help and exit
|
|
12
|
+
|
|
13
|
+
Examples:
|
|
14
|
+
man package-name display index for package-name
|
|
15
|
+
man @scope/package display index for @scope/package
|
|
16
|
+
man -l @scope/package list topics for @scope/package
|
|
17
|
+
man package-name/topic display topic from package-name
|
|
18
|
+
man @scope/package/docs display docs/index from @scope/package`;
|
|
19
|
+
writelnStderr(process, terminal, usage);
|
|
20
|
+
}
|
|
21
|
+
function resolveManPath(shell, whereArg) {
|
|
22
|
+
if (whereArg)
|
|
23
|
+
return [whereArg];
|
|
24
|
+
const manpath = shell.env.get('MANPATH');
|
|
25
|
+
if (manpath)
|
|
26
|
+
return manpath.split(':').filter(p => p.length > 0);
|
|
27
|
+
return ['/usr/share/docs'];
|
|
28
|
+
}
|
|
29
|
+
function parsePackagePath(pathStr) {
|
|
30
|
+
if (!pathStr || pathStr.length === 0)
|
|
31
|
+
return null;
|
|
32
|
+
const parts = pathStr.split('/');
|
|
33
|
+
if (parts.length === 0)
|
|
34
|
+
return null;
|
|
35
|
+
if (parts[0]?.startsWith('@')) {
|
|
36
|
+
if (parts.length === 1)
|
|
37
|
+
return null;
|
|
38
|
+
const firstPart = parts[0];
|
|
39
|
+
const packageName = parts[1];
|
|
40
|
+
if (!firstPart || !packageName)
|
|
41
|
+
return null;
|
|
42
|
+
const scope = firstPart.slice(1);
|
|
43
|
+
const topic = parts.length > 2 ? parts.slice(2).join('/') : undefined;
|
|
44
|
+
return { scope, package: packageName, topic };
|
|
45
|
+
}
|
|
46
|
+
else {
|
|
47
|
+
const packageName = parts[0];
|
|
48
|
+
if (!packageName)
|
|
49
|
+
return null;
|
|
50
|
+
const topic = parts.length > 1 ? parts.slice(1).join('/') : undefined;
|
|
51
|
+
return { package: packageName, topic };
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
function buildPackagePath(manpath, pkgPath) {
|
|
55
|
+
if (pkgPath.scope)
|
|
56
|
+
return path.join(manpath, `@${pkgPath.scope}`, pkgPath.package);
|
|
57
|
+
return path.join(manpath, pkgPath.package);
|
|
58
|
+
}
|
|
59
|
+
async function findDocument(fs, packageDir, topic) {
|
|
60
|
+
const extensions = ['.md', '.txt', '.html'];
|
|
61
|
+
const baseName = topic || 'index';
|
|
62
|
+
// First, check for a file with the topic name directly
|
|
63
|
+
for (const ext of extensions) {
|
|
64
|
+
const filePath = path.join(packageDir, `${baseName}${ext}`);
|
|
65
|
+
if (await fs.promises.exists(filePath))
|
|
66
|
+
return filePath;
|
|
67
|
+
}
|
|
68
|
+
// If topic contains a path or is a directory, look for index files in that directory
|
|
69
|
+
if (topic) {
|
|
70
|
+
const topicDir = path.join(packageDir, topic);
|
|
71
|
+
try {
|
|
72
|
+
const stat = await fs.promises.stat(topicDir);
|
|
73
|
+
if (stat.isDirectory()) {
|
|
74
|
+
for (const ext of extensions) {
|
|
75
|
+
const indexPath = path.join(topicDir, `index${ext}`);
|
|
76
|
+
if (await fs.promises.exists(indexPath))
|
|
77
|
+
return indexPath;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
catch {
|
|
82
|
+
// Directory doesn't exist, continue
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
return null;
|
|
86
|
+
}
|
|
87
|
+
async function listTopics(fs, packageDir, prefix = '') {
|
|
88
|
+
const topics = [];
|
|
89
|
+
try {
|
|
90
|
+
if (!(await fs.promises.exists(packageDir)))
|
|
91
|
+
return topics;
|
|
92
|
+
const entries = await fs.promises.readdir(packageDir);
|
|
93
|
+
for (const entry of entries) {
|
|
94
|
+
if (entry === 'metadata.json' || entry === 'index.md' || entry === 'index.txt' || entry === 'index.html') {
|
|
95
|
+
continue;
|
|
96
|
+
}
|
|
97
|
+
const fullPath = path.join(packageDir, entry);
|
|
98
|
+
const stat = await fs.promises.stat(fullPath);
|
|
99
|
+
if (stat.isFile()) {
|
|
100
|
+
const ext = path.extname(entry);
|
|
101
|
+
if (ext === '.md' || ext === '.txt' || ext === '.html') {
|
|
102
|
+
const baseName = path.basename(entry, ext);
|
|
103
|
+
if (baseName && baseName !== 'index') {
|
|
104
|
+
topics.push(prefix ? `${prefix}/${baseName}` : baseName);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
else if (stat.isDirectory()) {
|
|
109
|
+
// Check if subdirectory has an index file (making it a valid topic)
|
|
110
|
+
const subDir = fullPath;
|
|
111
|
+
const hasIndex = await fs.promises.exists(path.join(subDir, 'index.md')) ||
|
|
112
|
+
await fs.promises.exists(path.join(subDir, 'index.txt')) ||
|
|
113
|
+
await fs.promises.exists(path.join(subDir, 'index.html'));
|
|
114
|
+
if (hasIndex) {
|
|
115
|
+
const topicName = prefix ? `${prefix}/${entry}` : entry;
|
|
116
|
+
topics.push(topicName);
|
|
117
|
+
}
|
|
118
|
+
// Recursively list topics in subdirectory
|
|
119
|
+
const subTopics = await listTopics(fs, subDir, prefix ? `${prefix}/${entry}` : entry);
|
|
120
|
+
topics.push(...subTopics);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
catch {
|
|
125
|
+
}
|
|
126
|
+
return topics.sort();
|
|
127
|
+
}
|
|
128
|
+
async function parseMetadata(fs, packageDir) {
|
|
129
|
+
const metadataPath = path.join(packageDir, 'metadata.json');
|
|
130
|
+
try {
|
|
131
|
+
if (await fs.promises.exists(metadataPath)) {
|
|
132
|
+
const content = await fs.promises.readFile(metadataPath, 'utf-8');
|
|
133
|
+
return JSON.parse(content);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
catch { }
|
|
137
|
+
return null;
|
|
138
|
+
}
|
|
139
|
+
function convertMarkdownToText(content, _currentPackage, _currentManpath) {
|
|
140
|
+
let result = content;
|
|
141
|
+
// Strip HTML comments: <!-- ... -->
|
|
142
|
+
// - Safe: Processed first to remove comments before any other processing
|
|
143
|
+
// - Safe: Uses non-greedy match to handle multiple comments
|
|
144
|
+
// - Safe: Can span multiple lines
|
|
145
|
+
result = result.replace(/<!--[\s\S]*?-->/g, '');
|
|
146
|
+
// Process code blocks FIRST to avoid processing markdown inside them
|
|
147
|
+
// Code blocks: /^```[\s\S]*?^```/gm
|
|
148
|
+
// - Pattern matches fenced code blocks (```...```)
|
|
149
|
+
// - Uses non-greedy match to handle multiple code blocks
|
|
150
|
+
// - Replace with placeholders that won't match any markdown patterns
|
|
151
|
+
const codeBlockPlaceholders = [];
|
|
152
|
+
result = result.replace(/^```[\s\S]*?^```/gm, (match) => {
|
|
153
|
+
const code = match.replace(/^```[^\n]*\n/, '').replace(/\n```$/, '');
|
|
154
|
+
const formatted = '\n' + code.split('\n').map(line => ' ' + line).join('\n') + '\n';
|
|
155
|
+
const placeholder = `__CODE_BLOCK_${codeBlockPlaceholders.length}__`;
|
|
156
|
+
codeBlockPlaceholders.push(formatted);
|
|
157
|
+
return placeholder;
|
|
158
|
+
});
|
|
159
|
+
// Headings: /^(#{1,6})\s+(.+)$/gm
|
|
160
|
+
// - Safe: Uses ^ and $ with m flag (line anchors)
|
|
161
|
+
// - Safe: Requires whitespace after # characters
|
|
162
|
+
// - Safe: Won't match inside code blocks (already replaced with placeholders)
|
|
163
|
+
result = result.replace(/^(#{1,6})\s+(.+)$/gm, (_match, hashes, text) => {
|
|
164
|
+
const level = hashes.length;
|
|
165
|
+
if (level === 1)
|
|
166
|
+
return ansi.format(text, ['bold', 'underline']) + '\n';
|
|
167
|
+
else if (level === 2)
|
|
168
|
+
return ansi.format(text, ['bold']) + '\n';
|
|
169
|
+
else
|
|
170
|
+
return ansi.format(text, ['bold']) + '\n';
|
|
171
|
+
});
|
|
172
|
+
// Inline code: /`([^`]+)`/g
|
|
173
|
+
// - Safe: Processed after code blocks, so won't match inside code blocks
|
|
174
|
+
// - Safe: [^`]+ ensures it won't match empty content
|
|
175
|
+
// - Safe: Won't match across lines (backticks must be on same line)
|
|
176
|
+
// - Safe: Processed early to protect code snippets from other markdown
|
|
177
|
+
result = result.replace(/`([^`]+)`/g, (_, code) => ansi.format(code, ['cyan']));
|
|
178
|
+
// Restore code blocks
|
|
179
|
+
for (let i = 0; i < codeBlockPlaceholders.length; i++) {
|
|
180
|
+
const placeholder = codeBlockPlaceholders[i];
|
|
181
|
+
if (placeholder) {
|
|
182
|
+
result = result.replace(`__CODE_BLOCK_${i}__`, placeholder);
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
// Bold text: /\*\*(.+?)\*\*/g
|
|
186
|
+
// - Safe: Processed after code blocks, so won't match inside code blocks
|
|
187
|
+
// - Safe: Non-greedy (.+?) ensures it matches the shortest valid bold text
|
|
188
|
+
// - Safe: Requires at least one character between ** (won't match empty)
|
|
189
|
+
// - Safe: Processed BEFORE italic to avoid conflicts
|
|
190
|
+
// - Note: Can match inside headings (e.g., "## **Bold Heading**") which is valid markdown
|
|
191
|
+
result = result.replace(/\*\*(.+?)\*\*/g, (_, text) => ansi.format(text, ['bold']));
|
|
192
|
+
// Italic text: /\*(?![*])(.+?)\*/g
|
|
193
|
+
// - Safe: Processed after code blocks and bold, so won't match inside code blocks or **bold**
|
|
194
|
+
// - Safe: Negative lookahead (?![*]) ensures it doesn't match if followed by *
|
|
195
|
+
// - Safe: Non-greedy (.+?) ensures it matches the shortest valid italic text
|
|
196
|
+
// - Safe: Requires at least one character between * (won't match empty)
|
|
197
|
+
// - Safe: Can match inside bold text (e.g., "**bold *italic* bold**") which is valid markdown
|
|
198
|
+
// - Note: Using 'gray' color since many terminals don't render italic styling visibly
|
|
199
|
+
result = result.replace(/\*(?![*])(.+?)\*/g, (_, text) => ansi.format(text, ['gray']));
|
|
200
|
+
// URLs: Color any URLs (http://, https://, mailto:) as blue
|
|
201
|
+
// - Safe: Processed after code blocks, so won't match inside code blocks
|
|
202
|
+
// - Safe: Matches common URL patterns, stops at whitespace or common punctuation
|
|
203
|
+
// - Safe: Won't match URLs that are already inside formatted text (escape sequences)
|
|
204
|
+
// - Note: Pattern excludes trailing punctuation like ), ], but allows . (periods are valid in URLs)
|
|
205
|
+
const urlPattern = /(https?:\/\/[^\s<>"',;!)\]\)]+|mailto:[^\s<>"',;!)\]\)]+)/gi;
|
|
206
|
+
result = result.replace(urlPattern, (url) => {
|
|
207
|
+
return ansi.format(url, ['blue']);
|
|
208
|
+
});
|
|
209
|
+
return result;
|
|
210
|
+
}
|
|
211
|
+
function convertHtmlToText(content, _currentPackage, _currentManpath) {
|
|
212
|
+
let result = content;
|
|
213
|
+
// Strip HTML comments: <!-- ... -->
|
|
214
|
+
result = result.replace(/<!--[\s\S]*?-->/g, '');
|
|
215
|
+
// Strip head, style, script, nav, footer tags and their content
|
|
216
|
+
result = result.replace(/<head[^>]*>[\s\S]*?<\/head>/gi, '');
|
|
217
|
+
result = result.replace(/<style[^>]*>[\s\S]*?<\/style>/gi, '');
|
|
218
|
+
result = result.replace(/<script[^>]*>[\s\S]*?<\/script>/gi, '');
|
|
219
|
+
result = result.replace(/<nav[^>]*>[\s\S]*?<\/nav>/gi, '');
|
|
220
|
+
result = result.replace(/<footer[^>]*>[\s\S]*?<\/footer>/gi, '');
|
|
221
|
+
// Add line breaks before/after block elements
|
|
222
|
+
result = result.replace(/<br\s*\/?>/gi, '\n');
|
|
223
|
+
result = result.replace(/<\/p>/gi, '\n\n');
|
|
224
|
+
result = result.replace(/<\/div>/gi, '\n');
|
|
225
|
+
result = result.replace(/<\/li>/gi, '\n');
|
|
226
|
+
result = result.replace(/<\/tr>/gi, '\n');
|
|
227
|
+
result = result.replace(/<hr[^>]*>/gi, '\n---\n');
|
|
228
|
+
// List items - add bullet
|
|
229
|
+
result = result.replace(/<li[^>]*>/gi, ' • ');
|
|
230
|
+
result = result.replace(/<h1[^>]*>(.*?)<\/h1>/gi, (_, text) => {
|
|
231
|
+
return ansi.format(text.replace(/<[^>]+>/g, ''), ['bold', 'underline']) + '\n';
|
|
232
|
+
});
|
|
233
|
+
result = result.replace(/<h2[^>]*>(.*?)<\/h2>/gi, (_, text) => {
|
|
234
|
+
return ansi.format(text.replace(/<[^>]+>/g, ''), ['bold']) + '\n';
|
|
235
|
+
});
|
|
236
|
+
result = result.replace(/<h[3-6][^>]*>(.*?)<\/h[3-6]>/gi, (_, text) => {
|
|
237
|
+
return ansi.format(text.replace(/<[^>]+>/g, ''), ['bold']) + '\n';
|
|
238
|
+
});
|
|
239
|
+
result = result.replace(/<strong[^>]*>(.*?)<\/strong>/gi, (_, text) => {
|
|
240
|
+
return ansi.format(text.replace(/<[^>]+>/g, ''), ['bold']);
|
|
241
|
+
});
|
|
242
|
+
result = result.replace(/<b[^>]*>(.*?)<\/b>/gi, (_, text) => {
|
|
243
|
+
return ansi.format(text.replace(/<[^>]+>/g, ''), ['bold']);
|
|
244
|
+
});
|
|
245
|
+
result = result.replace(/<em[^>]*>(.*?)<\/em>/gi, (_, text) => {
|
|
246
|
+
return ansi.format(text.replace(/<[^>]+>/g, ''), ['gray']);
|
|
247
|
+
});
|
|
248
|
+
result = result.replace(/<i[^>]*>(.*?)<\/i>/gi, (_, text) => {
|
|
249
|
+
return ansi.format(text.replace(/<[^>]+>/g, ''), ['gray']);
|
|
250
|
+
});
|
|
251
|
+
result = result.replace(/<code[^>]*>(.*?)<\/code>/gi, (_, text) => {
|
|
252
|
+
return ansi.format(text.replace(/<[^>]+>/g, ''), ['cyan']);
|
|
253
|
+
});
|
|
254
|
+
result = result.replace(/<pre[^>]*>(.*?)<\/pre>/gis, (_, text) => {
|
|
255
|
+
const code = text.replace(/<[^>]+>/g, '');
|
|
256
|
+
return '\n' + code.split('\n').map((line) => ' ' + line).join('\n') + '\n';
|
|
257
|
+
});
|
|
258
|
+
result = result.replace(/<[^>]+>/g, '');
|
|
259
|
+
// Decode HTML entities
|
|
260
|
+
result = result.replace(/ /g, ' ');
|
|
261
|
+
result = result.replace(/</g, '<');
|
|
262
|
+
result = result.replace(/>/g, '>');
|
|
263
|
+
result = result.replace(/&/g, '&');
|
|
264
|
+
result = result.replace(/"/g, '"');
|
|
265
|
+
result = result.replace(/'/g, "'");
|
|
266
|
+
result = result.replace(/'/g, "'");
|
|
267
|
+
result = result.replace(/&#(\d+);/g, (_, code) => String.fromCharCode(parseInt(code, 10)));
|
|
268
|
+
// Clean up whitespace
|
|
269
|
+
result = result.replace(/[ \t]+/g, ' ');
|
|
270
|
+
result = result.replace(/\n[ \t]+/g, '\n');
|
|
271
|
+
result = result.replace(/[ \t]+\n/g, '\n');
|
|
272
|
+
result = result.replace(/\n{3,}/g, '\n\n');
|
|
273
|
+
result = result.trim();
|
|
274
|
+
// URLs: Color any URLs (http://, https://, mailto:) as blue
|
|
275
|
+
const urlPattern = /(https?:\/\/[^\s<>"',;:!?)\]\)]+|mailto:[^\s<>"',;:!?)\]\)]+)/gi;
|
|
276
|
+
result = result.replace(urlPattern, (url) => {
|
|
277
|
+
return ansi.format(url, ['blue']);
|
|
278
|
+
});
|
|
279
|
+
return result;
|
|
280
|
+
}
|
|
281
|
+
async function displayManPage(terminal, content, documentName) {
|
|
282
|
+
const lines = content.split('\n');
|
|
283
|
+
let currentLine = 0;
|
|
284
|
+
let horizontalOffset = 0;
|
|
285
|
+
let keyListener = null;
|
|
286
|
+
let linesRendered = 0;
|
|
287
|
+
terminal.unlisten();
|
|
288
|
+
terminal.write('\n');
|
|
289
|
+
terminal.write(ansi.cursor.hide);
|
|
290
|
+
const rows = terminal.rows;
|
|
291
|
+
const displayRows = rows - 1;
|
|
292
|
+
const render = () => {
|
|
293
|
+
const cols = terminal.cols;
|
|
294
|
+
const stripAnsi = (s) => s.replace(/\x1b\[[0-9;]*[a-zA-Z]/g, '');
|
|
295
|
+
const getVisibleSlice = (line, offset) => {
|
|
296
|
+
const visibleLen = stripAnsi(line).length;
|
|
297
|
+
if (offset < 0)
|
|
298
|
+
offset = 0;
|
|
299
|
+
if (offset > visibleLen)
|
|
300
|
+
offset = visibleLen;
|
|
301
|
+
let visible = 0;
|
|
302
|
+
let result = '';
|
|
303
|
+
let inEscape = false;
|
|
304
|
+
let charsSkipped = 0;
|
|
305
|
+
for (const char of line) {
|
|
306
|
+
if (char === '\x1b')
|
|
307
|
+
inEscape = true;
|
|
308
|
+
if (inEscape) {
|
|
309
|
+
if (charsSkipped >= offset) {
|
|
310
|
+
result += char;
|
|
311
|
+
}
|
|
312
|
+
if (/[a-zA-Z]/.test(char))
|
|
313
|
+
inEscape = false;
|
|
314
|
+
}
|
|
315
|
+
else {
|
|
316
|
+
if (charsSkipped < offset) {
|
|
317
|
+
charsSkipped++;
|
|
318
|
+
}
|
|
319
|
+
else {
|
|
320
|
+
if (visible >= cols)
|
|
321
|
+
break;
|
|
322
|
+
result += char;
|
|
323
|
+
visible++;
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
return result;
|
|
328
|
+
};
|
|
329
|
+
const maxLine = Math.max(0, lines.length - displayRows);
|
|
330
|
+
if (currentLine > maxLine)
|
|
331
|
+
currentLine = maxLine;
|
|
332
|
+
if (currentLine < 0)
|
|
333
|
+
currentLine = 0;
|
|
334
|
+
const maxLineLength = Math.max(...lines.map(l => stripAnsi(l).length), 0);
|
|
335
|
+
const maxHorizontalOffset = Math.max(0, maxLineLength - cols);
|
|
336
|
+
if (horizontalOffset > maxHorizontalOffset)
|
|
337
|
+
horizontalOffset = maxHorizontalOffset;
|
|
338
|
+
if (horizontalOffset < 0)
|
|
339
|
+
horizontalOffset = 0;
|
|
340
|
+
if (linesRendered > 0)
|
|
341
|
+
terminal.write(ansi.cursor.up(linesRendered));
|
|
342
|
+
const endLine = Math.min(currentLine + displayRows, lines.length);
|
|
343
|
+
linesRendered = 0;
|
|
344
|
+
for (let i = currentLine; i < endLine; i++) {
|
|
345
|
+
terminal.write(ansi.erase.inLine(2));
|
|
346
|
+
const line = getVisibleSlice(lines[i] || '', horizontalOffset);
|
|
347
|
+
terminal.write(line);
|
|
348
|
+
linesRendered++;
|
|
349
|
+
if (i < endLine - 1)
|
|
350
|
+
terminal.write('\n');
|
|
351
|
+
}
|
|
352
|
+
for (let i = endLine - currentLine; i < displayRows; i++) {
|
|
353
|
+
terminal.write('\n');
|
|
354
|
+
terminal.write(ansi.erase.inLine(2));
|
|
355
|
+
linesRendered++;
|
|
356
|
+
}
|
|
357
|
+
const percentage = lines.length > 0 ? Math.round(((endLine / lines.length) * 100)) : 100;
|
|
358
|
+
const statusLine = `-- ${documentName} ${currentLine + 1}-${endLine} / ${lines.length} (${percentage}%)`;
|
|
359
|
+
terminal.write('\n');
|
|
360
|
+
terminal.write(ansi.erase.inLine(2));
|
|
361
|
+
terminal.write(getVisibleSlice(statusLine, 0));
|
|
362
|
+
linesRendered++;
|
|
363
|
+
};
|
|
364
|
+
render();
|
|
365
|
+
await new Promise((resolve) => {
|
|
366
|
+
keyListener = terminal.onKey(async ({ domEvent }) => {
|
|
367
|
+
const keyName = domEvent.key;
|
|
368
|
+
switch (keyName) {
|
|
369
|
+
case 'q':
|
|
370
|
+
case 'Q':
|
|
371
|
+
case 'Escape':
|
|
372
|
+
if (keyListener) {
|
|
373
|
+
keyListener.dispose();
|
|
374
|
+
keyListener = null;
|
|
375
|
+
}
|
|
376
|
+
terminal.write(ansi.cursor.show);
|
|
377
|
+
terminal.write('\n');
|
|
378
|
+
terminal.listen();
|
|
379
|
+
resolve();
|
|
380
|
+
return;
|
|
381
|
+
case 'ArrowUp':
|
|
382
|
+
if (currentLine > 0) {
|
|
383
|
+
currentLine--;
|
|
384
|
+
render();
|
|
385
|
+
}
|
|
386
|
+
break;
|
|
387
|
+
case 'ArrowDown':
|
|
388
|
+
case 'Enter':
|
|
389
|
+
currentLine++;
|
|
390
|
+
render();
|
|
391
|
+
break;
|
|
392
|
+
case 'ArrowLeft':
|
|
393
|
+
horizontalOffset = Math.max(0, horizontalOffset - Math.floor(terminal.cols / 2));
|
|
394
|
+
render();
|
|
395
|
+
break;
|
|
396
|
+
case 'ArrowRight':
|
|
397
|
+
horizontalOffset += Math.floor(terminal.cols / 2);
|
|
398
|
+
render();
|
|
399
|
+
break;
|
|
400
|
+
case 'PageDown':
|
|
401
|
+
case ' ':
|
|
402
|
+
currentLine = Math.min(currentLine + displayRows, Math.max(0, lines.length - displayRows));
|
|
403
|
+
render();
|
|
404
|
+
break;
|
|
405
|
+
case 'PageUp':
|
|
406
|
+
case 'b':
|
|
407
|
+
case 'B':
|
|
408
|
+
currentLine = Math.max(0, currentLine - displayRows);
|
|
409
|
+
render();
|
|
410
|
+
break;
|
|
411
|
+
case 'Home':
|
|
412
|
+
case 'g':
|
|
413
|
+
currentLine = 0;
|
|
414
|
+
render();
|
|
415
|
+
break;
|
|
416
|
+
case 'End':
|
|
417
|
+
case 'G':
|
|
418
|
+
currentLine = Math.max(0, lines.length - displayRows);
|
|
419
|
+
render();
|
|
420
|
+
break;
|
|
421
|
+
}
|
|
422
|
+
});
|
|
423
|
+
});
|
|
424
|
+
}
|
|
425
|
+
export function createCommand(kernel, shell, terminal) {
|
|
426
|
+
return new TerminalCommand({
|
|
427
|
+
command: 'man',
|
|
428
|
+
description: 'Display manual pages',
|
|
429
|
+
kernel,
|
|
430
|
+
shell,
|
|
431
|
+
terminal,
|
|
432
|
+
run: async (pid, argv) => {
|
|
433
|
+
const process = kernel.processes.get(pid);
|
|
434
|
+
if (!process)
|
|
435
|
+
return 1;
|
|
436
|
+
if (argv.length > 0 && (argv[0] === '--help' || argv[0] === '-h')) {
|
|
437
|
+
printUsage(process, terminal);
|
|
438
|
+
return 0;
|
|
439
|
+
}
|
|
440
|
+
let whereArg;
|
|
441
|
+
let topicPath;
|
|
442
|
+
let listTopicsFlag = false;
|
|
443
|
+
for (let i = 0; i < argv.length; i++) {
|
|
444
|
+
const arg = argv[i];
|
|
445
|
+
if (arg === undefined)
|
|
446
|
+
continue;
|
|
447
|
+
if (arg === '--where') {
|
|
448
|
+
if (i + 1 < argv.length) {
|
|
449
|
+
i++;
|
|
450
|
+
whereArg = argv[i];
|
|
451
|
+
}
|
|
452
|
+
else {
|
|
453
|
+
await writelnStderr(process, terminal, 'man: missing argument to --where');
|
|
454
|
+
return 1;
|
|
455
|
+
}
|
|
456
|
+
}
|
|
457
|
+
else if (arg === '--list' || arg === '-l') {
|
|
458
|
+
listTopicsFlag = true;
|
|
459
|
+
}
|
|
460
|
+
else if (!arg.startsWith('-')) {
|
|
461
|
+
topicPath = arg;
|
|
462
|
+
}
|
|
463
|
+
}
|
|
464
|
+
if (!topicPath) {
|
|
465
|
+
topicPath = '@ecmaos/kernel';
|
|
466
|
+
}
|
|
467
|
+
const pkgPath = parsePackagePath(topicPath);
|
|
468
|
+
if (!pkgPath) {
|
|
469
|
+
await writelnStderr(process, terminal, `man: invalid package path: ${topicPath}`);
|
|
470
|
+
return 1;
|
|
471
|
+
}
|
|
472
|
+
const manpaths = resolveManPath(shell, whereArg);
|
|
473
|
+
for (const manpath of manpaths) {
|
|
474
|
+
const packageDir = buildPackagePath(manpath, pkgPath);
|
|
475
|
+
if (!(await shell.context.fs.promises.exists(packageDir)))
|
|
476
|
+
continue;
|
|
477
|
+
await parseMetadata(shell.context.fs, packageDir);
|
|
478
|
+
if (listTopicsFlag) {
|
|
479
|
+
const topics = await listTopics(shell.context.fs, packageDir);
|
|
480
|
+
const packageName = pkgPath.scope ? `@${pkgPath.scope}/${pkgPath.package}` : pkgPath.package;
|
|
481
|
+
if (topics.length === 0) {
|
|
482
|
+
terminal.writeln(`${packageName}: no topics available`);
|
|
483
|
+
}
|
|
484
|
+
else {
|
|
485
|
+
terminal.writeln(`${packageName}:`);
|
|
486
|
+
for (const topic of topics) {
|
|
487
|
+
terminal.writeln(` ${topic}`);
|
|
488
|
+
}
|
|
489
|
+
}
|
|
490
|
+
return 0;
|
|
491
|
+
}
|
|
492
|
+
if (!pkgPath.topic) {
|
|
493
|
+
const indexFile = await findDocument(shell.context.fs, packageDir);
|
|
494
|
+
if (indexFile) {
|
|
495
|
+
const content = await shell.context.fs.promises.readFile(indexFile, 'utf-8');
|
|
496
|
+
const ext = path.extname(indexFile);
|
|
497
|
+
let processedContent = content;
|
|
498
|
+
if (ext === '.md') {
|
|
499
|
+
processedContent = convertMarkdownToText(content, pkgPath, manpath);
|
|
500
|
+
}
|
|
501
|
+
else if (ext === '.html') {
|
|
502
|
+
processedContent = convertHtmlToText(content, pkgPath, manpath);
|
|
503
|
+
}
|
|
504
|
+
const documentName = pkgPath.scope
|
|
505
|
+
? `@${pkgPath.scope}/${pkgPath.package}`
|
|
506
|
+
: pkgPath.package;
|
|
507
|
+
await displayManPage(terminal, processedContent, documentName);
|
|
508
|
+
}
|
|
509
|
+
else {
|
|
510
|
+
const topics = await listTopics(shell.context.fs, packageDir);
|
|
511
|
+
const packageName = pkgPath.scope ? `@${pkgPath.scope}/${pkgPath.package}` : pkgPath.package;
|
|
512
|
+
if (topics.length === 0) {
|
|
513
|
+
terminal.writeln(`${packageName}: no topics available`);
|
|
514
|
+
}
|
|
515
|
+
else {
|
|
516
|
+
const exampleTopic = topics[0];
|
|
517
|
+
terminal.writeln(`${kernel.i18n.t('coreutils.man.noIndexFound', 'No index found, try a topic:')} man ${packageName}/${exampleTopic}`);
|
|
518
|
+
terminal.writeln(`${packageName} ${kernel.i18n.t('topics')}:`);
|
|
519
|
+
for (const topic of topics)
|
|
520
|
+
terminal.writeln(` ${topic}`);
|
|
521
|
+
}
|
|
522
|
+
}
|
|
523
|
+
return 0;
|
|
524
|
+
}
|
|
525
|
+
const docFile = await findDocument(shell.context.fs, packageDir, pkgPath.topic);
|
|
526
|
+
if (!docFile)
|
|
527
|
+
continue;
|
|
528
|
+
try {
|
|
529
|
+
const content = await shell.context.fs.promises.readFile(docFile, 'utf-8');
|
|
530
|
+
const ext = path.extname(docFile);
|
|
531
|
+
let processedContent = content;
|
|
532
|
+
if (ext === '.md') {
|
|
533
|
+
processedContent = convertMarkdownToText(content, pkgPath, manpath);
|
|
534
|
+
}
|
|
535
|
+
else if (ext === '.html') {
|
|
536
|
+
processedContent = convertHtmlToText(content, pkgPath, manpath);
|
|
537
|
+
}
|
|
538
|
+
const documentName = pkgPath.scope
|
|
539
|
+
? `@${pkgPath.scope}/${pkgPath.package}/${pkgPath.topic}`
|
|
540
|
+
: `${pkgPath.package}/${pkgPath.topic}`;
|
|
541
|
+
await displayManPage(terminal, processedContent, documentName);
|
|
542
|
+
return 0;
|
|
543
|
+
}
|
|
544
|
+
catch (error) {
|
|
545
|
+
await writelnStderr(process, terminal, `man: error reading document: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
|
546
|
+
return 1;
|
|
547
|
+
}
|
|
548
|
+
}
|
|
549
|
+
await writelnStderr(process, terminal, `man: no manual entry for ${topicPath}`);
|
|
550
|
+
return 1;
|
|
551
|
+
}
|
|
552
|
+
});
|
|
553
|
+
}
|
|
554
|
+
//# sourceMappingURL=man.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"man.js","sourceRoot":"","sources":["../../src/commands/man.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/mkdir.js
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import path from 'path';
|
|
2
2
|
import { TerminalCommand } from '../shared/terminal-command.js';
|
|
3
|
-
import {
|
|
3
|
+
import { writelnStderr } from '../shared/helpers.js';
|
|
4
4
|
function printUsage(process, terminal) {
|
|
5
5
|
const usage = `Usage: mkdir [OPTION]... DIRECTORY...
|
|
6
6
|
Create the DIRECTORY(ies), if they do not already exist.
|
|
7
7
|
|
|
8
8
|
--help display this help and exit`;
|
|
9
|
-
|
|
9
|
+
writelnStderr(process, terminal, usage);
|
|
10
10
|
}
|
|
11
11
|
export function createCommand(kernel, shell, terminal) {
|
|
12
12
|
return new TerminalCommand({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mkdir.js","sourceRoot":"","sources":["../../src/commands/mkdir.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAA;AAEvB,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAA;AAC/D,OAAO,EAAE,aAAa,EAAE,
|
|
1
|
+
{"version":3,"file":"mkdir.js","sourceRoot":"","sources":["../../src/commands/mkdir.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAA;AAEvB,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAA;AAC/D,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AAEpD,SAAS,UAAU,CAAC,OAA4B,EAAE,QAAkB;IAClE,MAAM,KAAK,GAAG;;;qCAGqB,CAAA;IACnC,aAAa,CAAC,OAAO,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAA;AACzC,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,MAAc,EAAE,KAAY,EAAE,QAAkB;IAC5E,OAAO,IAAI,eAAe,CAAC;QACzB,OAAO,EAAE,OAAO;QAChB,WAAW,EAAE,oBAAoB;QACjC,MAAM;QACN,KAAK;QACL,QAAQ;QACR,GAAG,EAAE,KAAK,EAAE,GAAW,EAAE,IAAc,EAAE,EAAE;YACzC,MAAM,OAAO,GAAG,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAwB,CAAA;YAEhE,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,QAAQ,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,EAAE,CAAC;gBAClE,UAAU,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAA;gBAC7B,OAAO,CAAC,CAAA;YACV,CAAC;YAED,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACtB,MAAM,aAAa,CAAC,OAAO,EAAE,QAAQ,EAAE,wBAAwB,CAAC,CAAA;gBAChE,MAAM,aAAa,CAAC,OAAO,EAAE,QAAQ,EAAE,0CAA0C,CAAC,CAAA;gBAClF,OAAO,CAAC,CAAA;YACV,CAAC;YAED,IAAI,QAAQ,GAAG,KAAK,CAAA;YAEpB,KAAK,MAAM,MAAM,IAAI,IAAI,EAAE,CAAC;gBAC1B,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC;oBAAE,SAAQ;gBAE/C,MAAM,QAAQ,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAA;gBAErE,IAAI,CAAC;oBACH,MAAM,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAA;gBACjD,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,MAAM,YAAY,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;oBAC3E,MAAM,aAAa,CAAC,OAAO,EAAE,QAAQ,EAAE,UAAU,MAAM,KAAK,YAAY,EAAE,CAAC,CAAA;oBAC3E,QAAQ,GAAG,IAAI,CAAA;gBACjB,CAAC;YACH,CAAC;YAED,OAAO,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;QACzB,CAAC;KACF,CAAC,CAAA;AACJ,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { Kernel, Shell, Terminal } from '@ecmaos/types';
|
|
2
|
+
import { TerminalCommand } from '../shared/terminal-command.js';
|
|
3
|
+
export declare function createCommand(kernel: Kernel, shell: Shell, terminal: Terminal): TerminalCommand;
|
|
4
|
+
//# sourceMappingURL=mktemp.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mktemp.d.ts","sourceRoot":"","sources":["../../src/commands/mktemp.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAW,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AACrE,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAA;AA2E/D,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,GAAG,eAAe,CA6J/F"}
|