typescript-virtual-container 1.5.3 → 1.5.4

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 (365) hide show
  1. package/README.md +43 -23
  2. package/dist/.tsbuildinfo +1 -0
  3. package/dist/SSHMimic/executor.js +23 -5
  4. package/dist/VirtualPackageManager/index.js +10 -0
  5. package/dist/commands/basename.d.ts +13 -0
  6. package/dist/commands/basename.js +45 -0
  7. package/dist/commands/file.d.ts +8 -0
  8. package/dist/commands/file.js +57 -0
  9. package/dist/commands/fun.d.ts +32 -0
  10. package/dist/commands/fun.js +172 -0
  11. package/dist/commands/ifconfig.d.ts +7 -0
  12. package/dist/commands/ifconfig.js +52 -0
  13. package/dist/commands/last.d.ts +13 -0
  14. package/dist/commands/last.js +68 -0
  15. package/dist/commands/manuals-bundle.js +598 -6
  16. package/dist/commands/registry.js +24 -2
  17. package/dist/commands/runtime.js +22 -2
  18. package/dist/commands/sh.js +5 -0
  19. package/dist/commands/tput.d.ts +13 -0
  20. package/dist/commands/tput.js +76 -0
  21. package/dist/commands/w.d.ts +7 -0
  22. package/dist/commands/w.js +38 -0
  23. package/dist/utils/expand.d.ts +12 -0
  24. package/dist/utils/expand.js +84 -0
  25. package/package.json +9 -3
  26. package/.github/ISSUE_TEMPLATE/bug_report.yml +0 -50
  27. package/.github/ISSUE_TEMPLATE/feature_request.yml +0 -31
  28. package/.github/dependabot.yml +0 -27
  29. package/.github/pull_request_template.md +0 -21
  30. package/.github/workflows/create-pull-request.yml +0 -85
  31. package/.github/workflows/publish.yml +0 -25
  32. package/.github/workflows/test-battery.yml +0 -102
  33. package/.vscode/settings.json +0 -20
  34. package/CODE_OF_CONDUCT.md +0 -39
  35. package/CONTRIBUTING.md +0 -59
  36. package/HONEYPOT.md +0 -358
  37. package/SECURITY.md +0 -33
  38. package/benchmark-results.txt +0 -40
  39. package/benchmark-virtualshell.ts +0 -88
  40. package/biome.json +0 -37
  41. package/build.js +0 -22
  42. package/builds/fortune-nyx-v1.5.3-directbash-k6.1.0.mjs +0 -1764
  43. package/builds/fortune-nyx-v1.5.3-ssh-nosftp.js +0 -1764
  44. package/builds/fortune-nyx-v1.5.3-ssh.cjs +0 -1765
  45. package/builds/fortune-nyx-v1.5.3-web.min.js +0 -17036
  46. package/bun.lock +0 -244
  47. package/docs/.nojekyll +0 -1
  48. package/docs/app.js +0 -1751
  49. package/docs/assets/hierarchy.js +0 -1
  50. package/docs/assets/highlight.css +0 -162
  51. package/docs/assets/icons.js +0 -18
  52. package/docs/assets/icons.svg +0 -1
  53. package/docs/assets/main.js +0 -60
  54. package/docs/assets/navigation.js +0 -1
  55. package/docs/assets/search.js +0 -1
  56. package/docs/assets/style.css +0 -1633
  57. package/docs/classes/HoneyPot.html +0 -31
  58. package/docs/classes/IdleManager.html +0 -162
  59. package/docs/classes/SshClient.html +0 -66
  60. package/docs/classes/VirtualFileSystem.html +0 -279
  61. package/docs/classes/VirtualPackageManager.html +0 -63
  62. package/docs/classes/VirtualSftpServer.html +0 -169
  63. package/docs/classes/VirtualShell.html +0 -285
  64. package/docs/classes/VirtualSshServer.html +0 -182
  65. package/docs/classes/VirtualUserManager.html +0 -276
  66. package/docs/demo.html +0 -82
  67. package/docs/functions/assertDiff.html +0 -6
  68. package/docs/functions/diffSnapshots.html +0 -7
  69. package/docs/functions/formatDiff.html +0 -6
  70. package/docs/functions/getArg.html +0 -13
  71. package/docs/functions/getFlag.html +0 -15
  72. package/docs/functions/ifFlag.html +0 -11
  73. package/docs/hierarchy.html +0 -1
  74. package/docs/index.html +0 -1869
  75. package/docs/interfaces/AuditLogEntry.html +0 -6
  76. package/docs/interfaces/CommandContext.html +0 -22
  77. package/docs/interfaces/CommandResult.html +0 -26
  78. package/docs/interfaces/ExecStream.html +0 -11
  79. package/docs/interfaces/HoneyPotStats.html +0 -16
  80. package/docs/interfaces/IdleManagerOptions.html +0 -7
  81. package/docs/interfaces/InstalledPackage.html +0 -20
  82. package/docs/interfaces/NanoEditorSession.html +0 -8
  83. package/docs/interfaces/PackageDefinition.html +0 -30
  84. package/docs/interfaces/PackageFile.html +0 -8
  85. package/docs/interfaces/PasswordChallenge.html +0 -16
  86. package/docs/interfaces/RemoveOptions.html +0 -4
  87. package/docs/interfaces/ShellEnv.html +0 -6
  88. package/docs/interfaces/ShellModule.html +0 -14
  89. package/docs/interfaces/ShellProperties.html +0 -14
  90. package/docs/interfaces/ShellStream.html +0 -11
  91. package/docs/interfaces/SudoChallenge.html +0 -24
  92. package/docs/interfaces/VfsBaseNode.html +0 -12
  93. package/docs/interfaces/VfsDiff.html +0 -10
  94. package/docs/interfaces/VfsDiffEntry.html +0 -6
  95. package/docs/interfaces/VfsDiffModified.html +0 -10
  96. package/docs/interfaces/VfsDirectoryNode.html +0 -15
  97. package/docs/interfaces/VfsFileNode.html +0 -17
  98. package/docs/interfaces/VfsOptions.html +0 -26
  99. package/docs/interfaces/VfsSnapshot.html +0 -3
  100. package/docs/interfaces/VfsSnapshotBaseNode.html +0 -8
  101. package/docs/interfaces/VfsSnapshotDirectoryNode.html +0 -10
  102. package/docs/interfaces/VfsSnapshotFileNode.html +0 -12
  103. package/docs/interfaces/VirtualActiveSession.html +0 -12
  104. package/docs/interfaces/VirtualSftpServerOptions.html +0 -7
  105. package/docs/interfaces/VirtualShellVfsLike.html +0 -15
  106. package/docs/interfaces/VirtualShellVfsOptions.html +0 -3
  107. package/docs/interfaces/WriteFileOptions.html +0 -6
  108. package/docs/media/LICENSE +0 -21
  109. package/docs/modules.html +0 -1
  110. package/docs/types/ArgParseOptions.html +0 -4
  111. package/docs/types/CommandMode.html +0 -2
  112. package/docs/types/CommandOutcome.html +0 -2
  113. package/docs/types/IdleState.html +0 -1
  114. package/docs/types/VfsNodeStats.html +0 -2
  115. package/docs/types/VfsNodeType.html +0 -2
  116. package/docs/types/VfsPersistenceMode.html +0 -5
  117. package/docs/types/VfsSnapshotNode.html +0 -2
  118. package/examples/README.md +0 -288
  119. package/examples/app.js +0 -1751
  120. package/examples/app.ts +0 -299
  121. package/examples/build.js +0 -27
  122. package/examples/demo.html +0 -33
  123. package/examples/honeypot-audit.ts +0 -180
  124. package/examples/honeypot-export.ts +0 -253
  125. package/examples/honeypot-quickstart.ts +0 -110
  126. package/examples/index.html +0 -82
  127. package/examples/server.js +0 -55
  128. package/polyfills/buffer.js +0 -117
  129. package/polyfills/node_child_process/index.js +0 -2
  130. package/polyfills/node_crypto/index.js +0 -167
  131. package/polyfills/node_events/index.js +0 -9
  132. package/polyfills/node_fs/index.js +0 -202
  133. package/polyfills/node_fs/promises.js +0 -4
  134. package/polyfills/node_os/index.js +0 -9
  135. package/polyfills/node_path/index.js +0 -28
  136. package/polyfills/node_vm/index.js +0 -7
  137. package/polyfills/node_zlib/index.js +0 -3
  138. package/polyfills/process.js +0 -14
  139. package/polyfills/ssh2/index.js +0 -75
  140. package/scripts/build-all.mjs +0 -226
  141. package/scripts/build-names.mjs +0 -43
  142. package/scripts/generate-manuals-bundle.mjs +0 -49
  143. package/scripts/postinstall.js +0 -42
  144. package/scripts/publish-package.sh +0 -70
  145. package/src/Honeypot/index.ts +0 -457
  146. package/src/SSHClient/index.ts +0 -270
  147. package/src/SSHMimic/exec.ts +0 -49
  148. package/src/SSHMimic/executor.ts +0 -251
  149. package/src/SSHMimic/hostKey.ts +0 -21
  150. package/src/SSHMimic/index.ts +0 -337
  151. package/src/SSHMimic/loginBanner.ts +0 -36
  152. package/src/SSHMimic/loginFormat.ts +0 -10
  153. package/src/SSHMimic/prompt.ts +0 -14
  154. package/src/SSHMimic/sftp.ts +0 -883
  155. package/src/VirtualFileSystem/binaryPack.ts +0 -258
  156. package/src/VirtualFileSystem/index.ts +0 -1193
  157. package/src/VirtualFileSystem/internalTypes.ts +0 -43
  158. package/src/VirtualFileSystem/journal.ts +0 -171
  159. package/src/VirtualFileSystem/path.ts +0 -74
  160. package/src/VirtualPackageManager/index.ts +0 -996
  161. package/src/VirtualShell/idleManager.ts +0 -137
  162. package/src/VirtualShell/index.ts +0 -475
  163. package/src/VirtualShell/shell.ts +0 -700
  164. package/src/VirtualShell/shellParser.ts +0 -285
  165. package/src/VirtualUserManager/index.ts +0 -758
  166. package/src/bun.d.ts +0 -1
  167. package/src/commands/adduser.ts +0 -103
  168. package/src/commands/alias.ts +0 -69
  169. package/src/commands/apt.ts +0 -233
  170. package/src/commands/awk.ts +0 -168
  171. package/src/commands/base64.ts +0 -29
  172. package/src/commands/cat.ts +0 -52
  173. package/src/commands/cd.ts +0 -25
  174. package/src/commands/chmod.ts +0 -85
  175. package/src/commands/clear.ts +0 -15
  176. package/src/commands/command-helpers.ts +0 -286
  177. package/src/commands/cp.ts +0 -83
  178. package/src/commands/curl.ts +0 -147
  179. package/src/commands/cut.ts +0 -36
  180. package/src/commands/date.ts +0 -30
  181. package/src/commands/declare.ts +0 -49
  182. package/src/commands/deluser.ts +0 -98
  183. package/src/commands/df.ts +0 -23
  184. package/src/commands/diff.ts +0 -43
  185. package/src/commands/dpkg.ts +0 -180
  186. package/src/commands/du.ts +0 -56
  187. package/src/commands/echo.ts +0 -58
  188. package/src/commands/env.ts +0 -23
  189. package/src/commands/exit.ts +0 -18
  190. package/src/commands/export.ts +0 -34
  191. package/src/commands/find.ts +0 -68
  192. package/src/commands/free.ts +0 -47
  193. package/src/commands/grep.ts +0 -116
  194. package/src/commands/groups.ts +0 -19
  195. package/src/commands/gzip.ts +0 -88
  196. package/src/commands/head.ts +0 -52
  197. package/src/commands/help.ts +0 -152
  198. package/src/commands/helpers.ts +0 -234
  199. package/src/commands/history.ts +0 -34
  200. package/src/commands/hostname.ts +0 -14
  201. package/src/commands/htop.ts +0 -20
  202. package/src/commands/id.ts +0 -19
  203. package/src/commands/index.ts +0 -9
  204. package/src/commands/kill.ts +0 -19
  205. package/src/commands/ln.ts +0 -71
  206. package/src/commands/ls.ts +0 -243
  207. package/src/commands/lsb-release.ts +0 -63
  208. package/src/commands/man.ts +0 -31
  209. package/src/commands/manuals/adduser.txt +0 -11
  210. package/src/commands/manuals/apt-cache.txt +0 -12
  211. package/src/commands/manuals/apt.txt +0 -20
  212. package/src/commands/manuals/awk.txt +0 -13
  213. package/src/commands/manuals/cat.txt +0 -14
  214. package/src/commands/manuals/cd.txt +0 -16
  215. package/src/commands/manuals/chmod.txt +0 -16
  216. package/src/commands/manuals/clear.txt +0 -10
  217. package/src/commands/manuals/cp.txt +0 -10
  218. package/src/commands/manuals/curl.txt +0 -20
  219. package/src/commands/manuals/date.txt +0 -14
  220. package/src/commands/manuals/declare.txt +0 -12
  221. package/src/commands/manuals/deluser.txt +0 -10
  222. package/src/commands/manuals/df.txt +0 -10
  223. package/src/commands/manuals/dpkg-query.txt +0 -11
  224. package/src/commands/manuals/dpkg.txt +0 -14
  225. package/src/commands/manuals/du.txt +0 -11
  226. package/src/commands/manuals/echo.txt +0 -11
  227. package/src/commands/manuals/false.txt +0 -10
  228. package/src/commands/manuals/find.txt +0 -11
  229. package/src/commands/manuals/free.txt +0 -12
  230. package/src/commands/manuals/grep.txt +0 -13
  231. package/src/commands/manuals/groups.txt +0 -10
  232. package/src/commands/manuals/gzip.txt +0 -11
  233. package/src/commands/manuals/head.txt +0 -10
  234. package/src/commands/manuals/help.txt +0 -11
  235. package/src/commands/manuals/history.txt +0 -11
  236. package/src/commands/manuals/hostname.txt +0 -10
  237. package/src/commands/manuals/id.txt +0 -10
  238. package/src/commands/manuals/kill.txt +0 -13
  239. package/src/commands/manuals/ls.txt +0 -20
  240. package/src/commands/manuals/lsb_release.txt +0 -14
  241. package/src/commands/manuals/mkdir.txt +0 -10
  242. package/src/commands/manuals/mv.txt +0 -10
  243. package/src/commands/manuals/nano.txt +0 -11
  244. package/src/commands/manuals/neofetch.txt +0 -10
  245. package/src/commands/manuals/node.txt +0 -13
  246. package/src/commands/manuals/npm.txt +0 -13
  247. package/src/commands/manuals/npx.txt +0 -13
  248. package/src/commands/manuals/passwd.txt +0 -11
  249. package/src/commands/manuals/ping.txt +0 -10
  250. package/src/commands/manuals/printf.txt +0 -11
  251. package/src/commands/manuals/ps.txt +0 -10
  252. package/src/commands/manuals/pwd.txt +0 -10
  253. package/src/commands/manuals/python3.txt +0 -13
  254. package/src/commands/manuals/readlink.txt +0 -10
  255. package/src/commands/manuals/return.txt +0 -10
  256. package/src/commands/manuals/rm.txt +0 -10
  257. package/src/commands/manuals/sed.txt +0 -11
  258. package/src/commands/manuals/set.txt +0 -11
  259. package/src/commands/manuals/shift.txt +0 -10
  260. package/src/commands/manuals/sleep.txt +0 -10
  261. package/src/commands/manuals/sort.txt +0 -12
  262. package/src/commands/manuals/source.txt +0 -11
  263. package/src/commands/manuals/ssh.txt +0 -11
  264. package/src/commands/manuals/stat.txt +0 -10
  265. package/src/commands/manuals/su.txt +0 -13
  266. package/src/commands/manuals/sudo.txt +0 -11
  267. package/src/commands/manuals/tail.txt +0 -10
  268. package/src/commands/manuals/tar.txt +0 -19
  269. package/src/commands/manuals/tee.txt +0 -10
  270. package/src/commands/manuals/test.txt +0 -11
  271. package/src/commands/manuals/touch.txt +0 -11
  272. package/src/commands/manuals/tr.txt +0 -10
  273. package/src/commands/manuals/trap.txt +0 -10
  274. package/src/commands/manuals/true.txt +0 -10
  275. package/src/commands/manuals/type.txt +0 -10
  276. package/src/commands/manuals/uname.txt +0 -12
  277. package/src/commands/manuals/uniq.txt +0 -12
  278. package/src/commands/manuals/unset.txt +0 -10
  279. package/src/commands/manuals/uptime.txt +0 -11
  280. package/src/commands/manuals/wc.txt +0 -12
  281. package/src/commands/manuals/wget.txt +0 -12
  282. package/src/commands/manuals/which.txt +0 -10
  283. package/src/commands/manuals/whoami.txt +0 -10
  284. package/src/commands/manuals/xargs.txt +0 -10
  285. package/src/commands/manuals-bundle.ts +0 -898
  286. package/src/commands/mkdir.ts +0 -31
  287. package/src/commands/mv.ts +0 -50
  288. package/src/commands/nano.ts +0 -38
  289. package/src/commands/neofetch.ts +0 -53
  290. package/src/commands/node.ts +0 -341
  291. package/src/commands/npm.ts +0 -132
  292. package/src/commands/passwd.ts +0 -50
  293. package/src/commands/ping.ts +0 -32
  294. package/src/commands/printf.ts +0 -129
  295. package/src/commands/ps.ts +0 -58
  296. package/src/commands/pwd.ts +0 -9
  297. package/src/commands/python.ts +0 -2229
  298. package/src/commands/read.ts +0 -46
  299. package/src/commands/registry.ts +0 -249
  300. package/src/commands/rm.ts +0 -42
  301. package/src/commands/runtime.ts +0 -421
  302. package/src/commands/sed.ts +0 -68
  303. package/src/commands/seq.ts +0 -43
  304. package/src/commands/set.ts +0 -29
  305. package/src/commands/sh.ts +0 -467
  306. package/src/commands/shift.ts +0 -63
  307. package/src/commands/sleep.ts +0 -20
  308. package/src/commands/sort.ts +0 -46
  309. package/src/commands/source.ts +0 -52
  310. package/src/commands/stat.ts +0 -61
  311. package/src/commands/su.ts +0 -72
  312. package/src/commands/sudo.ts +0 -76
  313. package/src/commands/tail.ts +0 -53
  314. package/src/commands/tar.ts +0 -102
  315. package/src/commands/tee.ts +0 -36
  316. package/src/commands/test.ts +0 -137
  317. package/src/commands/touch.ts +0 -28
  318. package/src/commands/tr.ts +0 -70
  319. package/src/commands/tree.ts +0 -20
  320. package/src/commands/true.ts +0 -27
  321. package/src/commands/type.ts +0 -48
  322. package/src/commands/uname.ts +0 -29
  323. package/src/commands/uniq.ts +0 -39
  324. package/src/commands/unset.ts +0 -17
  325. package/src/commands/uptime.ts +0 -54
  326. package/src/commands/wc.ts +0 -55
  327. package/src/commands/wget.ts +0 -148
  328. package/src/commands/which.ts +0 -37
  329. package/src/commands/who.ts +0 -25
  330. package/src/commands/whoami.ts +0 -14
  331. package/src/commands/xargs.ts +0 -31
  332. package/src/index.ts +0 -67
  333. package/src/modules/linuxRootfs.ts +0 -1961
  334. package/src/modules/neofetch.ts +0 -358
  335. package/src/modules/shellInteractive.ts +0 -57
  336. package/src/modules/shellRuntime.ts +0 -76
  337. package/src/self-standalone.ts +0 -542
  338. package/src/standalone-wo-sftp.ts +0 -38
  339. package/src/standalone.ts +0 -72
  340. package/src/types/commands.ts +0 -146
  341. package/src/types/pipeline.ts +0 -52
  342. package/src/types/streams.ts +0 -32
  343. package/src/types/tar-stream.d.ts +0 -38
  344. package/src/types/vfs.ts +0 -98
  345. package/src/utils/expand.ts +0 -491
  346. package/src/utils/perfLogger.ts +0 -72
  347. package/src/utils/tokenize.ts +0 -98
  348. package/src/utils/vfsDiff.ts +0 -275
  349. package/tests/command-helpers.test.ts +0 -116
  350. package/tests/commands-admin-net.test.ts +0 -441
  351. package/tests/commands-advanced.test.ts +0 -456
  352. package/tests/commands-core.test.ts +0 -562
  353. package/tests/commands-missing.test.ts +0 -570
  354. package/tests/commands-specific-units.test.ts +0 -327
  355. package/tests/commands-text-sys.test.ts +0 -445
  356. package/tests/expand.test.ts +0 -170
  357. package/tests/helpers.test.ts +0 -97
  358. package/tests/new-features.test.ts +0 -1036
  359. package/tests/parser-executor.test.ts +0 -37
  360. package/tests/sftp.test.ts +0 -323
  361. package/tests/ssh-exec.test.ts +0 -45
  362. package/tests/test-helper.ts +0 -79
  363. package/tests/users.test.ts +0 -86
  364. package/tsconfig.json +0 -49
  365. package/typedoc.json +0 -47
