@ecmaos/coreutils 0.2.1 → 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.
Files changed (120) hide show
  1. package/.turbo/turbo-build.log +1 -1
  2. package/CHANGELOG.md +11 -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/date.js +2 -2
  14. package/dist/commands/date.js.map +1 -1
  15. package/dist/commands/echo.js +2 -2
  16. package/dist/commands/echo.js.map +1 -1
  17. package/dist/commands/false.js +2 -2
  18. package/dist/commands/fetch.d.ts +4 -0
  19. package/dist/commands/fetch.d.ts.map +1 -0
  20. package/dist/commands/fetch.js +210 -0
  21. package/dist/commands/fetch.js.map +1 -0
  22. package/dist/commands/format.d.ts +4 -0
  23. package/dist/commands/format.d.ts.map +1 -0
  24. package/dist/commands/format.js +178 -0
  25. package/dist/commands/format.js.map +1 -0
  26. package/dist/commands/hash.d.ts +4 -0
  27. package/dist/commands/hash.d.ts.map +1 -0
  28. package/dist/commands/hash.js +200 -0
  29. package/dist/commands/hash.js.map +1 -0
  30. package/dist/commands/head.js +2 -2
  31. package/dist/commands/id.js +2 -2
  32. package/dist/commands/id.js.map +1 -1
  33. package/dist/commands/less.d.ts.map +1 -1
  34. package/dist/commands/less.js +53 -2
  35. package/dist/commands/less.js.map +1 -1
  36. package/dist/commands/ls.d.ts.map +1 -1
  37. package/dist/commands/ls.js +41 -15
  38. package/dist/commands/ls.js.map +1 -1
  39. package/dist/commands/man.d.ts +4 -0
  40. package/dist/commands/man.d.ts.map +1 -0
  41. package/dist/commands/man.js +554 -0
  42. package/dist/commands/man.js.map +1 -0
  43. package/dist/commands/mkdir.js +2 -2
  44. package/dist/commands/mkdir.js.map +1 -1
  45. package/dist/commands/mktemp.d.ts +4 -0
  46. package/dist/commands/mktemp.d.ts.map +1 -0
  47. package/dist/commands/mktemp.js +229 -0
  48. package/dist/commands/mktemp.js.map +1 -0
  49. package/dist/commands/nc.js +2 -2
  50. package/dist/commands/nc.js.map +1 -1
  51. package/dist/commands/passkey.js +3 -3
  52. package/dist/commands/pwd.js +2 -2
  53. package/dist/commands/pwd.js.map +1 -1
  54. package/dist/commands/rm.d.ts.map +1 -1
  55. package/dist/commands/rm.js +57 -12
  56. package/dist/commands/rm.js.map +1 -1
  57. package/dist/commands/rmdir.js +2 -2
  58. package/dist/commands/rmdir.js.map +1 -1
  59. package/dist/commands/sockets.js +1 -1
  60. package/dist/commands/stat.d.ts.map +1 -1
  61. package/dist/commands/stat.js +37 -15
  62. package/dist/commands/stat.js.map +1 -1
  63. package/dist/commands/tail.js +2 -2
  64. package/dist/commands/tar.d.ts +4 -0
  65. package/dist/commands/tar.d.ts.map +1 -0
  66. package/dist/commands/tar.js +693 -0
  67. package/dist/commands/tar.js.map +1 -0
  68. package/dist/commands/touch.js +2 -2
  69. package/dist/commands/touch.js.map +1 -1
  70. package/dist/commands/true.js +2 -2
  71. package/dist/commands/unzip.d.ts +4 -0
  72. package/dist/commands/unzip.d.ts.map +1 -0
  73. package/dist/commands/unzip.js +443 -0
  74. package/dist/commands/unzip.js.map +1 -0
  75. package/dist/commands/user.js +1 -1
  76. package/dist/commands/whoami.js +2 -2
  77. package/dist/commands/whoami.js.map +1 -1
  78. package/dist/commands/zip.d.ts +4 -0
  79. package/dist/commands/zip.d.ts.map +1 -0
  80. package/dist/commands/zip.js +264 -0
  81. package/dist/commands/zip.js.map +1 -0
  82. package/dist/index.d.ts +8 -0
  83. package/dist/index.d.ts.map +1 -1
  84. package/dist/index.js +25 -1
  85. package/dist/index.js.map +1 -1
  86. package/package.json +6 -4
  87. package/src/commands/cal.ts +2 -2
  88. package/src/commands/cat.ts +2 -2
  89. package/src/commands/cd.ts +2 -2
  90. package/src/commands/chmod.ts +19 -11
  91. package/src/commands/cp.ts +2 -2
  92. package/src/commands/date.ts +2 -2
  93. package/src/commands/echo.ts +2 -2
  94. package/src/commands/false.ts +2 -2
  95. package/src/commands/fetch.ts +205 -0
  96. package/src/commands/format.ts +204 -0
  97. package/src/commands/hash.ts +215 -0
  98. package/src/commands/head.ts +2 -2
  99. package/src/commands/id.ts +2 -2
  100. package/src/commands/less.ts +50 -2
  101. package/src/commands/ls.ts +40 -14
  102. package/src/commands/man.ts +643 -0
  103. package/src/commands/mkdir.ts +2 -2
  104. package/src/commands/mktemp.ts +235 -0
  105. package/src/commands/nc.ts +2 -2
  106. package/src/commands/passkey.ts +3 -3
  107. package/src/commands/pwd.ts +2 -2
  108. package/src/commands/rm.ts +54 -12
  109. package/src/commands/rmdir.ts +2 -2
  110. package/src/commands/sockets.ts +1 -1
  111. package/src/commands/stat.ts +44 -16
  112. package/src/commands/tail.ts +2 -2
  113. package/src/commands/tar.ts +737 -0
  114. package/src/commands/touch.ts +2 -2
  115. package/src/commands/true.ts +2 -2
  116. package/src/commands/unzip.ts +517 -0
  117. package/src/commands/user.ts +1 -1
  118. package/src/commands/whoami.ts +2 -2
  119. package/src/commands/zip.ts +319 -0
  120. package/src/index.ts +25 -1
