mirror of
https://github.com/nushell/nushell
synced 2024-12-27 05:23:11 +00:00
3d5f853b03
<!-- if this PR closes one or more issues, you can automatically link the PR with them by using one of the [*linking keywords*](https://docs.github.com/en/issues/tracking-your-work-with-issues/linking-a-pull-request-to-an-issue#linking-a-pull-request-to-an-issue-using-a-keyword), e.g. - this PR should close #xxxx - fixes #xxxx you can also mention related issues, PRs or discussions! --> # Description <!-- Thank you for improving Nushell. Please, check our [contributing guide](../CONTRIBUTING.md) and talk to the core team before making major changes. Description of your pull request goes here. **Provide examples and/or screenshots** if your changes affect the user experience. --> The [nushell/demo](https://github.com/nushell/demo) project successfully demonstrated running Nushell in the browser using WASM. However, the current version of Nushell cannot be easily built for the `wasm32-unknown-unknown` target, the default for `wasm-bindgen`. This PR introduces initial support for the `wasm32-unknown-unknown` target by disabling OS-dependent features such as filesystem access, IO, and platform/system-specific functionality. This separation is achieved using a new `os` feature in the following crates: - `nu-cmd-lang` - `nu-command` - `nu-engine` - `nu-protocol` The `os` feature includes all functionality that interacts with an operating system. It is enabled by default, but can be disabled using `--no-default-features`. All crates that depend on these core crates now use `--no-default-features` to allow compilation for WASM. To demonstrate compatibility, the following script builds all crates expected to work with WASM. Direct user interaction, running external commands, working with plugins, and features requiring `openssl` are out of scope for now due to their complexity or reliance on C libraries, which are difficult to compile and link in a WASM environment. ```nushell [ # compatible crates "nu-cmd-base", "nu-cmd-extra", "nu-cmd-lang", "nu-color-config", "nu-command", "nu-derive-value", "nu-engine", "nu-glob", "nu-json", "nu-parser", "nu-path", "nu-pretty-hex", "nu-protocol", "nu-std", "nu-system", "nu-table", "nu-term-grid", "nu-utils", "nuon" ] | each {cargo build -p $in --target wasm32-unknown-unknown --no-default-features} ``` ## Caveats This PR has a few caveats: 1. **`miette` and `terminal-size` Dependency Issue** `miette` depends on `terminal-size`, which uses `rustix` when the target is not Windows. However, `rustix` requires `std::os::unix`, which is unavailable in WASM. To address this, I opened a [PR](https://github.com/eminence/terminal-size/pull/68) for `terminal-size` to conditionally compile `rustix` only when the target is Unix. For now, the `Cargo.toml` includes patches to: - Use my forked version of `terminal-size`. - ~~Use an unreleased version of `miette` that depends on `terminal-size@0.4`.~~ These patches are temporary and can be removed once the upstream changes are merged and released. 2. **Test Output Adjustments** Due to the slight bump in the `miette` version, one test required adjustments to accommodate minor formatting changes in the error output, such as shifted newlines. # User-Facing Changes <!-- List of all changes that impact the user experience here. This helps us keep track of breaking changes. --> This shouldn't break anything but allows using some crates for targeting `wasm32-unknown-unknown` to revive the demo page eventually. # Tests + Formatting <!-- Don't forget to add tests that cover your changes. Make sure you've run and fixed any issues with these commands: - `cargo fmt --all -- --check` to check standard code formatting (`cargo fmt --all` applies these changes) - `cargo clippy --workspace -- -D warnings -D clippy::unwrap_used` to check that you're using the standard code style - `cargo test --workspace` to check that all tests pass (on Windows make sure to [enable developer mode](https://learn.microsoft.com/en-us/windows/apps/get-started/developer-mode-features-and-debugging)) - `cargo run -- -c "use toolkit.nu; toolkit test stdlib"` to run the tests for the standard library > **Note** > from `nushell` you can also use the `toolkit` as follows > ```bash > use toolkit.nu # or use an `env_change` hook to activate it automatically > toolkit check pr > ``` --> - 🟢 `toolkit fmt` - 🟢 `toolkit clippy` - 🟢 `toolkit test` - 🟢 `toolkit test stdlib` I did not add any extra tests, I just checked that compiling works, also when using the host target but unselecting the `os` feature. # After Submitting <!-- If your PR had any user-facing changes, update [the documentation](https://github.com/nushell/nushell.github.io) after the PR is merged, if necessary. This will help us keep the docs up to date. --> ~~Breaking the wasm support can be easily done by adding some `use`s or by adding a new dependency, we should definitely add some CI that also at least builds against wasm to make sure that building for it keep working.~~ I added a job to build wasm. --------- Co-authored-by: Ian Manske <ian.manske@pm.me>
199 lines
No EOL
6.6 KiB
TOML
199 lines
No EOL
6.6 KiB
TOML
[package]
|
|
authors = ["The Nushell Project Developers"]
|
|
description = "Nushell's built-in commands"
|
|
edition = "2021"
|
|
license = "MIT"
|
|
name = "nu-command"
|
|
repository = "https://github.com/nushell/nushell/tree/main/crates/nu-command"
|
|
version = "0.100.1"
|
|
|
|
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
|
|
|
[lib]
|
|
bench = false
|
|
|
|
[lints]
|
|
workspace = true
|
|
|
|
[dependencies]
|
|
nu-cmd-base = { path = "../nu-cmd-base", version = "0.100.1" }
|
|
nu-color-config = { path = "../nu-color-config", version = "0.100.1" }
|
|
nu-engine = { path = "../nu-engine", version = "0.100.1", default-features = false }
|
|
nu-glob = { path = "../nu-glob", version = "0.100.1" }
|
|
nu-json = { path = "../nu-json", version = "0.100.1" }
|
|
nu-parser = { path = "../nu-parser", version = "0.100.1" }
|
|
nu-path = { path = "../nu-path", version = "0.100.1" }
|
|
nu-pretty-hex = { path = "../nu-pretty-hex", version = "0.100.1" }
|
|
nu-protocol = { path = "../nu-protocol", version = "0.100.1", default-features = false }
|
|
nu-system = { path = "../nu-system", version = "0.100.1" }
|
|
nu-table = { path = "../nu-table", version = "0.100.1" }
|
|
nu-term-grid = { path = "../nu-term-grid", version = "0.100.1" }
|
|
nu-utils = { path = "../nu-utils", version = "0.100.1", default-features = false }
|
|
nu-ansi-term = { workspace = true }
|
|
nuon = { path = "../nuon", version = "0.100.1" }
|
|
|
|
alphanumeric-sort = { workspace = true }
|
|
base64 = { workspace = true }
|
|
bracoxide = { workspace = true }
|
|
brotli = { workspace = true }
|
|
byteorder = { workspace = true }
|
|
bytesize = { workspace = true }
|
|
calamine = { workspace = true, features = ["dates"] }
|
|
chardetng = { workspace = true }
|
|
chrono = { workspace = true, features = ["std", "unstable-locales", "clock"], default-features = false }
|
|
chrono-humanize = { workspace = true }
|
|
chrono-tz = { workspace = true }
|
|
crossterm = { workspace = true, optional = true }
|
|
csv = { workspace = true }
|
|
dialoguer = { workspace = true, default-features = false, features = ["fuzzy-select"] }
|
|
digest = { workspace = true, default-features = false }
|
|
dtparse = { workspace = true }
|
|
encoding_rs = { workspace = true }
|
|
fancy-regex = { workspace = true }
|
|
filesize = { workspace = true }
|
|
filetime = { workspace = true }
|
|
human-date-parser = { workspace = true }
|
|
indexmap = { workspace = true }
|
|
indicatif = { workspace = true }
|
|
itertools = { workspace = true }
|
|
log = { workspace = true }
|
|
lscolors = { workspace = true, default-features = false, features = ["nu-ansi-term"] }
|
|
md5 = { workspace = true }
|
|
mime = { workspace = true }
|
|
mime_guess = { workspace = true }
|
|
multipart-rs = { workspace = true, optional = true }
|
|
native-tls = { workspace = true, optional = true }
|
|
notify-debouncer-full = { workspace = true, default-features = false, optional = true }
|
|
num-format = { workspace = true }
|
|
num-traits = { workspace = true }
|
|
oem_cp = { workspace = true }
|
|
open = { workspace = true, optional = true }
|
|
os_pipe = { workspace = true, optional = true }
|
|
pathdiff = { workspace = true }
|
|
percent-encoding = { workspace = true }
|
|
print-positions = { workspace = true }
|
|
quick-xml = { workspace = true }
|
|
rand = { workspace = true, optional = true }
|
|
getrandom = { workspace = true, optional = true }
|
|
rayon = { workspace = true }
|
|
regex = { workspace = true }
|
|
roxmltree = { workspace = true }
|
|
rusqlite = { workspace = true, features = ["bundled", "backup", "chrono"], optional = true }
|
|
rmp = { workspace = true }
|
|
serde = { workspace = true, features = ["derive"] }
|
|
serde_json = { workspace = true, features = ["preserve_order"] }
|
|
serde_urlencoded = { workspace = true }
|
|
serde_yaml = { workspace = true }
|
|
sha2 = { workspace = true }
|
|
sysinfo = { workspace = true }
|
|
tabled = { workspace = true, features = ["ansi"], default-features = false }
|
|
titlecase = { workspace = true }
|
|
toml = { workspace = true, features = ["preserve_order"] }
|
|
unicode-segmentation = { workspace = true }
|
|
ureq = { workspace = true, default-features = false, features = ["charset", "gzip", "json"] }
|
|
url = { workspace = true }
|
|
uu_cp = { workspace = true, optional = true }
|
|
uu_mkdir = { workspace = true, optional = true }
|
|
uu_mktemp = { workspace = true, optional = true }
|
|
uu_mv = { workspace = true, optional = true }
|
|
uu_touch = { workspace = true, optional = true }
|
|
uu_uname = { workspace = true, optional = true }
|
|
uu_whoami = { workspace = true, optional = true }
|
|
uuid = { workspace = true, features = ["v4"], optional = true }
|
|
v_htmlescape = { workspace = true }
|
|
wax = { workspace = true }
|
|
which = { workspace = true, optional = true }
|
|
unicode-width = { workspace = true }
|
|
data-encoding = { version = "2.6.0", features = ["alloc"] }
|
|
|
|
[target.'cfg(windows)'.dependencies]
|
|
winreg = { workspace = true }
|
|
|
|
[target.'cfg(all(not(windows), not(target_arch = "wasm32")))'.dependencies]
|
|
uucore = { workspace = true, features = ["mode"] }
|
|
|
|
[target.'cfg(unix)'.dependencies]
|
|
umask = { workspace = true }
|
|
nix = { workspace = true, default-features = false, features = ["user", "resource", "pthread"] }
|
|
|
|
[target.'cfg(any(target_os = "linux", target_os = "android"))'.dependencies]
|
|
procfs = { workspace = true }
|
|
|
|
[target.'cfg(not(any(target_os = "android", target_os = "ios")))'.dependencies.trash]
|
|
optional = true
|
|
workspace = true
|
|
|
|
[target.'cfg(windows)'.dependencies.windows]
|
|
features = [
|
|
"Win32_Foundation",
|
|
"Win32_Storage_FileSystem",
|
|
"Win32_System_Environment",
|
|
"Win32_System_SystemServices",
|
|
"Win32_Security",
|
|
"Win32_System_Threading",
|
|
]
|
|
workspace = true
|
|
|
|
[features]
|
|
default = ["os"]
|
|
os = [
|
|
# include other features
|
|
"js",
|
|
"network",
|
|
"nu-protocol/os",
|
|
"nu-utils/os",
|
|
|
|
# os-dependant dependencies
|
|
"crossterm",
|
|
"notify-debouncer-full",
|
|
"open",
|
|
"os_pipe",
|
|
"uu_cp",
|
|
"uu_mkdir",
|
|
"uu_mktemp",
|
|
"uu_mv",
|
|
"uu_touch",
|
|
"uu_uname",
|
|
"uu_whoami",
|
|
"which",
|
|
]
|
|
|
|
# The dependencies listed below need 'getrandom'.
|
|
# They work with JS (usually with wasm-bindgen) or regular OS support.
|
|
# Hence they are also put under the 'os' feature to avoid repetition.
|
|
js = [
|
|
"getrandom",
|
|
"getrandom/js",
|
|
"rand",
|
|
"uuid",
|
|
]
|
|
|
|
# These dependencies require networking capabilities, especially the http
|
|
# interface requires openssl which is not easy to embed into wasm,
|
|
# using rustls could solve this issue.
|
|
network = [
|
|
"multipart-rs",
|
|
"native-tls",
|
|
"ureq/native-tls",
|
|
"uuid",
|
|
]
|
|
|
|
plugin = [
|
|
"nu-parser/plugin",
|
|
"os",
|
|
]
|
|
sqlite = ["rusqlite"]
|
|
trash-support = ["trash"]
|
|
|
|
[dev-dependencies]
|
|
nu-cmd-lang = { path = "../nu-cmd-lang", version = "0.100.1" }
|
|
nu-test-support = { path = "../nu-test-support", version = "0.100.1" }
|
|
|
|
dirs = { workspace = true }
|
|
mockito = { workspace = true, default-features = false }
|
|
quickcheck = { workspace = true }
|
|
quickcheck_macros = { workspace = true }
|
|
rstest = { workspace = true, default-features = false }
|
|
pretty_assertions = { workspace = true }
|
|
tempfile = { workspace = true }
|
|
rand_chacha = { workspace = true } |