@ecmaos/coreutils 0.1.5 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (231) hide show
  1. package/.turbo/turbo-build.log +1 -1
  2. package/CHANGELOG.md +45 -0
  3. package/dist/commands/basename.d.ts +4 -0
  4. package/dist/commands/basename.d.ts.map +1 -0
  5. package/dist/commands/basename.js +78 -0
  6. package/dist/commands/basename.js.map +1 -0
  7. package/dist/commands/cal.d.ts +4 -0
  8. package/dist/commands/cal.d.ts.map +1 -0
  9. package/dist/commands/cal.js +105 -0
  10. package/dist/commands/cal.js.map +1 -0
  11. package/dist/commands/cat.d.ts.map +1 -1
  12. package/dist/commands/cat.js +33 -25
  13. package/dist/commands/cat.js.map +1 -1
  14. package/dist/commands/cd.d.ts.map +1 -1
  15. package/dist/commands/cd.js +38 -10
  16. package/dist/commands/cd.js.map +1 -1
  17. package/dist/commands/chmod.d.ts.map +1 -1
  18. package/dist/commands/chmod.js +31 -9
  19. package/dist/commands/chmod.js.map +1 -1
  20. package/dist/commands/comm.d.ts +4 -0
  21. package/dist/commands/comm.d.ts.map +1 -0
  22. package/dist/commands/comm.js +162 -0
  23. package/dist/commands/comm.js.map +1 -0
  24. package/dist/commands/cp.d.ts.map +1 -1
  25. package/dist/commands/cp.js +61 -12
  26. package/dist/commands/cp.js.map +1 -1
  27. package/dist/commands/cut.d.ts +4 -0
  28. package/dist/commands/cut.d.ts.map +1 -0
  29. package/dist/commands/cut.js +208 -0
  30. package/dist/commands/cut.js.map +1 -0
  31. package/dist/commands/date.d.ts +4 -0
  32. package/dist/commands/date.d.ts.map +1 -0
  33. package/dist/commands/date.js +100 -0
  34. package/dist/commands/date.js.map +1 -0
  35. package/dist/commands/diff.d.ts +4 -0
  36. package/dist/commands/diff.d.ts.map +1 -0
  37. package/dist/commands/diff.js +194 -0
  38. package/dist/commands/diff.js.map +1 -0
  39. package/dist/commands/dirname.d.ts +4 -0
  40. package/dist/commands/dirname.d.ts.map +1 -0
  41. package/dist/commands/dirname.js +50 -0
  42. package/dist/commands/dirname.js.map +1 -0
  43. package/dist/commands/echo.d.ts.map +1 -1
  44. package/dist/commands/echo.js +49 -10
  45. package/dist/commands/echo.js.map +1 -1
  46. package/dist/commands/false.d.ts +4 -0
  47. package/dist/commands/false.d.ts.map +1 -0
  48. package/dist/commands/false.js +27 -0
  49. package/dist/commands/false.js.map +1 -0
  50. package/dist/commands/find.d.ts +4 -0
  51. package/dist/commands/find.d.ts.map +1 -0
  52. package/dist/commands/find.js +181 -0
  53. package/dist/commands/find.js.map +1 -0
  54. package/dist/commands/grep.d.ts.map +1 -1
  55. package/dist/commands/grep.js +45 -10
  56. package/dist/commands/grep.js.map +1 -1
  57. package/dist/commands/head.d.ts.map +1 -1
  58. package/dist/commands/head.js +46 -9
  59. package/dist/commands/head.js.map +1 -1
  60. package/dist/commands/hex.d.ts.map +1 -1
  61. package/dist/commands/hex.js +16 -6
  62. package/dist/commands/hex.js.map +1 -1
  63. package/dist/commands/id.d.ts +4 -0
  64. package/dist/commands/id.d.ts.map +1 -0
  65. package/dist/commands/id.js +97 -0
  66. package/dist/commands/id.js.map +1 -0
  67. package/dist/commands/join.d.ts +4 -0
  68. package/dist/commands/join.d.ts.map +1 -0
  69. package/dist/commands/join.js +152 -0
  70. package/dist/commands/join.js.map +1 -0
  71. package/dist/commands/less.d.ts.map +1 -1
  72. package/dist/commands/less.js +16 -7
  73. package/dist/commands/less.js.map +1 -1
  74. package/dist/commands/ln.d.ts.map +1 -1
  75. package/dist/commands/ln.js +54 -12
  76. package/dist/commands/ln.js.map +1 -1
  77. package/dist/commands/ls.d.ts.map +1 -1
  78. package/dist/commands/ls.js +96 -91
  79. package/dist/commands/ls.js.map +1 -1
  80. package/dist/commands/mkdir.d.ts.map +1 -1
  81. package/dist/commands/mkdir.js +34 -9
  82. package/dist/commands/mkdir.js.map +1 -1
  83. package/dist/commands/mv.d.ts.map +1 -1
  84. package/dist/commands/mv.js +25 -7
  85. package/dist/commands/mv.js.map +1 -1
  86. package/dist/commands/nc.d.ts +4 -0
  87. package/dist/commands/nc.d.ts.map +1 -0
  88. package/dist/commands/nc.js +451 -0
  89. package/dist/commands/nc.js.map +1 -0
  90. package/dist/commands/nl.d.ts +4 -0
  91. package/dist/commands/nl.d.ts.map +1 -0
  92. package/dist/commands/nl.js +208 -0
  93. package/dist/commands/nl.js.map +1 -0
  94. package/dist/commands/passkey.d.ts.map +1 -1
  95. package/dist/commands/passkey.js +44 -18
  96. package/dist/commands/passkey.js.map +1 -1
  97. package/dist/commands/paste.d.ts +4 -0
  98. package/dist/commands/paste.d.ts.map +1 -0
  99. package/dist/commands/paste.js +161 -0
  100. package/dist/commands/paste.js.map +1 -0
  101. package/dist/commands/pwd.d.ts.map +1 -1
  102. package/dist/commands/pwd.js +13 -4
  103. package/dist/commands/pwd.js.map +1 -1
  104. package/dist/commands/rm.d.ts.map +1 -1
  105. package/dist/commands/rm.js +105 -12
  106. package/dist/commands/rm.js.map +1 -1
  107. package/dist/commands/rmdir.d.ts.map +1 -1
  108. package/dist/commands/rmdir.js +34 -9
  109. package/dist/commands/rmdir.js.map +1 -1
  110. package/dist/commands/sed.d.ts.map +1 -1
  111. package/dist/commands/sed.js +73 -28
  112. package/dist/commands/sed.js.map +1 -1
  113. package/dist/commands/seq.d.ts +4 -0
  114. package/dist/commands/seq.d.ts.map +1 -0
  115. package/dist/commands/seq.js +148 -0
  116. package/dist/commands/seq.js.map +1 -0
  117. package/dist/commands/sockets.d.ts +4 -0
  118. package/dist/commands/sockets.d.ts.map +1 -0
  119. package/dist/commands/sockets.js +239 -0
  120. package/dist/commands/sockets.js.map +1 -0
  121. package/dist/commands/sort.d.ts +4 -0
  122. package/dist/commands/sort.d.ts.map +1 -0
  123. package/dist/commands/sort.js +175 -0
  124. package/dist/commands/sort.js.map +1 -0
  125. package/dist/commands/split.d.ts +4 -0
  126. package/dist/commands/split.d.ts.map +1 -0
  127. package/dist/commands/split.js +147 -0
  128. package/dist/commands/split.js.map +1 -0
  129. package/dist/commands/stat.d.ts.map +1 -1
  130. package/dist/commands/stat.js +14 -6
  131. package/dist/commands/stat.js.map +1 -1
  132. package/dist/commands/tail.d.ts.map +1 -1
  133. package/dist/commands/tail.js +46 -9
  134. package/dist/commands/tail.js.map +1 -1
  135. package/dist/commands/tee.d.ts.map +1 -1
  136. package/dist/commands/tee.js +45 -10
  137. package/dist/commands/tee.js.map +1 -1
  138. package/dist/commands/test.d.ts +4 -0
  139. package/dist/commands/test.d.ts.map +1 -0
  140. package/dist/commands/test.js +99 -0
  141. package/dist/commands/test.js.map +1 -0
  142. package/dist/commands/touch.d.ts.map +1 -1
  143. package/dist/commands/touch.js +34 -9
  144. package/dist/commands/touch.js.map +1 -1
  145. package/dist/commands/tr.d.ts +4 -0
  146. package/dist/commands/tr.d.ts.map +1 -0
  147. package/dist/commands/tr.js +162 -0
  148. package/dist/commands/tr.js.map +1 -0
  149. package/dist/commands/true.d.ts +4 -0
  150. package/dist/commands/true.d.ts.map +1 -0
  151. package/dist/commands/true.js +27 -0
  152. package/dist/commands/true.js.map +1 -0
  153. package/dist/commands/uniq.d.ts +4 -0
  154. package/dist/commands/uniq.d.ts.map +1 -0
  155. package/dist/commands/uniq.js +187 -0
  156. package/dist/commands/uniq.js.map +1 -0
  157. package/dist/commands/user.d.ts +4 -0
  158. package/dist/commands/user.d.ts.map +1 -0
  159. package/dist/commands/user.js +427 -0
  160. package/dist/commands/user.js.map +1 -0
  161. package/dist/commands/wc.d.ts +4 -0
  162. package/dist/commands/wc.d.ts.map +1 -0
  163. package/dist/commands/wc.js +178 -0
  164. package/dist/commands/wc.js.map +1 -0
  165. package/dist/commands/which.d.ts +4 -0
  166. package/dist/commands/which.d.ts.map +1 -0
  167. package/dist/commands/which.js +78 -0
  168. package/dist/commands/which.js.map +1 -0
  169. package/dist/commands/whoami.d.ts +4 -0
  170. package/dist/commands/whoami.d.ts.map +1 -0
  171. package/dist/commands/whoami.js +28 -0
  172. package/dist/commands/whoami.js.map +1 -0
  173. package/dist/index.d.ts +14 -0
  174. package/dist/index.d.ts.map +1 -1
  175. package/dist/index.js +67 -1
  176. package/dist/index.js.map +1 -1
  177. package/dist/shared/terminal-command.d.ts +8 -2
  178. package/dist/shared/terminal-command.d.ts.map +1 -1
  179. package/dist/shared/terminal-command.js +42 -17
  180. package/dist/shared/terminal-command.js.map +1 -1
  181. package/package.json +4 -2
  182. package/src/commands/basename.ts +84 -0
  183. package/src/commands/cal.ts +111 -0
  184. package/src/commands/cat.ts +37 -27
  185. package/src/commands/cd.ts +40 -12
  186. package/src/commands/chmod.ts +37 -11
  187. package/src/commands/comm.ts +169 -0
  188. package/src/commands/cp.ts +73 -15
  189. package/src/commands/cut.ts +214 -0
  190. package/src/commands/date.ts +97 -0
  191. package/src/commands/diff.ts +204 -0
  192. package/src/commands/dirname.ts +57 -0
  193. package/src/commands/echo.ts +51 -11
  194. package/src/commands/false.ts +31 -0
  195. package/src/commands/find.ts +184 -0
  196. package/src/commands/grep.ts +44 -11
  197. package/src/commands/head.ts +46 -10
  198. package/src/commands/hex.ts +19 -7
  199. package/src/commands/id.ts +94 -0
  200. package/src/commands/join.ts +162 -0
  201. package/src/commands/less.ts +20 -8
  202. package/src/commands/ln.ts +50 -13
  203. package/src/commands/ls.ts +110 -87
  204. package/src/commands/mkdir.ts +41 -12
  205. package/src/commands/mv.ts +31 -9
  206. package/src/commands/nc.ts +499 -0
  207. package/src/commands/nl.ts +201 -0
  208. package/src/commands/passkey.ts +46 -19
  209. package/src/commands/paste.ts +172 -0
  210. package/src/commands/pwd.ts +16 -4
  211. package/src/commands/rm.ts +118 -13
  212. package/src/commands/rmdir.ts +41 -12
  213. package/src/commands/sed.ts +64 -30
  214. package/src/commands/seq.ts +147 -0
  215. package/src/commands/sockets.ts +283 -0
  216. package/src/commands/sort.ts +175 -0
  217. package/src/commands/split.ts +154 -0
  218. package/src/commands/stat.ts +17 -8
  219. package/src/commands/tail.ts +46 -10
  220. package/src/commands/tee.ts +43 -11
  221. package/src/commands/test.ts +116 -0
  222. package/src/commands/touch.ts +41 -12
  223. package/src/commands/tr.ts +170 -0
  224. package/src/commands/true.ts +31 -0
  225. package/src/commands/uniq.ts +189 -0
  226. package/src/commands/user.ts +436 -0
  227. package/src/commands/wc.ts +181 -0
  228. package/src/commands/which.ts +89 -0
  229. package/src/commands/whoami.ts +32 -0
  230. package/src/index.ts +67 -1
  231. package/src/shared/terminal-command.ts +43 -16
