typescript-virtual-container 1.4.2 → 1.4.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.
- package/.vscode/settings.json +2 -1
- package/README.md +209 -54
- package/benchmark-results.txt +21 -21
- package/builds/self-standalone.js +196 -189
- package/builds/self-standalone.js.map +4 -4
- package/builds/standalone-wo-sftp.js +167 -160
- package/builds/standalone-wo-sftp.js.map +4 -4
- package/builds/standalone.js +169 -162
- package/builds/standalone.js.map +4 -4
- package/builds/web-full-api.min.js +5 -5
- package/builds/web-full-api.min.js.map +3 -3
- package/builds/web.min.js +5 -5
- package/builds/web.min.js.map +3 -3
- package/bun.lock +4 -6
- package/examples/web.min.js +5 -5
- package/package.json +4 -3
- package/src/Honeypot/index.d.ts.map +1 -0
- package/src/SSHClient/index.d.ts.map +1 -0
- package/src/SSHMimic/exec.d.ts.map +1 -0
- package/src/SSHMimic/executor.d.ts.map +1 -0
- package/src/SSHMimic/hostKey.d.ts.map +1 -0
- package/src/SSHMimic/index.d.ts.map +1 -0
- package/src/SSHMimic/loginBanner.d.ts.map +1 -0
- package/src/SSHMimic/loginFormat.d.ts.map +1 -0
- package/src/SSHMimic/prompt.d.ts.map +1 -0
- package/src/SSHMimic/sftp.d.ts.map +1 -0
- package/src/VirtualFileSystem/binaryPack.d.ts.map +1 -0
- package/{dist → src}/VirtualFileSystem/index.d.ts +47 -0
- package/src/VirtualFileSystem/index.d.ts.map +1 -0
- package/{dist → src}/VirtualFileSystem/index.js +159 -0
- package/src/VirtualFileSystem/index.ts +173 -8
- package/src/VirtualFileSystem/internalTypes.d.ts.map +1 -0
- package/src/VirtualFileSystem/path.d.ts.map +1 -0
- package/src/VirtualPackageManager/index.d.ts.map +1 -0
- package/{dist → src}/VirtualShell/index.d.ts +29 -0
- package/src/VirtualShell/index.d.ts.map +1 -0
- package/{dist → src}/VirtualShell/index.js +29 -0
- package/src/VirtualShell/index.ts +36 -0
- package/src/VirtualShell/shell.d.ts.map +1 -0
- package/src/VirtualShell/shellParser.d.ts.map +1 -0
- package/{dist → src}/VirtualShell/shellParser.js +30 -2
- package/src/VirtualShell/shellParser.ts +29 -3
- package/src/VirtualUserManager/index.d.ts.map +1 -0
- package/src/bun.d.ts +1 -0
- package/src/commands/adduser.d.ts.map +1 -0
- package/src/commands/alias.d.ts.map +1 -0
- package/src/commands/apt.d.ts.map +1 -0
- package/src/commands/awk.d.ts.map +1 -0
- package/{dist → src}/commands/awk.js +1 -2
- package/src/commands/awk.ts +1 -2
- package/src/commands/base64.d.ts.map +1 -0
- package/src/commands/cat.d.ts.map +1 -0
- package/src/commands/cd.d.ts.map +1 -0
- package/{dist → src}/commands/cd.js +2 -2
- package/src/commands/cd.ts +2 -2
- package/src/commands/chmod.d.ts.map +1 -0
- package/src/commands/clear.d.ts.map +1 -0
- package/src/commands/command-helpers.d.ts.map +1 -0
- package/src/commands/cp.d.ts.map +1 -0
- package/src/commands/curl.d.ts.map +1 -0
- package/src/commands/cut.d.ts.map +1 -0
- package/src/commands/date.d.ts.map +1 -0
- package/src/commands/declare.d.ts.map +1 -0
- package/src/commands/deluser.d.ts.map +1 -0
- package/src/commands/df.d.ts.map +1 -0
- package/src/commands/diff.d.ts.map +1 -0
- package/src/commands/dpkg.d.ts.map +1 -0
- package/src/commands/du.d.ts.map +1 -0
- package/src/commands/echo.d.ts.map +1 -0
- package/src/commands/env.d.ts.map +1 -0
- package/src/commands/exit.d.ts.map +1 -0
- package/src/commands/export.d.ts.map +1 -0
- package/{dist → src}/commands/export.js +5 -3
- package/src/commands/export.ts +5 -3
- package/src/commands/find.d.ts.map +1 -0
- package/src/commands/free.d.ts.map +1 -0
- package/src/commands/grep.d.ts.map +1 -0
- package/src/commands/groups.d.ts.map +1 -0
- package/src/commands/gzip.d.ts.map +1 -0
- package/src/commands/head.d.ts.map +1 -0
- package/src/commands/help.d.ts.map +1 -0
- package/src/commands/helpers.d.ts.map +1 -0
- package/{dist → src}/commands/helpers.js +3 -0
- package/src/commands/helpers.ts +3 -0
- package/src/commands/history.d.ts.map +1 -0
- package/src/commands/hostname.d.ts.map +1 -0
- package/src/commands/htop.d.ts.map +1 -0
- package/src/commands/id.d.ts.map +1 -0
- package/src/commands/index.d.ts.map +1 -0
- package/src/commands/kill.d.ts.map +1 -0
- package/src/commands/ln.d.ts.map +1 -0
- package/src/commands/ls.d.ts.map +1 -0
- package/src/commands/ls.js +200 -0
- package/src/commands/ls.ts +210 -41
- package/src/commands/lsb-release.d.ts.map +1 -0
- package/src/commands/man.d.ts.map +1 -0
- package/src/commands/mkdir.d.ts.map +1 -0
- package/src/commands/mv.d.ts.map +1 -0
- package/src/commands/nano.d.ts.map +1 -0
- package/src/commands/neofetch.d.ts.map +1 -0
- package/src/commands/node.d.ts.map +1 -0
- package/src/commands/npm.d.ts.map +1 -0
- package/src/commands/passwd.d.ts.map +1 -0
- package/src/commands/ping.d.ts.map +1 -0
- package/src/commands/printf.d.ts.map +1 -0
- package/src/commands/ps.d.ts.map +1 -0
- package/src/commands/pwd.d.ts.map +1 -0
- package/src/commands/python.d.ts.map +1 -0
- package/src/commands/read.d.ts.map +1 -0
- package/src/commands/registry.d.ts.map +1 -0
- package/{dist → src}/commands/registry.js +2 -0
- package/src/commands/registry.ts +2 -0
- package/src/commands/rm.d.ts.map +1 -0
- package/src/commands/runtime.d.ts.map +1 -0
- package/{dist → src}/commands/runtime.js +64 -3
- package/src/commands/runtime.ts +86 -6
- package/src/commands/sed.d.ts.map +1 -0
- package/src/commands/seq.d.ts +4 -0
- package/src/commands/seq.d.ts.map +1 -0
- package/src/commands/seq.js +50 -0
- package/src/commands/seq.ts +43 -0
- package/src/commands/set.d.ts.map +1 -0
- package/src/commands/sh.d.ts +3 -0
- package/src/commands/sh.d.ts.map +1 -0
- package/{dist → src}/commands/sh.js +158 -11
- package/src/commands/sh.ts +148 -20
- package/src/commands/shift.d.ts.map +1 -0
- package/src/commands/sleep.d.ts.map +1 -0
- package/src/commands/sort.d.ts.map +1 -0
- package/src/commands/source.d.ts.map +1 -0
- package/src/commands/stat.d.ts.map +1 -0
- package/src/commands/su.d.ts.map +1 -0
- package/src/commands/sudo.d.ts.map +1 -0
- package/src/commands/tail.d.ts.map +1 -0
- package/src/commands/tar.d.ts.map +1 -0
- package/src/commands/tee.d.ts.map +1 -0
- package/src/commands/test.d.ts.map +1 -0
- package/src/commands/test.ts +4 -2
- package/src/commands/touch.d.ts.map +1 -0
- package/src/commands/tr.d.ts.map +1 -0
- package/src/commands/tree.d.ts.map +1 -0
- package/src/commands/true.d.ts.map +1 -0
- package/src/commands/type.d.ts.map +1 -0
- package/src/commands/uname.d.ts.map +1 -0
- package/src/commands/uniq.d.ts.map +1 -0
- package/src/commands/unset.d.ts.map +1 -0
- package/src/commands/uptime.d.ts.map +1 -0
- package/src/commands/wc.d.ts.map +1 -0
- package/{dist → src}/commands/wc.js +1 -1
- package/src/commands/wc.ts +1 -1
- package/src/commands/wget.d.ts.map +1 -0
- package/src/commands/which.d.ts.map +1 -0
- package/src/commands/who.d.ts.map +1 -0
- package/src/commands/whoami.d.ts.map +1 -0
- package/src/commands/xargs.d.ts.map +1 -0
- package/src/index.d.ts.map +1 -0
- package/src/modules/linuxRootfs.d.ts +59 -0
- package/src/modules/linuxRootfs.d.ts.map +1 -0
- package/src/modules/linuxRootfs.js +619 -0
- package/src/modules/linuxRootfs.ts +420 -231
- package/src/modules/neofetch.d.ts.map +1 -0
- package/src/modules/shellInteractive.d.ts.map +1 -0
- package/src/modules/shellRuntime.d.ts.map +1 -0
- package/{dist → src}/self-standalone.d.ts.map +1 -1
- package/src/standalone-wo-sftp.d.ts.map +1 -0
- package/{dist → src}/standalone.d.ts.map +1 -1
- package/{dist → src}/types/commands.d.ts +1 -1
- package/src/types/commands.d.ts.map +1 -0
- package/src/types/commands.ts +1 -1
- package/{dist → src}/types/pipeline.d.ts +6 -0
- package/src/types/pipeline.d.ts.map +1 -0
- package/src/types/pipeline.ts +6 -0
- package/src/types/streams.d.ts.map +1 -0
- package/{dist → src}/types/vfs.d.ts +15 -0
- package/src/types/vfs.d.ts.map +1 -0
- package/src/types/vfs.ts +17 -0
- package/{dist → src}/utils/expand.d.ts +11 -2
- package/src/utils/expand.d.ts.map +1 -0
- package/src/utils/expand.js +476 -0
- package/src/utils/expand.ts +281 -28
- package/src/utils/perfLogger.d.ts.map +1 -0
- package/src/utils/tokenize.d.ts.map +1 -0
- package/{dist → src}/utils/tokenize.js +40 -0
- package/src/utils/tokenize.ts +20 -0
- package/src/utils/vfsDiff.d.ts.map +1 -0
- package/src/web-api.d.ts.map +1 -0
- package/src/web-full.d.ts.map +1 -0
- package/src/web.d.ts.map +1 -0
- package/tests/command-helpers.test.d.ts +2 -0
- package/tests/command-helpers.test.d.ts.map +1 -0
- package/tests/command-helpers.test.js +92 -0
- package/tests/command-helpers.test.ts +80 -0
- package/tests/commands-admin-net.test.d.ts +2 -0
- package/tests/commands-admin-net.test.d.ts.map +1 -0
- package/tests/commands-admin-net.test.js +353 -0
- package/tests/commands-admin-net.test.ts +441 -0
- package/tests/commands-advanced.test.d.ts +2 -0
- package/tests/commands-advanced.test.d.ts.map +1 -0
- package/tests/commands-advanced.test.js +378 -0
- package/tests/commands-advanced.test.ts +456 -0
- package/tests/commands-core.test.d.ts +2 -0
- package/tests/commands-core.test.d.ts.map +1 -0
- package/tests/commands-core.test.js +477 -0
- package/tests/commands-core.test.ts +562 -0
- package/tests/commands-missing.test.d.ts +2 -0
- package/tests/commands-missing.test.d.ts.map +1 -0
- package/tests/commands-missing.test.js +470 -0
- package/tests/commands-missing.test.ts +570 -0
- package/tests/commands-specific-units.test.d.ts +2 -0
- package/tests/commands-specific-units.test.d.ts.map +1 -0
- package/tests/commands-specific-units.test.js +264 -0
- package/tests/commands-specific-units.test.ts +327 -0
- package/tests/commands-text-sys.test.d.ts +2 -0
- package/tests/commands-text-sys.test.d.ts.map +1 -0
- package/tests/commands-text-sys.test.js +366 -0
- package/tests/commands-text-sys.test.ts +445 -0
- package/tests/expand.test.d.ts +2 -0
- package/tests/expand.test.d.ts.map +1 -0
- package/tests/expand.test.js +138 -0
- package/tests/expand.test.ts +170 -0
- package/tests/helpers.test.d.ts +2 -0
- package/tests/helpers.test.d.ts.map +1 -0
- package/tests/helpers.test.js +52 -0
- package/tests/helpers.test.ts +75 -0
- package/tests/new-features.test.d.ts +2 -0
- package/tests/new-features.test.d.ts.map +1 -0
- package/tests/new-features.test.js +850 -0
- package/tests/parser-executor.test.d.ts +2 -0
- package/tests/parser-executor.test.d.ts.map +1 -0
- package/tests/parser-executor.test.js +25 -0
- package/tests/sftp.test.d.ts +2 -0
- package/tests/sftp.test.d.ts.map +1 -0
- package/tests/sftp.test.js +246 -0
- package/tests/ssh-exec.test.d.ts +2 -0
- package/tests/ssh-exec.test.d.ts.map +1 -0
- package/tests/ssh-exec.test.js +39 -0
- package/tests/test-helper.d.ts +56 -0
- package/tests/test-helper.d.ts.map +1 -0
- package/tests/test-helper.js +71 -0
- package/tests/test-helper.ts +79 -0
- package/tests/users.test.d.ts +2 -0
- package/tests/users.test.d.ts.map +1 -0
- package/tests/users.test.js +71 -0
- package/tests/web.test.d.ts +2 -0
- package/tests/web.test.d.ts.map +1 -0
- package/tests/web.test.js +149 -0
- package/tsconfig.json +2 -4
- package/dist/Honeypot/index.d.ts.map +0 -1
- package/dist/SSHClient/index.d.ts.map +0 -1
- package/dist/SSHMimic/exec.d.ts.map +0 -1
- package/dist/SSHMimic/executor.d.ts.map +0 -1
- package/dist/SSHMimic/hostKey.d.ts.map +0 -1
- package/dist/SSHMimic/index.d.ts.map +0 -1
- package/dist/SSHMimic/loginBanner.d.ts.map +0 -1
- package/dist/SSHMimic/loginFormat.d.ts.map +0 -1
- package/dist/SSHMimic/prompt.d.ts.map +0 -1
- package/dist/SSHMimic/sftp.d.ts.map +0 -1
- package/dist/VirtualFileSystem/binaryPack.d.ts.map +0 -1
- package/dist/VirtualFileSystem/index.d.ts.map +0 -1
- package/dist/VirtualFileSystem/internalTypes.d.ts.map +0 -1
- package/dist/VirtualFileSystem/path.d.ts.map +0 -1
- package/dist/VirtualPackageManager/index.d.ts.map +0 -1
- package/dist/VirtualShell/index.d.ts.map +0 -1
- package/dist/VirtualShell/shell.d.ts.map +0 -1
- package/dist/VirtualShell/shellParser.d.ts.map +0 -1
- package/dist/VirtualUserManager/index.d.ts.map +0 -1
- package/dist/commands/adduser.d.ts.map +0 -1
- package/dist/commands/alias.d.ts.map +0 -1
- package/dist/commands/apt.d.ts.map +0 -1
- package/dist/commands/awk.d.ts.map +0 -1
- package/dist/commands/base64.d.ts.map +0 -1
- package/dist/commands/cat.d.ts.map +0 -1
- package/dist/commands/cd.d.ts.map +0 -1
- package/dist/commands/chmod.d.ts.map +0 -1
- package/dist/commands/clear.d.ts.map +0 -1
- package/dist/commands/command-helpers.d.ts.map +0 -1
- package/dist/commands/cp.d.ts.map +0 -1
- package/dist/commands/curl.d.ts.map +0 -1
- package/dist/commands/cut.d.ts.map +0 -1
- package/dist/commands/date.d.ts.map +0 -1
- package/dist/commands/declare.d.ts.map +0 -1
- package/dist/commands/deluser.d.ts.map +0 -1
- package/dist/commands/df.d.ts.map +0 -1
- package/dist/commands/diff.d.ts.map +0 -1
- package/dist/commands/dpkg.d.ts.map +0 -1
- package/dist/commands/du.d.ts.map +0 -1
- package/dist/commands/echo.d.ts.map +0 -1
- package/dist/commands/env.d.ts.map +0 -1
- package/dist/commands/exit.d.ts.map +0 -1
- package/dist/commands/export.d.ts.map +0 -1
- package/dist/commands/find.d.ts.map +0 -1
- package/dist/commands/free.d.ts.map +0 -1
- package/dist/commands/grep.d.ts.map +0 -1
- package/dist/commands/groups.d.ts.map +0 -1
- package/dist/commands/gzip.d.ts.map +0 -1
- package/dist/commands/head.d.ts.map +0 -1
- package/dist/commands/help.d.ts.map +0 -1
- package/dist/commands/helpers.d.ts.map +0 -1
- package/dist/commands/history.d.ts.map +0 -1
- package/dist/commands/hostname.d.ts.map +0 -1
- package/dist/commands/htop.d.ts.map +0 -1
- package/dist/commands/id.d.ts.map +0 -1
- package/dist/commands/index.d.ts.map +0 -1
- package/dist/commands/kill.d.ts.map +0 -1
- package/dist/commands/ln.d.ts.map +0 -1
- package/dist/commands/ls.d.ts.map +0 -1
- package/dist/commands/ls.js +0 -67
- package/dist/commands/lsb-release.d.ts.map +0 -1
- package/dist/commands/man.d.ts.map +0 -1
- package/dist/commands/mkdir.d.ts.map +0 -1
- package/dist/commands/mv.d.ts.map +0 -1
- package/dist/commands/nano.d.ts.map +0 -1
- package/dist/commands/neofetch.d.ts.map +0 -1
- package/dist/commands/node.d.ts.map +0 -1
- package/dist/commands/npm.d.ts.map +0 -1
- package/dist/commands/passwd.d.ts.map +0 -1
- package/dist/commands/ping.d.ts.map +0 -1
- package/dist/commands/printf.d.ts.map +0 -1
- package/dist/commands/ps.d.ts.map +0 -1
- package/dist/commands/pwd.d.ts.map +0 -1
- package/dist/commands/python.d.ts.map +0 -1
- package/dist/commands/read.d.ts.map +0 -1
- package/dist/commands/registry.d.ts.map +0 -1
- package/dist/commands/rm.d.ts.map +0 -1
- package/dist/commands/runtime.d.ts.map +0 -1
- package/dist/commands/sed.d.ts.map +0 -1
- package/dist/commands/set.d.ts.map +0 -1
- package/dist/commands/sh.d.ts +0 -9
- package/dist/commands/sh.d.ts.map +0 -1
- package/dist/commands/shift.d.ts.map +0 -1
- package/dist/commands/sleep.d.ts.map +0 -1
- package/dist/commands/sort.d.ts.map +0 -1
- package/dist/commands/source.d.ts.map +0 -1
- package/dist/commands/stat.d.ts.map +0 -1
- package/dist/commands/su.d.ts.map +0 -1
- package/dist/commands/sudo.d.ts.map +0 -1
- package/dist/commands/tail.d.ts.map +0 -1
- package/dist/commands/tar.d.ts.map +0 -1
- package/dist/commands/tee.d.ts.map +0 -1
- package/dist/commands/test.d.ts.map +0 -1
- package/dist/commands/touch.d.ts.map +0 -1
- package/dist/commands/tr.d.ts.map +0 -1
- package/dist/commands/tree.d.ts.map +0 -1
- package/dist/commands/true.d.ts.map +0 -1
- package/dist/commands/type.d.ts.map +0 -1
- package/dist/commands/uname.d.ts.map +0 -1
- package/dist/commands/uniq.d.ts.map +0 -1
- package/dist/commands/unset.d.ts.map +0 -1
- package/dist/commands/uptime.d.ts.map +0 -1
- package/dist/commands/wc.d.ts.map +0 -1
- package/dist/commands/wget.d.ts.map +0 -1
- package/dist/commands/which.d.ts.map +0 -1
- package/dist/commands/who.d.ts.map +0 -1
- package/dist/commands/whoami.d.ts.map +0 -1
- package/dist/commands/xargs.d.ts.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/modules/linuxRootfs.d.ts +0 -41
- package/dist/modules/linuxRootfs.d.ts.map +0 -1
- package/dist/modules/linuxRootfs.js +0 -440
- package/dist/modules/neofetch.d.ts.map +0 -1
- package/dist/modules/shellInteractive.d.ts.map +0 -1
- package/dist/modules/shellRuntime.d.ts.map +0 -1
- package/dist/standalone-wo-sftp.d.ts.map +0 -1
- package/dist/types/commands.d.ts.map +0 -1
- package/dist/types/pipeline.d.ts.map +0 -1
- package/dist/types/streams.d.ts.map +0 -1
- package/dist/types/vfs.d.ts.map +0 -1
- package/dist/utils/expand.d.ts.map +0 -1
- package/dist/utils/expand.js +0 -183
- package/dist/utils/perfLogger.d.ts.map +0 -1
- package/dist/utils/tokenize.d.ts.map +0 -1
- package/dist/utils/vfsDiff.d.ts.map +0 -1
- package/dist/web-api.d.ts.map +0 -1
- package/dist/web-full.d.ts.map +0 -1
- package/dist/web.d.ts.map +0 -1
- package/tests/bun-test-shim.ts +0 -9
- /package/{dist → src}/Honeypot/index.d.ts +0 -0
- /package/{dist → src}/Honeypot/index.js +0 -0
- /package/{dist → src}/SSHClient/index.d.ts +0 -0
- /package/{dist → src}/SSHClient/index.js +0 -0
- /package/{dist → src}/SSHMimic/exec.d.ts +0 -0
- /package/{dist → src}/SSHMimic/exec.js +0 -0
- /package/{dist → src}/SSHMimic/executor.d.ts +0 -0
- /package/{dist → src}/SSHMimic/executor.js +0 -0
- /package/{dist → src}/SSHMimic/hostKey.d.ts +0 -0
- /package/{dist → src}/SSHMimic/hostKey.js +0 -0
- /package/{dist → src}/SSHMimic/index.d.ts +0 -0
- /package/{dist → src}/SSHMimic/index.js +0 -0
- /package/{dist → src}/SSHMimic/loginBanner.d.ts +0 -0
- /package/{dist → src}/SSHMimic/loginBanner.js +0 -0
- /package/{dist → src}/SSHMimic/loginFormat.d.ts +0 -0
- /package/{dist → src}/SSHMimic/loginFormat.js +0 -0
- /package/{dist → src}/SSHMimic/prompt.d.ts +0 -0
- /package/{dist → src}/SSHMimic/prompt.js +0 -0
- /package/{dist → src}/SSHMimic/sftp.d.ts +0 -0
- /package/{dist → src}/SSHMimic/sftp.js +0 -0
- /package/{dist → src}/VirtualFileSystem/binaryPack.d.ts +0 -0
- /package/{dist → src}/VirtualFileSystem/binaryPack.js +0 -0
- /package/{dist → src}/VirtualFileSystem/internalTypes.d.ts +0 -0
- /package/{dist → src}/VirtualFileSystem/internalTypes.js +0 -0
- /package/{dist → src}/VirtualFileSystem/path.d.ts +0 -0
- /package/{dist → src}/VirtualFileSystem/path.js +0 -0
- /package/{dist → src}/VirtualPackageManager/index.d.ts +0 -0
- /package/{dist → src}/VirtualPackageManager/index.js +0 -0
- /package/{dist → src}/VirtualShell/shell.d.ts +0 -0
- /package/{dist → src}/VirtualShell/shell.js +0 -0
- /package/{dist → src}/VirtualShell/shellParser.d.ts +0 -0
- /package/{dist → src}/VirtualUserManager/index.d.ts +0 -0
- /package/{dist → src}/VirtualUserManager/index.js +0 -0
- /package/{dist → src}/commands/adduser.d.ts +0 -0
- /package/{dist → src}/commands/adduser.js +0 -0
- /package/{dist → src}/commands/alias.d.ts +0 -0
- /package/{dist → src}/commands/alias.js +0 -0
- /package/{dist → src}/commands/apt.d.ts +0 -0
- /package/{dist → src}/commands/apt.js +0 -0
- /package/{dist → src}/commands/awk.d.ts +0 -0
- /package/{dist → src}/commands/base64.d.ts +0 -0
- /package/{dist → src}/commands/base64.js +0 -0
- /package/{dist → src}/commands/cat.d.ts +0 -0
- /package/{dist → src}/commands/cat.js +0 -0
- /package/{dist → src}/commands/cd.d.ts +0 -0
- /package/{dist → src}/commands/chmod.d.ts +0 -0
- /package/{dist → src}/commands/chmod.js +0 -0
- /package/{dist → src}/commands/clear.d.ts +0 -0
- /package/{dist → src}/commands/clear.js +0 -0
- /package/{dist → src}/commands/command-helpers.d.ts +0 -0
- /package/{dist → src}/commands/command-helpers.js +0 -0
- /package/{dist → src}/commands/cp.d.ts +0 -0
- /package/{dist → src}/commands/cp.js +0 -0
- /package/{dist → src}/commands/curl.d.ts +0 -0
- /package/{dist → src}/commands/curl.js +0 -0
- /package/{dist → src}/commands/cut.d.ts +0 -0
- /package/{dist → src}/commands/cut.js +0 -0
- /package/{dist → src}/commands/date.d.ts +0 -0
- /package/{dist → src}/commands/date.js +0 -0
- /package/{dist → src}/commands/declare.d.ts +0 -0
- /package/{dist → src}/commands/declare.js +0 -0
- /package/{dist → src}/commands/deluser.d.ts +0 -0
- /package/{dist → src}/commands/deluser.js +0 -0
- /package/{dist → src}/commands/df.d.ts +0 -0
- /package/{dist → src}/commands/df.js +0 -0
- /package/{dist → src}/commands/diff.d.ts +0 -0
- /package/{dist → src}/commands/diff.js +0 -0
- /package/{dist → src}/commands/dpkg.d.ts +0 -0
- /package/{dist → src}/commands/dpkg.js +0 -0
- /package/{dist → src}/commands/du.d.ts +0 -0
- /package/{dist → src}/commands/du.js +0 -0
- /package/{dist → src}/commands/echo.d.ts +0 -0
- /package/{dist → src}/commands/echo.js +0 -0
- /package/{dist → src}/commands/env.d.ts +0 -0
- /package/{dist → src}/commands/env.js +0 -0
- /package/{dist → src}/commands/exit.d.ts +0 -0
- /package/{dist → src}/commands/exit.js +0 -0
- /package/{dist → src}/commands/export.d.ts +0 -0
- /package/{dist → src}/commands/find.d.ts +0 -0
- /package/{dist → src}/commands/find.js +0 -0
- /package/{dist → src}/commands/free.d.ts +0 -0
- /package/{dist → src}/commands/free.js +0 -0
- /package/{dist → src}/commands/grep.d.ts +0 -0
- /package/{dist → src}/commands/grep.js +0 -0
- /package/{dist → src}/commands/groups.d.ts +0 -0
- /package/{dist → src}/commands/groups.js +0 -0
- /package/{dist → src}/commands/gzip.d.ts +0 -0
- /package/{dist → src}/commands/gzip.js +0 -0
- /package/{dist → src}/commands/head.d.ts +0 -0
- /package/{dist → src}/commands/head.js +0 -0
- /package/{dist → src}/commands/help.d.ts +0 -0
- /package/{dist → src}/commands/help.js +0 -0
- /package/{dist → src}/commands/helpers.d.ts +0 -0
- /package/{dist → src}/commands/history.d.ts +0 -0
- /package/{dist → src}/commands/history.js +0 -0
- /package/{dist → src}/commands/hostname.d.ts +0 -0
- /package/{dist → src}/commands/hostname.js +0 -0
- /package/{dist → src}/commands/htop.d.ts +0 -0
- /package/{dist → src}/commands/htop.js +0 -0
- /package/{dist → src}/commands/id.d.ts +0 -0
- /package/{dist → src}/commands/id.js +0 -0
- /package/{dist → src}/commands/index.d.ts +0 -0
- /package/{dist → src}/commands/index.js +0 -0
- /package/{dist → src}/commands/kill.d.ts +0 -0
- /package/{dist → src}/commands/kill.js +0 -0
- /package/{dist → src}/commands/ln.d.ts +0 -0
- /package/{dist → src}/commands/ln.js +0 -0
- /package/{dist → src}/commands/ls.d.ts +0 -0
- /package/{dist → src}/commands/lsb-release.d.ts +0 -0
- /package/{dist → src}/commands/lsb-release.js +0 -0
- /package/{dist → src}/commands/man.d.ts +0 -0
- /package/{dist → src}/commands/man.js +0 -0
- /package/{dist → src}/commands/mkdir.d.ts +0 -0
- /package/{dist → src}/commands/mkdir.js +0 -0
- /package/{dist → src}/commands/mv.d.ts +0 -0
- /package/{dist → src}/commands/mv.js +0 -0
- /package/{dist → src}/commands/nano.d.ts +0 -0
- /package/{dist → src}/commands/nano.js +0 -0
- /package/{dist → src}/commands/neofetch.d.ts +0 -0
- /package/{dist → src}/commands/neofetch.js +0 -0
- /package/{dist → src}/commands/node.d.ts +0 -0
- /package/{dist → src}/commands/node.js +0 -0
- /package/{dist → src}/commands/npm.d.ts +0 -0
- /package/{dist → src}/commands/npm.js +0 -0
- /package/{dist → src}/commands/passwd.d.ts +0 -0
- /package/{dist → src}/commands/passwd.js +0 -0
- /package/{dist → src}/commands/ping.d.ts +0 -0
- /package/{dist → src}/commands/ping.js +0 -0
- /package/{dist → src}/commands/printf.d.ts +0 -0
- /package/{dist → src}/commands/printf.js +0 -0
- /package/{dist → src}/commands/ps.d.ts +0 -0
- /package/{dist → src}/commands/ps.js +0 -0
- /package/{dist → src}/commands/pwd.d.ts +0 -0
- /package/{dist → src}/commands/pwd.js +0 -0
- /package/{dist → src}/commands/python.d.ts +0 -0
- /package/{dist → src}/commands/python.js +0 -0
- /package/{dist → src}/commands/read.d.ts +0 -0
- /package/{dist → src}/commands/read.js +0 -0
- /package/{dist → src}/commands/registry.d.ts +0 -0
- /package/{dist → src}/commands/rm.d.ts +0 -0
- /package/{dist → src}/commands/rm.js +0 -0
- /package/{dist → src}/commands/runtime.d.ts +0 -0
- /package/{dist → src}/commands/sed.d.ts +0 -0
- /package/{dist → src}/commands/sed.js +0 -0
- /package/{dist → src}/commands/set.d.ts +0 -0
- /package/{dist → src}/commands/set.js +0 -0
- /package/{dist → src}/commands/shift.d.ts +0 -0
- /package/{dist → src}/commands/shift.js +0 -0
- /package/{dist → src}/commands/sleep.d.ts +0 -0
- /package/{dist → src}/commands/sleep.js +0 -0
- /package/{dist → src}/commands/sort.d.ts +0 -0
- /package/{dist → src}/commands/sort.js +0 -0
- /package/{dist → src}/commands/source.d.ts +0 -0
- /package/{dist → src}/commands/source.js +0 -0
- /package/{dist → src}/commands/stat.d.ts +0 -0
- /package/{dist → src}/commands/stat.js +0 -0
- /package/{dist → src}/commands/su.d.ts +0 -0
- /package/{dist → src}/commands/su.js +0 -0
- /package/{dist → src}/commands/sudo.d.ts +0 -0
- /package/{dist → src}/commands/sudo.js +0 -0
- /package/{dist → src}/commands/tail.d.ts +0 -0
- /package/{dist → src}/commands/tail.js +0 -0
- /package/{dist → src}/commands/tar.d.ts +0 -0
- /package/{dist → src}/commands/tar.js +0 -0
- /package/{dist → src}/commands/tee.d.ts +0 -0
- /package/{dist → src}/commands/tee.js +0 -0
- /package/{dist → src}/commands/test.d.ts +0 -0
- /package/{dist → src}/commands/test.js +0 -0
- /package/{dist → src}/commands/touch.d.ts +0 -0
- /package/{dist → src}/commands/touch.js +0 -0
- /package/{dist → src}/commands/tr.d.ts +0 -0
- /package/{dist → src}/commands/tr.js +0 -0
- /package/{dist → src}/commands/tree.d.ts +0 -0
- /package/{dist → src}/commands/tree.js +0 -0
- /package/{dist → src}/commands/true.d.ts +0 -0
- /package/{dist → src}/commands/true.js +0 -0
- /package/{dist → src}/commands/type.d.ts +0 -0
- /package/{dist → src}/commands/type.js +0 -0
- /package/{dist → src}/commands/uname.d.ts +0 -0
- /package/{dist → src}/commands/uname.js +0 -0
- /package/{dist → src}/commands/uniq.d.ts +0 -0
- /package/{dist → src}/commands/uniq.js +0 -0
- /package/{dist → src}/commands/unset.d.ts +0 -0
- /package/{dist → src}/commands/unset.js +0 -0
- /package/{dist → src}/commands/uptime.d.ts +0 -0
- /package/{dist → src}/commands/uptime.js +0 -0
- /package/{dist → src}/commands/wc.d.ts +0 -0
- /package/{dist → src}/commands/wget.d.ts +0 -0
- /package/{dist → src}/commands/wget.js +0 -0
- /package/{dist → src}/commands/which.d.ts +0 -0
- /package/{dist → src}/commands/which.js +0 -0
- /package/{dist → src}/commands/who.d.ts +0 -0
- /package/{dist → src}/commands/who.js +0 -0
- /package/{dist → src}/commands/whoami.d.ts +0 -0
- /package/{dist → src}/commands/whoami.js +0 -0
- /package/{dist → src}/commands/xargs.d.ts +0 -0
- /package/{dist → src}/commands/xargs.js +0 -0
- /package/{dist → src}/index.d.ts +0 -0
- /package/{dist → src}/index.js +0 -0
- /package/{dist → src}/modules/neofetch.d.ts +0 -0
- /package/{dist → src}/modules/neofetch.js +0 -0
- /package/{dist → src}/modules/shellInteractive.d.ts +0 -0
- /package/{dist → src}/modules/shellInteractive.js +0 -0
- /package/{dist → src}/modules/shellRuntime.d.ts +0 -0
- /package/{dist → src}/modules/shellRuntime.js +0 -0
- /package/{dist → src}/self-standalone.d.ts +0 -0
- /package/{dist → src}/self-standalone.js +0 -0
- /package/{dist → src}/standalone-wo-sftp.d.ts +0 -0
- /package/{dist → src}/standalone-wo-sftp.js +0 -0
- /package/{dist → src}/standalone.d.ts +0 -0
- /package/{dist → src}/standalone.js +0 -0
- /package/{dist → src}/types/commands.js +0 -0
- /package/{dist → src}/types/pipeline.js +0 -0
- /package/{dist → src}/types/streams.d.ts +0 -0
- /package/{dist → src}/types/streams.js +0 -0
- /package/{dist → src}/types/vfs.js +0 -0
- /package/{dist → src}/utils/perfLogger.d.ts +0 -0
- /package/{dist → src}/utils/perfLogger.js +0 -0
- /package/{dist → src}/utils/tokenize.d.ts +0 -0
- /package/{dist → src}/utils/vfsDiff.d.ts +0 -0
- /package/{dist → src}/utils/vfsDiff.js +0 -0
- /package/{dist → src}/web-api.d.ts +0 -0
- /package/{dist → src}/web-api.js +0 -0
- /package/{dist → src}/web-full.d.ts +0 -0
- /package/{dist → src}/web-full.js +0 -0
- /package/{dist → src}/web.d.ts +0 -0
- /package/{dist → src}/web.js +0 -0
package/src/commands/sh.ts
CHANGED
|
@@ -3,7 +3,7 @@ import type {
|
|
|
3
3
|
CommandResult,
|
|
4
4
|
ShellModule,
|
|
5
5
|
} from "../types/commands";
|
|
6
|
-
import { expandAsync } from "../utils/expand";
|
|
6
|
+
import { evalArith, expandAsync, expandBraces } from "../utils/expand";
|
|
7
7
|
import { ifFlag } from "./command-helpers";
|
|
8
8
|
import { resolvePath } from "./helpers";
|
|
9
9
|
import { runCommand } from "./runtime";
|
|
@@ -45,6 +45,8 @@ type Block =
|
|
|
45
45
|
}
|
|
46
46
|
| { type: "for"; var: string; list: string; body: string[] }
|
|
47
47
|
| { type: "while"; cond: string; body: string[] }
|
|
48
|
+
| { type: "func"; name: string; body: string[] }
|
|
49
|
+
| { type: "arith"; expr: string }
|
|
48
50
|
| { type: "cmd"; line: string };
|
|
49
51
|
|
|
50
52
|
/** Very small shell interpreter: supports if/elif/else/fi, for/do/done, while/do/done */
|
|
@@ -58,6 +60,41 @@ function parseBlocks(lines: string[]): Block[] {
|
|
|
58
60
|
continue;
|
|
59
61
|
}
|
|
60
62
|
|
|
63
|
+
// Function definition: name() { or function name { or name() { body }
|
|
64
|
+
const funcMatchInline = line.match(/^(?:function\s+)?(\w+)\s*\(\s*\)\s*\{(.+)\}\s*$/);
|
|
65
|
+
const funcMatch = funcMatchInline ?? (
|
|
66
|
+
line.match(/^(?:function\s+)?(\w+)\s*\(\s*\)\s*\{?\s*$/) ||
|
|
67
|
+
line.match(/^function\s+(\w+)\s*\{?\s*$/)
|
|
68
|
+
);
|
|
69
|
+
if (funcMatch) {
|
|
70
|
+
const funcName = funcMatch[1]!;
|
|
71
|
+
const body: string[] = [];
|
|
72
|
+
// Inline: name() { cmd; } — single-line form
|
|
73
|
+
if (funcMatchInline) {
|
|
74
|
+
body.push(...funcMatchInline[2]!.split(";").map((s: string) => s.trim()).filter(Boolean));
|
|
75
|
+
blocks.push({ type: "func", name: funcName, body });
|
|
76
|
+
i++;
|
|
77
|
+
continue;
|
|
78
|
+
}
|
|
79
|
+
i++;
|
|
80
|
+
while (i < lines.length && lines[i]?.trim() !== "}" && i < lines.length + 1) {
|
|
81
|
+
const l = lines[i]!.trim().replace(/^do\s+/, "");
|
|
82
|
+
if (l && l !== "{") body.push(l);
|
|
83
|
+
i++;
|
|
84
|
+
}
|
|
85
|
+
i++; // skip closing }
|
|
86
|
+
blocks.push({ type: "func", name: funcName, body });
|
|
87
|
+
continue;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
// (( expr )) arithmetic statement
|
|
91
|
+
const arithMatch = line.match(/^\(\(\s*(.+?)\s*\)\)$/);
|
|
92
|
+
if (arithMatch) {
|
|
93
|
+
blocks.push({ type: "arith", expr: arithMatch[1]! });
|
|
94
|
+
i++;
|
|
95
|
+
continue;
|
|
96
|
+
}
|
|
97
|
+
|
|
61
98
|
if (line.startsWith("if ") || line === "if") {
|
|
62
99
|
const cond = line
|
|
63
100
|
.replace(/^if\s+/, "")
|
|
@@ -225,16 +262,34 @@ async function runBlocks(
|
|
|
225
262
|
}
|
|
226
263
|
}
|
|
227
264
|
|
|
228
|
-
const r = await
|
|
229
|
-
expanded
|
|
230
|
-
|
|
231
|
-
ctx.
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
265
|
+
const r = await (async () => {
|
|
266
|
+
// Check if expanded matches a registered function
|
|
267
|
+
const cmdName = expanded.trim().split(/\s+/)[0] ?? "";
|
|
268
|
+
const funcBody = ctx.env.vars[`__func_${cmdName}`];
|
|
269
|
+
if (funcBody) {
|
|
270
|
+
// Set positional params $1 $2 ... from remaining args
|
|
271
|
+
const funcArgs = expanded.trim().split(/\s+/).slice(1);
|
|
272
|
+
const savedVars = { ...ctx.env.vars };
|
|
273
|
+
funcArgs.forEach((a, i) => { ctx.env.vars[String(i + 1)] = a; });
|
|
274
|
+
ctx.env.vars["0"] = cmdName;
|
|
275
|
+
const funcLines = funcBody.split("\n");
|
|
276
|
+
const funcResult = await runBlocks(parseBlocks(funcLines), ctx);
|
|
277
|
+
// Restore positional params
|
|
278
|
+
for (let pi = 1; pi <= funcArgs.length; pi++) delete ctx.env.vars[String(pi)];
|
|
279
|
+
Object.assign(ctx.env.vars, { ...savedVars, ...ctx.env.vars });
|
|
280
|
+
return funcResult;
|
|
281
|
+
}
|
|
282
|
+
return runCommand(
|
|
283
|
+
expanded,
|
|
284
|
+
ctx.authUser,
|
|
285
|
+
ctx.hostname,
|
|
286
|
+
ctx.mode,
|
|
287
|
+
ctx.cwd,
|
|
288
|
+
ctx.shell,
|
|
289
|
+
undefined,
|
|
290
|
+
ctx.env,
|
|
291
|
+
);
|
|
292
|
+
})();
|
|
238
293
|
ctx.env.lastExitCode = r.exitCode ?? 0;
|
|
239
294
|
if (r.stdout) output += `${r.stdout}\n`;
|
|
240
295
|
if (r.stderr) return { ...r, stdout: output.trim() };
|
|
@@ -259,6 +314,31 @@ async function runBlocks(
|
|
|
259
314
|
if (sub.stdout) output += `${sub.stdout}\n`;
|
|
260
315
|
}
|
|
261
316
|
}
|
|
317
|
+
} else if (block.type === "func") {
|
|
318
|
+
// Register function in env vars as __func_<name>=<body>
|
|
319
|
+
ctx.env.vars[`__func_${block.name}`] = block.body.join("\n");
|
|
320
|
+
} else if (block.type === "arith") {
|
|
321
|
+
// (( expr )) — evaluate arithmetic, update vars
|
|
322
|
+
const expr = block.expr.trim();
|
|
323
|
+
// Handle i++ / i-- / i+=N / i-=N
|
|
324
|
+
const incMatch = expr.match(/^(\w+)\s*(\+\+|--)$/);
|
|
325
|
+
if (incMatch) {
|
|
326
|
+
const val = parseInt(ctx.env.vars[incMatch[1]!] ?? "0", 10);
|
|
327
|
+
ctx.env.vars[incMatch[1]!] = String(incMatch[2] === "++" ? val + 1 : val - 1);
|
|
328
|
+
} else {
|
|
329
|
+
const assignMatch = expr.match(/^(\w+)\s*([+\-*/])=\s*(.+)$/);
|
|
330
|
+
if (assignMatch) {
|
|
331
|
+
const lhs = parseInt(ctx.env.vars[assignMatch[1]!] ?? "0", 10);
|
|
332
|
+
const rhs = parseInt(assignMatch[3]!, 10);
|
|
333
|
+
const ops: Record<string, number> = { "+": lhs + rhs, "-": lhs - rhs, "*": lhs * rhs, "/": Math.floor(lhs / rhs) };
|
|
334
|
+
ctx.env.vars[assignMatch[1]!] = String(ops[assignMatch[2]!] ?? lhs);
|
|
335
|
+
} else {
|
|
336
|
+
const value = evalArith(expr, ctx.env.vars);
|
|
337
|
+
if (!Number.isNaN(value)) {
|
|
338
|
+
ctx.env.lastExitCode = value === 0 ? 1 : 0;
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
}
|
|
262
342
|
} else if (block.type === "for") {
|
|
263
343
|
const listExpanded = await expandVars(
|
|
264
344
|
block.list,
|
|
@@ -266,7 +346,8 @@ async function runBlocks(
|
|
|
266
346
|
ctx.env.lastExitCode,
|
|
267
347
|
ctx,
|
|
268
348
|
);
|
|
269
|
-
|
|
349
|
+
// Apply brace expansion to each token in the list
|
|
350
|
+
const items = listExpanded.trim().split(/\s+/).flatMap(expandBraces);
|
|
270
351
|
for (const item of items) {
|
|
271
352
|
ctx.env.vars[block.var] = item;
|
|
272
353
|
const sub = await runBlocks(parseBlocks(block.body), ctx);
|
|
@@ -292,6 +373,59 @@ async function runBlocks(
|
|
|
292
373
|
* @category shell
|
|
293
374
|
* @params ["-c <script>", "[<file>]"]
|
|
294
375
|
*/
|
|
376
|
+
|
|
377
|
+
/**
|
|
378
|
+
* Split a sh script into logical lines, respecting:
|
|
379
|
+
* - `{...}` braces (function bodies)
|
|
380
|
+
* - Newlines and semicolons at depth 0 only
|
|
381
|
+
*/
|
|
382
|
+
function splitShScript(script: string): string[] {
|
|
383
|
+
const lines: string[] = [];
|
|
384
|
+
let current = "";
|
|
385
|
+
let depth = 0;
|
|
386
|
+
let inSingleQ = false;
|
|
387
|
+
let inDoubleQ = false;
|
|
388
|
+
let i = 0;
|
|
389
|
+
while (i < script.length) {
|
|
390
|
+
const ch = script[i]!;
|
|
391
|
+
if (!inSingleQ && !inDoubleQ) {
|
|
392
|
+
if (ch === "'") { inSingleQ = true; current += ch; i++; continue; }
|
|
393
|
+
if (ch === '"') { inDoubleQ = true; current += ch; i++; continue; }
|
|
394
|
+
if (ch === "{") { depth++; current += ch; i++; continue; }
|
|
395
|
+
if (ch === "}") {
|
|
396
|
+
depth--;
|
|
397
|
+
current += ch;
|
|
398
|
+
i++;
|
|
399
|
+
// At depth 0, closing } ends the function body line
|
|
400
|
+
if (depth === 0) {
|
|
401
|
+
const t = current.trim();
|
|
402
|
+
if (t) lines.push(t);
|
|
403
|
+
current = "";
|
|
404
|
+
// Skip trailing ; or whitespace
|
|
405
|
+
while (i < script.length && (script[i] === ";" || script[i] === " ")) i++;
|
|
406
|
+
}
|
|
407
|
+
continue;
|
|
408
|
+
}
|
|
409
|
+
if (depth === 0 && (ch === ";" || ch === "\n")) {
|
|
410
|
+
const t = current.trim();
|
|
411
|
+
if (t && !t.startsWith("#")) lines.push(t);
|
|
412
|
+
current = "";
|
|
413
|
+
i++;
|
|
414
|
+
continue;
|
|
415
|
+
}
|
|
416
|
+
} else if (inSingleQ && ch === "'") {
|
|
417
|
+
inSingleQ = false;
|
|
418
|
+
} else if (inDoubleQ && ch === '"') {
|
|
419
|
+
inDoubleQ = false;
|
|
420
|
+
}
|
|
421
|
+
current += ch;
|
|
422
|
+
i++;
|
|
423
|
+
}
|
|
424
|
+
const t = current.trim();
|
|
425
|
+
if (t && !t.startsWith("#")) lines.push(t);
|
|
426
|
+
return lines;
|
|
427
|
+
}
|
|
428
|
+
|
|
295
429
|
export const shCommand: ShellModule = {
|
|
296
430
|
name: "sh",
|
|
297
431
|
aliases: ["bash"],
|
|
@@ -305,10 +439,7 @@ export const shCommand: ShellModule = {
|
|
|
305
439
|
if (ifFlag(args, "-c")) {
|
|
306
440
|
const script = args[args.indexOf("-c") + 1] ?? "";
|
|
307
441
|
if (!script) return { stderr: "sh: -c requires a script", exitCode: 1 };
|
|
308
|
-
const lines = script
|
|
309
|
-
.split(/[;\n]/)
|
|
310
|
-
.map((l) => l.trim())
|
|
311
|
-
.filter((l) => l && !l.startsWith("#"));
|
|
442
|
+
const lines = splitShScript(script);
|
|
312
443
|
const blocks = parseBlocks(lines);
|
|
313
444
|
return runBlocks(blocks, ctx);
|
|
314
445
|
}
|
|
@@ -323,10 +454,7 @@ export const shCommand: ShellModule = {
|
|
|
323
454
|
exitCode: 1,
|
|
324
455
|
};
|
|
325
456
|
const content = shell.vfs.readFile(p);
|
|
326
|
-
const lines = content
|
|
327
|
-
.split("\n")
|
|
328
|
-
.map((l) => l.trim())
|
|
329
|
-
.filter((l) => l && !l.startsWith("#"));
|
|
457
|
+
const lines = splitShScript(content);
|
|
330
458
|
const blocks = parseBlocks(lines);
|
|
331
459
|
return runBlocks(blocks, ctx);
|
|
332
460
|
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shift.d.ts","sourceRoot":"","sources":["shift.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAErD;;;;GAIG;AACH,eAAO,MAAM,YAAY,EAAE,WAoB1B,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,WAAW,EAAE,WAezB,CAAC;AAEF,eAAO,MAAM,aAAa,EAAE,WAW3B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sleep.d.ts","sourceRoot":"","sources":["sleep.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAErD;;;;GAIG;AACH,eAAO,MAAM,YAAY,EAAE,WAY1B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sort.d.ts","sourceRoot":"","sources":["sort.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAIrD;;;;GAIG;AACH,eAAO,MAAM,WAAW,EAAE,WAoCzB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"source.d.ts","sourceRoot":"","sources":["source.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAIrD;;;;GAIG;AACH,eAAO,MAAM,aAAa,EAAE,WA0C3B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stat.d.ts","sourceRoot":"","sources":["stat.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAGrD;;;GAGG;AACH,eAAO,MAAM,WAAW,EAAE,WAqDzB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"su.d.ts","sourceRoot":"","sources":["su.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAGrD;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,SAAS,EAAE,WAuDvB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sudo.d.ts","sourceRoot":"","sources":["sudo.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AA0BrD,eAAO,MAAM,WAAW,EAAE,WAiDzB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tail.d.ts","sourceRoot":"","sources":["tail.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAIrD;;;;GAIG;AACH,eAAO,MAAM,WAAW,EAAE,WA2CzB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tar.d.ts","sourceRoot":"","sources":["tar.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAGrD;;;;GAIG;AACH,eAAO,MAAM,UAAU,EAAE,WA6FxB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tee.d.ts","sourceRoot":"","sources":["tee.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAIrD;;;;GAIG;AACH,eAAO,MAAM,UAAU,EAAE,WA0BxB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test.d.ts","sourceRoot":"","sources":["test.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AA0HrD,eAAO,MAAM,WAAW,EAAE,WAczB,CAAC"}
|
package/src/commands/test.ts
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
import type { ShellModule } from "../types/commands";
|
|
2
|
+
import type { VfsFileNode } from "../types/vfs";
|
|
3
|
+
import type { VirtualShell } from "../VirtualShell";
|
|
2
4
|
|
|
3
5
|
/**
|
|
4
6
|
* Evaluate a POSIX test expression.
|
|
@@ -8,7 +10,7 @@ import type { ShellModule } from "../types/commands";
|
|
|
8
10
|
*/
|
|
9
11
|
function evalTest(
|
|
10
12
|
tokens: string[],
|
|
11
|
-
shell:
|
|
13
|
+
shell: VirtualShell,
|
|
12
14
|
cwd: string,
|
|
13
15
|
): boolean {
|
|
14
16
|
// When called via [ command, ] is the last arg — strip it
|
|
@@ -68,7 +70,7 @@ function evalTest(
|
|
|
68
70
|
return (
|
|
69
71
|
shell.vfs.exists(path) &&
|
|
70
72
|
shell.vfs.stat(path).type === "file" &&
|
|
71
|
-
(shell.vfs.stat(path) as
|
|
73
|
+
(shell.vfs.stat(path) as VfsFileNode).size > 0
|
|
72
74
|
);
|
|
73
75
|
case "-z":
|
|
74
76
|
return operand.length === 0;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"touch.d.ts","sourceRoot":"","sources":["touch.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAGrD;;;;GAIG;AACH,eAAO,MAAM,YAAY,EAAE,WAmB1B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tr.d.ts","sourceRoot":"","sources":["tr.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAgCrD,eAAO,MAAM,SAAS,EAAE,WAqCvB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tree.d.ts","sourceRoot":"","sources":["tree.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAIrD;;;;GAIG;AACH,eAAO,MAAM,WAAW,EAAE,WAUzB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"true.d.ts","sourceRoot":"","sources":["true.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAErD;;;;GAIG;AACH,eAAO,MAAM,WAAW,EAAE,WAMzB,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,YAAY,EAAE,WAM1B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"type.d.ts","sourceRoot":"","sources":["type.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAGrD;;;;GAIG;AACH,eAAO,MAAM,WAAW,EAAE,WAuCzB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"uname.d.ts","sourceRoot":"","sources":["uname.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAGrD;;;;GAIG;AACH,eAAO,MAAM,YAAY,EAAE,WAoB1B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"uniq.d.ts","sourceRoot":"","sources":["uniq.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAGrD;;;;GAIG;AACH,eAAO,MAAM,WAAW,EAAE,WA8BzB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"unset.d.ts","sourceRoot":"","sources":["unset.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAErD;;;;GAIG;AACH,eAAO,MAAM,YAAY,EAAE,WAS1B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"uptime.d.ts","sourceRoot":"","sources":["uptime.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAGrD;;;;GAIG;AACH,eAAO,MAAM,aAAa,EAAE,WA6C3B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wc.d.ts","sourceRoot":"","sources":["wc.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAIrD;;;;GAIG;AACH,eAAO,MAAM,SAAS,EAAE,WA6CvB,CAAC"}
|
|
@@ -17,7 +17,7 @@ export const wcCommand = {
|
|
|
17
17
|
const showAll = !lines && !words && !bytes;
|
|
18
18
|
const positionals = args.filter((a) => !a.startsWith("-"));
|
|
19
19
|
const count = (content, label) => {
|
|
20
|
-
const l = content.
|
|
20
|
+
const l = content.length === 0 ? 0 : content.trim().split("\n").length;
|
|
21
21
|
const w = content.trim().split(/\s+/).filter(Boolean).length;
|
|
22
22
|
const c = Buffer.byteLength(content, "utf8");
|
|
23
23
|
const parts = [];
|
package/src/commands/wc.ts
CHANGED
|
@@ -20,7 +20,7 @@ export const wcCommand: ShellModule = {
|
|
|
20
20
|
const positionals = args.filter((a) => !a.startsWith("-"));
|
|
21
21
|
|
|
22
22
|
const count = (content: string, label: string): string => {
|
|
23
|
-
const l = content.
|
|
23
|
+
const l = content.length === 0 ? 0 : content.trim().split("\n").length;
|
|
24
24
|
const w = content.trim().split(/\s+/).filter(Boolean).length;
|
|
25
25
|
const c = Buffer.byteLength(content, "utf8");
|
|
26
26
|
const parts: string[] = [];
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wget.d.ts","sourceRoot":"","sources":["wget.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAIrD;;;;GAIG;AACH,eAAO,MAAM,WAAW,EAAE,WA0IzB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"which.d.ts","sourceRoot":"","sources":["which.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAErD,eAAO,MAAM,YAAY,EAAE,WAkC1B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"who.d.ts","sourceRoot":"","sources":["who.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAErD;;;;GAIG;AACH,eAAO,MAAM,UAAU,EAAE,WAgBxB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"whoami.d.ts","sourceRoot":"","sources":["whoami.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAErD;;;;GAIG;AACH,eAAO,MAAM,aAAa,EAAE,WAM3B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"xargs.d.ts","sourceRoot":"","sources":["xargs.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAGrD;;;;GAIG;AACH,eAAO,MAAM,YAAY,EAAE,WAsB1B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAC9C,OAAO,EAAE,SAAS,IAAI,iBAAiB,EAAE,QAAQ,IAAI,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAChG,OAAO,EAAE,OAAO,IAAI,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AACzE,OAAO,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AACtE,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAEhE,YAAY,EACX,aAAa,EACb,aAAa,EACb,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EACX,cAAc,EACd,WAAW,EACX,cAAc,EACd,aAAa,EACb,iBAAiB,EACjB,QAAQ,EACR,WAAW,EACX,aAAa,EACb,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC/D,YAAY,EACX,aAAa,EACb,WAAW,EACX,gBAAgB,EAChB,WAAW,EACX,YAAY,EACZ,WAAW,EACX,WAAW,EACX,mBAAmB,EACnB,wBAAwB,EACxB,mBAAmB,EACnB,eAAe,EACf,gBAAgB,EAChB,MAAM,aAAa,CAAC;AACrB,YAAY,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAChF,YAAY,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAE5D,YAAY,EACX,gBAAgB,EAAE,iBAAiB,EACnC,WAAW,EACX,MAAM,+BAA+B,CAAC;AAEvC,OAAO,EACN,UAAU,EAAE,aAAa,EACzB,UAAU,EACV,MAAM,iBAAiB,CAAC;AACzB,YAAY,EACX,OAAO,EACP,YAAY,EACZ,eAAe,EACf,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EACN,MAAM,EACN,OAAO,EACP,MAAM,EACN,MAAM,4BAA4B,CAAC"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/** biome-ignore-all lint/style/useNamingConvention: ENV VAR KEYS + system names */
|
|
2
|
+
/**
|
|
3
|
+
* linuxRootfs.ts
|
|
4
|
+
*
|
|
5
|
+
* Bootstraps a realistic Linux directory hierarchy in the VFS.
|
|
6
|
+
* Called once during VirtualShell initialization. Idempotent — skips
|
|
7
|
+
* paths that already exist so FS-mode snapshots survive restarts.
|
|
8
|
+
*
|
|
9
|
+
* Public API:
|
|
10
|
+
* - bootstrapLinuxRootfs() one-shot boot (VirtualShell calls this)
|
|
11
|
+
* - refreshProc() refresh /proc/* (call on session changes)
|
|
12
|
+
* - syncEtcPasswd() sync /etc/passwd|group|shadow from UserManager
|
|
13
|
+
* - createLinuxRootfsEngine() returns engine with .boot() + .tick() for
|
|
14
|
+
* runtimes that want a live refresh loop
|
|
15
|
+
*/
|
|
16
|
+
import type VirtualFileSystem from "../VirtualFileSystem";
|
|
17
|
+
import type { ShellProperties } from "../VirtualShell";
|
|
18
|
+
import type { VirtualActiveSession, VirtualUserManager } from "../VirtualUserManager";
|
|
19
|
+
/**
|
|
20
|
+
* Sync `/etc/passwd`, `/etc/group`, and `/etc/shadow` from the
|
|
21
|
+
* VirtualUserManager's current user list into the VFS.
|
|
22
|
+
*/
|
|
23
|
+
export declare function syncEtcPasswd(vfs: VirtualFileSystem, users: VirtualUserManager): void;
|
|
24
|
+
/**
|
|
25
|
+
* Populate and refresh `/proc` virtual entries based on host stats and
|
|
26
|
+
* provided active sessions. Rewrites uptime, meminfo, cpuinfo, loadavg,
|
|
27
|
+
* per-pid entries, and /proc/self.
|
|
28
|
+
*
|
|
29
|
+
* Safe to call repeatedly — acts as a live kernel state snapshot.
|
|
30
|
+
*/
|
|
31
|
+
export declare function refreshProc(vfs: VirtualFileSystem, props: ShellProperties, hostname: string, shellStartTime: number, sessions?: VirtualActiveSession[]): void;
|
|
32
|
+
/**
|
|
33
|
+
* Bootstraps the full Linux rootfs hierarchy in the VFS.
|
|
34
|
+
* Safe to call multiple times — idempotent.
|
|
35
|
+
*
|
|
36
|
+
* @param vfs Target virtual filesystem.
|
|
37
|
+
* @param users User manager (for /etc/passwd sync).
|
|
38
|
+
* @param hostname Virtual hostname.
|
|
39
|
+
* @param props Shell properties (kernel, os, arch).
|
|
40
|
+
* @param shellStartTime Unix ms of shell creation (for uptime).
|
|
41
|
+
* @param sessions Active sessions (for /proc/<pid> population).
|
|
42
|
+
*/
|
|
43
|
+
export declare function bootstrapLinuxRootfs(vfs: VirtualFileSystem, users: VirtualUserManager, hostname: string, props: ShellProperties, shellStartTime: number, sessions?: VirtualActiveSession[]): void;
|
|
44
|
+
/**
|
|
45
|
+
* Engine for runtimes that want periodic /proc refresh (e.g. web shell
|
|
46
|
+
* with live `top`/`ps` output). Call `.boot()` once, then `.tick()` on
|
|
47
|
+
* each session change or on a timer.
|
|
48
|
+
*
|
|
49
|
+
* ```ts
|
|
50
|
+
* const engine = createLinuxRootfsEngine(vfs, props, hostname, Date.now());
|
|
51
|
+
* engine.boot(users, sessions);
|
|
52
|
+
* setInterval(() => engine.tick(shell.listActiveSessions()), 5000);
|
|
53
|
+
* ```
|
|
54
|
+
*/
|
|
55
|
+
export declare function createLinuxRootfsEngine(vfs: VirtualFileSystem, props: ShellProperties, hostname: string, startTime: number): {
|
|
56
|
+
boot(users: VirtualUserManager, sessions?: VirtualActiveSession[]): void;
|
|
57
|
+
tick(sessions?: VirtualActiveSession[]): void;
|
|
58
|
+
};
|
|
59
|
+
//# sourceMappingURL=linuxRootfs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"linuxRootfs.d.ts","sourceRoot":"","sources":["linuxRootfs.ts"],"names":[],"mappings":"AAAA,mFAAmF;AACnF;;;;;;;;;;;;;GAaG;AAGH,OAAO,KAAK,iBAAiB,MAAM,sBAAsB,CAAC;AAC1D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AACvD,OAAO,KAAK,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAwLtF;;;GAGG;AACH,wBAAgB,aAAa,CAC5B,GAAG,EAAE,iBAAiB,EACtB,KAAK,EAAE,kBAAkB,GACvB,IAAI,CAsCN;AAoFD;;;;;;GAMG;AACH,wBAAgB,WAAW,CAC1B,GAAG,EAAE,iBAAiB,EACtB,KAAK,EAAE,eAAe,EACtB,QAAQ,EAAE,MAAM,EAChB,cAAc,EAAE,MAAM,EACtB,QAAQ,GAAE,oBAAoB,EAAO,GACnC,IAAI,CAiLN;AAwPD;;;;;;;;;;GAUG;AACH,wBAAgB,oBAAoB,CACnC,GAAG,EAAE,iBAAiB,EACtB,KAAK,EAAE,kBAAkB,EACzB,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,eAAe,EACtB,cAAc,EAAE,MAAM,EACtB,QAAQ,GAAE,oBAAoB,EAAO,GACnC,IAAI,CAaN;AAID;;;;;;;;;;GAUG;AACH,wBAAgB,uBAAuB,CACtC,GAAG,EAAE,iBAAiB,EACtB,KAAK,EAAE,eAAe,EACtB,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM;gBAGJ,kBAAkB,aAAY,oBAAoB,EAAE;oBAGjD,oBAAoB,EAAE;EAItC"}
|