@@ -0,0 +1,319 @@
1
+ import path from 'path'
2
+ import * as zipjs from '@zip.js/zip.js'
3
+ import type { Kernel, Process, Shell, Terminal } from '@ecmaos/types'
4
+ import { TerminalCommand } from '../shared/terminal-command.js'
5
+ import { writelnStdout, writelnStderr } from '../shared/helpers.js'
6
+ import chalk from 'chalk'
7
+
8
+ function printUsage(process: Process | undefined, terminal: Terminal): void {
9
+ const usage = `Usage: zip [OPTION]... ZIPFILE FILE...
10
+ Create a zip archive containing the specified files and directories.
11
+
12
+ -r, --recurse recurse into directories
13
+ -l, --list list contents of zip file
14
+ -v, --verbose verbose mode
15
+ -h, --help display this help and exit
16
+
17
+ Examples:
18
+ zip archive.zip file1.txt file2.txt
19
+ zip -r archive.zip directory/
20
+ zip -l archive.zip`
21
+ writelnStderr(process, terminal, usage)
22
+ }
23
+
24
+ interface ZipOptions {
25
+ recurse: boolean
26
+ list: boolean
27
+ verbose: boolean
28
+ }
29
+
30
+ function parseArgs(argv: string[]): { options: ZipOptions; zipfile: string | null; files: string[] } {
31
+ const options: ZipOptions = {
32
+ recurse: false,
33
+ list: false,
34
+ verbose: false
35
+ }
36
+
37
+ const files: string[] = []
38
+ let zipfile: string | null = null
39
+ let i = 0
40
+
41
+ while (i < argv.length) {
42
+ const arg = argv[i]
43
+ if (!arg) {
44
+ i++
45
+ continue
46
+ }
47
+
48
+ if (arg === '--help' || arg === '-h') {
49
+ i++
50
+ continue
51
+ } else if (arg === '-r' || arg === '--recurse') {
52
+ options.recurse = true
53
+ i++
54
+ } else if (arg === '-l' || arg === '--list') {
55
+ options.list = true
56
+ i++
57
+ } else if (arg === '-v' || arg === '--verbose') {
58
+ options.verbose = true
59
+ i++
60
+ } else if (arg.startsWith('-')) {
61
+ // Handle combined flags like -rv
62
+ const flags = arg.slice(1).split('')
63
+ for (const flag of flags) {
64
+ if (flag === 'r') options.recurse = true
65
+ else if (flag === 'l') options.list = true
66
+ else if (flag === 'v') options.verbose = true
67
+ }
68
+ i++
69
+ } else {
70
+ // First non-option argument is the zipfile
71
+ if (!zipfile) {
72
+ zipfile = arg
73
+ } else {
74
+ files.push(arg)
75
+ }
76
+ i++
77
+ }
78
+ }
79
+
80
+ return { options, zipfile, files }
81
+ }
82
+
83
+ async function addDirectory(
84
+ zipWriter: zipjs.ZipWriter<Blob>,
85
+ dirPath: string,
86
+ basePath: string,
87
+ shell: Shell,
88
+ terminal: Terminal,
89
+ process: Process | undefined,
90
+ verbose: boolean
91
+ ): Promise<void> {
92
+ const entries = await shell.context.fs.promises.readdir(dirPath)
93
+
94
+ for (const entry of entries) {
95
+ const entryPath = path.join(dirPath, entry)
96
+ const relativePath = path.relative(basePath, entryPath)
97
+ const entryStat = await shell.context.fs.promises.stat(entryPath)
98
+
99
+ if (entryStat.isFile()) {
100
+ const fileData = await shell.context.fs.promises.readFile(entryPath)
101
+ const reader = new zipjs.Uint8ArrayReader(fileData)
102
+ await zipWriter.add(relativePath, reader)
103
+ if (verbose) {
104
+ await writelnStdout(process, terminal, ` adding: ${relativePath}`)
105
+ }
106
+ } else if (entryStat.isDirectory()) {
107
+ await addDirectory(zipWriter, entryPath, basePath, shell, terminal, process, verbose)
108
+ }
109
+ }
110
+ }
111
+
112
+ async function listZipContents(
113
+ zipfilePath: string,
114
+ shell: Shell,
115
+ terminal: Terminal,
116
+ process: Process | undefined
117
+ ): Promise<number> {
118
+ try {
119
+ const zipData = await shell.context.fs.promises.readFile(zipfilePath)
120
+ const blob = new Blob([new Uint8Array(zipData)])
121
+ const zipReader = new zipjs.ZipReader(new zipjs.BlobReader(blob))
122
+ const entries = await zipReader.getEntries()
123
+
124
+ if (entries.length === 0) {
125
+ await writelnStdout(process, terminal, 'Archive: ' + path.basename(zipfilePath))
126
+ await writelnStdout(process, terminal, ' Empty archive')
127
+ await zipReader.close()
128
+ return 0
129
+ }
130
+
131
+ // Calculate column widths
132
+ let maxLength = 0
133
+ let maxSize = 0
134
+ for (const entry of entries) {
135
+ if (entry.filename.length > maxLength) maxLength = entry.filename.length
136
+ const size = entry.uncompressedSize || 0
137
+ if (size > maxSize) maxSize = size
138
+ }
139
+
140
+ const sizeWidth = Math.max(12, String(maxSize).length)
141
+ const nameWidth = Math.max(20, maxLength)
142
+
143
+ await writelnStdout(process, terminal, `Archive: ${path.basename(zipfilePath)}`)
144
+ await writelnStdout(process, terminal, '')
145
+ await writelnStdout(process, terminal,
146
+ ` Length Date Time Name`.padEnd(nameWidth + sizeWidth + 20)
147
+ )
148
+ await writelnStdout(process, terminal,
149
+ ` ${'-'.repeat(sizeWidth)} ${'-'.repeat(10)} ${'-'.repeat(5)} ${'-'.repeat(nameWidth)}`
150
+ )
151
+
152
+ let totalLength = 0
153
+ for (const entry of entries) {
154
+ const length = entry.uncompressedSize || 0
155
+ totalLength += length
156
+
157
+ let date = '--'
158
+ let time = '--'
159
+
160
+ if (entry.lastModDate) {
161
+ const d = new Date(entry.lastModDate)
162
+ const month = String(d.getMonth() + 1).padStart(2, '0')
163
+ const day = String(d.getDate()).padStart(2, '0')
164
+ const year = String(d.getFullYear()).slice(-2)
165
+ date = `${month}-${day}-${year}`
166
+
167
+ const hours = String(d.getHours()).padStart(2, '0')
168
+ const minutes = String(d.getMinutes()).padStart(2, '0')
169
+ time = `${hours}:${minutes}`
170
+ }
171
+
172
+ const name = entry.directory ? entry.filename + '/' : entry.filename
173
+ const lengthStr = entry.directory ? '' : String(length).padStart(sizeWidth)
174
+
175
+ await writelnStdout(process, terminal,
176
+ ` ${lengthStr.padEnd(sizeWidth)} ${date.padEnd(10)} ${time.padEnd(5)} ${name}`
177
+ )
178
+ }
179
+
180
+ await writelnStdout(process, terminal,
181
+ ` ${'-'.repeat(sizeWidth)} ${'-'.repeat(10)} ${'-'.repeat(5)} ${'-'.repeat(nameWidth)}`
182
+ )
183
+ await writelnStdout(process, terminal,
184
+ ` ${String(totalLength).padStart(sizeWidth)} ${entries.length} file${entries.length !== 1 ? 's' : ''}`
185
+ )
186
+
187
+ await zipReader.close()
188
+ return 0
189
+ } catch (error) {
190
+ await writelnStderr(process, terminal,
191
+ chalk.red(`zip error: ${error instanceof Error ? error.message : 'Unknown error'}`)
192
+ )
193
+ return 1
194
+ }
195
+ }
196
+
197
+ export function createCommand(kernel: Kernel, shell: Shell, terminal: Terminal): TerminalCommand {
198
+ return new TerminalCommand({
199
+ command: 'zip',
200
+ description: 'Create zip archives',
201
+ kernel,
202
+ shell,
203
+ terminal,
204
+ run: async (pid: number, argv: string[]) => {
205
+ const process = kernel.processes.get(pid) as Process | undefined
206
+
207
+ if (argv.length > 0 && (argv[0] === '--help' || argv[0] === '-h')) {
208
+ printUsage(process, terminal)
209
+ return 0
210
+ }
211
+
212
+ const { options, zipfile, files } = parseArgs(argv)
213
+
214
+ // List mode
215
+ if (options.list) {
216
+ if (!zipfile) {
217
+ await writelnStderr(process, terminal, chalk.red('zip error: zipfile name required'))
218
+ await writelnStderr(process, terminal, "Try 'zip --help' for more information.")
219
+ return 1
220
+ }
221
+
222
+ const zipfilePath = path.resolve(shell.cwd, zipfile)
223
+ const exists = await shell.context.fs.promises.exists(zipfilePath)
224
+ if (!exists) {
225
+ await writelnStderr(process, terminal, chalk.red(`zip error: ${zipfile}: No such file or directory`))
226
+ return 1
227
+ }
228
+
229
+ return await listZipContents(zipfilePath, shell, terminal, process)
230
+ }
231
+
232
+ // Create mode
233
+ if (!zipfile) {
234
+ await writelnStderr(process, terminal, chalk.red('zip error: zipfile name required'))
235
+ await writelnStderr(process, terminal, "Try 'zip --help' for more information.")
236
+ return 1
237
+ }
238
+
239
+ if (files.length === 0) {
240
+ await writelnStderr(process, terminal, chalk.red('zip error: nothing to do'))
241
+ await writelnStderr(process, terminal, "Try 'zip --help' for more information.")
242
+ return 1
243
+ }
244
+
245
+ const outputPath = path.resolve(shell.cwd, zipfile)
246
+ let zipWriter: zipjs.ZipWriter<Blob> | null = null
247
+ let hasError = false
248
+
249
+ try {
250
+ zipWriter = new zipjs.ZipWriter(new zipjs.BlobWriter())
251
+
252
+ for (const inputPath of files) {
253
+ const fullPath = path.resolve(shell.cwd, inputPath)
254
+
255
+ try {
256
+ const exists = await shell.context.fs.promises.exists(fullPath)
257
+ if (!exists) {
258
+ await writelnStderr(process, terminal, chalk.red(`zip warning: ${inputPath}: No such file or directory`))
259
+ hasError = true
260
+ continue
261
+ }
262
+
263
+ const fileStat = await shell.context.fs.promises.stat(fullPath)
264
+
265
+ if (fileStat.isFile()) {
266
+ // Add single file
267
+ const relativePath = path.relative(shell.cwd, fullPath)
268
+ const fileData = await shell.context.fs.promises.readFile(fullPath)
269
+ const reader = new zipjs.Uint8ArrayReader(fileData)
270
+ await zipWriter.add(relativePath, reader)
271
+ if (options.verbose) {
272
+ await writelnStdout(process, terminal, ` adding: ${relativePath}`)
273
+ }
274
+ } else if (fileStat.isDirectory()) {
275
+ if (options.recurse) {
276
+ // Add directory and contents recursively
277
+ await addDirectory(zipWriter, fullPath, shell.cwd, shell, terminal, process, options.verbose)
278
+ if (options.verbose) {
279
+ await writelnStdout(process, terminal, ` adding: ${path.relative(shell.cwd, fullPath)}/`)
280
+ }
281
+ } else {
282
+ await writelnStderr(process, terminal, chalk.yellow(`zip warning: ${inputPath}: is a directory (not added). Use -r to recurse into directories`))
283
+ hasError = true
284
+ }
285
+ } else {
286
+ await writelnStderr(process, terminal, chalk.red(`zip error: ${inputPath}: Not a file or directory`))
287
+ hasError = true
288
+ }
289
+ } catch (err: unknown) {
290
+ await writelnStderr(process, terminal,
291
+ chalk.red(`zip error: ${inputPath}: ${err instanceof Error ? err.message : 'Unknown error'}`)
292
+ )
293
+ hasError = true
294
+ }
295
+ }
296
+
297
+ // Write the zip file
298
+ const blob = await zipWriter.close()
299
+ zipWriter = null // Clear reference after closing
300
+ await shell.context.fs.promises.writeFile(outputPath, new Uint8Array(await blob.arrayBuffer()))
301
+
302
+ if (options.verbose) {
303
+ await writelnStdout(process, terminal, ` zipfile: ${zipfile}`)
304
+ }
305
+
306
+ return hasError ? 1 : 0
307
+ } catch (err: unknown) {
308
+ await writelnStderr(process, terminal,
309
+ chalk.red(`zip error: ${err instanceof Error ? err.message : 'Unknown error'}`)
310
+ )
311
+ return 1
312
+ } finally {
313
+ if (zipWriter) {
314
+ await zipWriter.close()
315
+ }
316
+ }
317
+ }
318
+ })
319
+ }
package/src/index.ts CHANGED
@@ -12,11 +12,14 @@ import { createCommand as createCd } from './commands/cd.js'
12
12
  import { createCommand as createChmod } from './commands/chmod.js'