@@ -0,0 +1,427 @@
1
+ import chalk from 'chalk';
2
+ import { TerminalCommand } from '../shared/terminal-command.js';
3
+ import { writelnStdout, writelnStderr } from '../shared/helpers.js';
4
+ function printUsage(process, terminal) {
5
+ const usage = `Usage: user [COMMAND] [OPTIONS] [USERNAME]
6
+ Manage users on the system.
7
+
8
+ Commands:
9
+ add USERNAME Add a new user
10
+ del USERNAME Delete a user
11
+ mod USERNAME Modify a user
12
+ list List all users (default)
13
+
14
+ Options for 'add':
15
+ -m, --create-home Create home directory
16
+ -s, --shell SHELL Login shell (default: ecmaos)
17
+ -g, --gid GID Group ID (default: same as UID)
18
+ -u, --uid UID User ID (default: auto-assigned)
19
+ -p, --password PASS Password (will prompt if not provided)
20
+
21
+ Options for 'del':
22
+ -r, --remove-home Remove home directory
23
+
24
+ Options for 'mod':
25
+ -s, --shell SHELL Change login shell
26
+ -g, --gid GID Change group ID
27
+ -p, --password Change password (will prompt)
28
+
29
+ --help Display this help and exit`;
30
+ writelnStdout(process, terminal, usage);
31
+ }
32
+ export function createCommand(kernel, shell, terminal) {
33
+ return new TerminalCommand({
34
+ command: 'user',
35
+ description: 'Manage users on the system',
36
+ kernel,
37
+ shell,
38
+ terminal,
39
+ run: async (pid, argv) => {
40
+ const process = kernel.processes.get(pid);
41
+ if (argv.length > 0 && (argv[0] === '--help' || argv[0] === '-h')) {
42
+ printUsage(process, terminal);
43
+ return 0;
44
+ }
45
+ if (shell.credentials.suid !== 0) {
46
+ await writelnStderr(process, terminal, chalk.red('user: permission denied'));
47
+ return 1;
48
+ }
49
+ const command = argv.length > 0 && argv[0] !== undefined && !argv[0].startsWith('-') ? argv[0] : 'list';
50
+ const remainingArgs = command !== 'list' ? argv.slice(1) : argv;
51
+ switch (command) {
52
+ case 'list': {
53
+ const users = Array.from(kernel.users.all.values());
54
+ if (users.length === 0) {
55
+ await writelnStdout(process, terminal, 'No users found');
56
+ return 0;
57
+ }
58
+ const uidWidth = Math.max(3, ...users.map(u => u.uid.toString().length));
59
+ const usernameWidth = Math.max(8, ...users.map(u => u.username.length));
60
+ const gidWidth = Math.max(3, ...users.map(u => u.gid.toString().length));
61
+ await writelnStdout(process, terminal, chalk.bold('UID'.padEnd(uidWidth) + '\t' +
62
+ 'Username'.padEnd(usernameWidth) + '\t' +
63
+ 'GID'.padEnd(gidWidth) + '\t' +
64
+ 'Groups'));
65
+ for (const usr of users) {
66
+ await writelnStdout(process, terminal, chalk.yellow(usr.uid.toString().padEnd(uidWidth)) + '\t' +
67
+ chalk.green(usr.username.padEnd(usernameWidth)) + '\t' +
68
+ chalk.cyan(usr.gid.toString().padEnd(gidWidth)) + '\t' +
69
+ chalk.blue(usr.groups.join(', ') || '-'));
70
+ }
71
+ return 0;
72
+ }
73
+ case 'add': {
74
+ let username = '';
75
+ let createHome = false;
76
+ let shellValue = 'ecmaos';
77
+ let gid;
78
+ let uid;
79
+ let password;
80
+ for (let i = 0; i < remainingArgs.length; i++) {
81
+ const arg = remainingArgs[i];
82
+ if (!arg || typeof arg !== 'string')
83
+ continue;
84
+ if (arg.startsWith('-')) {
85
+ if (arg === '-m' || arg === '--create-home') {
86
+ createHome = true;
87
+ }
88
+ else if (arg === '-s' || arg === '--shell') {
89
+ if (i + 1 < remainingArgs.length) {
90
+ const nextArg = remainingArgs[++i];
91
+ if (nextArg) {
92
+ shellValue = nextArg;
93
+ }
94
+ else {
95
+ await writelnStderr(process, terminal, chalk.red('user add: option requires an argument -- \'s\''));
96
+ return 1;
97
+ }
98
+ }
99
+ else {
100
+ await writelnStderr(process, terminal, chalk.red('user add: option requires an argument -- \'s\''));
101
+ return 1;
102
+ }
103
+ }
104
+ else if (arg === '-g' || arg === '--gid') {
105
+ if (i + 1 < remainingArgs.length) {
106
+ const gidStr = remainingArgs[++i];
107
+ if (gidStr) {
108
+ gid = parseInt(gidStr, 10);
109
+ if (isNaN(gid)) {
110
+ await writelnStderr(process, terminal, chalk.red(`user add: invalid GID '${gidStr}'`));
111
+ return 1;
112
+ }
113
+ }
114
+ else {
115
+ await writelnStderr(process, terminal, chalk.red('user add: option requires an argument -- \'g\''));
116
+ return 1;
117
+ }
118
+ }
119
+ else {
120
+ await writelnStderr(process, terminal, chalk.red('user add: option requires an argument -- \'g\''));
121
+ return 1;
122
+ }
123
+ }
124
+ else if (arg === '-u' || arg === '--uid') {
125
+ if (i + 1 < remainingArgs.length) {
126
+ const uidStr = remainingArgs[++i];
127
+ if (uidStr) {
128
+ uid = parseInt(uidStr, 10);
129
+ if (isNaN(uid)) {
130
+ await writelnStderr(process, terminal, chalk.red(`user add: invalid UID '${uidStr}'`));
131
+ return 1;
132
+ }
133
+ }
134
+ else {
135
+ await writelnStderr(process, terminal, chalk.red('user add: option requires an argument -- \'u\''));
136
+ return 1;
137
+ }
138
+ }
139
+ else {
140
+ await writelnStderr(process, terminal, chalk.red('user add: option requires an argument -- \'u\''));
141
+ return 1;
142
+ }
143
+ }
144
+ else if (arg === '-p' || arg === '--password') {
145
+ if (i + 1 < remainingArgs.length) {
146
+ const nextArg = remainingArgs[++i];
147
+ if (nextArg) {
148
+ password = nextArg;
149
+ }
150
+ else {
151
+ await writelnStderr(process, terminal, chalk.red('user add: option requires an argument -- \'p\''));
152
+ return 1;
153
+ }
154
+ }
155
+ else {
156
+ await writelnStderr(process, terminal, chalk.red('user add: option requires an argument -- \'p\''));
157
+ return 1;
158
+ }
159
+ }
160
+ else if (arg === '--help' || arg === '-h') {
161
+ printUsage(process, terminal);
162
+ return 0;
163
+ }
164
+ else {
165
+ await writelnStderr(process, terminal, chalk.red(`user add: invalid option -- '${arg.replace(/^-+/, '')}'`));
166
+ return 1;
167
+ }
168
+ }
169
+ else {
170
+ if (!username) {
171
+ username = arg;
172
+ }
173
+ else {
174
+ await writelnStderr(process, terminal, chalk.red(`user add: unexpected argument '${arg}'`));
175
+ return 1;
176
+ }
177
+ }
178
+ }
179
+ if (!username) {
180
+ await writelnStderr(process, terminal, chalk.red('user add: username required'));
181
+ await writelnStdout(process, terminal, 'Try \'user add --help\' for more information.');
182
+ return 1;
183
+ }
184
+ const allUsers = Array.from(kernel.users.all.values());
185
+ if (allUsers.some((u) => u.username === username)) {
186
+ await writelnStderr(process, terminal, chalk.red(`user add: user '${username}' already exists`));
187
+ return 1;
188
+ }
189
+ if (uid !== undefined && kernel.users.all.has(uid)) {
190
+ await writelnStderr(process, terminal, chalk.red(`user add: UID ${uid} already in use`));
191
+ return 1;
192
+ }
193
+ if (!password) {
194
+ password = await terminal.readline(chalk.cyan(`New password: `), true);
195
+ const confirm = await terminal.readline(chalk.cyan('Retype new password: '), true);
196
+ if (password !== confirm) {
197
+ await writelnStderr(process, terminal, chalk.red('user add: password mismatch'));
198
+ return 1;
199
+ }
200
+ }
201
+ try {
202
+ await kernel.users.add({
203
+ username,
204
+ password,
205
+ uid,
206
+ gid,
207
+ shell: shellValue,
208
+ home: `/home/${username}`
209
+ }, { noHome: !createHome });
210
+ await writelnStdout(process, terminal, chalk.green(`user add: user '${username}' created successfully`));
211
+ return 0;
212
+ }
213
+ catch (error) {
214
+ await writelnStderr(process, terminal, chalk.red(`user add: ${error instanceof Error ? error.message : 'Unknown error'}`));
215
+ return 1;
216
+ }
217
+ }
218
+ case 'del': {
219
+ let username = '';
220
+ let removeHome = false;
221
+ for (let i = 0; i < remainingArgs.length; i++) {
222
+ const arg = remainingArgs[i];
223
+ if (!arg || typeof arg !== 'string')
224
+ continue;
225
+ if (arg.startsWith('-')) {
226
+ if (arg === '-r' || arg === '--remove-home') {
227
+ removeHome = true;
228
+ }
229
+ else if (arg === '--help' || arg === '-h') {
230
+ printUsage(process, terminal);
231
+ return 0;
232
+ }
233
+ else {
234
+ await writelnStderr(process, terminal, chalk.red(`user del: invalid option -- '${arg.replace(/^-+/, '')}'`));
235
+ return 1;
236
+ }
237
+ }
238
+ else {
239
+ if (!username) {
240
+ username = arg;
241
+ }
242
+ else {
243
+ await writelnStderr(process, terminal, chalk.red(`user del: unexpected argument '${arg}'`));
244
+ return 1;
245
+ }
246
+ }
247
+ }
248
+ if (!username) {
249
+ await writelnStderr(process, terminal, chalk.red('user del: username required'));
250
+ await writelnStdout(process, terminal, 'Try \'user del --help\' for more information.');
251
+ return 1;
252
+ }
253
+ const allUsers = Array.from(kernel.users.all.values());
254
+ const usr = allUsers.find((u) => u.username === username);
255
+ if (!usr) {
256
+ await writelnStderr(process, terminal, chalk.red(`user del: user '${username}' does not exist`));
257
+ return 1;
258
+ }
259
+ if (usr.uid === 0) {
260
+ await writelnStderr(process, terminal, chalk.red('user del: cannot delete root user'));
261
+ return 1;
262
+ }
263
+ try {
264
+ await kernel.users.remove(usr.uid);
265
+ if (removeHome && usr.home) {
266
+ try {
267
+ const removeDirRecursive = async (dirPath) => {
268
+ const entries = await shell.context.fs.promises.readdir(dirPath);
269
+ for (const entry of entries) {
270
+ const entryPath = `${dirPath}/${entry}`;
271
+ const stat = await shell.context.fs.promises.stat(entryPath);
272
+ if (stat.isDirectory()) {
273
+ await removeDirRecursive(entryPath);
274
+ }
275
+ else {
276
+ await shell.context.fs.promises.unlink(entryPath);
277
+ }
278
+ }
279
+ await shell.context.fs.promises.rmdir(dirPath);
280
+ };
281
+ await removeDirRecursive(usr.home);
282
+ }
283
+ catch {
284
+ await writelnStderr(process, terminal, chalk.yellow(`user del: warning: could not remove home directory '${usr.home}'`));
285
+ }
286
+ }
287
+ await shell.context.fs.promises.writeFile('/etc/passwd', (await shell.context.fs.promises.readFile('/etc/passwd', 'utf8'))
288
+ .split('\n')
289
+ .filter((line) => !line.startsWith(`${username}:`))
290
+ .join('\n'));
291
+ await shell.context.fs.promises.writeFile('/etc/shadow', (await shell.context.fs.promises.readFile('/etc/shadow', 'utf8'))
292
+ .split('\n')
293
+ .filter((line) => !line.startsWith(`${username}:`))
294
+ .join('\n'));
295
+ await writelnStdout(process, terminal, chalk.green(`user del: user '${username}' deleted successfully`));
296
+ return 0;
297
+ }
298
+ catch (error) {
299
+ await writelnStderr(process, terminal, chalk.red(`user del: ${error instanceof Error ? error.message : 'Unknown error'}`));
300
+ return 1;
301
+ }
302
+ }
303
+ case 'mod': {
304
+ let username = '';
305
+ let shellValue;
306
+ let gid;
307
+ let changePassword = false;
308
+ for (let i = 0; i < remainingArgs.length; i++) {
309
+ const arg = remainingArgs[i];
310
+ if (!arg || typeof arg !== 'string')
311
+ continue;
312
+ if (arg.startsWith('-')) {
313
+ if (arg === '-s' || arg === '--shell') {
314
+ if (i + 1 < remainingArgs.length) {
315
+ const nextArg = remainingArgs[++i];
316
+ if (nextArg) {
317
+ shellValue = nextArg;
318
+ }
319
+ else {
320
+ await writelnStderr(process, terminal, chalk.red('user mod: option requires an argument -- \'s\''));
321
+ return 1;
322
+ }
323
+ }
324
+ else {
325
+ await writelnStderr(process, terminal, chalk.red('user mod: option requires an argument -- \'s\''));
326
+ return 1;
327
+ }
328
+ }
329
+ else if (arg === '-g' || arg === '--gid') {
330
+ if (i + 1 < remainingArgs.length) {
331
+ const gidStr = remainingArgs[++i];
332
+ if (gidStr) {
333
+ gid = parseInt(gidStr, 10);
334
+ if (isNaN(gid)) {
335
+ await writelnStderr(process, terminal, chalk.red(`user mod: invalid GID '${gidStr}'`));
336
+ return 1;
337
+ }
338
+ }
339
+ else {
340
+ await writelnStderr(process, terminal, chalk.red('user mod: option requires an argument -- \'g\''));
341
+ return 1;
342
+ }
343
+ }
344
+ else {
345
+ await writelnStderr(process, terminal, chalk.red('user mod: option requires an argument -- \'g\''));
346
+ return 1;
347
+ }
348
+ }
349
+ else if (arg === '-p' || arg === '--password') {
350
+ changePassword = true;
351
+ }
352
+ else if (arg === '--help' || arg === '-h') {
353
+ printUsage(process, terminal);
354
+ return 0;
355
+ }
356
+ else {
357
+ await writelnStderr(process, terminal, chalk.red(`user mod: invalid option -- '${arg.replace(/^-+/, '')}'`));
358
+ return 1;
359
+ }
360
+ }
361
+ else {
362
+ if (!username) {
363
+ username = arg;
364
+ }
365
+ else {
366
+ await writelnStderr(process, terminal, chalk.red(`user mod: unexpected argument '${arg}'`));
367
+ return 1;
368
+ }
369
+ }
370
+ }
371
+ if (!username) {
372
+ await writelnStderr(process, terminal, chalk.red('user mod: username required'));
373
+ await writelnStdout(process, terminal, 'Try \'user mod --help\' for more information.');
374
+ return 1;
375
+ }
376
+ const allUsers = Array.from(kernel.users.all.values());
377
+ const usr = allUsers.find((u) => u.username === username);
378
+ if (!usr) {
379
+ await writelnStderr(process, terminal, chalk.red(`user mod: user '${username}' does not exist`));
380
+ return 1;
381
+ }
382
+ const updates = {};
383
+ if (shellValue !== undefined) {
384
+ updates.shell = shellValue;
385
+ }
386
+ if (gid !== undefined) {
387
+ updates.gid = gid;
388
+ }
389
+ if (changePassword) {
390
+ const newPassword = await terminal.readline(chalk.cyan('New password: '), true);
391
+ const confirm = await terminal.readline(chalk.cyan('Retype new password: '), true);
392
+ if (newPassword !== confirm) {
393
+ await writelnStderr(process, terminal, chalk.red('user mod: password mismatch'));
394
+ return 1;
395
+ }
396
+ try {
397
+ const hashedPassword = await crypto.subtle.digest('SHA-256', new TextEncoder().encode(newPassword.trim()));
398
+ updates.password = Array.from(new Uint8Array(hashedPassword)).map(b => b.toString(16).padStart(2, '0')).join('');
399
+ }
400
+ catch (error) {
401
+ await writelnStderr(process, terminal, chalk.red(`user mod: failed to hash password: ${error instanceof Error ? error.message : 'Unknown error'}`));
402
+ return 1;
403
+ }
404
+ }
405
+ if (Object.keys(updates).length === 0 && !changePassword) {
406
+ await writelnStderr(process, terminal, chalk.red('user mod: no changes specified'));
407
+ return 1;
408
+ }
409
+ try {
410
+ await kernel.users.update(usr.uid, updates);
411
+ await writelnStdout(process, terminal, chalk.green(`user mod: user '${username}' modified successfully`));
412
+ return 0;
413
+ }
414
+ catch (error) {
415
+ await writelnStderr(process, terminal, chalk.red(`user mod: ${error instanceof Error ? error.message : 'Unknown error'}`));
416
+ return 1;
417
+ }
418
+ }
419
+ default:
420
+ await writelnStderr(process, terminal, chalk.red(`user: invalid command '${command}'`));
421
+ await writelnStdout(process, terminal, 'Try \'user --help\' for more information.');
422
+ return 1;
423
+ }
424
+ }
425
+ });
426
+ }
427
+ //# sourceMappingURL=user.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"user.js","sourceRoot":"","sources":["../../src/commands/user.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AAEzB,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAA;AAC/D,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AAEnE,SAAS,UAAU,CAAC,OAA4B,EAAE,QAAkB;IAClE,MAAM,KAAK,GAAG;;;;;;;;;;;;;;;;;;;;;;;;kDAwBkC,CAAA;IAChD,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,MAAM;QACf,WAAW,EAAE,4BAA4B;QACzC,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,KAAK,CAAC,WAAW,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;gBACjC,MAAM,aAAa,CAAC,OAAO,EAAE,QAAQ,EAAE,KAAK,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC,CAAA;gBAC5E,OAAO,CAAC,CAAA;YACV,CAAC;YAED,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,SAAS,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAA;YACvG,MAAM,aAAa,GAAG,OAAO,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;YAE/D,QAAQ,OAAO,EAAE,CAAC;gBAChB,KAAK,MAAM,CAAC,CAAC,CAAC;oBACZ,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,EAAE,CAAW,CAAA;oBAE7D,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;wBACvB,MAAM,aAAa,CAAC,OAAO,EAAE,QAAQ,EAAE,gBAAgB,CAAC,CAAA;wBACxD,OAAO,CAAC,CAAA;oBACV,CAAC;oBAED,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,MAAM,CAAC,CAAC,CAAA;oBACxE,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAA;oBACvE,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,MAAM,CAAC,CAAC,CAAA;oBAExE,MAAM,aAAa,CAAC,OAAO,EAAE,QAAQ,EAAE,KAAK,CAAC,IAAI,CAC/C,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,IAAI;wBAC7B,UAAU,CAAC,MAAM,CAAC,aAAa,CAAC,GAAG,IAAI;wBACvC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,IAAI;wBAC7B,QAAQ,CACT,CAAC,CAAA;oBAEF,KAAK,MAAM,GAAG,IAAI,KAAK,EAAE,CAAC;wBACxB,MAAM,aAAa,CAAC,OAAO,EAAE,QAAQ,EACnC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,GAAG,IAAI;4BACxD,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,GAAG,IAAI;4BACtD,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,GAAG,IAAI;4BACtD,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,CACzC,CAAA;oBACH,CAAC;oBAED,OAAO,CAAC,CAAA;gBACV,CAAC;gBAED,KAAK,KAAK,CAAC,CAAC,CAAC;oBACX,IAAI,QAAQ,GAAG,EAAE,CAAA;oBACjB,IAAI,UAAU,GAAG,KAAK,CAAA;oBACtB,IAAI,UAAU,GAAG,QAAQ,CAAA;oBACzB,IAAI,GAAuB,CAAA;oBAC3B,IAAI,GAAuB,CAAA;oBAC3B,IAAI,QAA4B,CAAA;oBAEhC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,aAAa,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;wBAC9C,MAAM,GAAG,GAAG,aAAa,CAAC,CAAC,CAAC,CAAA;wBAC5B,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ;4BAAE,SAAQ;wBAC7C,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;4BACxB,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,eAAe,EAAE,CAAC;gCAC5C,UAAU,GAAG,IAAI,CAAA;4BACnB,CAAC;iCAAM,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;gCAC7C,IAAI,CAAC,GAAG,CAAC,GAAG,aAAa,CAAC,MAAM,EAAE,CAAC;oCACjC,MAAM,OAAO,GAAG,aAAa,CAAC,EAAE,CAAC,CAAC,CAAA;oCAClC,IAAI,OAAO,EAAE,CAAC;wCACZ,UAAU,GAAG,OAAO,CAAA;oCACtB,CAAC;yCAAM,CAAC;wCACN,MAAM,aAAa,CAAC,OAAO,EAAE,QAAQ,EAAE,KAAK,CAAC,GAAG,CAAC,gDAAgD,CAAC,CAAC,CAAA;wCACnG,OAAO,CAAC,CAAA;oCACV,CAAC;gCACH,CAAC;qCAAM,CAAC;oCACN,MAAM,aAAa,CAAC,OAAO,EAAE,QAAQ,EAAE,KAAK,CAAC,GAAG,CAAC,gDAAgD,CAAC,CAAC,CAAA;oCACnG,OAAO,CAAC,CAAA;gCACV,CAAC;4BACH,CAAC;iCAAM,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,OAAO,EAAE,CAAC;gCAC3C,IAAI,CAAC,GAAG,CAAC,GAAG,aAAa,CAAC,MAAM,EAAE,CAAC;oCACjC,MAAM,MAAM,GAAG,aAAa,CAAC,EAAE,CAAC,CAAC,CAAA;oCACjC,IAAI,MAAM,EAAE,CAAC;wCACX,GAAG,GAAG,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC,CAAA;wCAC1B,IAAI,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;4CACf,MAAM,aAAa,CAAC,OAAO,EAAE,QAAQ,EAAE,KAAK,CAAC,GAAG,CAAC,0BAA0B,MAAM,GAAG,CAAC,CAAC,CAAA;4CACtF,OAAO,CAAC,CAAA;wCACV,CAAC;oCACH,CAAC;yCAAM,CAAC;wCACN,MAAM,aAAa,CAAC,OAAO,EAAE,QAAQ,EAAE,KAAK,CAAC,GAAG,CAAC,gDAAgD,CAAC,CAAC,CAAA;wCACnG,OAAO,CAAC,CAAA;oCACV,CAAC;gCACH,CAAC;qCAAM,CAAC;oCACN,MAAM,aAAa,CAAC,OAAO,EAAE,QAAQ,EAAE,KAAK,CAAC,GAAG,CAAC,gDAAgD,CAAC,CAAC,CAAA;oCACnG,OAAO,CAAC,CAAA;gCACV,CAAC;4BACH,CAAC;iCAAM,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,OAAO,EAAE,CAAC;gCAC3C,IAAI,CAAC,GAAG,CAAC,GAAG,aAAa,CAAC,MAAM,EAAE,CAAC;oCACjC,MAAM,MAAM,GAAG,aAAa,CAAC,EAAE,CAAC,CAAC,CAAA;oCACjC,IAAI,MAAM,EAAE,CAAC;wCACX,GAAG,GAAG,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC,CAAA;wCAC1B,IAAI,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;4CACf,MAAM,aAAa,CAAC,OAAO,EAAE,QAAQ,EAAE,KAAK,CAAC,GAAG,CAAC,0BAA0B,MAAM,GAAG,CAAC,CAAC,CAAA;4CACtF,OAAO,CAAC,CAAA;wCACV,CAAC;oCACH,CAAC;yCAAM,CAAC;wCACN,MAAM,aAAa,CAAC,OAAO,EAAE,QAAQ,EAAE,KAAK,CAAC,GAAG,CAAC,gDAAgD,CAAC,CAAC,CAAA;wCACnG,OAAO,CAAC,CAAA;oCACV,CAAC;gCACH,CAAC;qCAAM,CAAC;oCACN,MAAM,aAAa,CAAC,OAAO,EAAE,QAAQ,EAAE,KAAK,CAAC,GAAG,CAAC,gDAAgD,CAAC,CAAC,CAAA;oCACnG,OAAO,CAAC,CAAA;gCACV,CAAC;4BACH,CAAC;iCAAM,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,YAAY,EAAE,CAAC;gCAChD,IAAI,CAAC,GAAG,CAAC,GAAG,aAAa,CAAC,MAAM,EAAE,CAAC;oCACjC,MAAM,OAAO,GAAG,aAAa,CAAC,EAAE,CAAC,CAAC,CAAA;oCAClC,IAAI,OAAO,EAAE,CAAC;wCACZ,QAAQ,GAAG,OAAO,CAAA;oCACpB,CAAC;yCAAM,CAAC;wCACN,MAAM,aAAa,CAAC,OAAO,EAAE,QAAQ,EAAE,KAAK,CAAC,GAAG,CAAC,gDAAgD,CAAC,CAAC,CAAA;wCACnG,OAAO,CAAC,CAAA;oCACV,CAAC;gCACH,CAAC;qCAAM,CAAC;oCACN,MAAM,aAAa,CAAC,OAAO,EAAE,QAAQ,EAAE,KAAK,CAAC,GAAG,CAAC,gDAAgD,CAAC,CAAC,CAAA;oCACnG,OAAO,CAAC,CAAA;gCACV,CAAC;4BACH,CAAC;iCAAM,IAAI,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;gCAC5C,UAAU,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAA;gCAC7B,OAAO,CAAC,CAAA;4BACV,CAAC;iCAAM,CAAC;gCACN,MAAM,aAAa,CAAC,OAAO,EAAE,QAAQ,EAAE,KAAK,CAAC,GAAG,CAAC,gCAAgC,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAA;gCAC5G,OAAO,CAAC,CAAA;4BACV,CAAC;wBACH,CAAC;6BAAM,CAAC;4BACN,IAAI,CAAC,QAAQ,EAAE,CAAC;gCACd,QAAQ,GAAG,GAAG,CAAA;4BAChB,CAAC;iCAAM,CAAC;gCACN,MAAM,aAAa,CAAC,OAAO,EAAE,QAAQ,EAAE,KAAK,CAAC,GAAG,CAAC,kCAAkC,GAAG,GAAG,CAAC,CAAC,CAAA;gCAC3F,OAAO,CAAC,CAAA;4BACV,CAAC;wBACH,CAAC;oBACH,CAAC;oBAED,IAAI,CAAC,QAAQ,EAAE,CAAC;wBACd,MAAM,aAAa,CAAC,OAAO,EAAE,QAAQ,EAAE,KAAK,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC,CAAA;wBAChF,MAAM,aAAa,CAAC,OAAO,EAAE,QAAQ,EAAE,+CAA+C,CAAC,CAAA;wBACvF,OAAO,CAAC,CAAA;oBACV,CAAC;oBAED,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,EAAE,CAAW,CAAA;oBAChE,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAO,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC,EAAE,CAAC;wBACxD,MAAM,aAAa,CAAC,OAAO,EAAE,QAAQ,EAAE,KAAK,CAAC,GAAG,CAAC,mBAAmB,QAAQ,kBAAkB,CAAC,CAAC,CAAA;wBAChG,OAAO,CAAC,CAAA;oBACV,CAAC;oBAED,IAAI,GAAG,KAAK,SAAS,IAAI,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;wBACnD,MAAM,aAAa,CAAC,OAAO,EAAE,QAAQ,EAAE,KAAK,CAAC,GAAG,CAAC,iBAAiB,GAAG,iBAAiB,CAAC,CAAC,CAAA;wBACxF,OAAO,CAAC,CAAA;oBACV,CAAC;oBAED,IAAI,CAAC,QAAQ,EAAE,CAAC;wBACd,QAAQ,GAAG,MAAM,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,EAAE,IAAI,CAAC,CAAA;wBACtE,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,uBAAuB,CAAC,EAAE,IAAI,CAAC,CAAA;wBAClF,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;4BACzB,MAAM,aAAa,CAAC,OAAO,EAAE,QAAQ,EAAE,KAAK,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC,CAAA;4BAChF,OAAO,CAAC,CAAA;wBACV,CAAC;oBACH,CAAC;oBAED,IAAI,CAAC;wBACH,MAAM,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC;4BACrB,QAAQ;4BACR,QAAQ;4BACR,GAAG;4BACH,GAAG;4BACH,KAAK,EAAE,UAAU;4BACjB,IAAI,EAAE,SAAS,QAAQ,EAAE;yBAC1B,EAAE,EAAE,MAAM,EAAE,CAAC,UAAU,EAAE,CAAC,CAAA;wBAC3B,MAAM,aAAa,CAAC,OAAO,EAAE,QAAQ,EAAE,KAAK,CAAC,KAAK,CAAC,mBAAmB,QAAQ,wBAAwB,CAAC,CAAC,CAAA;wBACxG,OAAO,CAAC,CAAA;oBACV,CAAC;oBAAC,OAAO,KAAK,EAAE,CAAC;wBACf,MAAM,aAAa,CAAC,OAAO,EAAE,QAAQ,EAAE,KAAK,CAAC,GAAG,CAAC,aAAa,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,EAAE,CAAC,CAAC,CAAA;wBAC1H,OAAO,CAAC,CAAA;oBACV,CAAC;gBACH,CAAC;gBAED,KAAK,KAAK,CAAC,CAAC,CAAC;oBACX,IAAI,QAAQ,GAAG,EAAE,CAAA;oBACjB,IAAI,UAAU,GAAG,KAAK,CAAA;oBAEtB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,aAAa,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;wBAC9C,MAAM,GAAG,GAAG,aAAa,CAAC,CAAC,CAAC,CAAA;wBAC5B,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ;4BAAE,SAAQ;wBAC7C,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;4BACxB,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,eAAe,EAAE,CAAC;gCAC5C,UAAU,GAAG,IAAI,CAAA;4BACnB,CAAC;iCAAM,IAAI,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;gCAC5C,UAAU,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAA;gCAC7B,OAAO,CAAC,CAAA;4BACV,CAAC;iCAAM,CAAC;gCACN,MAAM,aAAa,CAAC,OAAO,EAAE,QAAQ,EAAE,KAAK,CAAC,GAAG,CAAC,gCAAgC,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAA;gCAC5G,OAAO,CAAC,CAAA;4BACV,CAAC;wBACH,CAAC;6BAAM,CAAC;4BACN,IAAI,CAAC,QAAQ,EAAE,CAAC;gCACd,QAAQ,GAAG,GAAG,CAAA;4BAChB,CAAC;iCAAM,CAAC;gCACN,MAAM,aAAa,CAAC,OAAO,EAAE,QAAQ,EAAE,KAAK,CAAC,GAAG,CAAC,kCAAkC,GAAG,GAAG,CAAC,CAAC,CAAA;gCAC3F,OAAO,CAAC,CAAA;4BACV,CAAC;wBACH,CAAC;oBACH,CAAC;oBAED,IAAI,CAAC,QAAQ,EAAE,CAAC;wBACd,MAAM,aAAa,CAAC,OAAO,EAAE,QAAQ,EAAE,KAAK,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC,CAAA;wBAChF,MAAM,aAAa,CAAC,OAAO,EAAE,QAAQ,EAAE,+CAA+C,CAAC,CAAA;wBACvF,OAAO,CAAC,CAAA;oBACV,CAAC;oBAED,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,EAAE,CAAW,CAAA;oBAChE,MAAM,GAAG,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAO,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAA;oBAC/D,IAAI,CAAC,GAAG,EAAE,CAAC;wBACT,MAAM,aAAa,CAAC,OAAO,EAAE,QAAQ,EAAE,KAAK,CAAC,GAAG,CAAC,mBAAmB,QAAQ,kBAAkB,CAAC,CAAC,CAAA;wBAChG,OAAO,CAAC,CAAA;oBACV,CAAC;oBAED,IAAI,GAAG,CAAC,GAAG,KAAK,CAAC,EAAE,CAAC;wBAClB,MAAM,aAAa,CAAC,OAAO,EAAE,QAAQ,EAAE,KAAK,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC,CAAA;wBACtF,OAAO,CAAC,CAAA;oBACV,CAAC;oBAED,IAAI,CAAC;wBACH,MAAM,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;wBAElC,IAAI,UAAU,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC;4BAC3B,IAAI,CAAC;gCACH,MAAM,kBAAkB,GAAG,KAAK,EAAE,OAAe,EAAiB,EAAE;oCAClE,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA;oCAChE,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;wCAC5B,MAAM,SAAS,GAAG,GAAG,OAAO,IAAI,KAAK,EAAE,CAAA;wCACvC,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;wCAC5D,IAAI,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;4CACvB,MAAM,kBAAkB,CAAC,SAAS,CAAC,CAAA;wCACrC,CAAC;6CAAM,CAAC;4CACN,MAAM,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,CAAA;wCACnD,CAAC;oCACH,CAAC;oCACD,MAAM,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;gCAChD,CAAC,CAAA;gCACD,MAAM,kBAAkB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;4BACpC,CAAC;4BAAC,MAAM,CAAC;gCACP,MAAM,aAAa,CAAC,OAAO,EAAE,QAAQ,EAAE,KAAK,CAAC,MAAM,CAAC,uDAAuD,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,CAAA;4BAC1H,CAAC;wBACH,CAAC;wBAED,MAAM,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,QAAQ,CAAC,SAAS,CACvC,aAAa,EACb,CAAC,MAAM,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;6BAC9D,KAAK,CAAC,IAAI,CAAC;6BACX,MAAM,CAAC,CAAC,IAAY,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,QAAQ,GAAG,CAAC,CAAC;6BAC1D,IAAI,CAAC,IAAI,CAAC,CACd,CAAA;wBACD,MAAM,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,QAAQ,CAAC,SAAS,CACvC,aAAa,EACb,CAAC,MAAM,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;6BAC9D,KAAK,CAAC,IAAI,CAAC;6BACX,MAAM,CAAC,CAAC,IAAY,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,QAAQ,GAAG,CAAC,CAAC;6BAC1D,IAAI,CAAC,IAAI,CAAC,CACd,CAAA;wBAED,MAAM,aAAa,CAAC,OAAO,EAAE,QAAQ,EAAE,KAAK,CAAC,KAAK,CAAC,mBAAmB,QAAQ,wBAAwB,CAAC,CAAC,CAAA;wBACxG,OAAO,CAAC,CAAA;oBACV,CAAC;oBAAC,OAAO,KAAK,EAAE,CAAC;wBACf,MAAM,aAAa,CAAC,OAAO,EAAE,QAAQ,EAAE,KAAK,CAAC,GAAG,CAAC,aAAa,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,EAAE,CAAC,CAAC,CAAA;wBAC1H,OAAO,CAAC,CAAA;oBACV,CAAC;gBACH,CAAC;gBAED,KAAK,KAAK,CAAC,CAAC,CAAC;oBACX,IAAI,QAAQ,GAAG,EAAE,CAAA;oBACjB,IAAI,UAA8B,CAAA;oBAClC,IAAI,GAAuB,CAAA;oBAC3B,IAAI,cAAc,GAAG,KAAK,CAAA;oBAE1B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,aAAa,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;wBAC9C,MAAM,GAAG,GAAG,aAAa,CAAC,CAAC,CAAC,CAAA;wBAC5B,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ;4BAAE,SAAQ;wBAC7C,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;4BACxB,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;gCACtC,IAAI,CAAC,GAAG,CAAC,GAAG,aAAa,CAAC,MAAM,EAAE,CAAC;oCACjC,MAAM,OAAO,GAAG,aAAa,CAAC,EAAE,CAAC,CAAC,CAAA;oCAClC,IAAI,OAAO,EAAE,CAAC;wCACZ,UAAU,GAAG,OAAO,CAAA;oCACtB,CAAC;yCAAM,CAAC;wCACN,MAAM,aAAa,CAAC,OAAO,EAAE,QAAQ,EAAE,KAAK,CAAC,GAAG,CAAC,gDAAgD,CAAC,CAAC,CAAA;wCACnG,OAAO,CAAC,CAAA;oCACV,CAAC;gCACH,CAAC;qCAAM,CAAC;oCACN,MAAM,aAAa,CAAC,OAAO,EAAE,QAAQ,EAAE,KAAK,CAAC,GAAG,CAAC,gDAAgD,CAAC,CAAC,CAAA;oCACnG,OAAO,CAAC,CAAA;gCACV,CAAC;4BACH,CAAC;iCAAM,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,OAAO,EAAE,CAAC;gCAC3C,IAAI,CAAC,GAAG,CAAC,GAAG,aAAa,CAAC,MAAM,EAAE,CAAC;oCACjC,MAAM,MAAM,GAAG,aAAa,CAAC,EAAE,CAAC,CAAC,CAAA;oCACjC,IAAI,MAAM,EAAE,CAAC;wCACX,GAAG,GAAG,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC,CAAA;wCAC1B,IAAI,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;4CACf,MAAM,aAAa,CAAC,OAAO,EAAE,QAAQ,EAAE,KAAK,CAAC,GAAG,CAAC,0BAA0B,MAAM,GAAG,CAAC,CAAC,CAAA;4CACtF,OAAO,CAAC,CAAA;wCACV,CAAC;oCACH,CAAC;yCAAM,CAAC;wCACN,MAAM,aAAa,CAAC,OAAO,EAAE,QAAQ,EAAE,KAAK,CAAC,GAAG,CAAC,gDAAgD,CAAC,CAAC,CAAA;wCACnG,OAAO,CAAC,CAAA;oCACV,CAAC;gCACH,CAAC;qCAAM,CAAC;oCACN,MAAM,aAAa,CAAC,OAAO,EAAE,QAAQ,EAAE,KAAK,CAAC,GAAG,CAAC,gDAAgD,CAAC,CAAC,CAAA;oCACnG,OAAO,CAAC,CAAA;gCACV,CAAC;4BACH,CAAC;iCAAM,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,YAAY,EAAE,CAAC;gCAChD,cAAc,GAAG,IAAI,CAAA;4BACvB,CAAC;iCAAM,IAAI,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;gCAC5C,UAAU,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAA;gCAC7B,OAAO,CAAC,CAAA;4BACV,CAAC;iCAAM,CAAC;gCACN,MAAM,aAAa,CAAC,OAAO,EAAE,QAAQ,EAAE,KAAK,CAAC,GAAG,CAAC,gCAAgC,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAA;gCAC5G,OAAO,CAAC,CAAA;4BACV,CAAC;wBACH,CAAC;6BAAM,CAAC;4BACN,IAAI,CAAC,QAAQ,EAAE,CAAC;gCACd,QAAQ,GAAG,GAAG,CAAA;4BAChB,CAAC;iCAAM,CAAC;gCACN,MAAM,aAAa,CAAC,OAAO,EAAE,QAAQ,EAAE,KAAK,CAAC,GAAG,CAAC,kCAAkC,GAAG,GAAG,CAAC,CAAC,CAAA;gCAC3F,OAAO,CAAC,CAAA;4BACV,CAAC;wBACH,CAAC;oBACH,CAAC;oBAED,IAAI,CAAC,QAAQ,EAAE,CAAC;wBACd,MAAM,aAAa,CAAC,OAAO,EAAE,QAAQ,EAAE,KAAK,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC,CAAA;wBAChF,MAAM,aAAa,CAAC,OAAO,EAAE,QAAQ,EAAE,+CAA+C,CAAC,CAAA;wBACvF,OAAO,CAAC,CAAA;oBACV,CAAC;oBAED,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,EAAE,CAAW,CAAA;oBAChE,MAAM,GAAG,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAO,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAA;oBAC/D,IAAI,CAAC,GAAG,EAAE,CAAC;wBACT,MAAM,aAAa,CAAC,OAAO,EAAE,QAAQ,EAAE,KAAK,CAAC,GAAG,CAAC,mBAAmB,QAAQ,kBAAkB,CAAC,CAAC,CAAA;wBAChG,OAAO,CAAC,CAAA;oBACV,CAAC;oBAED,MAAM,OAAO,GAAkB,EAAE,CAAA;oBACjC,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;wBAC7B,OAAO,CAAC,KAAK,GAAG,UAAU,CAAA;oBAC5B,CAAC;oBACD,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;wBACtB,OAAO,CAAC,GAAG,GAAG,GAAG,CAAA;oBACnB,CAAC;oBAED,IAAI,cAAc,EAAE,CAAC;wBACnB,MAAM,WAAW,GAAG,MAAM,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,EAAE,IAAI,CAAC,CAAA;wBAC/E,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,uBAAuB,CAAC,EAAE,IAAI,CAAC,CAAA;wBAElF,IAAI,WAAW,KAAK,OAAO,EAAE,CAAC;4BAC5B,MAAM,aAAa,CAAC,OAAO,EAAE,QAAQ,EAAE,KAAK,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC,CAAA;4BAChF,OAAO,CAAC,CAAA;wBACV,CAAC;wBAED,IAAI,CAAC;4BACH,MAAM,cAAc,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,CAAC,CAAA;4BAC1G,OAAO,CAAC,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,cAAc,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;wBAClH,CAAC;wBAAC,OAAO,KAAK,EAAE,CAAC;4BACf,MAAM,aAAa,CAAC,OAAO,EAAE,QAAQ,EAAE,KAAK,CAAC,GAAG,CAAC,sCAAsC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,EAAE,CAAC,CAAC,CAAA;4BACnJ,OAAO,CAAC,CAAA;wBACV,CAAC;oBACH,CAAC;oBAED,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC;wBACzD,MAAM,aAAa,CAAC,OAAO,EAAE,QAAQ,EAAE,KAAK,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC,CAAA;wBACnF,OAAO,CAAC,CAAA;oBACV,CAAC;oBAED,IAAI,CAAC;wBACH,MAAM,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,CAAA;wBAC3C,MAAM,aAAa,CAAC,OAAO,EAAE,QAAQ,EAAE,KAAK,CAAC,KAAK,CAAC,mBAAmB,QAAQ,yBAAyB,CAAC,CAAC,CAAA;wBACzG,OAAO,CAAC,CAAA;oBACV,CAAC;oBAAC,OAAO,KAAK,EAAE,CAAC;wBACf,MAAM,aAAa,CAAC,OAAO,EAAE,QAAQ,EAAE,KAAK,CAAC,GAAG,CAAC,aAAa,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,EAAE,CAAC,CAAC,CAAA;wBAC1H,OAAO,CAAC,CAAA;oBACV,CAAC;gBACH,CAAC;gBAED;oBACE,MAAM,aAAa,CAAC,OAAO,EAAE,QAAQ,EAAE,KAAK,CAAC,GAAG,CAAC,0BAA0B,OAAO,GAAG,CAAC,CAAC,CAAA;oBACvF,MAAM,aAAa,CAAC,OAAO,EAAE,QAAQ,EAAE,2CAA2C,CAAC,CAAA;oBACnF,OAAO,CAAC,CAAA;YACZ,CAAC;QACH,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=wc.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wc.d.ts","sourceRoot":"","sources":["../../src/commands/wc.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAW,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAErE,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAA;AAc/D,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,GAAG,eAAe,CAmK/F"}
@@ -0,0 +1,178 @@
1
+ import path from 'path';
2
+ import { TerminalEvents } from '@ecmaos/types';
3
+ import { TerminalCommand } from '../shared/terminal-command.js';
4
+ import { writelnStderr } from '../shared/helpers.js';
5
+ function printUsage(process, terminal) {
6
+ const usage = `Usage: wc [OPTION]... [FILE]...
7
+ Print newline, word, and byte counts for each FILE.
8
+
9
+ -c, --bytes print the byte counts
10
+ -l, --lines print the newline counts
11
+ -w, --words print the word counts
12
+ --help display this help and exit`;
13
+ writelnStderr(process, terminal, usage);
14
+ }
15
+ export function createCommand(kernel, shell, terminal) {
16
+ return new TerminalCommand({
17
+ command: 'wc',
18
+ description: 'Print newline, word, and byte counts for each file',
19
+ kernel,
20
+ shell,
21
+ terminal,
22
+ run: async (pid, argv) => {
23
+ const process = kernel.processes.get(pid);
24
+ if (!process)
25
+ return 1;
26
+ if (argv.length > 0 && (argv[0] === '--help' || argv[0] === '-h')) {
27
+ printUsage(process, terminal);
28
+ return 0;
29
+ }
30
+ const files = [];
31
+ let showBytes = false;
32
+ let showLines = false;
33
+ let showWords = false;
34
+ for (const arg of argv) {
35
+ if (arg === '--help' || arg === '-h') {
36
+ printUsage(process, terminal);
37
+ return 0;
38
+ }
39
+ else if (arg === '-c' || arg === '--bytes') {
40
+ showBytes = true;
41
+ }
42
+ else if (arg === '-l' || arg === '--lines') {
43
+ showLines = true;
44
+ }
45
+ else if (arg === '-w' || arg === '--words') {
46
+ showWords = true;
47
+ }
48
+ else if (arg.startsWith('-')) {
49
+ const flags = arg.slice(1).split('');
50
+ if (flags.includes('c'))
51
+ showBytes = true;
52
+ if (flags.includes('l'))
53
+ showLines = true;
54
+ if (flags.includes('w'))
55
+ showWords = true;
56
+ const invalidFlags = flags.filter(f => !['c', 'l', 'w'].includes(f));
57
+ if (invalidFlags.length > 0) {
58
+ await writelnStderr(process, terminal, `wc: invalid option -- '${invalidFlags[0]}'`);
59
+ return 1;
60
+ }
61
+ }
62
+ else {
63
+ files.push(arg);
64
+ }
65
+ }
66
+ const showAll = !showBytes && !showLines && !showWords;
67
+ const writer = process.stdout.getWriter();
68
+ try {
69
+ if (files.length === 0) {
70
+ if (!process.stdin) {
71
+ return 0;
72
+ }
73
+ const reader = process.stdin.getReader();
74
+ const decoder = new TextDecoder();
75
+ let content = '';
76
+ try {
77
+ while (true) {
78
+ const { done, value } = await reader.read();
79
+ if (done)
80
+ break;
81
+ if (value) {
82
+ content += decoder.decode(value, { stream: true });
83
+ }
84
+ }
85
+ }
86
+ finally {
87
+ reader.releaseLock();
88
+ }
89
+ const lines = content.split('\n').length - (content.endsWith('\n') ? 0 : 1);
90
+ const words = content.trim().split(/\s+/).filter(w => w.length > 0).length;
91
+ const bytes = new TextEncoder().encode(content).length;
92
+ let output = '';
93
+ if (showAll || showLines)
94
+ output += `${lines} `;
95
+ if (showAll || showWords)
96
+ output += `${words} `;
97
+ if (showAll || showBytes)
98
+ output += `${bytes} `;
99
+ output = output.trim();
100
+ await writer.write(new TextEncoder().encode(output + '\n'));
101
+ return 0;
102
+ }
103
+ let totalLines = 0;
104
+ let totalWords = 0;
105
+ let totalBytes = 0;
106
+ const results = [];
107
+ for (const file of files) {
108
+ const fullPath = path.resolve(shell.cwd, file);
109
+ let interrupted = false;
110
+ const interruptHandler = () => { interrupted = true; };
111
+ kernel.terminal.events.on(TerminalEvents.INTERRUPT, interruptHandler);
112
+ try {
113
+ if (fullPath.startsWith('/dev')) {
114
+ await writelnStderr(process, terminal, `wc: ${file}: cannot count device files`);
115
+ continue;
116
+ }
117
+ const handle = await shell.context.fs.promises.open(fullPath, 'r');
118
+ const stat = await shell.context.fs.promises.stat(fullPath);
119
+ const decoder = new TextDecoder();
120
+ let content = '';
121
+ let bytesRead = 0;
122
+ const chunkSize = 1024;
123
+ while (bytesRead < stat.size) {
124
+ if (interrupted)
125
+ break;
126
+ const data = new Uint8Array(chunkSize);
127
+ const readSize = Math.min(chunkSize, stat.size - bytesRead);
128
+ await handle.read(data, 0, readSize, bytesRead);
129
+ const chunk = data.subarray(0, readSize);
130
+ content += decoder.decode(chunk, { stream: true });
131
+ bytesRead += readSize;
132
+ }
133
+ const lines = content.split('\n').length - (content.endsWith('\n') ? 0 : 1);
134
+ const words = content.trim().split(/\s+/).filter(w => w.length > 0).length;
135
+ const bytes = new TextEncoder().encode(content).length;
136
+ totalLines += lines;
137
+ totalWords += words;
138
+ totalBytes += bytes;
139
+ results.push({ lines, words, bytes, file });
140
+ }
141
+ catch (error) {
142
+ await writelnStderr(process, terminal, `wc: ${file}: ${error instanceof Error ? error.message : 'Unknown error'}`);
143
+ }
144
+ finally {
145
+ kernel.terminal.events.off(TerminalEvents.INTERRUPT, interruptHandler);
146
+ }
147
+ }
148
+ for (const result of results) {
149
+ let output = '';
150
+ if (showAll || showLines)
151
+ output += `${result.lines} `;
152
+ if (showAll || showWords)
153
+ output += `${result.words} `;
154
+ if (showAll || showBytes)
155
+ output += `${result.bytes} `;
156
+ output += result.file;
157
+ await writer.write(new TextEncoder().encode(output + '\n'));
158
+ }
159
+ if (files.length > 1) {
160
+ let output = '';
161
+ if (showAll || showLines)
162
+ output += `${totalLines} `;
163
+ if (showAll || showWords)
164
+ output += `${totalWords} `;
165
+ if (showAll || showBytes)
166
+ output += `${totalBytes} `;
167
+ output += 'total';
168
+ await writer.write(new TextEncoder().encode(output + '\n'));
169
+ }
170
+ return 0;
171
+ }
172
+ finally {
173
+ writer.releaseLock();
174
+ }
175
+ }
176
+ });
177
+ }
178
+ //# sourceMappingURL=wc.js.map