@@ -1,327 +0,0 @@
1
- import { beforeAll, describe, expect, test } from "bun:test";
2
- import type { SshClient, VirtualShell } from "../src";
3
- import { createTestDir, createTestEnv, createTestFile, runCmd } from "./test-helper";
4
-
5
- let shell: VirtualShell;
6
- let client: InstanceType<typeof SshClient>;
7
-
8
- beforeAll(async () => {
9
- const env = await createTestEnv("test-unit-specific");
10
- shell = env.shell;
11
- client = env.client;
12
- });
13
-
14
- // ─── SH command tests ─────────────────────────────────────────────────────
15
-
16
- describe("sh command - function unit tests", () => {
17
- test("sh -c executes command", async () => {
18
- const r = await runCmd(client, "sh -c 'echo hello'");
19
- expect(r.exitCode).toBe(0);
20
- expect(r.stdout?.trim()).toBe("hello");
21
- });
22
-
23
- test("sh -c with variable expansion", async () => {
24
- const r = await runCmd(client, "sh -c 'X=5 && echo $X' || echo '5'");
25
- expect(r.exitCode).toBeGreaterThanOrEqual(0);
26
- });
27
-
28
- test("sh -c with arithmetic", async () => {
29
- const r = await runCmd(client, "sh -c 'echo $((2+3))'");
30
- expect(r.exitCode).toBe(0);
31
- expect(r.stdout?.trim()).toBe("5");
32
- });
33
-
34
- test("sh -c with pipe", async () => {
35
- const r = await runCmd(client, "sh -c 'echo hello | cat'");
36
- expect(r.exitCode).toBe(0);
37
- expect(r.stdout?.trim()).toContain("hello");
38
- });
39
-
40
- test("sh -c with redirection", async () => {
41
- const r = await runCmd(client, "sh -c 'echo test > /tmp/shtest.txt'");
42
- expect(r.exitCode).toBe(0);
43
- expect(shell.vfs.exists("/tmp/shtest.txt")).toBe(true);
44
- });
45
-
46
- test("sh -c with conditional", async () => {
47
- const r = await runCmd(client, "sh -c 'test -f /tmp && echo exists || echo missing'");
48
- expect(r.exitCode).toBeGreaterThanOrEqual(0);
49
- });
50
-
51
- test("sh -c with for loop", async () => {
52
- const r = await runCmd(client, "sh -c 'for i in 1 2 3; do echo $i; done'");
53
- expect(r.exitCode).toBeGreaterThanOrEqual(0);
54
- });
55
-
56
- test("sh -c error handling", async () => {
57
- const r = await runCmd(client, "sh -c 'nonexistent_command'");
58
- expect(r.exitCode).not.toBe(0);
59
- });
60
-
61
- test("sh with positional parameters", async () => {
62
- const r = await runCmd(client, "sh -c 'echo $1' arg1 arg2");
63
- expect(r.exitCode).toBeGreaterThanOrEqual(0);
64
- });
65
-
66
- test("sh with @-expansion", async () => {
67
- const r = await runCmd(client, "sh -c 'for arg in \"$@\"; do echo $arg; done' script a b c");
68
- expect(r.exitCode).toBeGreaterThanOrEqual(0);
69
- });
70
- });
71
-
72
- // ─── FIND command tests ───────────────────────────────────────────────────
73
-
74
- describe("find command - case analysis", () => {
75
- test("find empty directory", async () => {
76
- await createTestDir(shell, "/tmp/findempty");
77
- const r = await runCmd(client, "find /tmp/findempty");
78
- expect(r.exitCode).toBe(0);
79
- });
80
-
81
- test("find with -type f and -name pattern", async () => {
82
- await createTestDir(shell, "/tmp/findmix");
83
- createTestFile(shell, "/tmp/findmix/file.txt", "test");
84
- createTestFile(shell, "/tmp/findmix/file.log", "log");
85
- createTestFile(shell, "/tmp/findmix/data.txt", "data");
86
- const r = await runCmd(client, "find /tmp/findmix -type f -name '*.txt'");
87
- expect(r.exitCode).toBe(0);
88
- const files = r.stdout?.split("\n").filter((l) => l);
89
- expect(files?.length).toBe(2);
90
- });
91
-
92
- test("find with maxdepth", async () => {
93
- await createTestDir(shell, "/tmp/findmax/a/b/c");
94
- createTestFile(shell, "/tmp/findmax/file.txt", "1");
95
- createTestFile(shell, "/tmp/findmax/a/file.txt", "2");
96
- createTestFile(shell, "/tmp/findmax/a/b/file.txt", "3");
97
- const r = await runCmd(client, "find /tmp/findmax -maxdepth 1 -type f");
98
- expect(r.exitCode).toBeGreaterThanOrEqual(0);
99
- });
100
-
101
- test("find -o OR operator", async () => {
102
- await createTestDir(shell, "/tmp/findor");
103
- createTestFile(shell, "/tmp/findor/a.txt", "a");
104
- createTestFile(shell, "/tmp/findor/b.log", "b");
105
- const r = await runCmd(client, "find /tmp/findor -name '*.txt' -o -name '*.log'");
106
- expect(r.exitCode).toBeGreaterThanOrEqual(0);
107
- });
108
-
109
- test("find with action -exec", async () => {
110
- await createTestDir(shell, "/tmp/findexec");
111
- createTestFile(shell, "/tmp/findexec/test.txt", "content");
112
- const r = await runCmd(client, "find /tmp/findexec -type f -exec ls -l {} \\;");
113
- expect(r.exitCode).toBeGreaterThanOrEqual(0);
114
- });
115
- });
116
-
117
- // ─── SED command tests ────────────────────────────────────────────────────
118
-
119
- describe("sed command - regex transformations", () => {
120
- test("sed basic substitution", async () => {
121
- const r = await runCmd(client, "echo 'hello world' | sed 's/world/universe/'");
122
- expect(r.exitCode).toBeGreaterThanOrEqual(0);
123
- });
124
-
125
- test("sed global substitution", async () => {
126
- const r = await runCmd(client, "echo 'aaa' | sed 's/a/b/g'");
127
- expect(r.exitCode).toBeGreaterThanOrEqual(0);
128
- });
129
-
130
- test("sed multiple commands", async () => {
131
- createTestFile(shell, "/tmp/sedtest.txt", "line1\\nline2\\nline3");
132
- const r = await runCmd(client, "sed -e 's/line/LINE/' -e 's/1/ONE/' /tmp/sedtest.txt");
133
- expect(r.exitCode).toBeGreaterThanOrEqual(0);
134
- });
135
-
136
- test("sed address range", async () => {
137
- createTestFile(shell, "/tmp/sedrange.txt", "1\\n2\\n3\\n4\\n5");
138
- const r = await runCmd(client, "sed '2,4d' /tmp/sedrange.txt");
139
- expect(r.exitCode).toBeGreaterThanOrEqual(0);
140
- });
141
-
142
- test("sed with flags", async () => {
143
- const r = await runCmd(client, "echo 'HELLO' | sed 's/hello/hi/i'");
144
- expect(r.exitCode).toBeGreaterThanOrEqual(0);
145
- });
146
- });
147
-
148
- // ─── AWK command tests ────────────────────────────────────────────────────
149
-
150
- describe("awk command - field processing", () => {
151
- test("awk field separator", async () => {
152
- const r = await runCmd(client, "echo 'a:b:c' | awk -F: '{print $2}'");
153
- expect(r.exitCode).toBeGreaterThanOrEqual(0);
154
- });
155
-
156
- test("awk multiple fields", async () => {
157
- const r = await runCmd(client, "echo 'one two three' | awk '{print $1, $3}'");
158
- expect(r.exitCode).toBeGreaterThanOrEqual(0);
159
- });
160
-
161
- test("awk NF (field count)", async () => {
162
- const r = await runCmd(client, "echo 'a b c d' | awk '{print NF}'");
163
- expect(r.exitCode).toBeGreaterThanOrEqual(0);
164
- });
165
-
166
- test("awk NR (line count)", async () => {
167
- createTestFile(shell, "/tmp/awktest.txt", "line1\\nline2\\nline3");
168
- const r = await runCmd(client, "awk '{print NR}' /tmp/awktest.txt");
169
- expect(r.exitCode).toBeGreaterThanOrEqual(0);
170
- });
171
-
172
- test("awk with condition", async () => {
173
- const r = await runCmd(client, "echo -e '1\\n5\\n10\\n3' | awk '$1 > 4'");
174
- expect(r.exitCode).toBeGreaterThanOrEqual(0);
175
- });
176
-
177
- test("awk string concatenation", async () => {
178
- const r = await runCmd(client, "echo 'a b' | awk '{print $1 $2}'");
179
- expect(r.exitCode).toBeGreaterThanOrEqual(0);
180
- });
181
-
182
- test("awk arithmetic", async () => {
183
- const r = await runCmd(client, "echo '10 20' | awk '{print $1 + $2}'");
184
- expect(r.exitCode).toBeGreaterThanOrEqual(0);
185
- });
186
-
187
- test("awk pattern matching", async () => {
188
- createTestFile(shell, "/tmp/awkpat.txt", "apple\\nbanana\\napricot");
189
- const r = await runCmd(client, "awk '/ap/' /tmp/awkpat.txt");
190
- expect(r.exitCode).toBeGreaterThanOrEqual(0);
191
- });
192
- });
193
-
194
- // ─── XARGS command tests ──────────────────────────────────────────────────
195
-
196
- describe("xargs command - argument processing", () => {
197
- test("xargs basic usage", async () => {
198
- const r = await runCmd(client, "echo 'file1 file2 file3' | xargs touch");
199
- expect(r.exitCode).toBeGreaterThanOrEqual(0);
200
- });
201
-
202
- test("xargs -n limits args", async () => {
203
- const r = await runCmd(client, "seq 1 10 | xargs -n 3 echo");
204
- expect(r.exitCode).toBeGreaterThanOrEqual(0);
205
- });
206
-
207
- test("xargs -I replace", async () => {
208
- const r = await runCmd(client, "echo -e 'a\\nb\\nc' | xargs -I {} echo file-{}");
209
- expect(r.exitCode).toBeGreaterThanOrEqual(0);
210
- });
211
-
212
- test("xargs -0 null delimiter", async () => {
213
- const r = await runCmd(client, "printf 'a\\0b\\0c' | xargs -0 echo");
214
- expect(r.exitCode).toBeGreaterThanOrEqual(0);
215
- });
216
-
217
- test("xargs with pipe", async () => {
218
- const r = await runCmd(client, "seq 1 5 | xargs | cat");
219
- expect(r.exitCode).toBeGreaterThanOrEqual(0);
220
- });
221
- });
222
-
223
- // ─── BASE64 command tests ─────────────────────────────────────────────────
224
-
225
- describe("base64 command - encoding/decoding", () => {
226
- test("base64 encode", async () => {
227
- const r = await runCmd(client, "echo 'hello' | base64");
228
- expect(r.exitCode).toBeGreaterThanOrEqual(0);
229
- });
230
-
231
- test("base64 decode", async () => {
232
- const r = await runCmd(client, "echo 'aGVsbG8=' | base64 -d");
233
- expect(r.exitCode).toBeGreaterThanOrEqual(0);
234
- });
235
-
236
- test("base64 file", async () => {
237
- createTestFile(shell, "/tmp/b64.txt", "test content");
238
- const r = await runCmd(client, "base64 /tmp/b64.txt");
239
- expect(r.exitCode).toBeGreaterThanOrEqual(0);
240
- });
241
-
242
- test("base64 encode/decode roundtrip", async () => {
243
- const r = await runCmd(client, "echo 'data' | base64 | base64 -d");
244
- expect(r.exitCode).toBeGreaterThanOrEqual(0);
245
- });
246
- });
247
-
248
- // ─── NANO/VI-like editor tests ────────────────────────────────────────────
249
-
250
- describe("nano command - editor simulation", () => {
251
- test("nano with file creates it", async () => {
252
- const r = await runCmd(client, "nano /tmp/nanofile.txt");
253
- expect(r.exitCode).toBeGreaterThanOrEqual(0);
254
- });
255
-
256
- test("nano opens existing file", async () => {
257
- createTestFile(shell, "/tmp/nanoexist.txt", "content");
258
- const r = await runCmd(client, "nano /tmp/nanoexist.txt");
259
- expect(r.exitCode).toBeGreaterThanOrEqual(0);
260
- });
261
- });
262
-
263
- // ─── READ command tests ──────────────────────────────────────────────────
264
-
265
- describe("read command - input processing", () => {
266
- test("read from stdin", async () => {
267
- const r = await runCmd(client, "echo 'test' | read var && echo $var");
268
- expect(r.exitCode).toBeGreaterThanOrEqual(0);
269
- });
270
-
271
- test("read multiple vars", async () => {
272
- const r = await runCmd(client, "echo 'a b c' | read x y z && echo $x $y $z");
273
- expect(r.exitCode).toBeGreaterThanOrEqual(0);
274
- });
275
-
276
- test("read -p prompt", async () => {
277
- const r = await runCmd(client, "echo 'input' | read -p 'Enter: ' var");
278
- expect(r.exitCode).toBeGreaterThanOrEqual(0);
279
- });
280
- });
281
-
282
- // ─── DECLARE/SET command tests ───────────────────────────────────────────
283
-
284
- describe("declare/set commands - variable management", () => {
285
- test("declare variable", async () => {
286
- const r = await runCmd(client, "declare VAR=value && echo $VAR");
287
- expect(r.exitCode).toBeGreaterThanOrEqual(0);
288
- });
289
-
290
- test("set positional parameters", async () => {
291
- const r = await runCmd(client, "set a b c && echo $2");
292
- expect(r.exitCode).toBeGreaterThanOrEqual(0);
293
- });
294
-
295
- test("set -x debug mode", async () => {
296
- const r = await runCmd(client, "set -x && echo test");
297
- expect(r.exitCode).toBeGreaterThanOrEqual(0);
298
- });
299
- });
300
-
301
- // ─── SHIFT command tests ──────────────────────────────────────────────────
302
-
303
- describe("shift command - parameter manipulation", () => {
304
- test("shift removes first param", async () => {
305
- const r = await runCmd(client, "shift");
306
- expect(r.exitCode).toBeGreaterThanOrEqual(0);
307
- });
308
-
309
- test("shift with count", async () => {
310
- const r = await runCmd(client, "shift 2");
311
- expect(r.exitCode).toBeGreaterThanOrEqual(0);
312
- });
313
- });
314
-
315
- // ─── REGISTRY command tests ──────────────────────────────────────────────
316
-
317
- describe("registry command - hidden feature", () => {
318
- test("registry command exists", async () => {
319
- const r = await runCmd(client, "registry");
320
- expect(r.exitCode).toBeGreaterThanOrEqual(0);
321
- });
322
-
323
- test("registry with args", async () => {
324
- const r = await runCmd(client, "registry list");
325
- expect(r.exitCode).toBeGreaterThanOrEqual(0);
326
- });
327
- });