13
13
  import { createCommand as createCp } from './commands/cp.js'
14
14
  import { createCommand as createEcho } from './commands/echo.js'
15
+ import { createCommand as createFetch } from './commands/fetch.js'
15
16
  import { createCommand as createGrep } from './commands/grep.js'
17
+ import { createCommand as createHash } from './commands/hash.js'
16
18
  import { createCommand as createHead } from './commands/head.js'
17
19
  import { createCommand as createLn } from './commands/ln.js'
18
20
  import { createCommand as createLs } from './commands/ls.js'
19
21
  import { createCommand as createMkdir } from './commands/mkdir.js'
22
+ import { createCommand as createMktemp } from './commands/mktemp.js'
20
23
  import { createCommand as createMv } from './commands/mv.js'
21
24
  import { createCommand as createNc } from './commands/nc.js'
22
25
  import { createCommand as createPwd } from './commands/pwd.js'
@@ -27,10 +30,12 @@ import { createCommand as createStat } from './commands/stat.js'
27
30
  import { createCommand as createTouch } from './commands/touch.js'
28
31
  import { createCommand as createHex } from './commands/hex.js'
29
32
  import { createCommand as createLess } from './commands/less.js'
33
+ import { createCommand as createMan } from './commands/man.js'
30
34
  import { createCommand as createPasskey } from './commands/passkey.js'
