@ecmaos/coreutils 0.2.1 → 0.3.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 (150) hide show
  1. package/.turbo/turbo-build.log +1 -1
  2. package/CHANGELOG.md +37 -0
  3. package/LICENSE +1 -1
  4. package/dist/commands/cal.js +2 -2
  5. package/dist/commands/cal.js.map +1 -1
  6. package/dist/commands/cat.js +2 -2
  7. package/dist/commands/cd.js +2 -2
  8. package/dist/commands/chmod.d.ts.map +1 -1
  9. package/dist/commands/chmod.js +16 -11
  10. package/dist/commands/chmod.js.map +1 -1
  11. package/dist/commands/cp.js +2 -2
  12. package/dist/commands/cp.js.map +1 -1
  13. package/dist/commands/cron.d.ts +4 -0
  14. package/dist/commands/cron.d.ts.map +1 -0
  15. package/dist/commands/cron.js +439 -0
  16. package/dist/commands/cron.js.map +1 -0
  17. package/dist/commands/date.js +2 -2
  18. package/dist/commands/date.js.map +1 -1
  19. package/dist/commands/echo.js +2 -2
  20. package/dist/commands/echo.js.map +1 -1
  21. package/dist/commands/false.js +2 -2
  22. package/dist/commands/fetch.d.ts +4 -0
  23. package/dist/commands/fetch.d.ts.map +1 -0
  24. package/dist/commands/fetch.js +210 -0
  25. package/dist/commands/fetch.js.map +1 -0
  26. package/dist/commands/format.d.ts +4 -0
  27. package/dist/commands/format.d.ts.map +1 -0
  28. package/dist/commands/format.js +178 -0
  29. package/dist/commands/format.js.map +1 -0
  30. package/dist/commands/hash.d.ts +4 -0
  31. package/dist/commands/hash.d.ts.map +1 -0
  32. package/dist/commands/hash.js +200 -0
  33. package/dist/commands/hash.js.map +1 -0
  34. package/dist/commands/head.js +2 -2
  35. package/dist/commands/id.js +2 -2
  36. package/dist/commands/id.js.map +1 -1
  37. package/dist/commands/less.d.ts.map +1 -1
  38. package/dist/commands/less.js +53 -2
  39. package/dist/commands/less.js.map +1 -1
  40. package/dist/commands/ls.d.ts.map +1 -1
  41. package/dist/commands/ls.js +41 -15
  42. package/dist/commands/ls.js.map +1 -1
  43. package/dist/commands/man.d.ts +4 -0
  44. package/dist/commands/man.d.ts.map +1 -0
  45. package/dist/commands/man.js +564 -0
  46. package/dist/commands/man.js.map +1 -0
  47. package/dist/commands/mkdir.js +2 -2
  48. package/dist/commands/mkdir.js.map +1 -1
  49. package/dist/commands/mktemp.d.ts +4 -0
  50. package/dist/commands/mktemp.d.ts.map +1 -0
  51. package/dist/commands/mktemp.js +229 -0
  52. package/dist/commands/mktemp.js.map +1 -0
  53. package/dist/commands/nc.js +2 -2
  54. package/dist/commands/nc.js.map +1 -1
  55. package/dist/commands/open.d.ts +4 -0
  56. package/dist/commands/open.d.ts.map +1 -0
  57. package/dist/commands/open.js +74 -0
  58. package/dist/commands/open.js.map +1 -0
  59. package/dist/commands/passkey.js +3 -3
  60. package/dist/commands/play.d.ts +4 -0
  61. package/dist/commands/play.d.ts.map +1 -0
  62. package/dist/commands/play.js +231 -0
  63. package/dist/commands/play.js.map +1 -0
  64. package/dist/commands/pwd.js +2 -2
  65. package/dist/commands/pwd.js.map +1 -1
  66. package/dist/commands/rm.d.ts.map +1 -1
  67. package/dist/commands/rm.js +57 -12
  68. package/dist/commands/rm.js.map +1 -1
  69. package/dist/commands/rmdir.js +2 -2
  70. package/dist/commands/rmdir.js.map +1 -1
  71. package/dist/commands/sockets.js +1 -1
  72. package/dist/commands/stat.d.ts.map +1 -1
  73. package/dist/commands/stat.js +37 -15
  74. package/dist/commands/stat.js.map +1 -1
  75. package/dist/commands/tail.js +2 -2
  76. package/dist/commands/tar.d.ts +4 -0
  77. package/dist/commands/tar.d.ts.map +1 -0
  78. package/dist/commands/tar.js +743 -0
  79. package/dist/commands/tar.js.map +1 -0
  80. package/dist/commands/touch.js +2 -2
  81. package/dist/commands/touch.js.map +1 -1
  82. package/dist/commands/true.js +2 -2
  83. package/dist/commands/unzip.d.ts +4 -0
  84. package/dist/commands/unzip.d.ts.map +1 -0
  85. package/dist/commands/unzip.js +443 -0
  86. package/dist/commands/unzip.js.map +1 -0
  87. package/dist/commands/user.js +1 -1
  88. package/dist/commands/video.d.ts +4 -0
  89. package/dist/commands/video.d.ts.map +1 -0
  90. package/dist/commands/video.js +250 -0
  91. package/dist/commands/video.js.map +1 -0
  92. package/dist/commands/view.d.ts +4 -0
  93. package/dist/commands/view.d.ts.map +1 -0
  94. package/dist/commands/view.js +488 -0
  95. package/dist/commands/view.js.map +1 -0
  96. package/dist/commands/web.d.ts +4 -0
  97. package/dist/commands/web.d.ts.map +1 -0
  98. package/dist/commands/web.js +348 -0
  99. package/dist/commands/web.js.map +1 -0
  100. package/dist/commands/whoami.js +2 -2
  101. package/dist/commands/whoami.js.map +1 -1
  102. package/dist/commands/zip.d.ts +4 -0
  103. package/dist/commands/zip.d.ts.map +1 -0
  104. package/dist/commands/zip.js +264 -0
  105. package/dist/commands/zip.js.map +1 -0
  106. package/dist/index.d.ts +14 -0
  107. package/dist/index.d.ts.map +1 -1
  108. package/dist/index.js +44 -2
  109. package/dist/index.js.map +1 -1
  110. package/package.json +7 -4
  111. package/src/commands/cal.ts +2 -2
  112. package/src/commands/cat.ts +2 -2
  113. package/src/commands/cd.ts +2 -2
  114. package/src/commands/chmod.ts +19 -11
  115. package/src/commands/cp.ts +2 -2
  116. package/src/commands/cron.ts +499 -0
  117. package/src/commands/date.ts +2 -2
  118. package/src/commands/echo.ts +2 -2
  119. package/src/commands/false.ts +2 -2
  120. package/src/commands/fetch.ts +205 -0
  121. package/src/commands/format.ts +204 -0
  122. package/src/commands/hash.ts +215 -0
  123. package/src/commands/head.ts +2 -2
  124. package/src/commands/id.ts +2 -2
  125. package/src/commands/less.ts +50 -2
  126. package/src/commands/ls.ts +40 -14
  127. package/src/commands/man.ts +651 -0
  128. package/src/commands/mkdir.ts +2 -2
  129. package/src/commands/mktemp.ts +235 -0
  130. package/src/commands/nc.ts +2 -2
  131. package/src/commands/open.ts +84 -0
  132. package/src/commands/passkey.ts +3 -3
  133. package/src/commands/play.ts +249 -0
  134. package/src/commands/pwd.ts +2 -2
  135. package/src/commands/rm.ts +54 -12
  136. package/src/commands/rmdir.ts +2 -2
  137. package/src/commands/sockets.ts +1 -1
  138. package/src/commands/stat.ts +44 -16
  139. package/src/commands/tail.ts +2 -2
  140. package/src/commands/tar.ts +780 -0
  141. package/src/commands/touch.ts +2 -2
  142. package/src/commands/true.ts +2 -2
  143. package/src/commands/unzip.ts +517 -0
  144. package/src/commands/user.ts +1 -1
  145. package/src/commands/video.ts +267 -0
  146. package/src/commands/view.ts +526 -0
  147. package/src/commands/web.ts +377 -0
  148. package/src/commands/whoami.ts +2 -2
  149. package/src/commands/zip.ts +319 -0
  150. package/src/index.ts +44 -2
