typescript-virtual-container 1.4.4 → 1.4.5

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 (892) hide show
  1. package/builds/self-standalone.js +321 -272
  2. package/builds/self-standalone.js.map +4 -4
  3. package/builds/standalone-wo-sftp.js +261 -212
  4. package/builds/standalone-wo-sftp.js.map +4 -4
  5. package/builds/standalone.js +265 -216
  6. package/builds/standalone.js.map +4 -4
  7. package/builds/web-full-api.min.js +5 -5
  8. package/builds/web-full-api.min.js.map +3 -3
  9. package/builds/web.min.js +5 -5
  10. package/builds/web.min.js.map +3 -3
  11. package/bun.lock +97 -0
  12. package/dist/Honeypot/index.d.ts.map +1 -0
  13. package/dist/Honeypot/index.js +299 -0
  14. package/dist/Honeypot/index.js.map +1 -0
  15. package/dist/SSHClient/index.d.ts.map +1 -0
  16. package/dist/SSHClient/index.js +238 -0
  17. package/dist/SSHClient/index.js.map +1 -0
  18. package/dist/SSHMimic/exec.d.ts.map +1 -0
  19. package/dist/SSHMimic/exec.js +28 -0
  20. package/dist/SSHMimic/exec.js.map +1 -0
  21. package/dist/SSHMimic/executor.d.ts.map +1 -0
  22. package/dist/SSHMimic/executor.js +161 -0
  23. package/dist/SSHMimic/executor.js.map +1 -0
  24. package/dist/SSHMimic/hostKey.d.ts.map +1 -0
  25. package/dist/SSHMimic/hostKey.js +18 -0
  26. package/dist/SSHMimic/hostKey.js.map +1 -0
  27. package/dist/SSHMimic/index.d.ts.map +1 -0
  28. package/dist/SSHMimic/index.js +250 -0
  29. package/dist/SSHMimic/index.js.map +1 -0
  30. package/dist/SSHMimic/loginBanner.d.ts.map +1 -0
  31. package/dist/SSHMimic/loginBanner.js +23 -0
  32. package/dist/SSHMimic/loginBanner.js.map +1 -0
  33. package/dist/SSHMimic/loginFormat.d.ts.map +1 -0
  34. package/dist/SSHMimic/loginFormat.js +11 -0
  35. package/dist/SSHMimic/loginFormat.js.map +1 -0
  36. package/dist/SSHMimic/prompt.d.ts.map +1 -0
  37. package/dist/SSHMimic/prompt.js +10 -0
  38. package/dist/SSHMimic/prompt.js.map +1 -0
  39. package/dist/SSHMimic/sftp.d.ts.map +1 -0
  40. package/dist/SSHMimic/sftp.js +620 -0
  41. package/dist/SSHMimic/sftp.js.map +1 -0
  42. package/dist/VirtualFileSystem/binaryPack.d.ts.map +1 -0
  43. package/dist/VirtualFileSystem/binaryPack.js +217 -0
  44. package/dist/VirtualFileSystem/binaryPack.js.map +1 -0
  45. package/dist/VirtualFileSystem/index.d.ts.map +1 -0
  46. package/dist/VirtualFileSystem/index.js +690 -0
  47. package/dist/VirtualFileSystem/index.js.map +1 -0
  48. package/dist/VirtualFileSystem/internalTypes.d.ts.map +1 -0
  49. package/dist/VirtualFileSystem/internalTypes.js +1 -0
  50. package/dist/VirtualFileSystem/internalTypes.js.map +1 -0
  51. package/dist/VirtualFileSystem/path.d.ts.map +1 -0
  52. package/dist/VirtualFileSystem/path.js +50 -0
  53. package/dist/VirtualFileSystem/path.js.map +1 -0
  54. package/dist/VirtualPackageManager/index.d.ts.map +1 -0
  55. package/dist/VirtualPackageManager/index.js +854 -0
  56. package/dist/VirtualPackageManager/index.js.map +1 -0
  57. package/dist/VirtualShell/index.d.ts.map +1 -0
  58. package/dist/VirtualShell/index.js +285 -0
  59. package/dist/VirtualShell/index.js.map +1 -0
  60. package/dist/VirtualShell/shell.d.ts.map +1 -0
  61. package/dist/VirtualShell/shell.js +503 -0
  62. package/dist/VirtualShell/shell.js.map +1 -0
  63. package/dist/VirtualShell/shellParser.d.ts.map +1 -0
  64. package/dist/VirtualShell/shellParser.js +266 -0
  65. package/dist/VirtualShell/shellParser.js.map +1 -0
  66. package/dist/VirtualUserManager/index.d.ts.map +1 -0
  67. package/dist/VirtualUserManager/index.js +608 -0
  68. package/dist/VirtualUserManager/index.js.map +1 -0
  69. package/dist/commands/adduser.d.ts.map +1 -0
  70. package/dist/commands/adduser.js +90 -0
  71. package/dist/commands/adduser.js.map +1 -0
  72. package/dist/commands/alias.d.ts.map +1 -0
  73. package/dist/commands/alias.js +69 -0
  74. package/dist/commands/alias.js.map +1 -0
  75. package/dist/commands/apt.d.ts.map +1 -0
  76. package/dist/commands/apt.js +211 -0
  77. package/dist/commands/apt.js.map +1 -0
  78. package/dist/commands/awk.d.ts.map +1 -0
  79. package/dist/commands/awk.js +170 -0
  80. package/dist/commands/awk.js.map +1 -0
  81. package/dist/commands/base64.d.ts.map +1 -0
  82. package/dist/commands/base64.js +29 -0
  83. package/dist/commands/base64.js.map +1 -0
  84. package/dist/commands/cat.d.ts.map +1 -0
  85. package/dist/commands/cat.js +45 -0
  86. package/dist/commands/cat.js.map +1 -0
  87. package/dist/commands/cd.d.ts.map +1 -0
  88. package/dist/commands/cd.js +22 -0
  89. package/dist/commands/cd.js.map +1 -0
  90. package/dist/commands/chmod.d.ts.map +1 -0
  91. package/dist/commands/chmod.js +88 -0
  92. package/dist/commands/chmod.js.map +1 -0
  93. package/dist/commands/clear.d.ts.map +1 -0
  94. package/dist/commands/clear.js +14 -0
  95. package/dist/commands/clear.js.map +1 -0
  96. package/dist/commands/command-helpers.d.ts.map +1 -0
  97. package/dist/commands/command-helpers.js +222 -0
  98. package/dist/commands/command-helpers.js.map +1 -0
  99. package/dist/commands/cp.d.ts.map +1 -0
  100. package/dist/commands/cp.js +76 -0
  101. package/dist/commands/cp.js.map +1 -0
  102. package/dist/commands/curl.d.ts.map +1 -0
  103. package/dist/commands/curl.js +128 -0
  104. package/dist/commands/curl.js.map +1 -0
  105. package/dist/commands/cut.d.ts.map +1 -0
  106. package/dist/commands/cut.js +35 -0
  107. package/dist/commands/cut.js.map +1 -0
  108. package/dist/commands/date.d.ts.map +1 -0
  109. package/dist/commands/date.js +29 -0
  110. package/dist/commands/date.js.map +1 -0
  111. package/dist/commands/declare.d.ts.map +1 -0
  112. package/dist/commands/declare.js +45 -0
  113. package/dist/commands/declare.js.map +1 -0
  114. package/dist/commands/deluser.d.ts.map +1 -0
  115. package/dist/commands/deluser.js +84 -0
  116. package/dist/commands/deluser.js.map +1 -0
  117. package/dist/commands/df.d.ts.map +1 -0
  118. package/dist/commands/df.js +22 -0
  119. package/dist/commands/df.js.map +1 -0
  120. package/dist/commands/diff.d.ts.map +1 -0
  121. package/dist/commands/diff.js +46 -0
  122. package/dist/commands/diff.js.map +1 -0
  123. package/dist/commands/dpkg.d.ts.map +1 -0
  124. package/dist/commands/dpkg.js +162 -0
  125. package/dist/commands/dpkg.js.map +1 -0
  126. package/dist/commands/du.d.ts.map +1 -0
  127. package/dist/commands/du.js +51 -0
  128. package/dist/commands/du.js.map +1 -0
  129. package/dist/commands/echo.d.ts.map +1 -0
  130. package/dist/commands/echo.js +46 -0
  131. package/dist/commands/echo.js.map +1 -0
  132. package/dist/commands/env.d.ts.map +1 -0
  133. package/dist/commands/env.js +21 -0
  134. package/dist/commands/env.js.map +1 -0
  135. package/dist/commands/exit.d.ts.map +1 -0
  136. package/dist/commands/exit.js +17 -0
  137. package/dist/commands/exit.js.map +1 -0
  138. package/dist/commands/export.d.ts.map +1 -0
  139. package/dist/commands/export.js +34 -0
  140. package/dist/commands/export.js.map +1 -0
  141. package/dist/commands/find.d.ts.map +1 -0
  142. package/dist/commands/find.js +56 -0
  143. package/dist/commands/find.js.map +1 -0
  144. package/dist/commands/free.d.ts.map +1 -0
  145. package/dist/commands/free.js +44 -0
  146. package/dist/commands/free.js.map +1 -0
  147. package/dist/commands/grep.d.ts.map +1 -0
  148. package/dist/commands/grep.js +121 -0
  149. package/dist/commands/grep.js.map +1 -0
  150. package/dist/commands/groups.d.ts.map +1 -0
  151. package/dist/commands/groups.js +18 -0
  152. package/dist/commands/groups.js.map +1 -0
  153. package/dist/commands/gzip.d.ts.map +1 -0
  154. package/dist/commands/gzip.js +83 -0
  155. package/dist/commands/gzip.js.map +1 -0
  156. package/dist/commands/head.d.ts.map +1 -0
  157. package/dist/commands/head.js +47 -0
  158. package/dist/commands/head.js.map +1 -0
  159. package/dist/commands/help.d.ts.map +1 -0
  160. package/dist/commands/help.js +124 -0
  161. package/dist/commands/help.js.map +1 -0
  162. package/dist/commands/helpers.d.ts.map +1 -0
  163. package/dist/commands/helpers.js +167 -0
  164. package/dist/commands/helpers.js.map +1 -0
  165. package/dist/commands/history.d.ts.map +1 -0
  166. package/dist/commands/history.js +27 -0
  167. package/dist/commands/history.js.map +1 -0
  168. package/dist/commands/hostname.d.ts.map +1 -0
  169. package/dist/commands/hostname.js +13 -0
  170. package/dist/commands/hostname.js.map +1 -0
  171. package/dist/commands/htop.d.ts.map +1 -0
  172. package/dist/commands/htop.js +18 -0
  173. package/dist/commands/htop.js.map +1 -0
  174. package/dist/commands/id.d.ts.map +1 -0
  175. package/dist/commands/id.js +18 -0
  176. package/dist/commands/id.js.map +1 -0
  177. package/dist/commands/index.d.ts.map +1 -0
  178. package/dist/commands/index.js +3 -0
  179. package/dist/commands/index.js.map +1 -0
  180. package/dist/commands/kill.d.ts.map +1 -0
  181. package/dist/commands/kill.js +19 -0
  182. package/dist/commands/kill.js.map +1 -0
  183. package/dist/commands/ln.d.ts.map +1 -0
  184. package/dist/commands/ln.js +67 -0
  185. package/dist/commands/ln.js.map +1 -0
  186. package/dist/commands/ls.d.ts.map +1 -0
  187. package/dist/commands/ls.js +201 -0
  188. package/dist/commands/ls.js.map +1 -0
  189. package/dist/commands/lsb-release.d.ts.map +1 -0
  190. package/dist/commands/lsb-release.js +62 -0
  191. package/dist/commands/lsb-release.js.map +1 -0
  192. package/dist/commands/man.d.ts.map +1 -0
  193. package/dist/commands/man.js +50 -0
  194. package/dist/commands/man.js.map +1 -0
  195. package/dist/commands/mkdir.d.ts.map +1 -0
  196. package/dist/commands/mkdir.js +29 -0
  197. package/dist/commands/mkdir.js.map +1 -0
  198. package/dist/commands/mv.d.ts.map +1 -0
  199. package/dist/commands/mv.js +43 -0
  200. package/dist/commands/mv.js.map +1 -0
  201. package/dist/commands/nano.d.ts.map +1 -0
  202. package/dist/commands/nano.js +35 -0
  203. package/dist/commands/nano.js.map +1 -0
  204. package/dist/commands/neofetch.d.ts.map +1 -0
  205. package/dist/commands/neofetch.js +49 -0
  206. package/dist/commands/neofetch.js.map +1 -0
  207. package/dist/commands/node.d.ts.map +1 -0
  208. package/dist/commands/node.js +317 -0
  209. package/dist/commands/node.js.map +1 -0
  210. package/dist/commands/npm.d.ts.map +1 -0
  211. package/dist/commands/npm.js +110 -0
  212. package/dist/commands/npm.js.map +1 -0
  213. package/dist/commands/passwd.d.ts.map +1 -0
  214. package/dist/commands/passwd.js +45 -0
  215. package/dist/commands/passwd.js.map +1 -0
  216. package/dist/commands/ping.d.ts.map +1 -0
  217. package/dist/commands/ping.js +29 -0
  218. package/dist/commands/ping.js.map +1 -0
  219. package/dist/commands/printf.d.ts.map +1 -0
  220. package/dist/commands/printf.js +145 -0
  221. package/dist/commands/printf.js.map +1 -0
  222. package/dist/commands/ps.d.ts.map +1 -0
  223. package/dist/commands/ps.js +47 -0
  224. package/dist/commands/ps.js.map +1 -0
  225. package/dist/commands/pwd.d.ts.map +1 -0
  226. package/dist/commands/pwd.js +8 -0
  227. package/dist/commands/pwd.js.map +1 -0
  228. package/dist/commands/python.d.ts.map +1 -0
  229. package/dist/commands/python.js +2059 -0
  230. package/dist/commands/python.js.map +1 -0
  231. package/dist/commands/read.d.ts.map +1 -0
  232. package/dist/commands/read.js +40 -0
  233. package/dist/commands/read.js.map +1 -0
  234. package/dist/commands/registry.d.ts.map +1 -0
  235. package/dist/commands/registry.js +235 -0
  236. package/dist/commands/registry.js.map +1 -0
  237. package/dist/commands/rm.d.ts.map +1 -0
  238. package/dist/commands/rm.js +37 -0
  239. package/dist/commands/rm.js.map +1 -0
  240. package/dist/commands/runtime.d.ts.map +1 -0
  241. package/dist/commands/runtime.js +286 -0
  242. package/dist/commands/runtime.js.map +1 -0
  243. package/dist/commands/sed.d.ts.map +1 -0
  244. package/dist/commands/sed.js +61 -0
  245. package/dist/commands/sed.js.map +1 -0
  246. package/dist/commands/seq.d.ts.map +1 -0
  247. package/dist/commands/seq.js +51 -0
  248. package/dist/commands/seq.js.map +1 -0
  249. package/dist/commands/set.d.ts.map +1 -0
  250. package/dist/commands/set.js +27 -0
  251. package/dist/commands/set.js.map +1 -0
  252. package/dist/commands/sh.d.ts.map +1 -0
  253. package/dist/commands/sh.js +432 -0
  254. package/dist/commands/sh.js.map +1 -0
  255. package/dist/commands/shift.d.ts.map +1 -0
  256. package/dist/commands/shift.js +63 -0
  257. package/dist/commands/shift.js.map +1 -0
  258. package/dist/commands/sleep.d.ts.map +1 -0
  259. package/dist/commands/sleep.js +19 -0
  260. package/dist/commands/sleep.js.map +1 -0
  261. package/dist/commands/sort.d.ts.map +1 -0
  262. package/dist/commands/sort.js +45 -0
  263. package/dist/commands/sort.js.map +1 -0
  264. package/dist/commands/source.d.ts.map +1 -0
  265. package/dist/commands/source.js +40 -0
  266. package/dist/commands/source.js.map +1 -0
  267. package/dist/commands/stat.d.ts.map +1 -0
  268. package/dist/commands/stat.js +57 -0
  269. package/dist/commands/stat.js.map +1 -0
  270. package/dist/commands/su.d.ts.map +1 -0
  271. package/dist/commands/su.js +58 -0
  272. package/dist/commands/su.js.map +1 -0
  273. package/dist/commands/sudo.d.ts.map +1 -0
  274. package/dist/commands/sudo.js +55 -0
  275. package/dist/commands/sudo.js.map +1 -0
  276. package/dist/commands/tail.d.ts.map +1 -0
  277. package/dist/commands/tail.js +48 -0
  278. package/dist/commands/tail.js.map +1 -0
  279. package/dist/commands/tar.d.ts.map +1 -0
  280. package/dist/commands/tar.js +103 -0
  281. package/dist/commands/tar.js.map +1 -0
  282. package/dist/commands/tee.d.ts.map +1 -0
  283. package/dist/commands/tee.js +37 -0
  284. package/dist/commands/tee.js.map +1 -0
  285. package/dist/commands/test.d.ts.map +1 -0
  286. package/dist/commands/test.js +115 -0
  287. package/dist/commands/test.js.map +1 -0
  288. package/dist/commands/touch.d.ts.map +1 -0
  289. package/dist/commands/touch.js +26 -0
  290. package/dist/commands/touch.js.map +1 -0
  291. package/dist/commands/tr.d.ts.map +1 -0
  292. package/dist/commands/tr.js +62 -0
  293. package/dist/commands/tr.js.map +1 -0
  294. package/dist/commands/tree.d.ts.map +1 -0
  295. package/dist/commands/tree.js +19 -0
  296. package/dist/commands/tree.js.map +1 -0
  297. package/dist/commands/true.d.ts.map +1 -0
  298. package/dist/commands/true.js +25 -0
  299. package/dist/commands/true.js.map +1 -0
  300. package/dist/commands/type.d.ts.map +1 -0
  301. package/dist/commands/type.js +40 -0
  302. package/dist/commands/type.js.map +1 -0
  303. package/dist/commands/uname.d.ts.map +1 -0
  304. package/dist/commands/uname.js +30 -0
  305. package/dist/commands/uname.js.map +1 -0
  306. package/dist/commands/uniq.d.ts.map +1 -0
  307. package/dist/commands/uniq.js +39 -0
  308. package/dist/commands/uniq.js.map +1 -0
  309. package/dist/commands/unset.d.ts.map +1 -0
  310. package/dist/commands/unset.js +17 -0
  311. package/dist/commands/unset.js.map +1 -0
  312. package/dist/commands/uptime.d.ts.map +1 -0
  313. package/dist/commands/uptime.js +49 -0
  314. package/dist/commands/uptime.js.map +1 -0
  315. package/dist/commands/wc.d.ts.map +1 -0
  316. package/dist/commands/wc.js +56 -0
  317. package/dist/commands/wc.js.map +1 -0
  318. package/dist/commands/wget.d.ts.map +1 -0
  319. package/dist/commands/wget.js +127 -0
  320. package/dist/commands/wget.js.map +1 -0
  321. package/dist/commands/which.d.ts.map +1 -0
  322. package/dist/commands/which.js +33 -0
  323. package/dist/commands/which.js.map +1 -0
  324. package/dist/commands/who.d.ts.map +1 -0
  325. package/dist/commands/who.js +23 -0
  326. package/dist/commands/who.js.map +1 -0
  327. package/dist/commands/whoami.d.ts.map +1 -0
  328. package/dist/commands/whoami.js +13 -0
  329. package/dist/commands/whoami.js.map +1 -0
  330. package/dist/commands/xargs.d.ts.map +1 -0
  331. package/dist/commands/xargs.js +22 -0
  332. package/dist/commands/xargs.js.map +1 -0
  333. package/dist/index.d.ts.map +1 -0
  334. package/dist/index.js +10 -0
  335. package/dist/index.js.map +1 -0
  336. package/dist/modules/linuxRootfs.d.ts.map +1 -0
  337. package/dist/modules/linuxRootfs.js +620 -0
  338. package/dist/modules/linuxRootfs.js.map +1 -0
  339. package/dist/modules/neofetch.d.ts.map +1 -0
  340. package/dist/modules/neofetch.js +285 -0
  341. package/dist/modules/neofetch.js.map +1 -0
  342. package/dist/modules/shellInteractive.d.ts.map +1 -0
  343. package/dist/modules/shellInteractive.js +27 -0
  344. package/dist/modules/shellInteractive.js.map +1 -0
  345. package/dist/modules/shellRuntime.d.ts.map +1 -0
  346. package/dist/modules/shellRuntime.js +53 -0
  347. package/dist/modules/shellRuntime.js.map +1 -0
  348. package/dist/self-standalone.d.ts.map +1 -0
  349. package/dist/self-standalone.js +419 -0
  350. package/dist/self-standalone.js.map +1 -0
  351. package/dist/standalone-wo-sftp.d.ts.map +1 -0
  352. package/dist/standalone-wo-sftp.js +31 -0
  353. package/dist/standalone-wo-sftp.js.map +1 -0
  354. package/dist/standalone.d.ts.map +1 -0
  355. package/dist/standalone.js +36 -0
  356. package/dist/standalone.js.map +1 -0
  357. package/dist/types/commands.d.ts.map +1 -0
  358. package/dist/types/commands.js +1 -0
  359. package/dist/types/commands.js.map +1 -0
  360. package/dist/types/pipeline.d.ts.map +1 -0
  361. package/dist/types/pipeline.js +1 -0
  362. package/dist/types/pipeline.js.map +1 -0
  363. package/dist/types/streams.d.ts.map +1 -0
  364. package/dist/types/streams.js +1 -0
  365. package/dist/types/streams.js.map +1 -0
  366. package/dist/types/vfs.d.ts.map +1 -0
  367. package/dist/types/vfs.js +1 -0
  368. package/dist/types/vfs.js.map +1 -0
  369. package/dist/utils/expand.d.ts.map +1 -0
  370. package/dist/utils/expand.js +477 -0
  371. package/dist/utils/expand.js.map +1 -0
  372. package/dist/utils/perfLogger.d.ts.map +1 -0
  373. package/dist/utils/perfLogger.js +50 -0
  374. package/dist/utils/perfLogger.js.map +1 -0
  375. package/dist/utils/tokenize.d.ts.map +1 -0
  376. package/dist/utils/tokenize.js +115 -0
  377. package/dist/utils/tokenize.js.map +1 -0
  378. package/dist/utils/vfsDiff.d.ts.map +1 -0
  379. package/dist/utils/vfsDiff.js +178 -0
  380. package/dist/utils/vfsDiff.js.map +1 -0
  381. package/dist/web-api.d.ts.map +1 -0
  382. package/dist/web-api.js +47 -0
  383. package/dist/web-api.js.map +1 -0
  384. package/dist/web-full.d.ts.map +1 -0
  385. package/dist/web-full.js +9 -0
  386. package/dist/web-full.js.map +1 -0
  387. package/dist/web.d.ts.map +1 -0
  388. package/dist/web.js +774 -0
  389. package/dist/web.js.map +1 -0
  390. package/docs/.nojekyll +1 -0
  391. package/docs/assets/hierarchy.js +1 -0
  392. package/docs/assets/highlight.css +162 -0
  393. package/docs/assets/icons.js +18 -0
  394. package/docs/assets/icons.svg +1 -0
  395. package/docs/assets/main.js +60 -0
  396. package/docs/assets/navigation.js +1 -0
  397. package/docs/assets/search.js +1 -0
  398. package/docs/assets/style.css +1633 -0
  399. package/docs/classes/HoneyPot.html +31 -0
  400. package/docs/classes/SshClient.html +66 -0
  401. package/docs/classes/VirtualFileSystem.html +262 -0
  402. package/docs/classes/VirtualPackageManager.html +63 -0
  403. package/docs/classes/VirtualSftpServer.html +169 -0
  404. package/docs/classes/VirtualShell.html +265 -0
  405. package/docs/classes/VirtualSshServer.html +177 -0
  406. package/docs/classes/VirtualUserManager.html +276 -0
  407. package/docs/docs/.nojekyll +1 -0
  408. package/docs/docs/assets/hierarchy.js +1 -0
  409. package/docs/docs/assets/highlight.css +162 -0
  410. package/docs/docs/assets/icons.js +18 -0
  411. package/docs/docs/assets/icons.svg +1 -0
  412. package/docs/docs/assets/main.js +60 -0
  413. package/docs/docs/assets/navigation.js +1 -0
  414. package/docs/docs/assets/search.js +1 -0
  415. package/docs/docs/assets/style.css +1633 -0
  416. package/docs/docs/hierarchy.html +1 -0
  417. package/docs/docs/index.html +1842 -0
  418. package/docs/docs/media/LICENSE +21 -0
  419. package/docs/docs/modules.html +1 -0
  420. package/docs/functions/assertDiff.html +6 -0
  421. package/docs/functions/diffSnapshots.html +7 -0
  422. package/docs/functions/formatDiff.html +6 -0
  423. package/docs/functions/getArg.html +13 -0
  424. package/docs/functions/getFlag.html +15 -0
  425. package/docs/functions/ifFlag.html +11 -0
  426. package/docs/hierarchy.html +1 -0
  427. package/docs/index.html +1842 -0
  428. package/docs/interfaces/AuditLogEntry.html +6 -0
  429. package/docs/interfaces/CommandContext.html +22 -0
  430. package/docs/interfaces/CommandResult.html +26 -0
  431. package/docs/interfaces/ExecStream.html +11 -0
  432. package/docs/interfaces/HoneyPotStats.html +14 -0
  433. package/docs/interfaces/InstalledPackage.html +20 -0
  434. package/docs/interfaces/NanoEditorSession.html +8 -0
  435. package/docs/interfaces/PackageDefinition.html +30 -0
  436. package/docs/interfaces/PackageFile.html +8 -0
  437. package/docs/interfaces/RemoveOptions.html +4 -0
  438. package/docs/interfaces/ShellEnv.html +6 -0
  439. package/docs/interfaces/ShellModule.html +14 -0
  440. package/docs/interfaces/ShellProperties.html +14 -0
  441. package/docs/interfaces/ShellStream.html +11 -0
  442. package/docs/interfaces/SudoChallenge.html +24 -0
  443. package/docs/interfaces/VfsBaseNode.html +12 -0
  444. package/docs/interfaces/VfsDiff.html +10 -0
  445. package/docs/interfaces/VfsDiffEntry.html +6 -0
  446. package/docs/interfaces/VfsDiffModified.html +10 -0
  447. package/docs/interfaces/VfsDirectoryNode.html +15 -0
  448. package/docs/interfaces/VfsFileNode.html +17 -0
  449. package/docs/interfaces/VfsOptions.html +12 -0
  450. package/docs/interfaces/VfsSnapshot.html +3 -0
  451. package/docs/interfaces/VfsSnapshotBaseNode.html +8 -0
  452. package/docs/interfaces/VfsSnapshotDirectoryNode.html +10 -0
  453. package/docs/interfaces/VfsSnapshotFileNode.html +12 -0
  454. package/docs/interfaces/WriteFileOptions.html +6 -0
  455. package/docs/media/LICENSE +21 -0
  456. package/docs/modules.html +1 -0
  457. package/docs/types/CommandMode.html +2 -0
  458. package/docs/types/CommandOutcome.html +2 -0
  459. package/docs/types/VfsNodeStats.html +2 -0
  460. package/docs/types/VfsNodeType.html +2 -0
  461. package/docs/types/VfsPersistenceMode.html +5 -0
  462. package/docs/types/VfsSnapshotNode.html +2 -0
  463. package/examples/web.min.js +5 -5
  464. package/package.json +4 -2
  465. package/tsconfig.json +7 -2
  466. package/typedoc.json +8 -0
  467. package/src/Honeypot/index.d.ts.map +0 -1
  468. package/src/Honeypot/index.js +0 -298
  469. package/src/SSHClient/index.d.ts.map +0 -1
  470. package/src/SSHClient/index.js +0 -237
  471. package/src/SSHMimic/exec.d.ts.map +0 -1
  472. package/src/SSHMimic/exec.js +0 -27
  473. package/src/SSHMimic/executor.d.ts.map +0 -1
  474. package/src/SSHMimic/executor.js +0 -160
  475. package/src/SSHMimic/hostKey.d.ts.map +0 -1
  476. package/src/SSHMimic/hostKey.js +0 -17
  477. package/src/SSHMimic/index.d.ts.map +0 -1
  478. package/src/SSHMimic/index.js +0 -249
  479. package/src/SSHMimic/loginBanner.d.ts.map +0 -1
  480. package/src/SSHMimic/loginBanner.js +0 -22
  481. package/src/SSHMimic/loginFormat.d.ts.map +0 -1
  482. package/src/SSHMimic/loginFormat.js +0 -10
  483. package/src/SSHMimic/prompt.d.ts.map +0 -1
  484. package/src/SSHMimic/prompt.js +0 -9
  485. package/src/SSHMimic/sftp.d.ts.map +0 -1
  486. package/src/SSHMimic/sftp.js +0 -619
  487. package/src/VirtualFileSystem/binaryPack.d.ts.map +0 -1
  488. package/src/VirtualFileSystem/binaryPack.js +0 -216
  489. package/src/VirtualFileSystem/index.d.ts.map +0 -1
  490. package/src/VirtualFileSystem/index.js +0 -689
  491. package/src/VirtualFileSystem/internalTypes.d.ts.map +0 -1
  492. package/src/VirtualFileSystem/internalTypes.js +0 -0
  493. package/src/VirtualFileSystem/path.d.ts.map +0 -1
  494. package/src/VirtualFileSystem/path.js +0 -49
  495. package/src/VirtualPackageManager/index.d.ts.map +0 -1
  496. package/src/VirtualPackageManager/index.js +0 -853
  497. package/src/VirtualShell/index.d.ts.map +0 -1
  498. package/src/VirtualShell/index.js +0 -284
  499. package/src/VirtualShell/shell.d.ts.map +0 -1
  500. package/src/VirtualShell/shell.js +0 -502
  501. package/src/VirtualShell/shellParser.d.ts.map +0 -1
  502. package/src/VirtualShell/shellParser.js +0 -265
  503. package/src/VirtualUserManager/index.d.ts.map +0 -1
  504. package/src/VirtualUserManager/index.js +0 -607
  505. package/src/commands/adduser.d.ts.map +0 -1
  506. package/src/commands/adduser.js +0 -89
  507. package/src/commands/alias.d.ts.map +0 -1
  508. package/src/commands/alias.js +0 -68
  509. package/src/commands/apt.d.ts.map +0 -1
  510. package/src/commands/apt.js +0 -210
  511. package/src/commands/awk.d.ts.map +0 -1
  512. package/src/commands/awk.js +0 -169
  513. package/src/commands/base64.d.ts.map +0 -1
  514. package/src/commands/base64.js +0 -28
  515. package/src/commands/cat.d.ts.map +0 -1
  516. package/src/commands/cat.js +0 -44
  517. package/src/commands/cd.d.ts.map +0 -1
  518. package/src/commands/cd.js +0 -21
  519. package/src/commands/chmod.d.ts.map +0 -1
  520. package/src/commands/chmod.js +0 -87
  521. package/src/commands/clear.d.ts.map +0 -1
  522. package/src/commands/clear.js +0 -13
  523. package/src/commands/command-helpers.d.ts.map +0 -1
  524. package/src/commands/command-helpers.js +0 -221
  525. package/src/commands/cp.d.ts.map +0 -1
  526. package/src/commands/cp.js +0 -75
  527. package/src/commands/curl.d.ts.map +0 -1
  528. package/src/commands/curl.js +0 -127
  529. package/src/commands/cut.d.ts.map +0 -1
  530. package/src/commands/cut.js +0 -34
  531. package/src/commands/date.d.ts.map +0 -1
  532. package/src/commands/date.js +0 -28
  533. package/src/commands/declare.d.ts.map +0 -1
  534. package/src/commands/declare.js +0 -44
  535. package/src/commands/deluser.d.ts.map +0 -1
  536. package/src/commands/deluser.js +0 -83
  537. package/src/commands/df.d.ts.map +0 -1
  538. package/src/commands/df.js +0 -21
  539. package/src/commands/diff.d.ts.map +0 -1
  540. package/src/commands/diff.js +0 -45
  541. package/src/commands/dpkg.d.ts.map +0 -1
  542. package/src/commands/dpkg.js +0 -161
  543. package/src/commands/du.d.ts.map +0 -1
  544. package/src/commands/du.js +0 -50
  545. package/src/commands/echo.d.ts.map +0 -1
  546. package/src/commands/echo.js +0 -45
  547. package/src/commands/env.d.ts.map +0 -1
  548. package/src/commands/env.js +0 -20
  549. package/src/commands/exit.d.ts.map +0 -1
  550. package/src/commands/exit.js +0 -16
  551. package/src/commands/export.d.ts.map +0 -1
  552. package/src/commands/export.js +0 -33
  553. package/src/commands/find.d.ts.map +0 -1
  554. package/src/commands/find.js +0 -55
  555. package/src/commands/free.d.ts.map +0 -1
  556. package/src/commands/free.js +0 -43
  557. package/src/commands/grep.d.ts.map +0 -1
  558. package/src/commands/grep.js +0 -120
  559. package/src/commands/groups.d.ts.map +0 -1
  560. package/src/commands/groups.js +0 -17
  561. package/src/commands/gzip.d.ts.map +0 -1
  562. package/src/commands/gzip.js +0 -82
  563. package/src/commands/head.d.ts.map +0 -1
  564. package/src/commands/head.js +0 -46
  565. package/src/commands/help.d.ts.map +0 -1
  566. package/src/commands/help.js +0 -123
  567. package/src/commands/helpers.d.ts.map +0 -1
  568. package/src/commands/helpers.js +0 -166
  569. package/src/commands/history.d.ts.map +0 -1
  570. package/src/commands/history.js +0 -26
  571. package/src/commands/hostname.d.ts.map +0 -1
  572. package/src/commands/hostname.js +0 -12
  573. package/src/commands/htop.d.ts.map +0 -1
  574. package/src/commands/htop.js +0 -17
  575. package/src/commands/id.d.ts.map +0 -1
  576. package/src/commands/id.js +0 -17
  577. package/src/commands/index.d.ts.map +0 -1
  578. package/src/commands/index.js +0 -2
  579. package/src/commands/kill.d.ts.map +0 -1
  580. package/src/commands/kill.js +0 -18
  581. package/src/commands/ln.d.ts.map +0 -1
  582. package/src/commands/ln.js +0 -66
  583. package/src/commands/ls.d.ts.map +0 -1
  584. package/src/commands/ls.js +0 -200
  585. package/src/commands/lsb-release.d.ts.map +0 -1
  586. package/src/commands/lsb-release.js +0 -61
  587. package/src/commands/man.d.ts.map +0 -1
  588. package/src/commands/man.js +0 -49
  589. package/src/commands/mkdir.d.ts.map +0 -1
  590. package/src/commands/mkdir.js +0 -28
  591. package/src/commands/mv.d.ts.map +0 -1
  592. package/src/commands/mv.js +0 -42
  593. package/src/commands/nano.d.ts.map +0 -1
  594. package/src/commands/nano.js +0 -34
  595. package/src/commands/neofetch.d.ts.map +0 -1
  596. package/src/commands/neofetch.js +0 -48
  597. package/src/commands/node.d.ts.map +0 -1
  598. package/src/commands/node.js +0 -316
  599. package/src/commands/npm.d.ts.map +0 -1
  600. package/src/commands/npm.js +0 -109
  601. package/src/commands/passwd.d.ts.map +0 -1
  602. package/src/commands/passwd.js +0 -44
  603. package/src/commands/ping.d.ts.map +0 -1
  604. package/src/commands/ping.js +0 -28
  605. package/src/commands/printf.d.ts.map +0 -1
  606. package/src/commands/printf.js +0 -144
  607. package/src/commands/ps.d.ts.map +0 -1
  608. package/src/commands/ps.js +0 -46
  609. package/src/commands/pwd.d.ts.map +0 -1
  610. package/src/commands/pwd.js +0 -7
  611. package/src/commands/python.d.ts.map +0 -1
  612. package/src/commands/python.js +0 -2058
  613. package/src/commands/read.d.ts.map +0 -1
  614. package/src/commands/read.js +0 -39
  615. package/src/commands/registry.d.ts.map +0 -1
  616. package/src/commands/registry.js +0 -234
  617. package/src/commands/rm.d.ts.map +0 -1
  618. package/src/commands/rm.js +0 -36
  619. package/src/commands/runtime.d.ts.map +0 -1
  620. package/src/commands/runtime.js +0 -285
  621. package/src/commands/sed.d.ts.map +0 -1
  622. package/src/commands/sed.js +0 -60
  623. package/src/commands/seq.d.ts.map +0 -1
  624. package/src/commands/seq.js +0 -50
  625. package/src/commands/set.d.ts.map +0 -1
  626. package/src/commands/set.js +0 -26
  627. package/src/commands/sh.d.ts.map +0 -1
  628. package/src/commands/sh.js +0 -431
  629. package/src/commands/shift.d.ts.map +0 -1
  630. package/src/commands/shift.js +0 -62
  631. package/src/commands/sleep.d.ts.map +0 -1
  632. package/src/commands/sleep.js +0 -18
  633. package/src/commands/sort.d.ts.map +0 -1
  634. package/src/commands/sort.js +0 -44
  635. package/src/commands/source.d.ts.map +0 -1
  636. package/src/commands/source.js +0 -39
  637. package/src/commands/stat.d.ts.map +0 -1
  638. package/src/commands/stat.js +0 -56
  639. package/src/commands/su.d.ts.map +0 -1
  640. package/src/commands/su.js +0 -57
  641. package/src/commands/sudo.d.ts.map +0 -1
  642. package/src/commands/sudo.js +0 -54
  643. package/src/commands/tail.d.ts.map +0 -1
  644. package/src/commands/tail.js +0 -47
  645. package/src/commands/tar.d.ts.map +0 -1
  646. package/src/commands/tar.js +0 -102
  647. package/src/commands/tee.d.ts.map +0 -1
  648. package/src/commands/tee.js +0 -36
  649. package/src/commands/test.d.ts.map +0 -1
  650. package/src/commands/test.js +0 -114
  651. package/src/commands/touch.d.ts.map +0 -1
  652. package/src/commands/touch.js +0 -25
  653. package/src/commands/tr.d.ts.map +0 -1
  654. package/src/commands/tr.js +0 -61
  655. package/src/commands/tree.d.ts.map +0 -1
  656. package/src/commands/tree.js +0 -18
  657. package/src/commands/true.d.ts.map +0 -1
  658. package/src/commands/true.js +0 -24
  659. package/src/commands/type.d.ts.map +0 -1
  660. package/src/commands/type.js +0 -39
  661. package/src/commands/uname.d.ts.map +0 -1
  662. package/src/commands/uname.js +0 -29
  663. package/src/commands/uniq.d.ts.map +0 -1
  664. package/src/commands/uniq.js +0 -38
  665. package/src/commands/unset.d.ts.map +0 -1
  666. package/src/commands/unset.js +0 -16
  667. package/src/commands/uptime.d.ts.map +0 -1
  668. package/src/commands/uptime.js +0 -48
  669. package/src/commands/wc.d.ts.map +0 -1
  670. package/src/commands/wc.js +0 -55
  671. package/src/commands/wget.d.ts.map +0 -1
  672. package/src/commands/wget.js +0 -126
  673. package/src/commands/which.d.ts.map +0 -1
  674. package/src/commands/which.js +0 -32
  675. package/src/commands/who.d.ts.map +0 -1
  676. package/src/commands/who.js +0 -22
  677. package/src/commands/whoami.d.ts.map +0 -1
  678. package/src/commands/whoami.js +0 -12
  679. package/src/commands/xargs.d.ts.map +0 -1
  680. package/src/commands/xargs.js +0 -21
  681. package/src/index.d.ts.map +0 -1
  682. package/src/index.js +0 -9
  683. package/src/modules/linuxRootfs.d.ts.map +0 -1
  684. package/src/modules/linuxRootfs.js +0 -619
  685. package/src/modules/neofetch.d.ts.map +0 -1
  686. package/src/modules/neofetch.js +0 -284
  687. package/src/modules/shellInteractive.d.ts.map +0 -1
  688. package/src/modules/shellInteractive.js +0 -26
  689. package/src/modules/shellRuntime.d.ts.map +0 -1
  690. package/src/modules/shellRuntime.js +0 -52
  691. package/src/self-standalone.d.ts.map +0 -1
  692. package/src/self-standalone.js +0 -418
  693. package/src/standalone-wo-sftp.d.ts.map +0 -1
  694. package/src/standalone-wo-sftp.js +0 -30
  695. package/src/standalone.d.ts.map +0 -1
  696. package/src/standalone.js +0 -35
  697. package/src/types/commands.d.ts.map +0 -1
  698. package/src/types/commands.js +0 -0
  699. package/src/types/pipeline.d.ts.map +0 -1
  700. package/src/types/pipeline.js +0 -0
  701. package/src/types/streams.d.ts.map +0 -1
  702. package/src/types/streams.js +0 -0
  703. package/src/types/vfs.d.ts.map +0 -1
  704. package/src/types/vfs.js +0 -0
  705. package/src/utils/expand.d.ts.map +0 -1
  706. package/src/utils/expand.js +0 -476
  707. package/src/utils/perfLogger.d.ts.map +0 -1
  708. package/src/utils/perfLogger.js +0 -49
  709. package/src/utils/tokenize.d.ts.map +0 -1
  710. package/src/utils/tokenize.js +0 -114
  711. package/src/utils/vfsDiff.d.ts.map +0 -1
  712. package/src/utils/vfsDiff.js +0 -177
  713. package/src/web-api.d.ts.map +0 -1
  714. package/src/web-api.js +0 -46
  715. package/src/web-full.d.ts.map +0 -1
  716. package/src/web-full.js +0 -8
  717. package/src/web.d.ts.map +0 -1
  718. package/src/web.js +0 -773
  719. package/tests/command-helpers.test.d.ts +0 -2
  720. package/tests/command-helpers.test.d.ts.map +0 -1
  721. package/tests/command-helpers.test.js +0 -92
  722. package/tests/commands-admin-net.test.d.ts +0 -2
  723. package/tests/commands-admin-net.test.d.ts.map +0 -1
  724. package/tests/commands-admin-net.test.js +0 -353
  725. package/tests/commands-advanced.test.d.ts +0 -2
  726. package/tests/commands-advanced.test.d.ts.map +0 -1
  727. package/tests/commands-advanced.test.js +0 -378
  728. package/tests/commands-core.test.d.ts +0 -2
  729. package/tests/commands-core.test.d.ts.map +0 -1
  730. package/tests/commands-core.test.js +0 -477
  731. package/tests/commands-missing.test.d.ts +0 -2
  732. package/tests/commands-missing.test.d.ts.map +0 -1
  733. package/tests/commands-missing.test.js +0 -470
  734. package/tests/commands-specific-units.test.d.ts +0 -2
  735. package/tests/commands-specific-units.test.d.ts.map +0 -1
  736. package/tests/commands-specific-units.test.js +0 -264
  737. package/tests/commands-text-sys.test.d.ts +0 -2
  738. package/tests/commands-text-sys.test.d.ts.map +0 -1
  739. package/tests/commands-text-sys.test.js +0 -366
  740. package/tests/expand.test.d.ts +0 -2
  741. package/tests/expand.test.d.ts.map +0 -1
  742. package/tests/expand.test.js +0 -138
  743. package/tests/helpers.test.d.ts +0 -2
  744. package/tests/helpers.test.d.ts.map +0 -1
  745. package/tests/helpers.test.js +0 -52
  746. package/tests/new-features.test.d.ts +0 -2
  747. package/tests/new-features.test.d.ts.map +0 -1
  748. package/tests/new-features.test.js +0 -850
  749. package/tests/parser-executor.test.d.ts +0 -2
  750. package/tests/parser-executor.test.d.ts.map +0 -1
  751. package/tests/parser-executor.test.js +0 -25
  752. package/tests/sftp.test.d.ts +0 -2
  753. package/tests/sftp.test.d.ts.map +0 -1
  754. package/tests/sftp.test.js +0 -246
  755. package/tests/ssh-exec.test.d.ts +0 -2
  756. package/tests/ssh-exec.test.d.ts.map +0 -1
  757. package/tests/ssh-exec.test.js +0 -39
  758. package/tests/test-helper.d.ts +0 -56
  759. package/tests/test-helper.d.ts.map +0 -1
  760. package/tests/test-helper.js +0 -71
  761. package/tests/users.test.d.ts +0 -2
  762. package/tests/users.test.d.ts.map +0 -1
  763. package/tests/users.test.js +0 -71
  764. package/tests/web.test.d.ts +0 -2
  765. package/tests/web.test.d.ts.map +0 -1
  766. package/tests/web.test.js +0 -149
  767. /package/{src → dist}/Honeypot/index.d.ts +0 -0
  768. /package/{src → dist}/SSHClient/index.d.ts +0 -0
  769. /package/{src → dist}/SSHMimic/exec.d.ts +0 -0
  770. /package/{src → dist}/SSHMimic/executor.d.ts +0 -0
  771. /package/{src → dist}/SSHMimic/hostKey.d.ts +0 -0
  772. /package/{src → dist}/SSHMimic/index.d.ts +0 -0
  773. /package/{src → dist}/SSHMimic/loginBanner.d.ts +0 -0
  774. /package/{src → dist}/SSHMimic/loginFormat.d.ts +0 -0
  775. /package/{src → dist}/SSHMimic/prompt.d.ts +0 -0
  776. /package/{src → dist}/SSHMimic/sftp.d.ts +0 -0
  777. /package/{src → dist}/VirtualFileSystem/binaryPack.d.ts +0 -0
  778. /package/{src → dist}/VirtualFileSystem/index.d.ts +0 -0
  779. /package/{src → dist}/VirtualFileSystem/internalTypes.d.ts +0 -0
  780. /package/{src → dist}/VirtualFileSystem/path.d.ts +0 -0
  781. /package/{src → dist}/VirtualPackageManager/index.d.ts +0 -0
  782. /package/{src → dist}/VirtualShell/index.d.ts +0 -0
  783. /package/{src → dist}/VirtualShell/shell.d.ts +0 -0
  784. /package/{src → dist}/VirtualShell/shellParser.d.ts +0 -0
  785. /package/{src → dist}/VirtualUserManager/index.d.ts +0 -0
  786. /package/{src → dist}/commands/adduser.d.ts +0 -0
  787. /package/{src → dist}/commands/alias.d.ts +0 -0
  788. /package/{src → dist}/commands/apt.d.ts +0 -0
  789. /package/{src → dist}/commands/awk.d.ts +0 -0
  790. /package/{src → dist}/commands/base64.d.ts +0 -0
  791. /package/{src → dist}/commands/cat.d.ts +0 -0
  792. /package/{src → dist}/commands/cd.d.ts +0 -0
  793. /package/{src → dist}/commands/chmod.d.ts +0 -0
  794. /package/{src → dist}/commands/clear.d.ts +0 -0
  795. /package/{src → dist}/commands/command-helpers.d.ts +0 -0
  796. /package/{src → dist}/commands/cp.d.ts +0 -0
  797. /package/{src → dist}/commands/curl.d.ts +0 -0
  798. /package/{src → dist}/commands/cut.d.ts +0 -0
  799. /package/{src → dist}/commands/date.d.ts +0 -0
  800. /package/{src → dist}/commands/declare.d.ts +0 -0
  801. /package/{src → dist}/commands/deluser.d.ts +0 -0
  802. /package/{src → dist}/commands/df.d.ts +0 -0
  803. /package/{src → dist}/commands/diff.d.ts +0 -0
  804. /package/{src → dist}/commands/dpkg.d.ts +0 -0
  805. /package/{src → dist}/commands/du.d.ts +0 -0
  806. /package/{src → dist}/commands/echo.d.ts +0 -0
  807. /package/{src → dist}/commands/env.d.ts +0 -0
  808. /package/{src → dist}/commands/exit.d.ts +0 -0
  809. /package/{src → dist}/commands/export.d.ts +0 -0
  810. /package/{src → dist}/commands/find.d.ts +0 -0
  811. /package/{src → dist}/commands/free.d.ts +0 -0
  812. /package/{src → dist}/commands/grep.d.ts +0 -0
  813. /package/{src → dist}/commands/groups.d.ts +0 -0
  814. /package/{src → dist}/commands/gzip.d.ts +0 -0
  815. /package/{src → dist}/commands/head.d.ts +0 -0
  816. /package/{src → dist}/commands/help.d.ts +0 -0
  817. /package/{src → dist}/commands/helpers.d.ts +0 -0
  818. /package/{src → dist}/commands/history.d.ts +0 -0
  819. /package/{src → dist}/commands/hostname.d.ts +0 -0
  820. /package/{src → dist}/commands/htop.d.ts +0 -0
  821. /package/{src → dist}/commands/id.d.ts +0 -0
  822. /package/{src → dist}/commands/index.d.ts +0 -0
  823. /package/{src → dist}/commands/kill.d.ts +0 -0
  824. /package/{src → dist}/commands/ln.d.ts +0 -0
  825. /package/{src → dist}/commands/ls.d.ts +0 -0
  826. /package/{src → dist}/commands/lsb-release.d.ts +0 -0
  827. /package/{src → dist}/commands/man.d.ts +0 -0
  828. /package/{src → dist}/commands/mkdir.d.ts +0 -0
  829. /package/{src → dist}/commands/mv.d.ts +0 -0
  830. /package/{src → dist}/commands/nano.d.ts +0 -0
  831. /package/{src → dist}/commands/neofetch.d.ts +0 -0
  832. /package/{src → dist}/commands/node.d.ts +0 -0
  833. /package/{src → dist}/commands/npm.d.ts +0 -0
  834. /package/{src → dist}/commands/passwd.d.ts +0 -0
  835. /package/{src → dist}/commands/ping.d.ts +0 -0
  836. /package/{src → dist}/commands/printf.d.ts +0 -0
  837. /package/{src → dist}/commands/ps.d.ts +0 -0
  838. /package/{src → dist}/commands/pwd.d.ts +0 -0
  839. /package/{src → dist}/commands/python.d.ts +0 -0
  840. /package/{src → dist}/commands/read.d.ts +0 -0
  841. /package/{src → dist}/commands/registry.d.ts +0 -0
  842. /package/{src → dist}/commands/rm.d.ts +0 -0
  843. /package/{src → dist}/commands/runtime.d.ts +0 -0
  844. /package/{src → dist}/commands/sed.d.ts +0 -0
  845. /package/{src → dist}/commands/seq.d.ts +0 -0
  846. /package/{src → dist}/commands/set.d.ts +0 -0
  847. /package/{src → dist}/commands/sh.d.ts +0 -0
  848. /package/{src → dist}/commands/shift.d.ts +0 -0
  849. /package/{src → dist}/commands/sleep.d.ts +0 -0
  850. /package/{src → dist}/commands/sort.d.ts +0 -0
  851. /package/{src → dist}/commands/source.d.ts +0 -0
  852. /package/{src → dist}/commands/stat.d.ts +0 -0
  853. /package/{src → dist}/commands/su.d.ts +0 -0
  854. /package/{src → dist}/commands/sudo.d.ts +0 -0
  855. /package/{src → dist}/commands/tail.d.ts +0 -0
  856. /package/{src → dist}/commands/tar.d.ts +0 -0
  857. /package/{src → dist}/commands/tee.d.ts +0 -0
  858. /package/{src → dist}/commands/test.d.ts +0 -0
  859. /package/{src → dist}/commands/touch.d.ts +0 -0
  860. /package/{src → dist}/commands/tr.d.ts +0 -0
  861. /package/{src → dist}/commands/tree.d.ts +0 -0
  862. /package/{src → dist}/commands/true.d.ts +0 -0
  863. /package/{src → dist}/commands/type.d.ts +0 -0
  864. /package/{src → dist}/commands/uname.d.ts +0 -0
  865. /package/{src → dist}/commands/uniq.d.ts +0 -0
  866. /package/{src → dist}/commands/unset.d.ts +0 -0
  867. /package/{src → dist}/commands/uptime.d.ts +0 -0
  868. /package/{src → dist}/commands/wc.d.ts +0 -0
  869. /package/{src → dist}/commands/wget.d.ts +0 -0
  870. /package/{src → dist}/commands/which.d.ts +0 -0
  871. /package/{src → dist}/commands/who.d.ts +0 -0
  872. /package/{src → dist}/commands/whoami.d.ts +0 -0
  873. /package/{src → dist}/commands/xargs.d.ts +0 -0
  874. /package/{src → dist}/index.d.ts +0 -0
  875. /package/{src → dist}/modules/linuxRootfs.d.ts +0 -0
  876. /package/{src → dist}/modules/neofetch.d.ts +0 -0
  877. /package/{src → dist}/modules/shellInteractive.d.ts +0 -0
  878. /package/{src → dist}/modules/shellRuntime.d.ts +0 -0
  879. /package/{src → dist}/self-standalone.d.ts +0 -0
  880. /package/{src → dist}/standalone-wo-sftp.d.ts +0 -0
  881. /package/{src → dist}/standalone.d.ts +0 -0
  882. /package/{src → dist}/types/commands.d.ts +0 -0
  883. /package/{src → dist}/types/pipeline.d.ts +0 -0
  884. /package/{src → dist}/types/streams.d.ts +0 -0
  885. /package/{src → dist}/types/vfs.d.ts +0 -0
  886. /package/{src → dist}/utils/expand.d.ts +0 -0
  887. /package/{src → dist}/utils/perfLogger.d.ts +0 -0
  888. /package/{src → dist}/utils/tokenize.d.ts +0 -0
  889. /package/{src → dist}/utils/vfsDiff.d.ts +0 -0
  890. /package/{src → dist}/web-api.d.ts +0 -0
  891. /package/{src → dist}/web-full.d.ts +0 -0
  892. /package/{src → dist}/web.d.ts +0 -0