31
35
  import { createCommand as createSed } from './commands/sed.js'
32
36
  import { createCommand as createTee } from './commands/tee.js'
33
37
  import { createCommand as createTail } from './commands/tail.js'
38
+ import { createCommand as createTar } from './commands/tar.js'
34
39
  import { createCommand as createBasename } from './commands/basename.js'
35
40
  import { createCommand as createCal } from './commands/cal.js'
36
41
  import { createCommand as createComm } from './commands/comm.js'
@@ -40,6 +45,7 @@ import { createCommand as createDiff } from './commands/diff.js'
40
45
  import { createCommand as createDirname } from './commands/dirname.js'
41
46
  import { createCommand as createFalse } from './commands/false.js'
42
47
  import { createCommand as createFind } from './commands/find.js'
48
+ import { createCommand as createFormat } from './commands/format.js'
43
49
  import { createCommand as createId } from './commands/id.js'
44
50
  import { createCommand as createJoin } from './commands/join.js'
45
51
  import { createCommand as createNl } from './commands/nl.js'
@@ -55,6 +61,8 @@ import { createCommand as createUser } from './commands/user.js'
55
61
  import { createCommand as createWc } from './commands/wc.js'
56
62
  import { createCommand as createWhich } from './commands/which.js'
57
63
  import { createCommand as createWhoami } from './commands/whoami.js'