@@ -0,0 +1,210 @@
1
+ import path from 'path';
2
+ import chalk from 'chalk';
3
+ import { TerminalCommand } from '../shared/terminal-command.js';
4
+ import { writelnStderr } from '../shared/helpers.js';
5
+ function printUsage(process, terminal) {
6
+ const usage = `Usage: fetch [OPTION]... URL
7
+ Fetch a resource from the network.
8
+
9
+ -o, --output=FILE write output to FILE instead of stdout
10
+ -X, --method=METHOD HTTP method to use (default: GET)
11
+ -d, --data=DATA request body data to send
12
+ -H, --header=HEADER add custom HTTP header (format: "Name: Value")
13
+ --help display this help and exit
14
+
15
+ Examples:
16
+ fetch https://example.com fetch and output to stdout
17
+ fetch -o file.txt https://example.com fetch and save to file.txt
18
+ fetch -X POST -d "data" https://api.example.com POST request with body`;
19
+ writelnStderr(process, terminal, usage);
20
+ }
21
+ export function createCommand(kernel, shell, terminal) {
22
+ return new TerminalCommand({
23
+ command: 'fetch',
24
+ description: 'Fetch a resource from the network',
25
+ kernel,
26
+ shell,
27
+ terminal,
28
+ run: async (pid, argv) => {
29
+ const process = kernel.processes.get(pid);
30
+ if (!process)
31
+ return 1;
32
+ if (argv.length > 0 && (argv[0] === '--help' || argv[0] === '-h')) {
33
+ printUsage(process, terminal);
34
+ return 0;
35
+ }
36
+ let url;
37
+ let outputFile;
38
+ let method = 'GET';
39
+ let body;
40
+ const headers = {};
41
+ // Parse arguments
42
+ for (let i = 0; i < argv.length; i++) {
43
+ const arg = argv[i];
44
+ if (arg === undefined)
45
+ continue;
46
+ if (arg === '--help' || arg === '-h') {
47
+ printUsage(process, terminal);
48
+ return 0;
49
+ }
50
+ else if (arg === '-o' || arg === '--output') {
51
+ const fileArg = argv[i + 1];
52
+ if (!fileArg) {
53
+ await writelnStderr(process, terminal, `fetch: option requires an argument -- '${arg === '-o' ? 'o' : 'output'}'`);
54
+ return 1;
55
+ }
56
+ outputFile = fileArg;
57
+ i++; // Skip the next argument as it's the file value
58
+ }
59
+ else if (arg.startsWith('--output=')) {
60
+ const outputValue = arg.split('=')[1];
61
+ if (!outputValue) {
62
+ await writelnStderr(process, terminal, `fetch: option requires an argument -- 'output'`);
63
+ return 1;
64
+ }
65
+ outputFile = outputValue;
66
+ }
67
+ else if (arg === '-X' || arg === '--method') {
68
+ const methodArg = argv[i + 1];
69
+ if (!methodArg) {
70
+ await writelnStderr(process, terminal, `fetch: option requires an argument -- '${arg === '-X' ? 'X' : 'method'}'`);
71
+ return 1;
72
+ }
73
+ method = methodArg.toUpperCase();
74
+ i++; // Skip the next argument as it's the method value
75
+ }
76
+ else if (arg.startsWith('--method=')) {
77
+ const methodValue = arg.split('=')[1];
78
+ if (!methodValue) {
79
+ await writelnStderr(process, terminal, `fetch: option requires an argument -- 'method'`);
80
+ return 1;
81
+ }
82
+ method = methodValue.toUpperCase();
83
+ }
84
+ else if (arg === '-d' || arg === '--data') {
85
+ const dataArg = argv[i + 1];
86
+ if (!dataArg) {
87
+ await writelnStderr(process, terminal, `fetch: option requires an argument -- '${arg === '-d' ? 'd' : 'data'}'`);
88
+ return 1;
89
+ }
90
+ body = dataArg;
91
+ i++; // Skip the next argument as it's the data value
92
+ }
93
+ else if (arg.startsWith('--data=')) {
94
+ const dataValue = arg.split('=')[1];
95
+ if (!dataValue) {
96
+ await writelnStderr(process, terminal, `fetch: option requires an argument -- 'data'`);
97
+ return 1;
98
+ }
99
+ body = dataValue;
100
+ }
101
+ else if (arg === '-H' || arg === '--header') {
102
+ const headerArg = argv[i + 1];
103
+ if (!headerArg) {
104
+ await writelnStderr(process, terminal, `fetch: option requires an argument -- '${arg === '-H' ? 'H' : 'header'}'`);
105
+ return 1;
106
+ }
107
+ const [name, ...valueParts] = headerArg.split(':');
108
+ if (!name || valueParts.length === 0) {
109
+ await writelnStderr(process, terminal, `fetch: invalid header format. Expected "Name: Value"`);
110
+ return 1;
111
+ }
112
+ headers[name.trim()] = valueParts.join(':').trim();
113
+ i++; // Skip the next argument as it's the header value
114
+ }
115
+ else if (arg.startsWith('--header=')) {
116
+ const headerValue = arg.split('=')[1];
117
+ if (!headerValue) {
118
+ await writelnStderr(process, terminal, `fetch: option requires an argument -- 'header'`);
119
+ return 1;
120
+ }
121
+ const [name, ...valueParts] = headerValue.split(':');
122
+ if (!name || valueParts.length === 0) {
123
+ await writelnStderr(process, terminal, `fetch: invalid header format. Expected "Name: Value"`);
124
+ return 1;
125
+ }
126
+ headers[name.trim()] = valueParts.join(':').trim();
127
+ }
128
+ else if (!arg.startsWith('-')) {
129
+ // Positional argument - should be the URL
130
+ if (!url) {
131
+ url = arg;
132
+ }
133
+ else {
134
+ await writelnStderr(process, terminal, `fetch: unexpected argument: ${arg}`);
135
+ return 1;
136
+ }
137
+ }
138
+ else {
139
+ await writelnStderr(process, terminal, `fetch: invalid option -- '${arg.replace(/^-+/, '')}'`);
140
+ await writelnStderr(process, terminal, `Try 'fetch --help' for more information.`);
141
+ return 1;
142
+ }
143
+ }
144
+ if (!url) {
145
+ await writelnStderr(process, terminal, `fetch: URL is required`);
146
+ await writelnStderr(process, terminal, `Try 'fetch --help' for more information.`);
147
+ return 1;
148
+ }
149
+ try {
150
+ const fetchOptions = { method };
151
+ if (body)
152
+ fetchOptions.body = body;
153
+ if (Object.keys(headers).length > 0)
154
+ fetchOptions.headers = headers;
155
+ const response = await globalThis.fetch(url, fetchOptions);
156
+ if (!response.ok) {
157
+ await writelnStderr(process, terminal, chalk.red(`fetch: HTTP error! status: ${response.status} ${response.statusText}`));
158
+ return 1;
159
+ }
160
+ const reader = response.body?.getReader();
161
+ if (!reader) {
162
+ await writelnStderr(process, terminal, chalk.red(`fetch: No response body`));
163
+ return 1;
164
+ }
165
+ let writer;
166
+ if (outputFile) {
167
+ // Write to file
168
+ const fullPath = path.resolve(shell.cwd, outputFile);
169
+ const fileHandle = await shell.context.fs.promises.open(fullPath, 'w');
170
+ writer = {
171
+ write: async (chunk) => {
172
+ await fileHandle.write(chunk);
173
+ },
174
+ releaseLock: async () => {
175
+ await fileHandle.close();
176
+ }
177
+ };
178
+ }
179
+ else {
180
+ // Write to stdout
181
+ if (!process.stdout) {
182
+ await writelnStderr(process, terminal, chalk.red(`fetch: No stdout available`));
183
+ return 1;
184
+ }
185
+ writer = process.stdout.getWriter();
186
+ }
187
+ try {
188
+ while (true) {
189
+ const { done, value } = await reader.read();
190
+ if (done)
191
+ break;
192
+ if (value && value.length > 0)
193
+ await writer.write(value);
194
+ }
195
+ }
196
+ finally {
197
+ reader.releaseLock();
198
+ if (writer && 'releaseLock' in writer)
199
+ await writer.releaseLock();
200
+ }
201
+ return 0;
202
+ }
203
+ catch (error) {
204
+ await writelnStderr(process, terminal, chalk.red(`fetch: ${error instanceof Error ? error.message : 'Unknown error'}`));
205
+ return 1;
206
+ }
207
+ }
208
+ });
209
+ }
210
+ //# sourceMappingURL=fetch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fetch.js","sourceRoot":"","sources":["../../src/commands/fetch.ts"],"names":[],"mappings":"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"}
@@ -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=format.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format.d.ts","sourceRoot":"","sources":["../../src/commands/format.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;AAwF/D,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,GAAG,eAAe,CAiH/F"}
@@ -0,0 +1,178 @@
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: format [OPTION]...
6
+ Delete all IndexedDB and localStorage data.
7
+
8
+ -i, --indexeddb Delete only IndexedDB databases
9
+ -l, --localstorage Delete only localStorage
10
+ -k, --keep <name> Preserve specific IndexedDB database(s) (can be used multiple times)
11
+ --help Display this help and exit
12
+
13
+ By default, deletes all IndexedDB databases and localStorage.
14
+ Requires root privileges and interactive confirmation.`;
15
+ writelnStderr(process, terminal, usage);
16
+ }
17
+ async function emptyIndexedDBDatabases(keepDatabases, _kernel, process, terminal) {
18
+ try {
19
+ if (!globalThis.indexedDB) {
20
+ await writelnStderr(process, terminal, chalk.yellow('format: IndexedDB is not available'));
21
+ return false;
22
+ }
23
+ await writelnStdout(process, terminal, chalk.yellow('format: Emptying filesystem...'));
24
+ let databases = [];
25
+ if (typeof indexedDB.databases === 'function') {
26
+ const dbList = await indexedDB.databases();
27
+ databases = dbList
28
+ .filter((db) => typeof db.name === 'string')
29
+ .map(db => ({ name: db.name, version: db.version }));
30
+ }
31
+ else {
32
+ await writelnStdout(process, terminal, chalk.yellow('format: indexedDB.databases() not supported, assuming filesystem will be emptied on reboot'));
33
+ return true;
34
+ }
35
+ const databasesToEmpty = databases.filter(db => !keepDatabases.includes(db.name));
36
+ if (databasesToEmpty.length === 0) {
37
+ await writelnStdout(process, terminal, chalk.green('format: All databases are preserved, nothing to empty'));
38
+ return true;
39
+ }
40
+ if (keepDatabases.length > 0) {
41
+ const preserved = databases.filter(db => keepDatabases.includes(db.name));
42
+ if (preserved.length > 0) {
43
+ await writelnStdout(process, terminal, chalk.cyan(`format: Preserving databases: ${preserved.map(db => db.name).join(', ')}`));
44
+ }
45
+ }
46
+ await writelnStdout(process, terminal, chalk.green(`format: Will empty ${databasesToEmpty.length} IndexedDB database(s) on reboot`));
47
+ return true;
48
+ }
49
+ catch (error) {
50
+ const errorMessage = error instanceof Error ? error.message : String(error);
51
+ await writelnStderr(process, terminal, chalk.red(`format: Error preparing IndexedDB databases: ${errorMessage}`));
52
+ return false;
53
+ }
54
+ }
55
+ async function deleteLocalStorage(process, terminal, storage) {
56
+ try {
57
+ const keysCount = storage.length;
58
+ if (keysCount === 0) {
59
+ await writelnStdout(process, terminal, chalk.green('format: localStorage is already empty'));
60
+ return true;
61
+ }
62
+ storage.clear();
63
+ await writelnStdout(process, terminal, chalk.green(`format: Successfully cleared localStorage (${keysCount} item(s))`));
64
+ return true;
65
+ }
66
+ catch (error) {
67
+ const errorMessage = error instanceof Error ? error.message : String(error);
68
+ await writelnStderr(process, terminal, chalk.red(`format: Error clearing localStorage: ${errorMessage}`));
69
+ return false;
70
+ }
71
+ }
72
+ export function createCommand(kernel, shell, terminal) {
73
+ return new TerminalCommand({
74
+ command: 'format',
75
+ description: 'Delete all IndexedDB and localStorage data',
76
+ kernel,
77
+ shell,
78
+ terminal,
79
+ run: async (pid, argv) => {
80
+ const process = kernel.processes.get(pid);
81
+ if (argv.length > 0 && (argv[0] === '--help' || argv[0] === '-h')) {
82
+ printUsage(process, terminal);
83
+ return 0;
84
+ }
85
+ if (shell.credentials.suid !== 0) {
86
+ await writelnStderr(process, terminal, chalk.red('format: permission denied (requires root)'));
87
+ return 1;
88
+ }
89
+ let onlyIndexedDB = false;
90
+ let onlyLocalStorage = false;
91
+ const keepDatabases = [];
92
+ for (let i = 0; i < argv.length; i++) {
93
+ const arg = argv[i];
94
+ if (!arg || typeof arg !== 'string')
95
+ continue;
96
+ if (arg === '-i' || arg === '--indexeddb') {
97
+ onlyIndexedDB = true;
98
+ }
99
+ else if (arg === '-l' || arg === '--localstorage') {
100
+ onlyLocalStorage = true;
101
+ }
102
+ else if (arg === '-k' || arg === '--keep') {
103
+ if (i + 1 < argv.length) {
104
+ const dbName = argv[++i];
105
+ if (dbName && !dbName.startsWith('-')) {
106
+ keepDatabases.push(dbName);
107
+ }
108
+ else {
109
+ await writelnStderr(process, terminal, chalk.red('format: --keep requires a database name'));
110
+ return 1;
111
+ }
112
+ }
113
+ else {
114
+ await writelnStderr(process, terminal, chalk.red('format: --keep requires a database name'));
115
+ return 1;
116
+ }
117
+ }
118
+ else if (arg.startsWith('-')) {
119
+ await writelnStderr(process, terminal, chalk.red(`format: invalid option -- '${arg.replace(/^-+/, '')}'`));
120
+ await writelnStdout(process, terminal, "Try 'format --help' for more information.");
121
+ return 1;
122
+ }
123
+ }
124
+ if (onlyIndexedDB && onlyLocalStorage) {
125
+ await writelnStderr(process, terminal, chalk.red('format: cannot specify both --indexeddb and --localstorage'));
126
+ return 1;
127
+ }
128
+ const deleteIndexedDB = !onlyLocalStorage;
129
+ const deleteLocal = !onlyIndexedDB;
130
+ let actionDescription = 'This will delete ';
131
+ if (deleteIndexedDB && deleteLocal) {
132
+ actionDescription += 'ALL IndexedDB databases and localStorage data';
133
+ }
134
+ else if (deleteIndexedDB) {
135
+ actionDescription += 'ALL IndexedDB databases';
136
+ }
137
+ else {
138
+ actionDescription += 'ALL localStorage data';
139
+ }
140
+ if (keepDatabases.length > 0) {
141
+ actionDescription += ` (preserving: ${keepDatabases.join(', ')})`;
142
+ }
143
+ actionDescription += '. This action cannot be undone!';
144
+ await writelnStderr(process, terminal, chalk.red.bold(`⚠️ WARNING: ${actionDescription}`));
145
+ await writelnStdout(process, terminal, chalk.yellow('Type "yes" to continue, or anything else to cancel: '));
146
+ const confirmation = await terminal.readline();
147
+ if (confirmation.trim().toLowerCase() !== 'yes') {
148
+ await writelnStdout(process, terminal, chalk.yellow('format: Operation cancelled'));
149
+ return 0;
150
+ }
151
+ if (kernel.storage.db) {
152
+ kernel.storage.db.close();
153
+ }
154
+ let success = true;
155
+ if (deleteIndexedDB) {
156
+ const indexedDBSuccess = await emptyIndexedDBDatabases(keepDatabases, kernel, process, terminal);
157
+ success = success && indexedDBSuccess;
158
+ }
159
+ if (deleteLocal) {
160
+ const localStorageSuccess = await deleteLocalStorage(process, terminal, kernel.storage.local);
161
+ success = success && localStorageSuccess;
162
+ }
163
+ if (success) {
164
+ await writelnStdout(process, terminal, chalk.green.bold('format: Format operation completed successfully'));
165
+ await writelnStdout(process, terminal, chalk.yellow('format: Rebooting system to complete format...'));
166
+ setTimeout(() => {
167
+ kernel.reboot();
168
+ }, 500);
169
+ return 0;
170
+ }
171
+ else {
172
+ await writelnStderr(process, terminal, chalk.red.bold('format: Format operation completed with errors'));
173
+ return 1;
174
+ }
175
+ }
176
+ });
177
+ }
178
+ //# sourceMappingURL=format.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format.js","sourceRoot":"","sources":["../../src/commands/format.ts"],"names":[],"mappings":"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"}
@@ -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=hash.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hash.d.ts","sourceRoot":"","sources":["../../src/commands/hash.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;AAyE/D,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,GAAG,eAAe,CA0I/F"}
@@ -0,0 +1,200 @@
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
+ const SUPPORTED_ALGORITHMS = {
6
+ 'sha1': 'SHA-1',
7
+ 'sha-1': 'SHA-1',
8
+ 'sha256': 'SHA-256',
9
+ 'sha-256': 'SHA-256',
10
+ 'sha384': 'SHA-384',
11
+ 'sha-384': 'SHA-384',
12
+ 'sha512': 'SHA-512',
13
+ 'sha-512': 'SHA-512'
14
+ };
15
+ function printUsage(process, terminal) {
16
+ const usage = `Usage: hash [OPTION]... [FILE]...
17
+ Compute and display hash values for files or standard input.
18
+
19
+ -a, --algorithm=ALGORITHM hash algorithm to use (sha1, sha256, sha384, sha512)
20
+ default: sha256
21
+ --help display this help and exit
22
+
23
+ Supported algorithms:
24
+ sha1, sha-1 SHA-1 (160 bits)
25
+ sha256, sha-256 SHA-256 (256 bits) [default]
26
+ sha384, sha-384 SHA-384 (384 bits)
27
+ sha512, sha-512 SHA-512 (512 bits)
28
+
29
+ Examples:
30
+ hash file.txt compute SHA-256 hash of file.txt
31
+ hash -a sha512 file.txt compute SHA-512 hash of file.txt
32
+ echo "hello" | hash compute SHA-256 hash of stdin`;
33
+ writelnStderr(process, terminal, usage);
34
+ }
35
+ async function hashData(data, algorithm) {
36
+ // Create a new Uint8Array with a proper ArrayBuffer to ensure compatibility
37
+ const dataCopy = new Uint8Array(data);
38
+ const hashBuffer = await crypto.subtle.digest(algorithm, dataCopy);
39
+ const hashArray = Array.from(new Uint8Array(hashBuffer));
40
+ return hashArray.map(b => b.toString(16).padStart(2, '0')).join('');
41
+ }
42
+ async function readStreamToUint8Array(reader) {
43
+ const chunks = [];
44
+ try {
45
+ while (true) {
46
+ const { done, value } = await reader.read();
47
+ if (done)
48
+ break;
49
+ if (value) {
50
+ chunks.push(value);
51
+ }
52
+ }
53
+ }
54
+ finally {
55
+ reader.releaseLock();
56
+ }
57
+ // Calculate total length
58
+ const totalLength = chunks.reduce((sum, chunk) => sum + chunk.length, 0);
59
+ // Concatenate all chunks into a single Uint8Array
60
+ const result = new Uint8Array(totalLength);
61
+ let offset = 0;
62
+ for (const chunk of chunks) {
63
+ result.set(chunk, offset);
64
+ offset += chunk.length;
65
+ }
66
+ return result;
67
+ }
68
+ export function createCommand(kernel, shell, terminal) {
69
+ return new TerminalCommand({
70
+ command: 'hash',
71
+ description: 'Compute and display hash values for files or standard input',
72
+ kernel,
73
+ shell,
74
+ terminal,
75
+ run: async (pid, argv) => {
76
+ const process = kernel.processes.get(pid);
77
+ if (!process)
78
+ return 1;
79
+ if (argv.length > 0 && (argv[0] === '--help' || argv[0] === '-h')) {
80
+ printUsage(process, terminal);
81
+ return 0;
82
+ }
83
+ let algorithm = 'SHA-256';
84
+ const files = [];
85
+ // Parse arguments
86
+ for (let i = 0; i < argv.length; i++) {
87
+ const arg = argv[i];
88
+ if (arg === undefined)
89
+ continue;
90
+ if (arg === '--help' || arg === '-h') {
91
+ printUsage(process, terminal);
92
+ return 0;
93
+ }
94
+ else if (arg === '-a' || arg === '--algorithm') {
95
+ const algoArg = argv[i + 1];
96
+ if (!algoArg) {
97
+ await writelnStderr(process, terminal, `hash: option requires an argument -- '${arg === '-a' ? 'a' : 'algorithm'}'`);
98
+ return 1;
99
+ }
100
+ const algoLower = algoArg.toLowerCase();
101
+ const selectedAlgorithm = SUPPORTED_ALGORITHMS[algoLower];
102
+ if (!selectedAlgorithm) {
103
+ await writelnStderr(process, terminal, `hash: unsupported algorithm '${algoArg}'\nSupported algorithms: ${Object.keys(SUPPORTED_ALGORITHMS).join(', ')}`);
104
+ return 1;
105
+ }
106
+ algorithm = selectedAlgorithm;
107
+ i++; // Skip the next argument as it's the algorithm value
108
+ }
109
+ else if (arg.startsWith('--algorithm=')) {
110
+ const algoArg = arg.split('=')[1];
111
+ if (!algoArg) {
112
+ await writelnStderr(process, terminal, `hash: option requires an argument -- 'algorithm'`);
113
+ return 1;
114
+ }
115
+ const algoLower = algoArg.toLowerCase();
116
+ const selectedAlgorithm = SUPPORTED_ALGORITHMS[algoLower];
117
+ if (!selectedAlgorithm) {
118
+ await writelnStderr(process, terminal, `hash: unsupported algorithm '${algoArg}'\nSupported algorithms: ${Object.keys(SUPPORTED_ALGORITHMS).join(', ')}`);
119
+ return 1;
120
+ }
121
+ algorithm = selectedAlgorithm;
122
+ }
123
+ else if (!arg.startsWith('-')) {
124
+ files.push(arg);
125
+ }
126
+ else {
127
+ await writelnStderr(process, terminal, `hash: invalid option -- '${arg.replace(/^-+/, '')}'`);
128
+ await writelnStderr(process, terminal, `Try 'hash --help' for more information.`);
129
+ return 1;
130
+ }
131
+ }
132
+ const writer = process.stdout.getWriter();
133
+ try {
134
+ // If no files specified, read from stdin
135
+ if (files.length === 0) {
136
+ if (!process.stdin) {
137
+ await writelnStderr(process, terminal, 'hash: no input specified');
138
+ return 1;
139
+ }
140
+ const reader = process.stdin.getReader();
141
+ const data = await readStreamToUint8Array(reader);
142
+ const hash = await hashData(data, algorithm);
143
+ await writer.write(new TextEncoder().encode(hash + '\n'));
144
+ return 0;
145
+ }
146
+ // Process each file
147
+ let hasError = false;
148
+ for (const file of files) {
149
+ const fullPath = path.resolve(shell.cwd, file);
150
+ let interrupted = false;
151
+ const interruptHandler = () => { interrupted = true; };
152
+ kernel.terminal.events.on(TerminalEvents.INTERRUPT, interruptHandler);
153
+ try {
154
+ if (fullPath.startsWith('/dev')) {
155
+ await writelnStderr(process, terminal, `hash: ${file}: cannot hash device files`);
156
+ hasError = true;
157
+ continue;
158
+ }
159
+ const handle = await shell.context.fs.promises.open(fullPath, 'r');
160
+ const stat = await shell.context.fs.promises.stat(fullPath);
161
+ const chunks = [];
162
+ let bytesRead = 0;
163
+ const chunkSize = 64 * 1024; // 64KB chunks for better performance
164
+ while (bytesRead < stat.size) {
165
+ if (interrupted)
166
+ break;
167
+ const data = new Uint8Array(chunkSize);
168
+ const readSize = Math.min(chunkSize, stat.size - bytesRead);
169
+ await handle.read(data, 0, readSize, bytesRead);
170
+ chunks.push(data.subarray(0, readSize));
171
+ bytesRead += readSize;
172
+ }
173
+ // Concatenate all chunks
174
+ const totalLength = chunks.reduce((sum, chunk) => sum + chunk.length, 0);
175
+ const fileData = new Uint8Array(totalLength);
176
+ let offset = 0;
177
+ for (const chunk of chunks) {
178
+ fileData.set(chunk, offset);
179
+ offset += chunk.length;
180
+ }
181
+ const hash = await hashData(fileData, algorithm);
182
+ await writer.write(new TextEncoder().encode(`${hash} ${file}\n`));
183
+ }
184
+ catch (error) {
185
+ await writelnStderr(process, terminal, `hash: ${file}: ${error instanceof Error ? error.message : 'Unknown error'}`);
186
+ hasError = true;
187
+ }
188
+ finally {
189
+ kernel.terminal.events.off(TerminalEvents.INTERRUPT, interruptHandler);
190
+ }
191
+ }
192
+ return hasError ? 1 : 0;
193
+ }
194
+ finally {
195
+ writer.releaseLock();
196
+ }
197
+ }
198
+ });
199
+ }
200
+ //# sourceMappingURL=hash.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hash.js","sourceRoot":"","sources":["../../src/commands/hash.ts"],"names":[],"mappings":"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"}