buninu-linux 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/LICENSES/Bun-LICENSE.md +84 -0
- package/LICENSES/GCC-Runtime-Library-Exception-3.1.txt +73 -0
- package/LICENSES/GPL-2.0.txt +338 -0
- package/LICENSES/GPL-3.0.txt +674 -0
- package/LICENSES/LGPL-2.1.txt +501 -0
- package/LICENSES/Linux-syscall-note.txt +25 -0
- package/LICENSES/musl-COPYRIGHT.txt +193 -0
- package/NOTICE.md +184 -0
- package/README.md +537 -0
- package/build-image.sh +44 -0
- package/build-uki.sh +75 -0
- package/fetch-alpine.sh +80 -0
- package/fetch-bun.sh +41 -0
- package/fetch-plus-build.sh +11 -0
- package/hello/build-hello.sh +14 -0
- package/hello/hello.c +50 -0
- package/index.js +235 -0
- package/initramfs/bin/sh +3 -0
- package/initramfs/buninu/.bashrc +11 -0
- package/initramfs/buninu/ARCHITECTURE.md +452 -0
- package/initramfs/buninu/CHANGELOG.md +580 -0
- package/initramfs/buninu/LICENSE +21 -0
- package/initramfs/buninu/README.md +1161 -0
- package/initramfs/buninu/apps/bun/make-bunBin.sh +99 -0
- package/initramfs/buninu/apps/bunmsh/CHANGELOG.md +493 -0
- package/initramfs/buninu/apps/bunmsh/LICENSE +21 -0
- package/initramfs/buninu/apps/bunmsh/LICENSE-MICRO +58 -0
- package/initramfs/buninu/apps/bunmsh/LICENSE-MKSH +295 -0
- package/initramfs/buninu/apps/bunmsh/PORTING.md +192 -0
- package/initramfs/buninu/apps/bunmsh/README.md +1042 -0
- package/initramfs/buninu/apps/bunmsh/bunmsh +7 -0
- package/initramfs/buninu/apps/bunmsh/bunshell.md +61 -0
- package/initramfs/buninu/apps/bunmsh/help/README.md +2237 -0
- package/initramfs/buninu/apps/bunmsh/help/alias.md +22 -0
- package/initramfs/buninu/apps/bunmsh/help/basename.md +38 -0
- package/initramfs/buninu/apps/bunmsh/help/builtin.md +25 -0
- package/initramfs/buninu/apps/bunmsh/help/bun.md +27 -0
- package/initramfs/buninu/apps/bunmsh/help/bunmsh.md +47 -0
- package/initramfs/buninu/apps/bunmsh/help/cat.md +31 -0
- package/initramfs/buninu/apps/bunmsh/help/catfancy.md +35 -0
- package/initramfs/buninu/apps/bunmsh/help/cd.md +22 -0
- package/initramfs/buninu/apps/bunmsh/help/chmod.md +27 -0
- package/initramfs/buninu/apps/bunmsh/help/clear.md +21 -0
- package/initramfs/buninu/apps/bunmsh/help/colon.md +22 -0
- package/initramfs/buninu/apps/bunmsh/help/command.md +27 -0
- package/initramfs/buninu/apps/bunmsh/help/cp.md +28 -0
- package/initramfs/buninu/apps/bunmsh/help/curl.md +181 -0
- package/initramfs/buninu/apps/bunmsh/help/cut.md +25 -0
- package/initramfs/buninu/apps/bunmsh/help/date.md +25 -0
- package/initramfs/buninu/apps/bunmsh/help/dirname.md +25 -0
- package/initramfs/buninu/apps/bunmsh/help/echo.md +25 -0
- package/initramfs/buninu/apps/bunmsh/help/env.md +27 -0
- package/initramfs/buninu/apps/bunmsh/help/eval.md +22 -0
- package/initramfs/buninu/apps/bunmsh/help/exec.md +22 -0
- package/initramfs/buninu/apps/bunmsh/help/exit.md +21 -0
- package/initramfs/buninu/apps/bunmsh/help/export.md +22 -0
- package/initramfs/buninu/apps/bunmsh/help/false.md +22 -0
- package/initramfs/buninu/apps/bunmsh/help/find.md +33 -0
- package/initramfs/buninu/apps/bunmsh/help/getopts.md +28 -0
- package/initramfs/buninu/apps/bunmsh/help/grep.md +34 -0
- package/initramfs/buninu/apps/bunmsh/help/head.md +27 -0
- package/initramfs/buninu/apps/bunmsh/help/kill.md +43 -0
- package/initramfs/buninu/apps/bunmsh/help/ln.md +28 -0
- package/initramfs/buninu/apps/bunmsh/help/ls.md +37 -0
- package/initramfs/buninu/apps/bunmsh/help/lsbun.md +29 -0
- package/initramfs/buninu/apps/bunmsh/help/lsfancy.md +37 -0
- package/initramfs/buninu/apps/bunmsh/help/md5sum.md +21 -0
- package/initramfs/buninu/apps/bunmsh/help/mkdir.md +27 -0
- package/initramfs/buninu/apps/bunmsh/help/mktemp.md +26 -0
- package/initramfs/buninu/apps/bunmsh/help/mv.md +26 -0
- package/initramfs/buninu/apps/bunmsh/help/print.md +30 -0
- package/initramfs/buninu/apps/bunmsh/help/printf.md +25 -0
- package/initramfs/buninu/apps/bunmsh/help/pspa.md +38 -0
- package/initramfs/buninu/apps/bunmsh/help/pspac.md +57 -0
- package/initramfs/buninu/apps/bunmsh/help/pwd.md +21 -0
- package/initramfs/buninu/apps/bunmsh/help/read.md +27 -0
- package/initramfs/buninu/apps/bunmsh/help/readonly.md +27 -0
- package/initramfs/buninu/apps/bunmsh/help/realpath.md +21 -0
- package/initramfs/buninu/apps/bunmsh/help/rm.md +33 -0
- package/initramfs/buninu/apps/bunmsh/help/rmdir.md +27 -0
- package/initramfs/buninu/apps/bunmsh/help/sed.md +29 -0
- package/initramfs/buninu/apps/bunmsh/help/seq.md +29 -0
- package/initramfs/buninu/apps/bunmsh/help/serve.md +50 -0
- package/initramfs/buninu/apps/bunmsh/help/set.md +26 -0
- package/initramfs/buninu/apps/bunmsh/help/sha256sum.md +21 -0
- package/initramfs/buninu/apps/bunmsh/help/shift.md +23 -0
- package/initramfs/buninu/apps/bunmsh/help/sleep.md +25 -0
- package/initramfs/buninu/apps/bunmsh/help/sort.md +29 -0
- package/initramfs/buninu/apps/bunmsh/help/source.md +23 -0
- package/initramfs/buninu/apps/bunmsh/help/tab.md +30 -0
- package/initramfs/buninu/apps/bunmsh/help/tac.md +29 -0
- package/initramfs/buninu/apps/bunmsh/help/tail.md +27 -0
- package/initramfs/buninu/apps/bunmsh/help/tee.md +25 -0
- package/initramfs/buninu/apps/bunmsh/help/test.md +30 -0
- package/initramfs/buninu/apps/bunmsh/help/time.md +29 -0
- package/initramfs/buninu/apps/bunmsh/help/touch.md +26 -0
- package/initramfs/buninu/apps/bunmsh/help/tr.md +26 -0
- package/initramfs/buninu/apps/bunmsh/help/true.md +22 -0
- package/initramfs/buninu/apps/bunmsh/help/type.md +21 -0
- package/initramfs/buninu/apps/bunmsh/help/umask.md +22 -0
- package/initramfs/buninu/apps/bunmsh/help/unalias.md +28 -0
- package/initramfs/buninu/apps/bunmsh/help/uname.md +31 -0
- package/initramfs/buninu/apps/bunmsh/help/unset.md +28 -0
- package/initramfs/buninu/apps/bunmsh/help/wc.md +27 -0
- package/initramfs/buninu/apps/bunmsh/help/whence.md +26 -0
- package/initramfs/buninu/apps/bunmsh/help/which.md +41 -0
- package/initramfs/buninu/apps/bunmsh/help/yes.md +23 -0
- package/initramfs/buninu/apps/bunmsh/index.js +7 -0
- package/initramfs/buninu/apps/bunmsh/package.json +30 -0
- package/initramfs/buninu/apps/bunmsh/serve.js +468 -0
- package/initramfs/buninu/apps/bunmsh/single-exe/README.md +402 -0
- package/initramfs/buninu/apps/bunmsh/single-exe/assetsHelper.js +371 -0
- package/initramfs/buninu/apps/bunmsh/single-exe/assetsLoader.mjs +85 -0
- package/initramfs/buninu/apps/bunmsh/single-exe/assetsPacker.js +218 -0
- package/initramfs/buninu/apps/bunmsh/single-exe/compiled.js +527 -0
- package/initramfs/buninu/apps/bunmsh/single-exe/entry.mjs +17 -0
- package/initramfs/buninu/apps/bunmsh/src/cat-fancy.js +117 -0
- package/initramfs/buninu/apps/bunmsh/src/cat-operands.js +31 -0
- package/initramfs/buninu/apps/bunmsh/src/completion.js +363 -0
- package/initramfs/buninu/apps/bunmsh/src/curl.js +1191 -0
- package/initramfs/buninu/apps/bunmsh/src/environment.js +61 -0
- package/initramfs/buninu/apps/bunmsh/src/fancy-ls.js +186 -0
- package/initramfs/buninu/apps/bunmsh/src/find.js +119 -0
- package/initramfs/buninu/apps/bunmsh/src/history.js +198 -0
- package/initramfs/buninu/apps/bunmsh/src/main.js +850 -0
- package/initramfs/buninu/apps/bunmsh/src/mouse.js +103 -0
- package/initramfs/buninu/apps/bunmsh/src/shell.js +3932 -0
- package/initramfs/buninu/apps/bunmsh/test/catfancy.test.js +102 -0
- package/initramfs/buninu/apps/bunmsh/test/curl.test.js +335 -0
- package/initramfs/buninu/apps/bunmsh/test/reference-source.sh +1 -0
- package/initramfs/buninu/apps/bunmsh/test/reference.test.js +817 -0
- package/initramfs/buninu/apps/bunmsh/test/serve/README.md +3 -0
- package/initramfs/buninu/apps/bunmsh/test/serve/bad.json +1 -0
- package/initramfs/buninu/apps/bunmsh/test/serve/data.json +1 -0
- package/initramfs/buninu/apps/bunmsh/test/serve/data.json5 +1 -0
- package/initramfs/buninu/apps/bunmsh/test/serve/data.jsonc +2 -0
- package/initramfs/buninu/apps/bunmsh/test/serve/data.jsonl +2 -0
- package/initramfs/buninu/apps/bunmsh/test/serve/data.ndjson +1 -0
- package/initramfs/buninu/apps/bunmsh/test/serve/data.toml +3 -0
- package/initramfs/buninu/apps/bunmsh/test/serve/data.ts +15 -0
- package/initramfs/buninu/apps/bunmsh/test/serve/data.xml +1 -0
- package/initramfs/buninu/apps/bunmsh/test/serve/data.yaml +3 -0
- package/initramfs/buninu/apps/bunmsh/test/serve/data.yml +1 -0
- package/initramfs/buninu/apps/bunmsh/test/serve.test.js +241 -0
- package/initramfs/buninu/apps/bunmsh/test/shell.test.js +2092 -0
- package/initramfs/buninu/apps/bunmsh/test/shell1.test.js +1087 -0
- package/initramfs/buninu/apps/bunmsh/test/shell2.test.js +457 -0
- package/initramfs/buninu/apps/bunmsh/test/shell3.test.js +741 -0
- package/initramfs/buninu/apps/bunmsh/test/t.sh +12 -0
- package/initramfs/buninu/apps/bunx/bunx.js +172 -0
- package/initramfs/buninu/apps/cmdlist +48 -0
- package/initramfs/buninu/apps/jsgotty/LICENSE +23 -0
- package/initramfs/buninu/apps/jsgotty/LICENSES/Apache-2.0-zmodem.js.txt +201 -0
- package/initramfs/buninu/apps/jsgotty/NOTICE +21 -0
- package/initramfs/buninu/apps/jsgotty/README.en.md +294 -0
- package/initramfs/buninu/apps/jsgotty/README.md +296 -0
- package/initramfs/buninu/apps/jsgotty/client.mjs +700 -0
- package/initramfs/buninu/apps/jsgotty/env.sh +2 -0
- package/initramfs/buninu/apps/jsgotty/gotty.js +3334 -0
- package/initramfs/buninu/apps/jsgotty/node_modules/.package-lock.json +35 -0
- package/initramfs/buninu/apps/jsgotty/node_modules/node-addon-api/LICENSE.md +9 -0
- package/initramfs/buninu/apps/jsgotty/node_modules/node-addon-api/README.md +319 -0
- package/initramfs/buninu/apps/jsgotty/node_modules/node-addon-api/common.gypi +20 -0
- package/initramfs/buninu/apps/jsgotty/node_modules/node-addon-api/except.gypi +25 -0
- package/initramfs/buninu/apps/jsgotty/node_modules/node-addon-api/index.js +12 -0
- package/initramfs/buninu/apps/jsgotty/node_modules/node-addon-api/napi-inl.deprecated.h +186 -0
- package/initramfs/buninu/apps/jsgotty/node_modules/node-addon-api/napi-inl.h +6607 -0
- package/initramfs/buninu/apps/jsgotty/node_modules/node-addon-api/napi.h +3201 -0
- package/initramfs/buninu/apps/jsgotty/node_modules/node-addon-api/node_addon_api.gyp +32 -0
- package/initramfs/buninu/apps/jsgotty/node_modules/node-addon-api/node_api.gyp +9 -0
- package/initramfs/buninu/apps/jsgotty/node_modules/node-addon-api/noexcept.gypi +26 -0
- package/initramfs/buninu/apps/jsgotty/node_modules/node-addon-api/nothing.c +0 -0
- package/initramfs/buninu/apps/jsgotty/node_modules/node-addon-api/package-support.json +21 -0
- package/initramfs/buninu/apps/jsgotty/node_modules/node-addon-api/package.json +480 -0
- package/initramfs/buninu/apps/jsgotty/node_modules/node-addon-api/tools/README.md +73 -0
- package/initramfs/buninu/apps/jsgotty/node_modules/node-addon-api/tools/check-napi.js +99 -0
- package/initramfs/buninu/apps/jsgotty/node_modules/node-addon-api/tools/clang-format.js +71 -0
- package/initramfs/buninu/apps/jsgotty/node_modules/node-addon-api/tools/conversion.js +301 -0
- package/initramfs/buninu/apps/jsgotty/node_modules/node-addon-api/tools/eslint-format.js +79 -0
- package/initramfs/buninu/apps/jsgotty/node_modules/ws/LICENSE +20 -0
- package/initramfs/buninu/apps/jsgotty/node_modules/ws/README.md +548 -0
- package/initramfs/buninu/apps/jsgotty/node_modules/ws/browser.js +8 -0
- package/initramfs/buninu/apps/jsgotty/node_modules/ws/index.js +22 -0
- package/initramfs/buninu/apps/jsgotty/node_modules/ws/lib/buffer-util.js +131 -0
- package/initramfs/buninu/apps/jsgotty/node_modules/ws/lib/constants.js +19 -0
- package/initramfs/buninu/apps/jsgotty/node_modules/ws/lib/event-target.js +292 -0
- package/initramfs/buninu/apps/jsgotty/node_modules/ws/lib/extension.js +203 -0
- package/initramfs/buninu/apps/jsgotty/node_modules/ws/lib/limiter.js +55 -0
- package/initramfs/buninu/apps/jsgotty/node_modules/ws/lib/permessage-deflate.js +528 -0
- package/initramfs/buninu/apps/jsgotty/node_modules/ws/lib/receiver.js +760 -0
- package/initramfs/buninu/apps/jsgotty/node_modules/ws/lib/sender.js +607 -0
- package/initramfs/buninu/apps/jsgotty/node_modules/ws/lib/stream.js +161 -0
- package/initramfs/buninu/apps/jsgotty/node_modules/ws/lib/subprotocol.js +62 -0
- package/initramfs/buninu/apps/jsgotty/node_modules/ws/lib/validation.js +152 -0
- package/initramfs/buninu/apps/jsgotty/node_modules/ws/lib/websocket-server.js +562 -0
- package/initramfs/buninu/apps/jsgotty/node_modules/ws/lib/websocket.js +1407 -0
- package/initramfs/buninu/apps/jsgotty/node_modules/ws/package.json +70 -0
- package/initramfs/buninu/apps/jsgotty/node_modules/ws/wrapper.mjs +21 -0
- package/initramfs/buninu/apps/jsgotty/package-lock.json +46 -0
- package/initramfs/buninu/apps/jsgotty/package.json +19 -0
- package/initramfs/buninu/apps/jsgotty/patches/windowsPtyAgent.js +326 -0
- package/initramfs/buninu/apps/jsgotty/patches/windowsTerminal.js +204 -0
- package/initramfs/buninu/apps/jsgotty/rz.js +199 -0
- package/initramfs/buninu/apps/jsgotty/single-exe/README.md +384 -0
- package/initramfs/buninu/apps/jsgotty/single-exe/assetsHelper.js +371 -0
- package/initramfs/buninu/apps/jsgotty/single-exe/assetsLoader.mjs +85 -0
- package/initramfs/buninu/apps/jsgotty/single-exe/assetsPacker.js +218 -0
- package/initramfs/buninu/apps/jsgotty/single-exe/compiled.js +498 -0
- package/initramfs/buninu/apps/jsgotty/single-exe/entry.mjs +23 -0
- package/initramfs/buninu/apps/jsgotty/single-exe/packAssets.sh +7 -0
- package/initramfs/buninu/apps/jsgotty/static/css/index.css +13 -0
- package/initramfs/buninu/apps/jsgotty/static/css/kitty.css +61 -0
- package/initramfs/buninu/apps/jsgotty/static/css/xterm.css +218 -0
- package/initramfs/buninu/apps/jsgotty/static/css/xterm_customize.css +35 -0
- package/initramfs/buninu/apps/jsgotty/static/favicon.ico +0 -0
- package/initramfs/buninu/apps/jsgotty/static/help.md +125 -0
- package/initramfs/buninu/apps/jsgotty/static/icon.svg +66 -0
- package/initramfs/buninu/apps/jsgotty/static/icon_192.png +0 -0
- package/initramfs/buninu/apps/jsgotty/static/index.html +164 -0
- package/initramfs/buninu/apps/jsgotty/static/js/gotty.js +31537 -0
- package/initramfs/buninu/apps/jsgotty/static/js/gotty.js.LICENSE.txt +7 -0
- package/initramfs/buninu/apps/jsgotty/static/js/gotty.js.map +1 -0
- package/initramfs/buninu/apps/jsgotty/static/js/gotty.licenses.txt +650 -0
- package/initramfs/buninu/apps/jsgotty/static/js/kitty.js +1101 -0
- package/initramfs/buninu/apps/jsgotty/static/js/windows_bridge.js +194 -0
- package/initramfs/buninu/apps/jsgotty/static/js/xterm-addon-unicode11.js +2 -0
- package/initramfs/buninu/apps/jsgotty/static/js/zmodem.js +1 -0
- package/initramfs/buninu/apps/jsgotty/static/manifest.json +15 -0
- package/initramfs/buninu/apps/jsgotty/sz.js +273 -0
- package/initramfs/buninu/apps/jsgotty/tests/kitty-order.test.js +58 -0
- package/initramfs/buninu/apps/jsgotty/tests/websocket-origin.test.js +54 -0
- package/initramfs/buninu/apps/jsgotty/viu.mjs +422 -0
- package/initramfs/buninu/apps/jsgotty/wgotty +62 -0
- package/initramfs/buninu/apps/jsgotty/windows-bridge-node.js +60 -0
- package/initramfs/buninu/apps/jsgotty/zmodem-node.js +262 -0
- package/initramfs/buninu/apps/jsmdcui/CHANGELOG.md +1118 -0
- package/initramfs/buninu/apps/jsmdcui/LICENSE +22 -0
- package/initramfs/buninu/apps/jsmdcui/README.md +1283 -0
- package/initramfs/buninu/apps/jsmdcui/cdp-maze.js +141 -0
- package/initramfs/buninu/apps/jsmdcui/clean.sh +9 -0
- package/initramfs/buninu/apps/jsmdcui/demos/basic.jpg +0 -0
- package/initramfs/buninu/apps/jsmdcui/demos/chinese.md +32 -0
- package/initramfs/buninu/apps/jsmdcui/demos/event.md +170 -0
- package/initramfs/buninu/apps/jsmdcui/demos/good.jpg +0 -0
- package/initramfs/buninu/apps/jsmdcui/demos/image-processor.md +366 -0
- package/initramfs/buninu/apps/jsmdcui/demos/image-processor.zh-TW.md +366 -0
- package/initramfs/buninu/apps/jsmdcui/demos/img-change.md +73 -0
- package/initramfs/buninu/apps/jsmdcui/demos/imgtool-zh.md +298 -0
- package/initramfs/buninu/apps/jsmdcui/demos/imgtool.md +298 -0
- package/initramfs/buninu/apps/jsmdcui/demos/maze.md +149 -0
- package/initramfs/buninu/apps/jsmdcui/demos/reactive.md +40 -0
- package/initramfs/buninu/apps/jsmdcui/demos/reader.md +513 -0
- package/initramfs/buninu/apps/jsmdcui/demos/select.md +63 -0
- package/initramfs/buninu/apps/jsmdcui/demos/todo-zh.md +190 -0
- package/initramfs/buninu/apps/jsmdcui/demos/todo.md +191 -0
- package/initramfs/buninu/apps/jsmdcui/edit +9 -0
- package/initramfs/buninu/apps/jsmdcui/jsmdcui.sh +16 -0
- package/initramfs/buninu/apps/jsmdcui/llm-maze.txt +94 -0
- package/initramfs/buninu/apps/jsmdcui/package.json +29 -0
- package/initramfs/buninu/apps/jsmdcui/project_structure.txt +35 -0
- package/initramfs/buninu/apps/jsmdcui/runmd.mjs +1140 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/colorschemes/atom-dark.micro +33 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/colorschemes/bubblegum.micro +31 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/colorschemes/cmc-16.micro +47 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/colorschemes/cmc-tc.micro +43 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/colorschemes/darcula.micro +34 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/colorschemes/default.micro +1 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/colorschemes/dracula-tc.micro +49 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/colorschemes/dukedark-tc.micro +38 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/colorschemes/dukelight-tc.micro +38 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/colorschemes/dukeubuntu-tc.micro +38 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/colorschemes/geany.micro +29 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/colorschemes/gotham.micro +29 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/colorschemes/gruvbox-tc.micro +29 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/colorschemes/gruvbox.micro +26 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/colorschemes/material-tc.micro +36 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/colorschemes/monokai-dark.micro +28 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/colorschemes/monokai.micro +34 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/colorschemes/one-dark.micro +39 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/colorschemes/railscast.micro +37 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/colorschemes/simple.micro +33 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/colorschemes/solarized-tc.micro +31 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/colorschemes/solarized.micro +30 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/colorschemes/sunny-day.micro +29 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/colorschemes/twilight.micro +40 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/colorschemes/zenburn.micro +30 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/help/actions.md +161 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/help/cdp.md +130 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/help/colors.md +421 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/help/commands.md +161 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/help/copypaste.md +149 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/help/defaultkeys.md +148 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/help/help.md +1283 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/help/keybindings.md +355 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/help/linter.md +90 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/help/options.md +709 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/help/plugins.md +544 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/help/tutorial.md +112 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/jsplugins/cdp/cdp-server.js +1263 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/jsplugins/cdp/cdp.js +203 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/jsplugins/chapter/chapter.js +111 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/jsplugins/diff/diff.js +46 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/jsplugins/example/example.js +117 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/jsplugins/linter/linter.js +281 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/plugins/autoclose/autoclose.lua +75 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/plugins/ftoptions/ftoptions.lua +17 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/plugins/literate/README.md +5 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/plugins/literate/literate.lua +55 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/plugins/status/help/status.md +21 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/plugins/status/status.lua +62 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/syntax/LICENSE +22 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/syntax/PowerShell.yaml +128 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/syntax/README.md +63 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/syntax/ada.yaml +43 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/syntax/apacheconf.yaml +59 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/syntax/arduino.yaml +101 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/syntax/asciidoc.yaml +51 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/syntax/asm.yaml +123 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/syntax/ats.yaml +99 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/syntax/awk.yaml +44 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/syntax/b.yaml +87 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/syntax/bat.yaml +57 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/syntax/c.yaml +60 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/syntax/caddyfile.yaml +23 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/syntax/cake.yaml +7 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/syntax/clojure.yaml +38 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/syntax/cmake.yaml +42 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/syntax/coffeescript.yaml +56 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/syntax/colortest.yaml +19 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/syntax/conky.yaml +17 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/syntax/cpp.yaml +91 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/syntax/crontab.yaml +36 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/syntax/crystal.yaml +72 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/syntax/csharp.yaml +52 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/syntax/css.yaml +44 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/syntax/csx.yaml +8 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/syntax/cuda.yaml +68 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/syntax/cython.yaml +52 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/syntax/d.yaml +121 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/syntax/dart.yaml +46 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/syntax/default.yaml +10 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/syntax/dockerfile.yaml +36 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/syntax/dot.yaml +29 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/syntax/elixir.yaml +30 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/syntax/elm.yaml +38 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/syntax/erb.yaml +42 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/syntax/erlang.yaml +45 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/syntax/fish.yaml +48 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/syntax/forth.yaml +34 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/syntax/fortran.yaml +64 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/syntax/freebsd-kernel.yaml +14 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/syntax/fsharp.yaml +48 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/syntax/gdscript.yaml +61 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/syntax/gemini.yaml +19 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/syntax/gentoo-ebuild.yaml +48 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/syntax/gentoo-etc-portage.yaml +23 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/syntax/git-commit.yaml +35 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/syntax/git-config.yaml +14 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/syntax/git-rebase-todo.yaml +19 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/syntax/gleam.yaml +69 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/syntax/glsl.yaml +26 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/syntax/gnuplot.yaml +15 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/syntax/go.yaml +62 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/syntax/godoc.yaml +17 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/syntax/golo.yaml +73 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/syntax/gomod.yaml +31 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/syntax/graphql.yaml +47 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/syntax/groff.yaml +30 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/syntax/groovy.yaml +111 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/syntax/haml.yaml +16 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/syntax/hare.yaml +52 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/syntax/haskell.yaml +52 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/syntax/hc.yaml +52 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/syntax/html.yaml +70 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/syntax/html4.yaml +25 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/syntax/html5.yaml +25 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/syntax/ini.yaml +23 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/syntax/inputrc.yaml +14 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/syntax/java.yaml +37 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/syntax/javascript.yaml +124 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/syntax/jinja2.yaml +19 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/syntax/json.yaml +39 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/syntax/jsonnet.yaml +92 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/syntax/julia.yaml +57 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/syntax/justfile.yaml +40 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/syntax/keymap.yaml +27 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/syntax/kickstart.yaml +16 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/syntax/kotlin.yaml +66 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/syntax/kvlang.yaml +67 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/syntax/ledger.yaml +14 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/syntax/lfe.yaml +17 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/syntax/lilypond.yaml +26 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/syntax/lisp.yaml +17 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/syntax/log.yaml +92 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/syntax/lua.yaml +111 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/syntax/mail.yaml +25 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/syntax/makefile.yaml +38 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/syntax/man.yaml +12 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/syntax/markdown.yaml +65 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/syntax/mc.yaml +23 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/syntax/meson.yaml +51 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/syntax/micro.yaml +34 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/syntax/mpdconf.yaml +13 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/syntax/msbuild.yaml +6 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/syntax/nanorc.yaml +16 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/syntax/nftables.yaml +30 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/syntax/nginx.yaml +22 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/syntax/nim.yaml +27 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/syntax/nix.yaml +32 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/syntax/nu.yaml +114 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/syntax/objc.yaml +60 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/syntax/ocaml.yaml +43 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/syntax/octave.yaml +83 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/syntax/odin.yaml +64 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/syntax/pascal.yaml +45 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/syntax/patch.yaml +14 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/syntax/peg.yaml +16 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/syntax/perl.yaml +58 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/syntax/php.yaml +60 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/syntax/pkg-config.yaml +12 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/syntax/po.yaml +12 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/syntax/pony.yaml +37 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/syntax/pov.yaml +21 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/syntax/privoxy-action.yaml +14 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/syntax/privoxy-config.yaml +10 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/syntax/privoxy-filter.yaml +12 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/syntax/proto.yaml +40 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/syntax/prql.yaml +84 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/syntax/puppet.yaml +22 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/syntax/python2.yaml +60 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/syntax/python3.yaml +80 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/syntax/r.yaml +32 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/syntax/raku.yaml +42 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/syntax/reST.yaml +18 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/syntax/renpy.yaml +15 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/syntax/rpmspec.yaml +43 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/syntax/ruby.yaml +73 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/syntax/rust.yaml +78 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/syntax/sage.yaml +60 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/syntax/scad.yaml +53 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/syntax/scala.yaml +33 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/syntax/sed.yaml +13 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/syntax/sh.yaml +69 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/syntax/sls.yaml +15 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/syntax/smalltalk.yaml +55 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/syntax/solidity.yaml +41 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/syntax/sql.yaml +35 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/syntax/stata.yaml +67 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/syntax/svelte.yaml +27 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/syntax/swift.yaml +103 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/syntax/systemd.yaml +16 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/syntax/tcl.yaml +18 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/syntax/terraform.yaml +87 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/syntax/tex.yaml +32 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/syntax/toml.yaml +56 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/syntax/twig.yaml +55 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/syntax/typescript.yaml +49 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/syntax/v.yaml +80 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/syntax/vala.yaml +26 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/syntax/verilog.yaml +60 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/syntax/vhdl.yaml +37 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/syntax/vi.yaml +31 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/syntax/vue.yaml +64 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/syntax/xml.yaml +37 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/syntax/xresources.yaml +14 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/syntax/yaml.yaml +34 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/syntax/yum.yaml +12 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/syntax/zig.yaml +52 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/syntax/zscript.yaml +72 -0
- package/initramfs/buninu/apps/jsmdcui/runtime/syntax/zsh.yaml +52 -0
- package/initramfs/buninu/apps/jsmdcui/single-exe/README.md +396 -0
- package/initramfs/buninu/apps/jsmdcui/single-exe/assetsHelper.js +371 -0
- package/initramfs/buninu/apps/jsmdcui/single-exe/assetsLoader.mjs +85 -0
- package/initramfs/buninu/apps/jsmdcui/single-exe/assetsPacker.js +218 -0
- package/initramfs/buninu/apps/jsmdcui/single-exe/compiled.js +498 -0
- package/initramfs/buninu/apps/jsmdcui/single-exe/entry.mjs +17 -0
- package/initramfs/buninu/apps/jsmdcui/single-exe/packAssets.sh +7 -0
- package/initramfs/buninu/apps/jsmdcui/src/MDCUI_DEFAULT_EDIT +0 -0
- package/initramfs/buninu/apps/jsmdcui/src/buffer/backup.js +165 -0
- package/initramfs/buninu/apps/jsmdcui/src/buffer/buffer.js +126 -0
- package/initramfs/buninu/apps/jsmdcui/src/buffer/fixed3-codec.js +140 -0
- package/initramfs/buninu/apps/jsmdcui/src/buffer/loc.js +38 -0
- package/initramfs/buninu/apps/jsmdcui/src/buffer/message.js +29 -0
- package/initramfs/buninu/apps/jsmdcui/src/build-args.js +40 -0
- package/initramfs/buninu/apps/jsmdcui/src/config/clean.js +172 -0
- package/initramfs/buninu/apps/jsmdcui/src/config/colorscheme.js +99 -0
- package/initramfs/buninu/apps/jsmdcui/src/config/config.js +125 -0
- package/initramfs/buninu/apps/jsmdcui/src/config/defaults.js +109 -0
- package/initramfs/buninu/apps/jsmdcui/src/cui/fence-events.mjs +144 -0
- package/initramfs/buninu/apps/jsmdcui/src/cui/heading-ids.mjs +1568 -0
- package/initramfs/buninu/apps/jsmdcui/src/cui/id-collision.mjs +111 -0
- package/initramfs/buninu/apps/jsmdcui/src/cui/identity.mjs +26 -0
- package/initramfs/buninu/apps/jsmdcui/src/cui/kitty-debug.mjs +25 -0
- package/initramfs/buninu/apps/jsmdcui/src/cui/kitty-images.mjs +280 -0
- package/initramfs/buninu/apps/jsmdcui/src/cui/kitty-mode.mjs +6 -0
- package/initramfs/buninu/apps/jsmdcui/src/cui/rerender-queue.mjs +66 -0
- package/initramfs/buninu/apps/jsmdcui/src/cui/rpc.mjs +1554 -0
- package/initramfs/buninu/apps/jsmdcui/src/cui/server.mjs +128 -0
- package/initramfs/buninu/apps/jsmdcui/src/cui/table-render.mjs +286 -0
- package/initramfs/buninu/apps/jsmdcui/src/cui/table-row-edit.mjs +226 -0
- package/initramfs/buninu/apps/jsmdcui/src/cui/task-checkbox.mjs +60 -0
- package/initramfs/buninu/apps/jsmdcui/src/cui/template-components.mjs +253 -0
- package/initramfs/buninu/apps/jsmdcui/src/cui/text-block-resize.mjs +177 -0
- package/initramfs/buninu/apps/jsmdcui/src/cui/tui-links.mjs +560 -0
- package/initramfs/buninu/apps/jsmdcui/src/display/ansi-style.js +60 -0
- package/initramfs/buninu/apps/jsmdcui/src/highlight/highlighter.js +243 -0
- package/initramfs/buninu/apps/jsmdcui/src/highlight/parser.js +225 -0
- package/initramfs/buninu/apps/jsmdcui/src/index.js +9586 -0
- package/initramfs/buninu/apps/jsmdcui/src/lua/engine.js +68 -0
- package/initramfs/buninu/apps/jsmdcui/src/platform/archive.js +50 -0
- package/initramfs/buninu/apps/jsmdcui/src/platform/clipboard.js +278 -0
- package/initramfs/buninu/apps/jsmdcui/src/platform/commands.js +221 -0
- package/initramfs/buninu/apps/jsmdcui/src/platform/terminal.js +5 -0
- package/initramfs/buninu/apps/jsmdcui/src/plugins/js-bridge.js +3377 -0
- package/initramfs/buninu/apps/jsmdcui/src/plugins/manager.js +674 -0
- package/initramfs/buninu/apps/jsmdcui/src/runtime/encodings.js +10 -0
- package/initramfs/buninu/apps/jsmdcui/src/runtime/registry.js +134 -0
- package/initramfs/buninu/apps/jsmdcui/src/screen/cell-buffer.js +81 -0
- package/initramfs/buninu/apps/jsmdcui/src/screen/events.js +263 -0
- package/initramfs/buninu/apps/jsmdcui/src/screen/screen.js +249 -0
- package/initramfs/buninu/apps/jsmdcui/src/screen/vt100.js +571 -0
- package/initramfs/buninu/apps/jsmdcui/src/shell/shell.js +70 -0
- package/initramfs/buninu/apps/jsmdcui/testapp.md +78 -0
- package/initramfs/buninu/apps/jsmdcui/tests/assets-helper.test.js +150 -0
- package/initramfs/buninu/apps/jsmdcui/tests/backup.test.js +158 -0
- package/initramfs/buninu/apps/jsmdcui/tests/cat-markdown.test.js +139 -0
- package/initramfs/buninu/apps/jsmdcui/tests/cdp-security.test.js +32 -0
- package/initramfs/buninu/apps/jsmdcui/tests/cdp-websocket-test.html +46 -0
- package/initramfs/buninu/apps/jsmdcui/tests/cmphex3b64.js +95 -0
- package/initramfs/buninu/apps/jsmdcui/tests/compiled-runtime.test.js +139 -0
- package/initramfs/buninu/apps/jsmdcui/tests/config-settings.test.js +52 -0
- package/initramfs/buninu/apps/jsmdcui/tests/demo.test.js +448 -0
- package/initramfs/buninu/apps/jsmdcui/tests/docs-sync.test.js +14 -0
- package/initramfs/buninu/apps/jsmdcui/tests/fence-events.test.js +1293 -0
- package/initramfs/buninu/apps/jsmdcui/tests/heading-ids.test.js +559 -0
- package/initramfs/buninu/apps/jsmdcui/tests/heading-list-selector.test.js +2393 -0
- package/initramfs/buninu/apps/jsmdcui/tests/id-collision.test.js +514 -0
- package/initramfs/buninu/apps/jsmdcui/tests/jmigt.js +16 -0
- package/initramfs/buninu/apps/jsmdcui/tests/js-plugin-prompts.test.js +110 -0
- package/initramfs/buninu/apps/jsmdcui/tests/key-event.md +10 -0
- package/initramfs/buninu/apps/jsmdcui/tests/kitty-demo.md +184 -0
- package/initramfs/buninu/apps/jsmdcui/tests/kitty-images.test.js +288 -0
- package/initramfs/buninu/apps/jsmdcui/tests/kitty-mode.test.js +14 -0
- package/initramfs/buninu/apps/jsmdcui/tests/platform-commands.test.js +18 -0
- package/initramfs/buninu/apps/jsmdcui/tests/platform-terminal.test.js +8 -0
- package/initramfs/buninu/apps/jsmdcui/tests/pty-demo.js +492 -0
- package/initramfs/buninu/apps/jsmdcui/tests/rerender-queue.test.js +130 -0
- package/initramfs/buninu/apps/jsmdcui/tests/table-render.test.js +150 -0
- package/initramfs/buninu/apps/jsmdcui/tests/table-row-edit.test.js +138 -0
- package/initramfs/buninu/apps/jsmdcui/tests/task-checkbox.test.js +33 -0
- package/initramfs/buninu/apps/jsmdcui/tests/template-components.test.js +422 -0
- package/initramfs/buninu/apps/jsmdcui/tests/text-block-resize.test.js +222 -0
- package/initramfs/buninu/apps/jsmdcui/tests/textarea.md +8 -0
- package/initramfs/buninu/apps/jsmdcui/tests/tui-links.test.js +298 -0
- package/initramfs/buninu/apps/jsmdcui/tests/wui-responsive-images.test.js +60 -0
- package/initramfs/buninu/apps/jsmdcui/tests/wui.test.js +108 -0
- package/initramfs/buninu/apps/jsmdcui/tests/wv-client.js +96 -0
- package/initramfs/buninu/apps/jsmdcui/tui +7 -0
- package/initramfs/buninu/apps/jsmdcui/wui +9 -0
- package/initramfs/buninu/apps/musl-la/LICENSES/GPL-3.0.txt +674 -0
- package/initramfs/buninu/apps/musl-la/LICENSES/gcc_runtime_exception.txt +73 -0
- package/initramfs/buninu/apps/musl-la/LICENSE_musl.txt +193 -0
- package/initramfs/buninu/apps/musl-la/NOTICE +41 -0
- package/initramfs/buninu/apps/musl-la/ld-musl-aarch64.so.1 +0 -0
- package/initramfs/buninu/apps/musl-la/libgcc_s.so.1 +0 -0
- package/initramfs/buninu/apps/musl-la/libstdc++.so.6 +0 -0
- package/initramfs/buninu/apps/musl-la/musl-la.sh +36 -0
- package/initramfs/buninu/apps/native-bridge/native-bridge.js +199 -0
- package/initramfs/buninu/apps/native-bridge/package.json +8 -0
- package/initramfs/buninu/apps/tts/tts.js +214 -0
- package/initramfs/buninu/apps/xclip/xclip.js +121 -0
- package/initramfs/buninu/apps/xdg-open/xdg-open.js +151 -0
- package/initramfs/buninu/bin/bun.bat +37 -0
- package/initramfs/buninu/bin/bun.sh +57 -0
- package/initramfs/buninu/bin/buninu-help.bat +4 -0
- package/initramfs/buninu/bin/buninu-help.sh +7 -0
- package/initramfs/buninu/bin/bunmsh.bat +3 -0
- package/initramfs/buninu/bin/bunmsh.sh +5 -0
- package/initramfs/buninu/bin/bunx.bat +3 -0
- package/initramfs/buninu/bin/glow.bat +3 -0
- package/initramfs/buninu/bin/glow.sh +5 -0
- package/initramfs/buninu/bin/init.js +779 -0
- package/initramfs/buninu/bin/install.js +570 -0
- package/initramfs/buninu/bin/jmi.bat +3 -0
- package/initramfs/buninu/bin/jmi.sh +5 -0
- package/initramfs/buninu/bin/jsgotty.bat +3 -0
- package/initramfs/buninu/bin/jsgotty.sh +5 -0
- package/initramfs/buninu/bin/jsmdcui.bat +11 -0
- package/initramfs/buninu/bin/libsh-loader.c +135 -0
- package/initramfs/buninu/bin/libsh-loader.so +0 -0
- package/initramfs/buninu/bin/multicall.sh +103 -0
- package/initramfs/buninu/bin/native-bridge.bat +3 -0
- package/initramfs/buninu/bin/rz.bat +3 -0
- package/initramfs/buninu/bin/rz.sh +5 -0
- package/initramfs/buninu/bin/shc.js +5 -0
- package/initramfs/buninu/bin/showimg.bat +3 -0
- package/initramfs/buninu/bin/showimg.sh +5 -0
- package/initramfs/buninu/bin/switch_to_android.sh +9 -0
- package/initramfs/buninu/bin/switch_to_linux.sh +7 -0
- package/initramfs/buninu/bin/sz.bat +3 -0
- package/initramfs/buninu/bin/sz.sh +5 -0
- package/initramfs/buninu/bin/tts.bat +3 -0
- package/initramfs/buninu/bin/xclip.bat +3 -0
- package/initramfs/buninu/bin/xdg-open.bat +3 -0
- package/initramfs/buninu/demo-server.js +64 -0
- package/initramfs/buninu/icon.png +0 -0
- package/initramfs/buninu/package.json +59 -0
- package/initramfs/etc/resolv.conf +1 -0
- package/initramfs/init.js +339 -0
- package/initramfs/lib/ld-musl-x86_64.so.1 +0 -0
- package/initramfs/lib/libc.musl-x86_64.so.1 +0 -0
- package/initramfs/lib/libgcc_s.so.1 +0 -0
- package/initramfs/lib/libstdc++.so.6 +0 -0
- package/initramfs/usr/bin/env +7 -0
- package/package.json +42 -0
- package/run-qemu.sh +44 -0
- package/scripts/fetch.sh +26 -0
- package/scripts/pack-initramfs.sh +41 -0
- package/test/build-init-bootstrap.sh +23 -0
- package/test/init-bootstrap.c +55 -0
|
@@ -0,0 +1,817 @@
|
|
|
1
|
+
import { afterAll, beforeAll, describe, expect, test } from "bun:test";
|
|
2
|
+
import { chmodSync, mkdirSync, mkdtempSync, rmSync } from "node:fs";
|
|
3
|
+
import { tmpdir } from "node:os";
|
|
4
|
+
import { join } from "node:path";
|
|
5
|
+
import { createState, decode, execute } from "../src/shell.js";
|
|
6
|
+
|
|
7
|
+
const root = new URL("..", import.meta.url).pathname;
|
|
8
|
+
const bunmsh = [process.execPath, "src/main.js", "-c"];
|
|
9
|
+
|
|
10
|
+
async function invoke(argv, source, env = process.env, args = []) {
|
|
11
|
+
const proc = Bun.spawn([...argv, source, ...args], {
|
|
12
|
+
cwd: root,
|
|
13
|
+
env,
|
|
14
|
+
stdin: "ignore",
|
|
15
|
+
stdout: "pipe",
|
|
16
|
+
stderr: "pipe",
|
|
17
|
+
});
|
|
18
|
+
const [status, stdout, stderr] = await Promise.all([
|
|
19
|
+
proc.exited,
|
|
20
|
+
new Response(proc.stdout).text(),
|
|
21
|
+
new Response(proc.stderr).text(),
|
|
22
|
+
]);
|
|
23
|
+
return { status, stdout, stderr };
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
async function expectLikeSh(source, env, args) {
|
|
27
|
+
const [actual, reference] = await Promise.all([
|
|
28
|
+
invoke(bunmsh, source, env, args),
|
|
29
|
+
invoke(["/bin/sh", "-c"], source, env, args),
|
|
30
|
+
]);
|
|
31
|
+
expect(actual).toEqual(reference);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
async function expectLikeShInTemp(source) {
|
|
35
|
+
const directory = mkdtempSync(join(tmpdir(), "bunmsh-reference-"));
|
|
36
|
+
try {
|
|
37
|
+
await expectLikeSh(source, {
|
|
38
|
+
...process.env,
|
|
39
|
+
BUNMSH_TEST_TMPDIR: directory,
|
|
40
|
+
});
|
|
41
|
+
} finally {
|
|
42
|
+
rmSync(directory, { recursive: true, force: true });
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
async function invokeInternal(source, options = {}) {
|
|
47
|
+
const state = createState(options);
|
|
48
|
+
const output = await execute(source, state, { capture: true });
|
|
49
|
+
return {
|
|
50
|
+
status: output.status,
|
|
51
|
+
stdout: decode(output.stdout),
|
|
52
|
+
stderr: decode(output.stderr),
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
async function invokeArgvWithInput(argv, input, cwd = root) {
|
|
57
|
+
const proc = Bun.spawn({
|
|
58
|
+
cmd: argv,
|
|
59
|
+
cwd,
|
|
60
|
+
env: process.env,
|
|
61
|
+
stdin: Buffer.from(input),
|
|
62
|
+
stdout: "pipe",
|
|
63
|
+
stderr: "pipe",
|
|
64
|
+
});
|
|
65
|
+
const [status, stdout, stderr] = await Promise.all([
|
|
66
|
+
proc.exited,
|
|
67
|
+
new Response(proc.stdout).text(),
|
|
68
|
+
new Response(proc.stderr).text(),
|
|
69
|
+
]);
|
|
70
|
+
return { status, stdout, stderr };
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
async function expectBuiltinGrepLike(args, input, cwd = root) {
|
|
74
|
+
const [actual, reference] = await Promise.all([
|
|
75
|
+
invokeArgvWithInput([process.execPath, join(root, "src/main.js"), "-cc", "builtin", "grep", ...args], input, cwd),
|
|
76
|
+
invokeArgvWithInput(["/usr/bin/grep", ...args], input, cwd),
|
|
77
|
+
]);
|
|
78
|
+
expect(actual).toEqual(reference);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
async function expectBuiltinSedLike(args, input, cwd = root) {
|
|
82
|
+
const [actual, reference] = await Promise.all([
|
|
83
|
+
invokeArgvWithInput([process.execPath, join(root, "src/main.js"), "-cc", "builtin", "sed", ...args], input, cwd),
|
|
84
|
+
invokeArgvWithInput(["/usr/bin/sed", ...args], input, cwd),
|
|
85
|
+
]);
|
|
86
|
+
expect(actual).toEqual(reference);
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
describe("/bin/sh reference", () => {
|
|
90
|
+
describe("quote and word expansion", () => {
|
|
91
|
+
test("removes LF and CRLF backslash continuations before tokenization", async () => {
|
|
92
|
+
const lf = "/usr/bin/printf '<%s>\\n' one \\\n two \\\n three";
|
|
93
|
+
await expectLikeSh(lf);
|
|
94
|
+
const crlf = lf.replaceAll("\n", "\r\n");
|
|
95
|
+
const output = await invoke(bunmsh, crlf);
|
|
96
|
+
expect(output).toEqual({ status: 0, stdout: "<one>\n<two>\n<three>\n", stderr: "" });
|
|
97
|
+
});
|
|
98
|
+
|
|
99
|
+
test("preserves quoted fields and removes quote syntax", async () => {
|
|
100
|
+
await expectLikeSh("value='a b'; /usr/bin/printf '<%s>\\n' \"$value\" '$value' a\\ b");
|
|
101
|
+
});
|
|
102
|
+
|
|
103
|
+
test("splits unquoted expansions using IFS", async () => {
|
|
104
|
+
await expectLikeSh("value='one two three'; /usr/bin/printf '<%s>\\n' $value");
|
|
105
|
+
});
|
|
106
|
+
|
|
107
|
+
test("does not apply IFS splitting to literal parts of a word", async () => {
|
|
108
|
+
await expectLikeSh(
|
|
109
|
+
"IFS=:; value='one:two'; /usr/bin/printf '<%s>\\n' $value literal:field",
|
|
110
|
+
);
|
|
111
|
+
});
|
|
112
|
+
|
|
113
|
+
test("preserves empty fields from non-whitespace IFS delimiters", async () => {
|
|
114
|
+
await expectLikeSh("IFS=:; value=':a::b:'; /usr/bin/printf '<%s>\\n' $value");
|
|
115
|
+
});
|
|
116
|
+
|
|
117
|
+
test("supports parameter defaults, alternatives, lengths, and trimming", async () => {
|
|
118
|
+
await expectLikeSh(
|
|
119
|
+
"value=abc.txt; empty=; /usr/bin/printf '%s\\n' ${missing:-fallback} ${empty:-fallback} " +
|
|
120
|
+
"${value:+present} ${#value} ${value%.txt}",
|
|
121
|
+
);
|
|
122
|
+
});
|
|
123
|
+
|
|
124
|
+
test("keeps spaces and nested expansions inside parameter operands", async () => {
|
|
125
|
+
await expectLikeSh(
|
|
126
|
+
"fallback=inside; /usr/bin/printf '<%s>\\n' \"${missing:-two words}\" " +
|
|
127
|
+
"\"${missing:-${fallback}}\"",
|
|
128
|
+
);
|
|
129
|
+
});
|
|
130
|
+
|
|
131
|
+
test("performs command substitution and strips trailing newlines", async () => {
|
|
132
|
+
await expectLikeSh("/usr/bin/printf '<%s>\\n' \"$(printf 'a b\\n\\n')\"");
|
|
133
|
+
});
|
|
134
|
+
|
|
135
|
+
test("supports legacy backtick substitution", async () => {
|
|
136
|
+
await expectLikeSh("/usr/bin/printf '<%s>\\n' \"`echo legacy`\"");
|
|
137
|
+
});
|
|
138
|
+
|
|
139
|
+
test("uses command substitution status for assignment-only commands", async () => {
|
|
140
|
+
await expectLikeSh("value=$(false); echo $?");
|
|
141
|
+
});
|
|
142
|
+
|
|
143
|
+
test("performs arithmetic expansion with shell variables", async () => {
|
|
144
|
+
await expectLikeSh("number=6; /usr/bin/printf '%s\\n' $((number * 7 + 1))");
|
|
145
|
+
});
|
|
146
|
+
|
|
147
|
+
test("expands quoted and unquoted positional parameters", async () => {
|
|
148
|
+
await expectLikeSh(
|
|
149
|
+
"/usr/bin/printf '<%s>\\n' \"$@\"; /usr/bin/printf '[%s]\\n' $@",
|
|
150
|
+
process.env,
|
|
151
|
+
["reference", "a b", "c"],
|
|
152
|
+
);
|
|
153
|
+
});
|
|
154
|
+
|
|
155
|
+
test("performs pathname generation but preserves quoted patterns", async () => {
|
|
156
|
+
await expectLikeSh(
|
|
157
|
+
"/usr/bin/printf '<%s>\\n' test/reference-*.sh 'test/reference-*.sh' test/no-match-*.none",
|
|
158
|
+
);
|
|
159
|
+
});
|
|
160
|
+
|
|
161
|
+
test("expands tilde in words and assignment values", async () => {
|
|
162
|
+
await expectLikeSh("path=~/folder; /usr/bin/printf '%s\\n' ~ \"$path\"");
|
|
163
|
+
});
|
|
164
|
+
});
|
|
165
|
+
|
|
166
|
+
describe("here documents", () => {
|
|
167
|
+
test("feeds a heredoc body to a command's stdin", async () => {
|
|
168
|
+
await expectLikeSh("cat <<EOF\nhello world\nEOF");
|
|
169
|
+
});
|
|
170
|
+
|
|
171
|
+
test("expands parameters and command substitution in an unquoted delimiter", async () => {
|
|
172
|
+
await expectLikeSh("name=world; cat <<EOF\nhi $name, today is $(echo Tuesday)\nEOF");
|
|
173
|
+
});
|
|
174
|
+
|
|
175
|
+
test("leaves a quoted or escaped delimiter's body literal", async () => {
|
|
176
|
+
await expectLikeSh("name=world; cat <<'EOF'\nhi $name\nEOF");
|
|
177
|
+
await expectLikeSh("name=world; cat <<\\EOF\nhi $name\nEOF");
|
|
178
|
+
});
|
|
179
|
+
|
|
180
|
+
test("<<- strips leading tabs from the body and the terminator", async () => {
|
|
181
|
+
await expectLikeSh("cat <<-EOF\n\thello\n\tEOF");
|
|
182
|
+
});
|
|
183
|
+
|
|
184
|
+
test("feeds a pipeline stage and composes with other redirects", async () => {
|
|
185
|
+
await expectLikeSh("cat <<EOF | tr a-z A-Z\nhi there\nEOF");
|
|
186
|
+
});
|
|
187
|
+
|
|
188
|
+
test("supports multiple heredocs on one command, last one wins", async () => {
|
|
189
|
+
await expectLikeSh("cat <<A <<B\nfirst\nA\nsecond\nB");
|
|
190
|
+
});
|
|
191
|
+
|
|
192
|
+
test("works inside while and if compound bodies", async () => {
|
|
193
|
+
await expectLikeSh(
|
|
194
|
+
"i=0\nwhile [ $i -lt 2 ]; do\n cat <<EOF\nline $i\nEOF\n i=$((i + 1))\ndone",
|
|
195
|
+
);
|
|
196
|
+
await expectLikeSh("if true; then\n cat <<EOF\nyes branch\nEOF\nfi");
|
|
197
|
+
});
|
|
198
|
+
|
|
199
|
+
test("leniently uses whatever was read when the terminator never appears", async () => {
|
|
200
|
+
await expectLikeSh("cat <<EOF\nno terminator here");
|
|
201
|
+
});
|
|
202
|
+
});
|
|
203
|
+
|
|
204
|
+
// /bin/sh here is dash, which does not implement <<<; these compare
|
|
205
|
+
// against bunmsh's own output instead of expectLikeSh's dash reference.
|
|
206
|
+
describe("here strings (mksh extension)", () => {
|
|
207
|
+
test("feeds the expanded word plus a trailing newline to stdin", async () => {
|
|
208
|
+
const output = await invoke(bunmsh, "cat <<< hello");
|
|
209
|
+
expect(output).toEqual({ status: 0, stdout: "hello\n", stderr: "" });
|
|
210
|
+
});
|
|
211
|
+
|
|
212
|
+
test("expands parameters and command substitution", async () => {
|
|
213
|
+
const output = await invoke(bunmsh, 'x=world; cat <<< "hi $x, $(echo there)"');
|
|
214
|
+
expect(output).toEqual({ status: 0, stdout: "hi world, there\n", stderr: "" });
|
|
215
|
+
});
|
|
216
|
+
|
|
217
|
+
test("does not field-split an unquoted expansion", async () => {
|
|
218
|
+
const output = await invoke(bunmsh, 'x="a b c"; cat <<< $x');
|
|
219
|
+
expect(output).toEqual({ status: 0, stdout: "a b c\n", stderr: "" });
|
|
220
|
+
});
|
|
221
|
+
|
|
222
|
+
test("leaves a single-quoted word literal", async () => {
|
|
223
|
+
const output = await invoke(bunmsh, "x=world; cat <<< 'hi $x'");
|
|
224
|
+
expect(output).toEqual({ status: 0, stdout: "hi $x\n", stderr: "" });
|
|
225
|
+
});
|
|
226
|
+
|
|
227
|
+
test("does not tilde-expand, unlike a file redirect target", async () => {
|
|
228
|
+
const output = await invoke(bunmsh, "cat <<< ~");
|
|
229
|
+
expect(output).toEqual({ status: 0, stdout: "~\n", stderr: "" });
|
|
230
|
+
});
|
|
231
|
+
});
|
|
232
|
+
|
|
233
|
+
describe("command", () => {
|
|
234
|
+
test("executes a utility and preserves its status", async () => {
|
|
235
|
+
await expectLikeSh(
|
|
236
|
+
"command echo hello; command false || echo fallback; command true && echo success",
|
|
237
|
+
);
|
|
238
|
+
});
|
|
239
|
+
|
|
240
|
+
test("with no operand succeeds without output", async () => {
|
|
241
|
+
await expectLikeSh("command");
|
|
242
|
+
});
|
|
243
|
+
|
|
244
|
+
test("-v reports successful and failed lookup through its status", async () => {
|
|
245
|
+
await expectLikeSh(
|
|
246
|
+
"command -v command >/dev/null && echo found; " +
|
|
247
|
+
"command -v bunmsh-command-that-does-not-exist >/dev/null || echo missing",
|
|
248
|
+
);
|
|
249
|
+
});
|
|
250
|
+
|
|
251
|
+
test("-p executes through the default utility PATH", async () => {
|
|
252
|
+
await expectLikeSh("PATH=/no/such/path command -p sh -c 'printf default-path'");
|
|
253
|
+
});
|
|
254
|
+
});
|
|
255
|
+
|
|
256
|
+
describe("state and evaluation builtins", () => {
|
|
257
|
+
test("alias definitions expand and unalias removes them", async () => {
|
|
258
|
+
await expectLikeSh(
|
|
259
|
+
"alias greeting='echo hello'\ngreeting\nunalias greeting\n" +
|
|
260
|
+
"alias greeting >/dev/null 2>/dev/null || echo removed",
|
|
261
|
+
);
|
|
262
|
+
});
|
|
263
|
+
|
|
264
|
+
test("readonly defines values and lists marked names", async () => {
|
|
265
|
+
await expectLikeSh(
|
|
266
|
+
"readonly BUNMSH_REFERENCE_VALUE=locked; echo $BUNMSH_REFERENCE_VALUE; " +
|
|
267
|
+
"readonly -p | grep BUNMSH_REFERENCE_VALUE >/dev/null && echo readonly",
|
|
268
|
+
);
|
|
269
|
+
});
|
|
270
|
+
|
|
271
|
+
test("eval parses and executes its joined arguments", async () => {
|
|
272
|
+
await expectLikeSh("word=works; eval 'echo eval-$word'");
|
|
273
|
+
});
|
|
274
|
+
|
|
275
|
+
test("dot sources a file in the current shell", async () => {
|
|
276
|
+
await expectLikeSh(
|
|
277
|
+
"BUNMSH_REFERENCE_SOURCE=value; . ./test/reference-source.sh; echo after:$?",
|
|
278
|
+
);
|
|
279
|
+
});
|
|
280
|
+
|
|
281
|
+
test("shift updates positional parameters", async () => {
|
|
282
|
+
await expectLikeSh("shift 2; echo $#:$1", process.env, ["reference", "a", "b", "c"]);
|
|
283
|
+
});
|
|
284
|
+
|
|
285
|
+
test("read assigns fields, with the last name receiving the remainder", async () => {
|
|
286
|
+
await expectLikeSh("IFS=' '; read first rest < test/reference-source.sh; printf '<%s>|<%s>\\n' \"$first\" \"$rest\"");
|
|
287
|
+
});
|
|
288
|
+
|
|
289
|
+
test("executes case, while, until, and for compound commands", async () => {
|
|
290
|
+
await expectLikeSh(`
|
|
291
|
+
value=archive.tgz
|
|
292
|
+
case "$value" in
|
|
293
|
+
*.zip)
|
|
294
|
+
printf wrong
|
|
295
|
+
;;
|
|
296
|
+
*.tgz|*.tar)
|
|
297
|
+
printf case
|
|
298
|
+
;;
|
|
299
|
+
esac
|
|
300
|
+
i=0
|
|
301
|
+
while [ "$i" -lt 2 ]; do
|
|
302
|
+
printf w%s "$i"
|
|
303
|
+
i=$((i + 1))
|
|
304
|
+
done
|
|
305
|
+
until [ "$i" -ge 4 ]; do
|
|
306
|
+
printf u%s "$i"
|
|
307
|
+
i=$((i + 1))
|
|
308
|
+
done
|
|
309
|
+
for item in alpha "two words"; do
|
|
310
|
+
printf 'f<%s>' "$item"
|
|
311
|
+
done
|
|
312
|
+
`);
|
|
313
|
+
});
|
|
314
|
+
|
|
315
|
+
test("executes a complete if command on one physical line", async () => {
|
|
316
|
+
await expectLikeSh("if true ; then echo hello ; fi");
|
|
317
|
+
await expectLikeSh("if false; then echo wrong; elif true; then echo elif; else echo wrong; fi");
|
|
318
|
+
await expectLikeSh("if true; then echo then fi else; fi");
|
|
319
|
+
await expectLikeSh("i=0; while [ \"$i\" -lt 2 ]; do echo loop:$i; i=$((i + 1)); done");
|
|
320
|
+
await expectLikeSh("for item in one two; do echo item:$item; done");
|
|
321
|
+
});
|
|
322
|
+
|
|
323
|
+
test("redirects a file into a while-read loop", async () => {
|
|
324
|
+
const directory = mkdtempSync(join(tmpdir(), "bunmsh-read-loop-"));
|
|
325
|
+
try {
|
|
326
|
+
const file = join(directory, "items.txt");
|
|
327
|
+
await Bun.write(file, "one\ntwo words\nthree\n");
|
|
328
|
+
await expectLikeSh(`
|
|
329
|
+
set --
|
|
330
|
+
while IFS= read -r item; do
|
|
331
|
+
set -- "$@" "$item"
|
|
332
|
+
done < "${file}"
|
|
333
|
+
for value in "$@"; do
|
|
334
|
+
printf '<%s>\\n' "$value"
|
|
335
|
+
done
|
|
336
|
+
`);
|
|
337
|
+
} finally { rmSync(directory, { recursive: true, force: true }); }
|
|
338
|
+
});
|
|
339
|
+
|
|
340
|
+
test("runs parenthesized commands in an isolated subshell", async () => {
|
|
341
|
+
await expectLikeSh(`
|
|
342
|
+
(cd test && basename "$PWD")
|
|
343
|
+
basename "$PWD"
|
|
344
|
+
`);
|
|
345
|
+
await expectLikeSh(`
|
|
346
|
+
(printf left && printf right)
|
|
347
|
+
printf ':%s' $?
|
|
348
|
+
`);
|
|
349
|
+
});
|
|
350
|
+
});
|
|
351
|
+
|
|
352
|
+
describe("query and system builtins", () => {
|
|
353
|
+
test("basename handles an optional suffix", async () => {
|
|
354
|
+
await expectLikeSh("basename /usr/src/shell.js .js");
|
|
355
|
+
});
|
|
356
|
+
|
|
357
|
+
test("dirname returns the containing path", async () => {
|
|
358
|
+
await expectLikeSh("dirname /usr/src/shell.js");
|
|
359
|
+
});
|
|
360
|
+
|
|
361
|
+
test("which searches PATH using Bun.which semantics", async () => {
|
|
362
|
+
const output = await invoke(bunmsh, "which sh; which bunmsh-command-that-does-not-exist");
|
|
363
|
+
expect(output).toEqual({
|
|
364
|
+
status: 1,
|
|
365
|
+
stdout: `${Bun.which("sh", { PATH: process.env.PATH, cwd: root })}\n`,
|
|
366
|
+
stderr: "",
|
|
367
|
+
});
|
|
368
|
+
});
|
|
369
|
+
|
|
370
|
+
test("test and [ evaluate files, strings, and integers", async () => {
|
|
371
|
+
await expectLikeSh(
|
|
372
|
+
"test -d . && echo directory; test -n value && echo string; " +
|
|
373
|
+
"[ 7 -ge 3 ] && echo integer; [ missing = present ] || echo unequal",
|
|
374
|
+
);
|
|
375
|
+
});
|
|
376
|
+
|
|
377
|
+
test("type reports lookup success through status", async () => {
|
|
378
|
+
await expectLikeSh(
|
|
379
|
+
"type echo >/dev/null && echo builtin; " +
|
|
380
|
+
"type bunmsh-command-that-does-not-exist >/dev/null 2>/dev/null || echo missing",
|
|
381
|
+
);
|
|
382
|
+
});
|
|
383
|
+
|
|
384
|
+
test("realpath resolves existing paths", async () => {
|
|
385
|
+
await expectLikeSh("realpath .");
|
|
386
|
+
});
|
|
387
|
+
|
|
388
|
+
test("umask reads and changes the process mask", async () => {
|
|
389
|
+
await expectLikeSh("umask 027; umask");
|
|
390
|
+
});
|
|
391
|
+
|
|
392
|
+
test("getopts consumes options and option arguments", async () => {
|
|
393
|
+
await expectLikeSh(
|
|
394
|
+
"OPTIND=1; getopts ab: option -a -b value; echo $option:$OPTIND; " +
|
|
395
|
+
"getopts ab: option -a -b value; echo $option:$OPTARG:$OPTIND",
|
|
396
|
+
);
|
|
397
|
+
});
|
|
398
|
+
|
|
399
|
+
test("kill -0 checks the current process without sending a signal", async () => {
|
|
400
|
+
await expectLikeSh("kill -0 $$; echo $?");
|
|
401
|
+
});
|
|
402
|
+
});
|
|
403
|
+
});
|
|
404
|
+
|
|
405
|
+
describe("system tail reference", () => {
|
|
406
|
+
test("supports -n +N and compact -n+N from-start modes", async () => {
|
|
407
|
+
const input = "one\ntwo\nthree\nfour\n";
|
|
408
|
+
for (const args of [["-n", "+2"], ["-n+3"], ["-n", "+1"], ["-n", "+0"]]) {
|
|
409
|
+
const [actual, reference] = await Promise.all([
|
|
410
|
+
invokeArgvWithInput(
|
|
411
|
+
[process.execPath, join(root, "src/main.js"), "-cc", "builtin", "tail", ...args],
|
|
412
|
+
input,
|
|
413
|
+
),
|
|
414
|
+
invokeArgvWithInput([Bun.which("tail"), ...args], input),
|
|
415
|
+
]);
|
|
416
|
+
expect(actual).toEqual(reference);
|
|
417
|
+
}
|
|
418
|
+
});
|
|
419
|
+
});
|
|
420
|
+
|
|
421
|
+
describe("system grep reference", () => {
|
|
422
|
+
test("matches basic and extended regular-expression semantics", async () => {
|
|
423
|
+
await expectBuiltinGrepLike(["a+b"], "a+b\naaab\n");
|
|
424
|
+
await expectBuiltinGrepLike(["a\\+b"], "a+b\naaab\n");
|
|
425
|
+
await expectBuiltinGrepLike(["-E", "a+b"], "a+b\naaab\n");
|
|
426
|
+
await expectBuiltinGrepLike(["-E", "[[:digit:]]+"], "word\nnumber42\n");
|
|
427
|
+
});
|
|
428
|
+
|
|
429
|
+
test("matches fixed, whole-line, case, number, invert, and quiet modes", async () => {
|
|
430
|
+
await expectBuiltinGrepLike(["-Finx", "alpha.beta"], "Alpha.Beta\nalphaXbeta\n");
|
|
431
|
+
await expectBuiltinGrepLike(["-v", "drop"], "keep\ndrop\n");
|
|
432
|
+
await expectBuiltinGrepLike(["-q", "found"], "found\nlater\n");
|
|
433
|
+
await expectBuiltinGrepLike(["-q", "missing"], "found\nlater\n");
|
|
434
|
+
});
|
|
435
|
+
|
|
436
|
+
test("suppresses zero-length -o matches and output for -v -o", async () => {
|
|
437
|
+
await expectBuiltinGrepLike(["-oE", "[0-9]*"], "uid=10234(name)\nnone\n");
|
|
438
|
+
await expectBuiltinGrepLike(["-oE", "[0-9a-zA-Z.]*"], "package:com.example 10234\n");
|
|
439
|
+
await expectBuiltinGrepLike(["-vo", "drop"], "keep\ndrop\n");
|
|
440
|
+
await expectBuiltinGrepLike(["-onE", "[0-9]+"], "a12b34\nnone\n");
|
|
441
|
+
});
|
|
442
|
+
|
|
443
|
+
test("matches recursive filename and line-number output", async () => {
|
|
444
|
+
const directory = mkdtempSync(join(tmpdir(), "bunmsh-grep-reference-"));
|
|
445
|
+
try {
|
|
446
|
+
mkdirSync(join(directory, "tree", "nested"), { recursive: true });
|
|
447
|
+
await Bun.write(join(directory, "tree", "a.txt"), "needle one\nnone\n");
|
|
448
|
+
await Bun.write(join(directory, "tree", "nested", "b.txt"), "needle two\n");
|
|
449
|
+
await expectBuiltinGrepLike(["-rn", "needle", "tree"], "", directory);
|
|
450
|
+
await expectBuiltinGrepLike(["-n", "needle", "tree/a.txt", "tree/nested/b.txt"], "", directory);
|
|
451
|
+
} finally { rmSync(directory, { recursive: true, force: true }); }
|
|
452
|
+
});
|
|
453
|
+
});
|
|
454
|
+
|
|
455
|
+
describe("system sed reference", () => {
|
|
456
|
+
test("selects the package path fields used by tmpk", async () => {
|
|
457
|
+
await expectBuiltinSedLike(["-n", "3p"], "data\ndata\ncom.example\n");
|
|
458
|
+
await expectBuiltinSedLike(["-n", "4p"], "data\nuser\n0\ncom.example\n");
|
|
459
|
+
});
|
|
460
|
+
|
|
461
|
+
test("trims whitespace and applies build.sh substitutions", async () => {
|
|
462
|
+
await expectBuiltinSedLike(["s/^[[:space:]]*//;s/[[:space:]]*$//"], " package.name \t\n");
|
|
463
|
+
await expectBuiltinSedLike(["-e", "s/com.drjohn.test1/com.example.app/"], "package=com.drjohn.test1\n");
|
|
464
|
+
await expectBuiltinSedLike(["s/Hello1/My App/"], "<string>Hello1</string>\n");
|
|
465
|
+
});
|
|
466
|
+
|
|
467
|
+
test("supports global replacements, extended expressions, and backreferences", async () => {
|
|
468
|
+
await expectBuiltinSedLike(["s/a/A/g"], "banana\n");
|
|
469
|
+
await expectBuiltinSedLike(["-E", "s/(name)=([^ ]+)/\\1:[\\2]/"], "name=value rest\n");
|
|
470
|
+
});
|
|
471
|
+
});
|
|
472
|
+
|
|
473
|
+
describe("command mksh extensions", () => {
|
|
474
|
+
test("PATH overrides fallback builtins, while builtin selects them explicitly", async () => {
|
|
475
|
+
const directory = mkdtempSync(join(tmpdir(), "bunmsh-fallback-"));
|
|
476
|
+
const executable = join(directory, "basename");
|
|
477
|
+
await Bun.write(executable, "#!/bin/sh\necho external-basename\n");
|
|
478
|
+
chmodSync(executable, 0o755);
|
|
479
|
+
const output = await invoke(
|
|
480
|
+
bunmsh,
|
|
481
|
+
"basename /a/b/file.txt; builtin basename /a/b/file.txt",
|
|
482
|
+
{ ...process.env, PATH: directory },
|
|
483
|
+
);
|
|
484
|
+
expect(output).toEqual({
|
|
485
|
+
status: 0,
|
|
486
|
+
stdout: "external-basename\nfile.txt\n",
|
|
487
|
+
stderr: "",
|
|
488
|
+
});
|
|
489
|
+
});
|
|
490
|
+
|
|
491
|
+
test("fallback builtins run when PATH has no matching executable", async () => {
|
|
492
|
+
const output = await invoke(
|
|
493
|
+
bunmsh,
|
|
494
|
+
"basename /a/b/file.txt; dirname /a/b/file.txt",
|
|
495
|
+
{ ...process.env, PATH: "/no/such/path" },
|
|
496
|
+
);
|
|
497
|
+
expect(output).toEqual({ status: 0, stdout: "file.txt\n/a/b\n", stderr: "" });
|
|
498
|
+
});
|
|
499
|
+
|
|
500
|
+
test("time reports elapsed nanosecond timing and preserves command results", async () => {
|
|
501
|
+
const output = await invoke(bunmsh, "time echo timed");
|
|
502
|
+
expect(output.status).toBe(0);
|
|
503
|
+
expect(output.stdout).toBe("timed\n");
|
|
504
|
+
expect(output.stderr).toMatch(/^real \d+\.\d{6} ms\n$/);
|
|
505
|
+
|
|
506
|
+
const failure = await invoke(bunmsh, "time false");
|
|
507
|
+
expect(failure.status).toBe(1);
|
|
508
|
+
expect(failure.stdout).toBe("");
|
|
509
|
+
expect(failure.stderr).toMatch(/^real \d+\.\d{6} ms\n$/);
|
|
510
|
+
});
|
|
511
|
+
|
|
512
|
+
test("performs mksh brace expansion", async () => {
|
|
513
|
+
const output = await invoke(bunmsh, "/usr/bin/printf '<%s>\\n' pre{one,two}post");
|
|
514
|
+
expect(output).toEqual({
|
|
515
|
+
status: 0,
|
|
516
|
+
stdout: "<preonepost>\n<pretwopost>\n",
|
|
517
|
+
stderr: "",
|
|
518
|
+
});
|
|
519
|
+
});
|
|
520
|
+
|
|
521
|
+
test("performs mksh parameter replacement", async () => {
|
|
522
|
+
const output = await invoke(
|
|
523
|
+
bunmsh,
|
|
524
|
+
"value=one-two-two; echo ${value/two/2}; echo ${value//two/2}",
|
|
525
|
+
);
|
|
526
|
+
expect(output).toEqual({
|
|
527
|
+
status: 0,
|
|
528
|
+
stdout: "one-2-two\none-2-2\n",
|
|
529
|
+
stderr: "",
|
|
530
|
+
});
|
|
531
|
+
});
|
|
532
|
+
|
|
533
|
+
test("quoted command names suppress alias expansion", async () => {
|
|
534
|
+
const output = await invokeInternal("'echo' hello", { aliases: { echo: ["false"] } });
|
|
535
|
+
expect(output).toEqual({ status: 0, stdout: "hello\n", stderr: "" });
|
|
536
|
+
});
|
|
537
|
+
|
|
538
|
+
test("bypasses aliases while retaining builtins", async () => {
|
|
539
|
+
const output = await invokeInternal("command echo hello", {
|
|
540
|
+
aliases: { echo: ["false"] },
|
|
541
|
+
});
|
|
542
|
+
expect(output).toEqual({ status: 0, stdout: "hello\n", stderr: "" });
|
|
543
|
+
});
|
|
544
|
+
|
|
545
|
+
test("-V describes aliases and builtins", async () => {
|
|
546
|
+
const output = await invoke(bunmsh, "command -V ls command");
|
|
547
|
+
expect(output).toEqual({
|
|
548
|
+
status: 0,
|
|
549
|
+
stdout: "ls is an alias for 'ls --color=auto'\ncommand is a shell builtin\n",
|
|
550
|
+
stderr: "",
|
|
551
|
+
});
|
|
552
|
+
});
|
|
553
|
+
|
|
554
|
+
test("whence and builtin expose mksh-style lookup", async () => {
|
|
555
|
+
const output = await invoke(bunmsh, "whence echo; builtin echo builtin-ok");
|
|
556
|
+
expect(output).toEqual({ status: 0, stdout: "echo\nbuiltin-ok\n", stderr: "" });
|
|
557
|
+
});
|
|
558
|
+
|
|
559
|
+
test("standalone builtin lists registered builtin names", async () => {
|
|
560
|
+
const output = await invoke(bunmsh, "builtin");
|
|
561
|
+
expect(output.status).toBe(0);
|
|
562
|
+
expect(output.stderr).toBe("");
|
|
563
|
+
const names = output.stdout.trimEnd().split("\n");
|
|
564
|
+
expect(names).toEqual([...names].sort());
|
|
565
|
+
expect(names).toContain("builtin");
|
|
566
|
+
expect(names).toContain("command");
|
|
567
|
+
expect(names).toContain("..");
|
|
568
|
+
expect(names).toContain("//");
|
|
569
|
+
});
|
|
570
|
+
});
|
|
571
|
+
|
|
572
|
+
describe("CLI direct argv forwarding", () => {
|
|
573
|
+
test("-cc preserves every argument without shell expansion", async () => {
|
|
574
|
+
const output = await invoke(
|
|
575
|
+
[process.execPath, "src/main.js", "-cc"],
|
|
576
|
+
"/usr/bin/printf",
|
|
577
|
+
process.env,
|
|
578
|
+
["<%s>\\n", "a b", "$HOME", "*", "semi;colon"],
|
|
579
|
+
);
|
|
580
|
+
expect(output).toEqual({
|
|
581
|
+
status: 0,
|
|
582
|
+
stdout: "<a b>\n<$HOME>\n<*>\n<semi;colon>\n",
|
|
583
|
+
stderr: "",
|
|
584
|
+
});
|
|
585
|
+
});
|
|
586
|
+
|
|
587
|
+
test("-cc uses builtin and PATH dispatch while preserving status", async () => {
|
|
588
|
+
const builtin = await invoke(
|
|
589
|
+
[process.execPath, "src/main.js", "-cc"],
|
|
590
|
+
"echo",
|
|
591
|
+
process.env,
|
|
592
|
+
["direct", "argv"],
|
|
593
|
+
);
|
|
594
|
+
expect(builtin).toEqual({ status: 0, stdout: "direct argv\n", stderr: "" });
|
|
595
|
+
|
|
596
|
+
const failure = await invoke(
|
|
597
|
+
[process.execPath, "src/main.js", "-cc"],
|
|
598
|
+
"false",
|
|
599
|
+
);
|
|
600
|
+
expect(failure).toEqual({ status: 1, stdout: "", stderr: "" });
|
|
601
|
+
});
|
|
602
|
+
|
|
603
|
+
test("-cc without a command is a usage error", async () => {
|
|
604
|
+
const output = await invoke([process.execPath, "src/main.js"], "-cc");
|
|
605
|
+
expect({ ...output, stderr: Bun.stripANSI(output.stderr) }).toEqual({
|
|
606
|
+
status: 2,
|
|
607
|
+
stdout: "",
|
|
608
|
+
stderr: "bunmsh: -cc requires a command\n",
|
|
609
|
+
});
|
|
610
|
+
});
|
|
611
|
+
});
|
|
612
|
+
|
|
613
|
+
describe("concurrent streaming pipelines", () => {
|
|
614
|
+
test("matches /bin/sh for cat piped into grep", async () => {
|
|
615
|
+
await expectLikeSh("cat test/reference-source.sh | grep BUNMSH_REFERENCE_SOURCE");
|
|
616
|
+
});
|
|
617
|
+
|
|
618
|
+
test("matches /bin/sh for a multi-stage filtering pipeline", async () => {
|
|
619
|
+
await expectLikeSh(
|
|
620
|
+
"printf 'alpha\\nbeta\\ngamma\\n' | grep 'a$' | tr a-z A-Z",
|
|
621
|
+
);
|
|
622
|
+
});
|
|
623
|
+
|
|
624
|
+
test("matches /bin/sh when redirected stdin feeds a pipeline", async () => {
|
|
625
|
+
await expectLikeSh("cat < test/reference-source.sh | grep 'sourced:'");
|
|
626
|
+
});
|
|
627
|
+
|
|
628
|
+
test("matches /bin/sh for streamed stdout overwrite and append redirects", async () => {
|
|
629
|
+
await expectLikeShInTemp(
|
|
630
|
+
"out=$BUNMSH_TEST_TMPDIR/redirect; printf first > \"$out\"; " +
|
|
631
|
+
"printf second >> \"$out\"; cat \"$out\"; rm \"$out\"",
|
|
632
|
+
);
|
|
633
|
+
});
|
|
634
|
+
|
|
635
|
+
test("matches /bin/sh for a streamed stderr redirect", async () => {
|
|
636
|
+
await expectLikeShInTemp(
|
|
637
|
+
"out=$BUNMSH_TEST_TMPDIR/stderr; sh -c 'printf error >&2' 2> \"$out\"; " +
|
|
638
|
+
"cat \"$out\"; rm \"$out\"",
|
|
639
|
+
);
|
|
640
|
+
});
|
|
641
|
+
|
|
642
|
+
test("matches /bin/sh when a redirect overrides the pipeline output", async () => {
|
|
643
|
+
await expectLikeShInTemp(
|
|
644
|
+
"out=$BUNMSH_TEST_TMPDIR/override; printf file > \"$out\" | cat; " +
|
|
645
|
+
"printf :; cat \"$out\"; rm \"$out\"",
|
|
646
|
+
);
|
|
647
|
+
});
|
|
648
|
+
|
|
649
|
+
test("streams a large redirect without collecting command output", async () => {
|
|
650
|
+
await expectLikeShInTemp(
|
|
651
|
+
"out=$BUNMSH_TEST_TMPDIR/large; head -c 1048576 /dev/zero > \"$out\"; " +
|
|
652
|
+
"wc -c < \"$out\"; rm \"$out\"",
|
|
653
|
+
);
|
|
654
|
+
});
|
|
655
|
+
|
|
656
|
+
test("matches /bin/sh by leaving stderr outside the pipe", async () => {
|
|
657
|
+
await expectLikeSh("sh -c 'printf error >&2; printf output' | cat");
|
|
658
|
+
});
|
|
659
|
+
|
|
660
|
+
test("matches /bin/sh pipeline status from the last stage", async () => {
|
|
661
|
+
await expectLikeSh("false | true; echo $?; true | false; echo $?");
|
|
662
|
+
});
|
|
663
|
+
|
|
664
|
+
test("matches /bin/sh pipeline state isolation", async () => {
|
|
665
|
+
await expectLikeSh("before=$PWD; cd / | cat; test \"$PWD\" = \"$before\" && echo unchanged");
|
|
666
|
+
});
|
|
667
|
+
|
|
668
|
+
test("streams the builtin yes into an external early-closing consumer", async () => {
|
|
669
|
+
const output = await invoke(bunmsh, "yes streamed | head -n 3");
|
|
670
|
+
expect(output).toEqual({
|
|
671
|
+
status: 0,
|
|
672
|
+
stdout: "streamed\nstreamed\nstreamed\n",
|
|
673
|
+
stderr: "",
|
|
674
|
+
});
|
|
675
|
+
});
|
|
676
|
+
|
|
677
|
+
test("streams builtin output into an external command", async () => {
|
|
678
|
+
const output = await invoke(bunmsh, "printf hello | tr a-z A-Z");
|
|
679
|
+
expect(output).toEqual({ status: 0, stdout: "HELLO", stderr: "" });
|
|
680
|
+
});
|
|
681
|
+
|
|
682
|
+
test("does not buffer a large multi-stage external pipeline", async () => {
|
|
683
|
+
const output = await invoke(
|
|
684
|
+
bunmsh,
|
|
685
|
+
"head -c 1048576 /dev/zero | tr '\\0' x | wc -c",
|
|
686
|
+
);
|
|
687
|
+
expect(output).toEqual({ status: 0, stdout: "1048576\n", stderr: "" });
|
|
688
|
+
});
|
|
689
|
+
});
|
|
690
|
+
|
|
691
|
+
// The fallback `curl` is only worth having if a script cannot tell it apart
|
|
692
|
+
// from the real one, so the parts that can be compared byte for byte are:
|
|
693
|
+
// the body, the exit code, and whatever --write-out reports. Response header
|
|
694
|
+
// order and casing come from fetch rather than the wire, so `-i` output is
|
|
695
|
+
// compared after normalisation instead.
|
|
696
|
+
describe("system curl reference", () => {
|
|
697
|
+
const systemCurl = Bun.which("curl");
|
|
698
|
+
let server;
|
|
699
|
+
let origin;
|
|
700
|
+
|
|
701
|
+
beforeAll(() => {
|
|
702
|
+
server = Bun.serve({
|
|
703
|
+
port: 0,
|
|
704
|
+
async fetch(request) {
|
|
705
|
+
const url = new URL(request.url);
|
|
706
|
+
switch (url.pathname) {
|
|
707
|
+
case "/text": return new Response("hello\n");
|
|
708
|
+
case "/query": return new Response(`${url.search}\n`);
|
|
709
|
+
case "/method": return new Response(`${request.method}\n`);
|
|
710
|
+
case "/body": return new Response(await request.text());
|
|
711
|
+
case "/missing": return new Response("missing\n", { status: 404 });
|
|
712
|
+
case "/redirect":
|
|
713
|
+
return new Response(null, { status: 302, headers: { Location: "/method" } });
|
|
714
|
+
case "/blob": return new Response(Buffer.alloc(65536, "b"));
|
|
715
|
+
default: return new Response("not found\n", { status: 404 });
|
|
716
|
+
}
|
|
717
|
+
},
|
|
718
|
+
});
|
|
719
|
+
origin = `localhost:${server.port}`;
|
|
720
|
+
});
|
|
721
|
+
|
|
722
|
+
afterAll(() => server?.stop(true));
|
|
723
|
+
|
|
724
|
+
async function expectLikeCurl(args, transform = (output) => output) {
|
|
725
|
+
const [actual, reference] = await Promise.all([
|
|
726
|
+
invokeArgvWithInput(
|
|
727
|
+
[process.execPath, join(root, "src/main.js"), "-cc", "builtin", "curl", ...args],
|
|
728
|
+
"",
|
|
729
|
+
),
|
|
730
|
+
invokeArgvWithInput([systemCurl, ...args], ""),
|
|
731
|
+
]);
|
|
732
|
+
expect(transform(actual)).toEqual(transform(reference));
|
|
733
|
+
}
|
|
734
|
+
|
|
735
|
+
test.skipIf(!systemCurl)("matches bodies, statuses, and the guessed scheme", async () => {
|
|
736
|
+
await expectLikeCurl(["-s", `${origin}/text`]);
|
|
737
|
+
await expectLikeCurl(["-s", `http://${origin}/text`]);
|
|
738
|
+
await expectLikeCurl(["-s", `${origin}/missing`]);
|
|
739
|
+
await expectLikeCurl(["-s", `${origin}/nowhere`]);
|
|
740
|
+
});
|
|
741
|
+
|
|
742
|
+
test.skipIf(!systemCurl)("matches the tmpk download and probe invocations", async () => {
|
|
743
|
+
await expectLikeCurl(["-fsSL", `${origin}/text`]);
|
|
744
|
+
await expectLikeCurl(["-kfsS", `${origin}/text`]);
|
|
745
|
+
await expectLikeCurl(["-sk", `${origin}/blob`]);
|
|
746
|
+
// `-#` paints a live bar whose bytes depend on timing; only the body
|
|
747
|
+
// and the status are comparable.
|
|
748
|
+
await expectLikeCurl(["-#k", `${origin}/text`], ({ status, stdout }) => ({ status, stdout }));
|
|
749
|
+
});
|
|
750
|
+
|
|
751
|
+
test.skipIf(!systemCurl)("matches -f and error exit codes", async () => {
|
|
752
|
+
await expectLikeCurl(["-sf", `${origin}/missing`]);
|
|
753
|
+
await expectLikeCurl(["-sSf", `${origin}/missing`]);
|
|
754
|
+
await expectLikeCurl(["-s", "--fail-with-body", `${origin}/missing`]);
|
|
755
|
+
await expectLikeCurl(["-s", "http://localhost:1/"]);
|
|
756
|
+
await Promise.all([
|
|
757
|
+
expectLikeCurl(["-s", "http://no-such-host-zzz.invalid/"]),
|
|
758
|
+
expectLikeCurl(["-sS", "http://no-such-host-zzz.invalid/"]),
|
|
759
|
+
]);
|
|
760
|
+
await expectLikeCurl(["--bogus", `${origin}/text`]);
|
|
761
|
+
await expectLikeCurl([]);
|
|
762
|
+
}, 10_000);
|
|
763
|
+
|
|
764
|
+
test.skipIf(!systemCurl)("matches redirect following and the method it lands on", async () => {
|
|
765
|
+
await expectLikeCurl(["-s", `${origin}/redirect`]);
|
|
766
|
+
await expectLikeCurl(["-sL", `${origin}/redirect`]);
|
|
767
|
+
await expectLikeCurl(["-sL", "-d", "a=1", `${origin}/redirect`]);
|
|
768
|
+
});
|
|
769
|
+
|
|
770
|
+
test.skipIf(!systemCurl)("matches the request bodies an API call sends", async () => {
|
|
771
|
+
await expectLikeCurl(["-s", "-d", "a=1", "-d", "b=2", `${origin}/body`]);
|
|
772
|
+
await expectLikeCurl(["-s", "--data-raw", '{"a":1}', `${origin}/body`]);
|
|
773
|
+
await expectLikeCurl(["-s", "--json", '{"a":1}', `${origin}/body`]);
|
|
774
|
+
await expectLikeCurl(["-s", "--data-urlencode", "q=a b&c", `${origin}/body`]);
|
|
775
|
+
await expectLikeCurl(["-s", "-X", "PUT", "-d", "x", `${origin}/method`]);
|
|
776
|
+
await expectLikeCurl(["-s", "-G", "-d", "a=1", "-d", "b=2", `${origin}/query`]);
|
|
777
|
+
await expectLikeCurl(["-s", "-G", "--data-urlencode", "q=a b", `${origin}/query`]);
|
|
778
|
+
});
|
|
779
|
+
|
|
780
|
+
test.skipIf(!systemCurl)("matches --write-out reporting", async () => {
|
|
781
|
+
await expectLikeCurl([
|
|
782
|
+
"-s", "-o", "/dev/null", "-w", "%{http_code} %{size_download} %{content_type}\\n",
|
|
783
|
+
`${origin}/text`,
|
|
784
|
+
]);
|
|
785
|
+
await expectLikeCurl([
|
|
786
|
+
"-sf", "-w", "%{http_code} %{exitcode}\\n", `${origin}/missing`,
|
|
787
|
+
]);
|
|
788
|
+
await expectLikeCurl([
|
|
789
|
+
"-s", "-o", "/dev/null", "-L", "-w", "%{url_effective} %{num_redirects} %{method}\\n",
|
|
790
|
+
`${origin}/redirect`,
|
|
791
|
+
]);
|
|
792
|
+
});
|
|
793
|
+
|
|
794
|
+
test.skipIf(!systemCurl)("matches -i once header order and casing are normalised", async () => {
|
|
795
|
+
// fetch hands back lower-cased headers in its own order and hides the
|
|
796
|
+
// negotiated HTTP version, so compare the status line plus a sorted,
|
|
797
|
+
// lower-cased header set — the values themselves still have to agree.
|
|
798
|
+
const normalize = ({ status, stdout, stderr }) => {
|
|
799
|
+
const split = stdout.indexOf("\r\n\r\n");
|
|
800
|
+
const head = stdout.slice(0, split).split("\r\n");
|
|
801
|
+
const body = stdout.slice(split + 4);
|
|
802
|
+
return {
|
|
803
|
+
status,
|
|
804
|
+
stderr,
|
|
805
|
+
body,
|
|
806
|
+
statusLine: head[0],
|
|
807
|
+
headers: head.slice(1)
|
|
808
|
+
.map((line) => line.toLowerCase())
|
|
809
|
+
// Date moves on between the two requests.
|
|
810
|
+
.filter((line) => !line.startsWith("date:"))
|
|
811
|
+
.sort(),
|
|
812
|
+
};
|
|
813
|
+
};
|
|
814
|
+
await expectLikeCurl(["-si", `${origin}/text`], normalize);
|
|
815
|
+
await expectLikeCurl(["-sI", `${origin}/text`], normalize);
|
|
816
|
+
});
|
|
817
|
+
});
|