64
+ import { createCommand as createZip } from './commands/zip.js'
65
+ import { createCommand as createUnzip } from './commands/unzip.js'
58
66
 
59
67
  // Export individual command factories
60
68
  export { createCommand as createCat } from './commands/cat.js'
@@ -62,10 +70,13 @@ export { createCommand as createCd } from './commands/cd.js'
62
70
  export { createCommand as createChmod } from './commands/chmod.js'
63
71
  export { createCommand as createCp } from './commands/cp.js'
64
72
  export { createCommand as createEcho } from './commands/echo.js'
73
+ export { createCommand as createFetch } from './commands/fetch.js'
65
74
  export { createCommand as createGrep } from './commands/grep.js'
75
+ export { createCommand as createHash } from './commands/hash.js'
66
76
  export { createCommand as createLn } from './commands/ln.js'
67
77
  export { createCommand as createLs } from './commands/ls.js'
68
78
  export { createCommand as createMkdir } from './commands/mkdir.js'
79
+ export { createCommand as createMktemp } from './commands/mktemp.js'
69
80
  export { createCommand as createMv } from './commands/mv.js'
70
81
  export { createCommand as createPwd } from './commands/pwd.js'
71
82
  export { createCommand as createRm } from './commands/rm.js'
@@ -74,15 +85,18 @@ export { createCommand as createStat } from './commands/stat.js'
74
85
  export { createCommand as createTouch } from './commands/touch.js'