@@ -1,850 +0,0 @@
1
- import { beforeAll, describe, expect, test } from "bun:test";
2
- import { VirtualShell } from "../src";
3
- import { SshClient } from "../src/SSHClient";
4
- // ─── shared shell ─────────────────────────────────────────────────────────────
5
- let shell;
6
- let client;
7
- beforeAll(async () => {
8
- shell = new VirtualShell("test-vm");
9
- await shell.ensureInitialized();
10
- client = new SshClient(shell, "root");
11
- });
12
- // ─── Phase 1: Linux rootfs ────────────────────────────────────────────────────
13
- describe("Linux rootfs", () => {
14
- test("/etc/os-release exists and has correct distro", async () => {
15
- const r = await client.cat("/etc/os-release");
16
- expect(r.exitCode).toBe(0);
17
- expect(r.stdout).toContain("Fortune GNU/Linux");
18
- });
19
- test("/etc/hostname exists", async () => {
20
- const r = await client.cat("/etc/hostname");
21
- expect(r.exitCode).toBe(0);
22
- expect(r.stdout?.trim()).toBe("test-vm");
23
- });
24
- test("/etc/hosts has localhost", async () => {
25
- const r = await client.cat("/etc/hosts");
26
- expect(r.stdout).toContain("127.0.0.1");
27
- expect(r.stdout).toContain("localhost");
28
- });
29
- test("/proc/meminfo is populated", async () => {
30
- const r = await client.cat("/proc/meminfo");
31
- expect(r.exitCode).toBe(0);
32
- expect(r.stdout).toContain("MemTotal:");
33
- expect(r.stdout).toContain("MemFree:");
34
- });
35
- test("/proc/cpuinfo is populated", async () => {
36
- const r = await client.cat("/proc/cpuinfo");
37
- expect(r.exitCode).toBe(0);
38
- expect(r.stdout).toContain("processor");
39
- expect(r.stdout).toContain("model name");
40
- });
41
- test("/proc/version is populated", async () => {
42
- const r = await client.cat("/proc/version");
43
- expect(r.exitCode).toBe(0);
44
- expect(r.stdout).toContain("Linux version");
45
- expect(r.stdout).toContain("1.0.0+itsrealfortune");
46
- });
47
- test("/sys/devices/virtual/dmi/id/sys_vendor exists", async () => {
48
- const r = await client.cat("/sys/devices/virtual/dmi/id/sys_vendor");
49
- expect(r.exitCode).toBe(0);
50
- expect(r.stdout?.trim()).toBe("Fortune Systems");
51
- });
52
- test("/var/lib/dpkg/status is created", () => {
53
- expect(shell.vfs.exists("/var/lib/dpkg/status")).toBe(true);
54
- });
55
- test("/bin is symlink to /usr/bin", () => {
56
- expect(shell.vfs.isSymlink("/bin")).toBe(true);
57
- });
58
- test("/tmp has sticky bit", () => {
59
- const stat = shell.vfs.stat("/tmp");
60
- expect(stat.type).toBe("directory");
61
- });
62
- test("/etc/passwd contains root", async () => {
63
- const r = await client.cat("/etc/passwd");
64
- expect(r.stdout).toContain("root:x:0:0");
65
- });
66
- test("/usr/bin stubs for builtins exist", () => {
67
- expect(shell.vfs.exists("/usr/bin/ls")).toBe(true);
68
- expect(shell.vfs.exists("/usr/bin/grep")).toBe(true);
69
- expect(shell.vfs.exists("/usr/bin/curl")).toBe(true);
70
- });
71
- test("lsb_release -a returns Fortune distro info", async () => {
72
- const r = await client.exec("lsb_release -a");
73
- expect(r.exitCode).toBe(0);
74
- expect(r.stdout).toContain("Fortune");
75
- expect(r.stdout).toContain("Distributor ID");
76
- });
77
- test("uname -a shows kernel from properties", async () => {
78
- const r = await client.exec("uname -a");
79
- expect(r.exitCode).toBe(0);
80
- expect(r.stdout).toContain("1.0.0+itsrealfortune+1-amd64");
81
- });
82
- });
83
- // ─── Phase 2: apt / dpkg ──────────────────────────────────────────────────────
84
- describe("Package manager (apt/dpkg)", () => {
85
- test("apt list shows available packages", async () => {
86
- const r = await client.exec("apt list");
87
- expect(r.exitCode).toBe(0);
88
- expect(r.stdout).toContain("vim");
89
- expect(r.stdout).toContain("git");
90
- expect(r.stdout).toContain("python3");
91
- });
92
- test("apt install vim installs package and writes files", async () => {
93
- const r = await client.exec("apt install vim");
94
- expect(r.exitCode).toBe(0);
95
- expect(r.stdout).toContain("Setting up vim");
96
- expect(shell.vfs.exists("/usr/bin/vim")).toBe(true);
97
- expect(shell.vfs.exists("/usr/bin/vi")).toBe(true);
98
- });
99
- test("apt list --installed shows vim after install", async () => {
100
- const r = await client.exec("apt list --installed");
101
- expect(r.stdout).toContain("vim");
102
- expect(r.stdout).toContain("[installed]");
103
- });
104
- test("dpkg -l shows installed packages", async () => {
105
- const r = await client.exec("dpkg -l");
106
- expect(r.exitCode).toBe(0);
107
- expect(r.stdout).toContain("vim");
108
- expect(r.stdout).toContain("ii");
109
- });
110
- test("dpkg -s vim shows package status", async () => {
111
- await client.exec("apt install vim"); // ensure installed
112
- const r = await client.exec("dpkg -s vim");
113
- expect(r.exitCode).toBe(0);
114
- expect(r.stdout).toContain("Package: vim");
115
- expect(r.stdout).toContain("Status: install ok installed");
116
- });
117
- test("dpkg -L vim lists installed files", async () => {
118
- await client.exec("apt install vim"); // ensure installed
119
- const r = await client.exec("dpkg -L vim");
120
- expect(r.exitCode).toBe(0);
121
- expect(r.stdout).toContain("/usr/bin/vim");
122
- });
123
- test("apt install resolves dependencies", async () => {
124
- // npm depends on nodejs
125
- const r = await client.exec("apt install npm");
126
- expect(r.exitCode).toBe(0);
127
- // nodejs should be auto-installed
128
- expect(shell.vfs.exists("/usr/bin/node")).toBe(true);
129
- expect(shell.vfs.exists("/usr/bin/npm")).toBe(true);
130
- });
131
- test("apt install non-existent package fails", async () => {
132
- const r = await client.exec("apt install fakepackage999");
133
- expect(r.exitCode).not.toBe(0);
134
- expect(r.stdout).toContain("Unable to locate package");
135
- });
136
- test("apt remove vim removes package", async () => {
137
- await client.exec("apt install vim");
138
- const r = await client.exec("apt remove vim");
139
- expect(r.exitCode).toBe(0);
140
- expect(r.stdout).toContain("Removing vim");
141
- });
142
- test("apt search finds packages by term", async () => {
143
- const r = await client.exec("apt search editor");
144
- expect(r.exitCode).toBe(0);
145
- expect(r.stdout).toContain("vim");
146
- });
147
- test("apt show displays package metadata", async () => {
148
- const r = await client.exec("apt show git");
149
- expect(r.exitCode).toBe(0);
150
- expect(r.stdout).toContain("Package: git");
151
- expect(r.stdout).toContain("Version:");
152
- });
153
- test("apt-cache search works", async () => {
154
- const r = await client.exec("apt-cache search python");
155
- expect(r.exitCode).toBe(0);
156
- expect(r.stdout).toContain("python3");
157
- });
158
- test("apt-cache show works", async () => {
159
- const r = await client.exec("apt-cache show curl");
160
- expect(r.exitCode).toBe(0);
161
- expect(r.stdout).toContain("Package: curl");
162
- });
163
- test("apt-cache policy works", async () => {
164
- const r = await client.exec("apt-cache policy nodejs");
165
- expect(r.exitCode).toBe(0);
166
- expect(r.stdout).toContain("Candidate:");
167
- });
168
- test("dpkg-query -W lists packages", async () => {
169
- await client.exec("apt install git"); // ensure git installed
170
- // dpkg-query -W shows tab-separated name\tversion for all installed
171
- const r = await client.exec("dpkg-query -W git");
172
- expect(r.exitCode).toBe(0);
173
- expect(r.stdout).toContain("git");
174
- });
175
- test("apt update simulates package index refresh", async () => {
176
- const r = await client.exec("apt update");
177
- expect(r.exitCode).toBe(0);
178
- expect(r.stdout).toContain("Reading package lists");
179
- });
180
- test("non-root apt install is blocked", async () => {
181
- // adduser alice
182
- await shell.users.addUser("alice", "pass");
183
- const aliceClient = new SshClient(shell, "alice");
184
- const r = await aliceClient.exec("apt install vim");
185
- expect(r.exitCode).not.toBe(0);
186
- expect(r.stderr).toContain("Permission denied");
187
- });
188
- test("neofetch shows package count after installs", async () => {
189
- await client.exec("apt install curl wget htop neofetch");
190
- const r = await client.exec("neofetch");
191
- expect(r.exitCode).toBe(0);
192
- expect(r.stdout).toContain("(dpkg)");
193
- });
194
- });
195
- // ─── Phase 3: pure fetch curl/wget ───────────────────────────────────────────
196
- describe("curl / wget (pure fetch)", () => {
197
- test("curl --help works without host binary", async () => {
198
- const r = await client.exec("curl --help");
199
- expect(r.exitCode).toBe(0);
200
- expect(r.stdout).toContain("Usage: curl");
201
- });
202
- test("wget --help works without host binary", async () => {
203
- const r = await client.exec("wget --help");
204
- expect(r.exitCode).toBe(0);
205
- expect(r.stdout).toContain("Usage: wget");
206
- });
207
- test("wget --version works", async () => {
208
- const r = await client.exec("wget --version");
209
- expect(r.exitCode).toBe(0);
210
- expect(r.stdout).toContain("GNU Wget");
211
- });
212
- test("curl fetches real URL and returns body", async () => {
213
- const r = await client.exec("curl https://httpbin.org/get");
214
- // In sandboxed env network may be blocked — accept 0 (ok), 6 (dns), 22 (http err), or 1 (fetch error)
215
- expect([0, 1, 6, 22]).toContain(r.exitCode ?? -1);
216
- });
217
- test("curl -o saves to VFS", async () => {
218
- try {
219
- await client.exec("curl -o /tmp/test-curl.txt https://httpbin.org/get");
220
- }
221
- catch { }
222
- // Just check no ENOENT crash; file may or may not exist depending on network
223
- });
224
- });
225
- // ─── Phase 4: /proc VFS ───────────────────────────────────────────────────────
226
- describe("/proc filesystem", () => {
227
- test("cat /proc/uptime returns numeric uptime", async () => {
228
- const r = await client.cat("/proc/uptime");
229
- expect(r.exitCode).toBe(0);
230
- const parts = r.stdout?.trim().split(" ");
231
- expect(parts?.length).toBeGreaterThanOrEqual(1);
232
- expect(Number(parts?.[0])).toBeGreaterThanOrEqual(0);
233
- });
234
- test("cat /proc/loadavg returns values", async () => {
235
- const r = await client.cat("/proc/loadavg");
236
- expect(r.exitCode).toBe(0);
237
- expect(r.stdout).toMatch(/\d+\.\d+/);
238
- });
239
- test("cat /proc/net/dev has eth0", async () => {
240
- const r = await client.cat("/proc/net/dev");
241
- expect(r.exitCode).toBe(0);
242
- expect(r.stdout).toContain("eth0");
243
- });
244
- test("refreshProcFs updates /proc/uptime", async () => {
245
- // const before = shell.vfs.readFile("/proc/uptime");
246
- await new Promise((r) => setTimeout(r, 50));
247
- shell.refreshProcFs();
248
- const after = shell.vfs.readFile("/proc/uptime");
249
- // Uptime value is based on Date.now(), content is same format
250
- expect(after).toContain(".00");
251
- });
252
- });
253
- // ─── Extras: which, type, man, uptime, free, alias, $() ──────────────────────
254
- describe("Extra commands", () => {
255
- test("which ls finds /usr/bin/ls", async () => {
256
- const r = await client.exec("which ls");
257
- expect(r.exitCode).toBe(0);
258
- expect(r.stdout?.trim()).toBe("/usr/bin/ls");
259
- });
260
- test("which nonexistent returns exit 1", async () => {
261
- const r = await client.exec("which thisdoesnotexist");
262
- expect(r.exitCode).toBe(1);
263
- });
264
- test("type ls reports builtin", async () => {
265
- const r = await client.exec("type ls");
266
- expect(r.exitCode).toBe(0);
267
- expect(r.stdout).toContain("ls");
268
- });
269
- test("man ls shows manual page", async () => {
270
- const r = await client.exec("man ls");
271
- expect(r.exitCode).toBe(0);
272
- expect(r.stdout).toContain("NAME");
273
- expect(r.stdout).toContain("list directory");
274
- });
275
- test("man nonexistent returns error", async () => {
276
- const r = await client.exec("man fakecmd999");
277
- expect(r.exitCode).not.toBe(0);
278
- expect(r.stderr).toContain("No manual entry");
279
- });
280
- test("uptime returns formatted string", async () => {
281
- const r = await client.exec("uptime");
282
- expect(r.exitCode).toBe(0);
283
- expect(r.stdout).toMatch(/up/);
284
- });
285
- test("uptime -p returns pretty format", async () => {
286
- const r = await client.exec("uptime -p");
287
- expect(r.exitCode).toBe(0);
288
- expect(r.stdout).toContain("up");
289
- expect(r.stdout).toMatch(/minute|hour|day/);
290
- });
291
- test("free shows memory table", async () => {
292
- const r = await client.exec("free");
293
- expect(r.exitCode).toBe(0);
294
- expect(r.stdout).toContain("Mem:");
295
- expect(r.stdout).toContain("Swap:");
296
- });
297
- test("free -h shows human readable", async () => {
298
- const r = await client.exec("free -h");
299
- expect(r.exitCode).toBe(0);
300
- expect(r.stdout).toMatch(/[0-9.]+[GMK]/);
301
- });
302
- test("alias sets and retrieves alias", async () => {
303
- // alias env is per-session; use sh -c to test in one exec
304
- const r = await client.exec("alias ll='ls -la'; alias ll");
305
- expect(r.exitCode).toBe(0);
306
- // alias output may be in stdout
307
- const out = (r.stdout ?? "") + (r.stderr ?? "");
308
- expect(out).toContain("ll");
309
- });
310
- test("alias -a lists all aliases", async () => {
311
- await client.exec("alias hello='echo hello'");
312
- const r = await client.exec("alias");
313
- expect(r.exitCode).toBe(0);
314
- });
315
- test("unalias removes an alias", async () => {
316
- await client.exec("alias myfoo='echo foo'");
317
- const r = await client.exec("unalias myfoo");
318
- expect(r.exitCode).toBe(0);
319
- });
320
- test("lsb_release -a returns distro info", async () => {
321
- const r = await client.exec("lsb_release -a");
322
- expect(r.stdout).toContain("Fortune");
323
- expect(r.stdout).toContain("aurora");
324
- });
325
- test("lsb_release -d returns description", async () => {
326
- const r = await client.exec("lsb_release -d");
327
- expect(r.stdout).toContain("Description:");
328
- });
329
- });
330
- // ─── $(cmd) substitution ──────────────────────────────────────────────────────
331
- describe("Command substitution $(cmd)", () => {
332
- test("echo $(echo hello) works", async () => {
333
- const r = await client.exec("echo $(echo hello)");
334
- expect(r.exitCode).toBe(0);
335
- expect(r.stdout?.trim()).toBe("hello");
336
- });
337
- test("echo $(hostname) returns hostname", async () => {
338
- const r = await client.exec("echo $(hostname)");
339
- expect(r.exitCode).toBe(0);
340
- expect(r.stdout?.trim()).toBe("test-vm");
341
- });
342
- test("echo $(whoami) returns user", async () => {
343
- const r = await client.exec("echo $(whoami)");
344
- expect(r.exitCode).toBe(0);
345
- expect(r.stdout?.trim()).toBe("root");
346
- });
347
- test("nested substitution in variable context", async () => {
348
- const r = await client.exec("echo user=$(whoami)");
349
- expect(r.stdout?.trim()).toBe("user=root");
350
- });
351
- });
352
- // ─── syncPasswd ───────────────────────────────────────────────────────────────
353
- describe("syncPasswd", () => {
354
- test("syncPasswd after addUser updates /etc/passwd", async () => {
355
- await shell.users.addUser("bob", "pass123");
356
- shell.syncPasswd();
357
- const r = await client.cat("/etc/passwd");
358
- expect(r.stdout).toContain("bob");
359
- });
360
- test("/etc/group has sudo group with sudoers", async () => {
361
- const r = await client.cat("/etc/group");
362
- expect(r.stdout).toContain("sudo:");
363
- expect(r.stdout).toContain("root");
364
- });
365
- test("/etc/shadow exists with restricted permissions", () => {
366
- expect(shell.vfs.exists("/etc/shadow")).toBe(true);
367
- const stat = shell.vfs.stat("/etc/shadow");
368
- expect(stat.type).toBe("file");
369
- });
370
- });
371
- // ─── Bug fixes ────────────────────────────────────────────────────────────────
372
- describe("Bug fixes", () => {
373
- let shell2;
374
- let c;
375
- beforeAll(async () => {
376
- shell2 = new VirtualShell("fix-vm");
377
- await shell2.ensureInitialized();
378
- c = new SshClient(shell2, "root");
379
- });
380
- // echo
381
- test("echo adds newline — >> append works", async () => {
382
- await c.exec("echo line1 > /tmp/append.txt");
383
- await c.exec("echo line2 >> /tmp/append.txt");
384
- const content = shell2.vfs.readFile("/tmp/append.txt");
385
- expect(content).toBe("line1\nline2\n");
386
- });
387
- test("echo -e interprets escape sequences", async () => {
388
- const r = await c.exec("echo -e 'a\\tb'");
389
- expect(r.stdout?.trim()).toBe("a\tb");
390
- });
391
- test("echo -n suppresses trailing newline", async () => {
392
- const r = await c.exec("echo -n hello");
393
- expect(r.stdout).toBe("hello");
394
- });
395
- test("echo uses session env.vars for $VAR", async () => {
396
- const r = await c.exec("export MYVAR=world && echo $MYVAR");
397
- expect(r.stdout?.trim()).toBe("world");
398
- });
399
- // ls -a
400
- test("ls -a shows dotfiles", async () => {
401
- await c.exec("touch /tmp/.hidden && touch /tmp/visible");
402
- const normal = await c.exec("ls /tmp");
403
- const all = await c.exec("ls -a /tmp");
404
- expect(normal.stdout).not.toContain(".hidden");
405
- expect(all.stdout).toContain(".hidden");
406
- expect(all.stdout).toContain("visible");
407
- });
408
- // chmod symbolic
409
- test("chmod +x adds execute bit", async () => {
410
- await c.exec("touch /tmp/script.sh");
411
- const before = shell2.vfs.stat("/tmp/script.sh").mode;
412
- await c.exec("chmod +x /tmp/script.sh");
413
- const after = shell2.vfs.stat("/tmp/script.sh").mode;
414
- expect(after & 0o111).toBeGreaterThan(0);
415
- expect(before & 0o111).toBe(0);
416
- });
417
- test("chmod u+x adds only user execute bit", async () => {
418
- await c.exec("touch /tmp/u.sh && chmod 644 /tmp/u.sh");
419
- await c.exec("chmod u+x /tmp/u.sh");
420
- const mode = shell2.vfs.stat("/tmp/u.sh").mode;
421
- expect(mode & 0o100).toBe(0o100); // user x set
422
- expect(mode & 0o010).toBe(0); // group x not set
423
- });
424
- test("chmod go-r removes group+other read", async () => {
425
- await c.exec("touch /tmp/priv.sh && chmod 755 /tmp/priv.sh");
426
- await c.exec("chmod go-r /tmp/priv.sh");
427
- const mode = shell2.vfs.stat("/tmp/priv.sh").mode;
428
- expect(mode & 0o044).toBe(0);
429
- });
430
- // cat -n
431
- test("cat -n numbers lines", async () => {
432
- await c.exec("echo -e 'foo\\nbar' > /tmp/cattest.txt");
433
- const r = await c.exec("cat -n /tmp/cattest.txt");
434
- expect(r.stdout).toContain("1\t");
435
- expect(r.stdout).toContain("2\t");
436
- });
437
- // ping -c
438
- test("ping -c 2 sends exactly 2 packets", async () => {
439
- const r = await c.exec("ping -c 2 localhost");
440
- const dataLines = r.stdout
441
- ?.split("\n")
442
- .filter((l) => l.includes("icmp_seq="));
443
- expect(dataLines?.length).toBe(2);
444
- });
445
- // test / [ command
446
- test("[ -f path ] returns 0 for existing file", async () => {
447
- await c.exec("touch /tmp/testfile");
448
- const r = await c.exec("[ -f /tmp/testfile ] && echo yes || echo no");
449
- expect(r.stdout?.trim()).toBe("yes");
450
- });
451
- test("[ -d path ] returns 0 for existing directory", async () => {
452
- const r = await c.exec("[ -d /etc ] && echo yes || echo no");
453
- expect(r.stdout?.trim()).toBe("yes");
454
- });
455
- test("[ -f path ] returns 1 for non-existent file", async () => {
456
- const r = await c.exec("[ -f /tmp/doesnotexist999 ] && echo yes || echo no");
457
- expect(r.stdout?.trim()).toBe("no");
458
- });
459
- test("[ -e path ] returns 0 for existing path", async () => {
460
- const r = await c.exec("[ -e /etc/hostname ] && echo yes || echo no");
461
- expect(r.stdout?.trim()).toBe("yes");
462
- });
463
- test("test string comparison = works", async () => {
464
- const r = await c.exec("[ hello = hello ] && echo yes || echo no");
465
- expect(r.stdout?.trim()).toBe("yes");
466
- });
467
- test("test numeric -eq works", async () => {
468
- const r = await c.exec("[ 5 -eq 5 ] && echo yes || echo no");
469
- expect(r.stdout?.trim()).toBe("yes");
470
- });
471
- test("test numeric -lt works", async () => {
472
- const r = await c.exec("[ 3 -lt 5 ] && echo yes || echo no");
473
- expect(r.stdout?.trim()).toBe("yes");
474
- });
475
- test("test -z empty string", async () => {
476
- const r = await c.exec("[ -z '' ] && echo yes || echo no");
477
- expect(r.stdout?.trim()).toBe("yes");
478
- });
479
- test("test -n non-empty string", async () => {
480
- const r = await c.exec("[ -n hello ] && echo yes || echo no");
481
- expect(r.stdout?.trim()).toBe("yes");
482
- });
483
- // source / .
484
- test("source executes file in current env", async () => {
485
- shell2.vfs.writeFile("/tmp/setup.sh", "export SOURCED=yes\n");
486
- const r = await c.exec("source /tmp/setup.sh && echo $SOURCED");
487
- expect(r.stdout?.trim()).toBe("yes");
488
- });
489
- test(". (dot) is alias for source", async () => {
490
- shell2.vfs.writeFile("/tmp/dot.sh", "export DOTTED=ok\n");
491
- const r = await c.exec(". /tmp/dot.sh && echo $DOTTED");
492
- expect(r.stdout?.trim()).toBe("ok");
493
- });
494
- // sh -c with $(cmd)
495
- test("sh -c handles $(cmd) substitution", async () => {
496
- const r = await c.exec("sh -c 'echo user=$(whoami)'");
497
- expect(r.stdout?.trim()).toBe("user=root");
498
- });
499
- test("sh -c for loop with $(cmd)", async () => {
500
- const r = await c.exec("sh -c 'for x in a b; do echo $(echo $x); done'");
501
- expect(r.stdout?.trim()).toBe("a\nb");
502
- });
503
- // history
504
- test("history command returns command list", async () => {
505
- // history reads from VFS .bash_history (written by interactive shell)
506
- // in non-interactive context it may be empty — just check it doesn't crash
507
- const r = await c.exec("history");
508
- expect(r.exitCode).toBe(0);
509
- });
510
- // ps -u
511
- test("ps -u shows USER column", async () => {
512
- const r = await c.exec("ps -u");
513
- expect(r.stdout).toContain("USER");
514
- expect(r.stdout).toContain("PID");
515
- expect(r.stdout).toContain("%CPU");
516
- });
517
- test("ps aux shows extended format", async () => {
518
- const r = await c.exec("ps aux");
519
- expect(r.stdout).toContain("USER");
520
- expect(r.exitCode).toBe(0);
521
- });
522
- // wc -l with pipe (after echo -e fix)
523
- test("wc -l counts newlines correctly via pipe", async () => {
524
- const r = await c.exec("echo -e 'a\\nb\\nc' | wc -l");
525
- expect(r.stdout?.trim()).toBe("3");
526
- });
527
- });
528
- // ─── Roadmap features ────────────────────────────────────────────────────────
529
- describe("/proc/self and /proc/<pid>", () => {
530
- let shell4;
531
- let c4;
532
- beforeAll(async () => {
533
- shell4 = new VirtualShell("proc-vm");
534
- await shell4.ensureInitialized();
535
- c4 = new SshClient(shell4, "root");
536
- });
537
- test("/proc/self exists and has comm file", async () => {
538
- expect(shell4.vfs.exists("/proc/self")).toBe(true);
539
- expect(shell4.vfs.exists("/proc/self/comm")).toBe(true);
540
- });
541
- test("/proc/self/status has Name field", async () => {
542
- const r = await c4.exec("cat /proc/self/status");
543
- expect(r.exitCode).toBe(0);
544
- expect(r.stdout).toContain("Name:");
545
- });
546
- test("/proc/self/cmdline is readable", async () => {
547
- const r = await c4.exec("cat /proc/self/cmdline");
548
- expect(r.exitCode).toBe(0);
549
- });
550
- test("/proc/1 (init) exists", async () => {
551
- expect(shell4.vfs.exists("/proc/1")).toBe(true);
552
- expect(shell4.vfs.exists("/proc/1/status")).toBe(true);
553
- });
554
- test("/proc/1/status has correct pid", async () => {
555
- const r = await c4.exec("cat /proc/1/status");
556
- expect(r.stdout).toContain("Pid:");
557
- expect(r.stdout).toContain("1");
558
- });
559
- test("refreshProcFs updates /proc contents", () => {
560
- shell4.refreshProcFs();
561
- expect(shell4.vfs.exists("/proc/uptime")).toBe(true);
562
- expect(shell4.vfs.exists("/proc/self")).toBe(true);
563
- });
564
- });
565
- import { assertDiff, diffSnapshots, formatDiff } from "../src";
566
- describe("VFS snapshot diff tooling", () => {
567
- let shell5;
568
- let c5;
569
- beforeAll(async () => {
570
- shell5 = new VirtualShell("diff-vm");
571
- await shell5.ensureInitialized();
572
- c5 = new SshClient(shell5, "root");
573
- });
574
- test("diffSnapshots returns clean diff for identical snapshots", () => {
575
- const snap = shell5.vfs.toSnapshot();
576
- const diff = diffSnapshots(snap, snap);
577
- expect(diff.clean).toBe(true);
578
- expect(diff.added).toHaveLength(0);
579
- expect(diff.removed).toHaveLength(0);
580
- expect(diff.modified).toHaveLength(0);
581
- });
582
- test("diffSnapshots detects added file", async () => {
583
- const before = shell5.vfs.toSnapshot();
584
- await c5.exec("echo test > /tmp/diff-test.txt");
585
- const after = shell5.vfs.toSnapshot();
586
- const diff = diffSnapshots(before, after, { ignore: ["/proc"] });
587
- const paths = diff.added.map((e) => e.path);
588
- expect(paths).toContain("/tmp/diff-test.txt");
589
- expect(diff.clean).toBe(false);
590
- });
591
- test("diffSnapshots detects added directory", async () => {
592
- const before = shell5.vfs.toSnapshot();
593
- shell5.vfs.mkdir("/tmp/diff-newdir", 0o755);
594
- const after = shell5.vfs.toSnapshot();
595
- const diff = diffSnapshots(before, after, { ignore: ["/proc"] });
596
- const paths = diff.added.map((e) => e.path);
597
- expect(paths).toContain("/tmp/diff-newdir");
598
- });
599
- test("diffSnapshots detects modified file", async () => {
600
- shell5.vfs.writeFile("/tmp/modtest.txt", "before");
601
- const before = shell5.vfs.toSnapshot();
602
- shell5.vfs.writeFile("/tmp/modtest.txt", "after");
603
- const after = shell5.vfs.toSnapshot();
604
- const diff = diffSnapshots(before, after, { ignore: ["/proc"] });
605
- const mod = diff.modified.find((e) => e.path === "/tmp/modtest.txt");
606
- expect(mod).toBeDefined();
607
- expect(mod?.before).toBe("before");
608
- expect(mod?.after).toBe("after");
609
- });
610
- test("diffSnapshots detects removed file", async () => {
611
- shell5.vfs.writeFile("/tmp/toremove.txt", "bye");
612
- const before = shell5.vfs.toSnapshot();
613
- shell5.vfs.remove("/tmp/toremove.txt");
614
- const after = shell5.vfs.toSnapshot();
615
- const diff = diffSnapshots(before, after, { ignore: ["/proc"] });
616
- const paths = diff.removed.map((e) => e.path);
617
- expect(paths).toContain("/tmp/toremove.txt");
618
- });
619
- test("diffSnapshots ignores specified prefixes", async () => {
620
- shell5.vfs.writeFile("/proc/uptime", "999.00 888.00\n");
621
- const before = shell5.vfs.toSnapshot();
622
- shell5.vfs.writeFile("/proc/uptime", "1000.00 900.00\n");
623
- const after = shell5.vfs.toSnapshot();
624
- const diff = diffSnapshots(before, after, { ignore: ["/proc"] });
625
- expect(diff.modified.map((e) => e.path)).not.toContain("/proc/uptime");
626
- });
627
- test("formatDiff returns (no changes) for clean diff", () => {
628
- const snap = shell5.vfs.toSnapshot();
629
- const diff = diffSnapshots(snap, snap);
630
- expect(formatDiff(diff)).toBe("(no changes)");
631
- });
632
- test("formatDiff includes change summary", async () => {
633
- const before = shell5.vfs.toSnapshot();
634
- shell5.vfs.writeFile("/tmp/format-test.txt", "x");
635
- const after = shell5.vfs.toSnapshot();
636
- const diff = diffSnapshots(before, after, { ignore: ["/proc"] });
637
- const formatted = formatDiff(diff);
638
- expect(formatted).toContain("added");
639
- });
640
- test("assertDiff passes when paths match", async () => {
641
- shell5.vfs.writeFile("/tmp/assert-test.txt", "hello");
642
- const before = shell5.vfs.toSnapshot();
643
- shell5.vfs.writeFile("/tmp/assert-new.txt", "new");
644
- shell5.vfs.remove("/tmp/assert-test.txt");
645
- const after = shell5.vfs.toSnapshot();
646
- const diff = diffSnapshots(before, after, { ignore: ["/proc"] });
647
- expect(() => assertDiff(diff, {
648
- added: ["/tmp/assert-new.txt"],
649
- removed: ["/tmp/assert-test.txt"],
650
- })).not.toThrow();
651
- });
652
- test("assertDiff throws when expected path is missing", () => {
653
- const snap = shell5.vfs.toSnapshot();
654
- const diff = diffSnapshots(snap, snap);
655
- expect(() => assertDiff(diff, { added: ["/nonexistent"] })).toThrow();
656
- });
657
- });
658
- describe("node and python3 REPL stubs", () => {
659
- let shell6;
660
- let c6;
661
- beforeAll(async () => {
662
- shell6 = new VirtualShell("repl-vm");
663
- await shell6.ensureInitialized();
664
- c6 = new SshClient(shell6, "root");
665
- await c6.exec("apt install nodejs python3");
666
- });
667
- test("node --version returns v18", async () => {
668
- const r = await c6.exec("node --version");
669
- expect(r.exitCode).toBe(0);
670
- expect(r.stdout?.trim()).toBe("v18.19.0");
671
- });
672
- test("node -e evaluates arithmetic", async () => {
673
- const r = await c6.exec("node -e '2 + 3'");
674
- expect(r.exitCode).toBe(0);
675
- expect(r.stdout?.trim()).toBe("5");
676
- });
677
- test("node -e console.log works", async () => {
678
- const r = await c6.exec("node -e 'console.log(42)'");
679
- expect(r.stdout?.trim()).toBe("42");
680
- });
681
- test("node executes VFS file", async () => {
682
- shell6.vfs.writeFile("/tmp/test.js", "console.log(10 + 5);\n");
683
- const r = await c6.exec("node /tmp/test.js");
684
- expect(r.stdout?.trim()).toBe("15");
685
- });
686
- test("node missing file returns exit 1", async () => {
687
- const r = await c6.exec("node /tmp/nonexistent.js");
688
- expect(r.exitCode).toBe(1);
689
- expect(r.stderr).toContain("No such file or directory");
690
- });
691
- test("python3 --version returns Python 3.11", async () => {
692
- const r = await c6.exec("python3 --version");
693
- expect(r.exitCode).toBe(0);
694
- expect(r.stdout?.trim()).toContain("Python 3.11");
695
- });
696
- test("python3 -c print arithmetic", async () => {
697
- const r = await c6.exec("python3 -c 'print(2 + 3)'");
698
- expect(r.stdout?.trim()).toBe("5");
699
- });
700
- test("python3 -c f-string", async () => {
701
- const r = await c6.exec("python3 -c 'print(f\"result: {1+1}\")'");
702
- expect(r.stdout?.trim()).toBe("result: 2");
703
- });
704
- test("python3 executes VFS script", async () => {
705
- shell6.vfs.writeFile("/tmp/test.py", "print(10 + 5)\n");
706
- const r = await c6.exec("python3 /tmp/test.py");
707
- expect(r.stdout?.trim()).toBe("15");
708
- });
709
- test("python alias works", async () => {
710
- const r = await c6.exec("python --version");
711
- expect(r.exitCode).toBe(0);
712
- expect(r.stdout?.trim()).toContain("Python");
713
- });
714
- test("python3 missing file returns exit 2", async () => {
715
- const r = await c6.exec("python3 /tmp/nonexistent.py");
716
- expect(r.exitCode).toBe(2);
717
- });
718
- test("node is available as a shell command", async () => {
719
- const r = await c6.exec("node --version");
720
- expect(r.exitCode).toBe(0);
721
- });
722
- });
723
- // ─── Enhanced REPL tests (post-rewrite) ──────────────────────────────────────
724
- describe("node enhanced REPL", () => {
725
- let shell7;
726
- let c7;
727
- beforeAll(async () => {
728
- shell7 = new VirtualShell("node-vm");
729
- await shell7.ensureInitialized();
730
- c7 = new SshClient(shell7, "root");
731
- await c7.exec("apt install nodejs");
732
- });
733
- test("node -e string methods", async () => {
734
- shell7.vfs.writeFile("/tmp/str.js", "'hello'.toUpperCase()");
735
- const r = await c7.exec("node /tmp/str.js");
736
- expect(r.stdout?.trim()).toBe("HELLO");
737
- });
738
- test("node -e array methods", async () => {
739
- shell7.vfs.writeFile("/tmp/arr.js", "[1,2,3].map(x => x*2).join(',')");
740
- const r = await c7.exec("node /tmp/arr.js");
741
- expect(r.stdout?.trim()).toBe("2,4,6");
742
- });
743
- test("node process.version is virtual", async () => {
744
- const r = await c7.exec("node -e 'process.version'");
745
- expect(r.stdout?.trim()).toBe("v18.19.0");
746
- });
747
- test("node require path works", async () => {
748
- shell7.vfs.writeFile("/tmp/path.js", "const p = require('path'); console.log(p.join('a', 'b'))");
749
- const r = await c7.exec("node /tmp/path.js");
750
- expect(r.stdout?.trim()).toBe("a/b");
751
- });
752
- test("node require fs throws gracefully", async () => {
753
- shell7.vfs.writeFile("/tmp/fs.js", "try { require('fs') } catch(e) { console.log('blocked') }");
754
- const r = await c7.exec("node /tmp/fs.js");
755
- expect(r.stdout?.trim()).toBe("blocked");
756
- });
757
- test("node console.log output", async () => {
758
- shell7.vfs.writeFile("/tmp/log.js", "console.log('hello', 'world')");
759
- const r = await c7.exec("node /tmp/log.js");
760
- expect(r.stdout?.trim()).toBe("hello world");
761
- });
762
- test("node Math methods", async () => {
763
- const r = await c7.exec("node -e 'Math.floor(3.9)'");
764
- expect(r.stdout?.trim()).toBe("3");
765
- });
766
- test("node JSON.stringify", async () => {
767
- const r = await c7.exec("node -e 'JSON.stringify({x:1})'");
768
- expect(r.stdout?.trim()).toBe('{"x":1}');
769
- });
770
- });
771
- describe("python3 enhanced interpreter", () => {
772
- let shell8;
773
- let c8;
774
- beforeAll(async () => {
775
- shell8 = new VirtualShell("python-vm");
776
- await shell8.ensureInitialized();
777
- c8 = new SshClient(shell8, "root");
778
- await c8.exec("apt install python3");
779
- });
780
- const py = async (code) => {
781
- shell8.vfs.writeFile("/tmp/t.py", code);
782
- return c8.exec("python3 /tmp/t.py");
783
- };
784
- test("str.upper()", async () => {
785
- const r = await py("print('hello'.upper())");
786
- expect(r.stdout?.trim()).toBe("HELLO");
787
- });
788
- test("str.split()", async () => {
789
- const r = await py("print('a,b,c'.split(','))");
790
- expect(r.stdout?.trim()).toBe("['a', 'b', 'c']");
791
- });
792
- test("str.join()", async () => {
793
- const r = await py("print(','.join(['a','b','c']))");
794
- expect(r.stdout?.trim()).toBe("a,b,c");
795
- });
796
- test("list comprehension", async () => {
797
- const r = await py("print([x**2 for x in range(5)])");
798
- expect(r.stdout?.trim()).toBe("[0, 1, 4, 9, 16]");
799
- });
800
- test("list.sort() in-place", async () => {
801
- const r = await py("nums=[3,1,4,1,5]\nnums.sort()\nprint(nums)");
802
- expect(r.stdout?.trim()).toBe("[1, 1, 3, 4, 5]");
803
- });
804
- test("dict access and methods", async () => {
805
- const r = await py("d={'x':1,'y':2}\nprint(d['x'])\nprint(list(d.keys()))");
806
- expect(r.stdout).toContain("1");
807
- expect(r.stdout).toContain("x");
808
- });
809
- test("class with __init__ and methods", async () => {
810
- const r = await py("class Dog:\n def __init__(self, name):\n self.name = name\n def bark(self):\n return f'Woof! I am {self.name}'\nd = Dog('Rex')\nprint(d.bark())");
811
- expect(r.stdout?.trim()).toBe("Woof! I am Rex");
812
- });
813
- test("import math and use functions", async () => {
814
- const r = await py("import math\nprint(math.floor(3.9))\nprint(round(math.sqrt(16), 0))");
815
- expect(r.stdout).toContain("3");
816
- expect(r.stdout).toContain("4");
817
- });
818
- test("import os and getcwd", async () => {
819
- const r = await py("import os\nprint(os.getcwd())");
820
- expect(r.exitCode).toBe(0);
821
- expect(r.stdout?.trim().length).toBeGreaterThan(0);
822
- });
823
- test("import sys and version", async () => {
824
- const r = await py("import sys\nprint(sys.version[:5])");
825
- expect(r.stdout?.trim()).toBe("3.11.");
826
- });
827
- test("import json dumps/loads", async () => {
828
- const r = await py("import json\nd={'x':1}\nprint(json.dumps(d))\nprint(json.loads('{\"a\":2}')['a'])");
829
- expect(r.stdout).toContain('"x"');
830
- expect(r.stdout).toContain("2");
831
- });
832
- test("try/except handles errors", async () => {
833
- const r = await py("try:\n x = 1/0\nexcept ZeroDivisionError:\n print('caught')");
834
- expect(r.stdout?.trim()).toBe("caught");
835
- });
836
- test("f-string interpolation", async () => {
837
- const r = await py("name='world'\nprint(f'hello {name}')");
838
- expect(r.stdout?.trim()).toBe("hello world");
839
- });
840
- test("sorted() and reversed()", async () => {
841
- const r = await py("print(sorted([3,1,2]))\nprint(list(reversed([1,2,3])))");
842
- expect(r.stdout).toContain("[1, 2, 3]");
843
- expect(r.stdout).toContain("[3, 2, 1]");
844
- });
845
- test("enumerate()", async () => {
846
- const r = await py("for i,v in enumerate(['a','b']):\n print(i, v)");
847
- expect(r.stdout).toContain("0 a");
848
- expect(r.stdout).toContain("1 b");
849
- });
850
- });