75
86
  export { createCommand as createHex } from './commands/hex.js'
76
87
  export { createCommand as createLess } from './commands/less.js'
88
+ export { createCommand as createMan } from './commands/man.js'
77
89
  export { createCommand as createSed } from './commands/sed.js'
78
90
  export { createCommand as createTee } from './commands/tee.js'
79
91
  export { createCommand as createTail } from './commands/tail.js'
92
+ export { createCommand as createTar } from './commands/tar.js'
80
93
  export { createCommand as createBasename } from './commands/basename.js'
81
94
  export { createCommand as createCut } from './commands/cut.js'
82
95
  export { createCommand as createDate } from './commands/date.js'
83
96
  export { createCommand as createDiff } from './commands/diff.js'
84
97
  export { createCommand as createDirname } from './commands/dirname.js'
85
98
  export { createCommand as createFind } from './commands/find.js'
99
+ export { createCommand as createFormat } from './commands/format.js'
86
100
  export { createCommand as createSort } from './commands/sort.js'
87
101
  export { createCommand as createTest } from './commands/test.js'
88
102
  export { createCommand as createTr } from './commands/tr.js'
@@ -91,6 +105,8 @@ export { createCommand as createUser } from './commands/user.js'
91
105
  export { createCommand as createWc } from './commands/wc.js'
92
106
  export { createCommand as createWhich } from './commands/which.js'
93
107
  export { createCommand as createSockets } from './commands/sockets.js'
108
+ export { createCommand as createZip } from './commands/zip.js'
109
+ export { createCommand as createUnzip } from './commands/unzip.js'
94
110
 
95
111
  /**
96
112
  * Creates all coreutils commands.
@@ -103,11 +119,14 @@ export function createAllCommands(kernel: Kernel, shell: Shell, terminal: Termin
103
119
  chmod: createChmod(kernel, shell, terminal),
104
120
  cp: createCp(kernel, shell, terminal),
105
121
  echo: createEcho(kernel, shell, terminal),
122
+ fetch: createFetch(kernel, shell, terminal),
106
123
  grep: createGrep(kernel, shell, terminal),
124
+ hash: createHash(kernel, shell, terminal),
107
125
  head: createHead(kernel, shell, terminal),
108
126
  ln: createLn(kernel, shell, terminal),
109
127
  ls: createLs(kernel, shell, terminal),
110
128
  mkdir: createMkdir(kernel, shell, terminal),
129
+ mktemp: createMktemp(kernel, shell, terminal),
111
130
  mv: createMv(kernel, shell, terminal),
112
131
  pwd: createPwd(kernel, shell, terminal),
113
132
  nc: createNc(kernel, shell, terminal),
@@ -118,6 +137,7 @@ export function createAllCommands(kernel: Kernel, shell: Shell, terminal: Termin
118
137
  touch: createTouch(kernel, shell, terminal),
119
138
  hex: createHex(kernel, shell, terminal),
120
139
  less: createLess(kernel, shell, terminal),
140
+ man: createMan(kernel, shell, terminal),
121
141
  passkey: createPasskey(kernel, shell, terminal),
122
142
  sed: createSed(kernel, shell, terminal),
123
143
  tail: createTail(kernel, shell, terminal),
@@ -131,6 +151,7 @@ export function createAllCommands(kernel: Kernel, shell: Shell, terminal: Termin
131
151
  dirname: createDirname(kernel, shell, terminal),
132
152
  false: createFalse(kernel, shell, terminal),
133
153
  find: createFind(kernel, shell, terminal),
154
+ format: createFormat(kernel, shell, terminal),
134
155
  id: createId(kernel, shell, terminal),
135
156
  join: createJoin(kernel, shell, terminal),
136
157
  nl: createNl(kernel, shell, terminal),
@@ -138,6 +159,7 @@ export function createAllCommands(kernel: Kernel, shell: Shell, terminal: Termin
138
159
  seq: createSeq(kernel, shell, terminal),
139
160
  sort: createSort(kernel, shell, terminal),
140
161
  split: createSplit(kernel, shell, terminal),
162
+ tar: createTar(kernel, shell, terminal),
141
163
  test: createTest(kernel, shell, terminal),
142
164
  tr: createTr(kernel, shell, terminal),
143
165
  true: createTrue(kernel, shell, terminal),
@@ -145,7 +167,9 @@ export function createAllCommands(kernel: Kernel, shell: Shell, terminal: Termin
145
167
  user: createUser(kernel, shell, terminal),
146
168
  wc: createWc(kernel, shell, terminal),
147
169
  which: createWhich(kernel, shell, terminal),
148
- whoami: createWhoami(kernel, shell, terminal)
170
+ whoami: createWhoami(kernel, shell, terminal),
171
+ zip: createZip(kernel, shell, terminal),
172
+ unzip: createUnzip(kernel, shell, terminal)
149
173
  }
150
174
  }
151
175