1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
[]
= "node-js"
= "0.1.2"
= "2021"
= "1.80"
= "JavaScript as a fusevm frontend: a lexer/parser and compiler to fusevm::Chunk on a JsHost object heap, with no bespoke VM or JIT"
= "MIT"
= ["MenkeTechnologies <linux.dev25@gmail.com>"]
= "https://github.com/MenkeTechnologies/node-js"
= "https://menketechnologies.github.io/node-js/"
= "https://docs.rs/node-js"
= ["javascript", "interpreter", "compiler", "jit", "fusevm"]
= ["command-line-utilities", "compilers"]
= true
# Keep the published crate lean: ship `src/`, `man/`, `completions/`,
# README/LICENSE — nothing else. Everything below stays in git for
# local/CI use but is omitted from `cargo package` / the crates.io
# tarball. Mirrors strykelang's exclude set.
= [
"/.github/",
"/tests/",
"/examples/",
"/docs/",
"/parity-scripts/",
"/BUGS.md",
]
# node-js is a standalone crate, not a workspace member. An explicit empty
# `[workspace]` stops cargo walking up to the MenkeTechnologiesMeta parent.
[]
[]
= "nodejs"
= "src/lib.rs"
# staticlib so an AOT object can be linked against the nodejs runtime into a
# standalone native executable (mirrors pythonrs).
= ["rlib", "staticlib"]
[[]]
= "node"
= "src/main.rs"
# Differential parity harness: runs the corpus through node-js and the reference
# `node`, diffing stdout. Development tool — needs `node` on PATH, so CI never
# runs it; its frozen outputs live in tests/data/parity_expected.txt, which
# tests/parity.rs replays with no `node` installed.
# Offline reference-manual generator: consumes the `nodejs::lsp` corpus and
# writes docs/reference.html (article-format keyword/global/method reference).
# The MenkeTechnologiesPublications reference PDF pipeline runs this.
[[]]
= "gen-docs"
= "src/bin/gen_docs.rs"
[[]]
= "parity"
= "src/bin/parity.rs"
# Differential parity FUZZER: generates thousands of deterministic-output JS
# snippets (biased toward float repr / exponential-notation threshold, ToInt32
# bitwise wrap, the `==` coercion matrix, `+` coercion, string/array methods,
# toFixed/toPrecision rounding, JSON round-trips) and diffs `node -e` against the
# reference `node -e`, delta-debugging every divergence to a minimal repro.
# Subprocess-only (never links the lib); std-only (no `rand`). Dev tool — needs
# `node` on PATH, so CI never runs it.
[[]]
= "parity-fuzz"
= "src/bin/parity_fuzz.rs"
[]
# JavaScript executes on fusevm. node-js is a pure frontend: it lowers JS to
# fusevm bytecode (src/compiler.rs) and hosts the JS object heap (src/host.rs,
# reached from fusevm's builtin dispatch + numeric hook). Object/str/array cells
# ride through the VM as `Value::Obj(u32)` handles into that heap.
#
# `jit-disk-cache` turns on fusevm's Cranelift JIT *and* its persistent on-disk
# cache of compiled native code; `aot` enables the ahead-of-time object emitter.
# `ffi` enables inline Rust FFI (`rust { ... }` blocks) — src/rust_ffi.rs.
= { = "0.23.0", = ["jit", "jit-disk-cache", "aot", "ffi"] }
= { = "4.5", = ["derive", "cargo"] }
= "2.0"
= "2.1"
# JS objects preserve property insertion order (observable in iteration / repr).
= "2"
# Stackful, same-thread coroutines backing generators (`function*`/`yield`) and
# `await` suspension — mirrors pythonrs. The thread_local JsHost heap is shared
# across every suspend/resume because the coroutine runs on the same thread.
= "0.3"
# rkyv-backed bytecode cache at ~/.node-js/scripts.rkyv (mirrors pythonrs/
# zshrs/rubylang): the outer shard is a zero-copy rkyv archive; the inner
# per-script fusevm::Chunk is bincode (fusevm::Chunk is serde-owned, not
# rkyv::Archive). Versioned from day one so a cached .js that worked never
# breaks (compat floor).
= { = "0.7", = ["validation", "archive_le", "size_32"] }
= "1.3"
= "0.9"
= "5"
= "1"
# LSP (`node --lsp`) + DAP (`node --dap`) over stdio. libc gives the DAP server
# a pipe + dup2 to capture the debuggee's stdout (console.log) so program output
# streams as `output` events instead of corrupting the JSON-RPC channel; it also
# backs the `isatty` REPL fallthrough.
= "0.7.9"
= "0.97.0"
= { = "1", = ["derive"] }
= "1"
= "0.2"
# Interactive REPL (`node --repl` / TTY fallthrough): reedline line editor,
# nu-ansi-term for status colors.
= "0.47.0"
= "0.50"
# Hash backends for the `crypto` module (createHash md5/sha1/sha256).
= "0.10"
= "0.10"
= "0.10"
# HMAC (createHmac), OS randomness (randomBytes/randomUUID), and real DEFLATE/gzip
# for the `zlib` module.
= "0.12"
= "0.2"
= "1"
# Pure-Rust TLS for the `tls`/`https` modules (blocking rustls::Stream over a
# std TcpStream); rustls-pemfile parses cert/key PEMs; webpki-roots is the client
# trust anchor set.
= "0.23"
= "2"
= "0.26"
# HPACK header compression for a minimal real HTTP/2 server (`http2`).
= "0.3"
# ── Full-stdlib round: additional native backends ────────────────────────────
# zlib: Brotli + Zstd codecs and a CRC-32 (flate2 already covers deflate/gzip).
= "7"
= "0.13"
= "1.4"
# crypto: real KDFs + symmetric ciphers + constant-time compare for the `crypto`
# module surface (pbkdf2/scrypt/hkdf, createCipheriv AES-CBC/CTR, timingSafeEqual).
= "0.12"
= "0.11"
= "0.12"
= "0.8"
= { = "0.1", = ["alloc"] }
= "0.9"
= "0.4"
= "2.6"
# dns: real recursive/system-config DNS resolution (resolve4/6/Mx/Txt/Cname/…).
= "0.24"
# ── crypto (asymmetric): real RustCrypto backends for the `crypto` module ─────
# RSA (keygen/sign/verify/OAEP+PKCS1), NIST P-256/P-384 ECDSA+ECDH, Ed25519,
# X25519 ECDH, PKCS#8/SPKI/SEC1/PEM key encoding, X.509 parsing, primality
# (checkPrime/generatePrime), Argon2 KDF.
= { = "0.9", = ["sha2", "pem"] }
= { = "0.13", = ["ecdsa", "ecdh", "pem", "pkcs8"] }
= { = "0.13", = ["ecdsa", "ecdh", "pem", "pkcs8"] }
= "0.16"
= { = "2", = ["pkcs8", "pem", "rand_core"] }
= { = "2", = ["static_secrets"] }
= "2"
= { = "0.10", = ["pem", "alloc"] }
= "0.7"
= "0.7"
= "0.2"
= "0.4"
= "0.5"
= { = "0.6", = ["getrandom"] }
= "0.9"
# Arbitrary-precision integers backing JS `BigInt` (the `10n` literal + bigint
# arithmetic). Same crates/versions pythonrs uses for its bignum path.
= "0.4"
= "0.1"
= "0.2"
# JS regular-expression literals (`/pat/flags`) + `RegExp`. `fancy-regex` wraps
# the Rust `regex` crate for the linear fast path and adds a backtracking engine
# for lookaround (`(?=)`/`(?!)`/`(?<=)`/`(?<!)`) and backreferences (`\1`,
# `\k<name>`) — the JS constructs Rust `regex` alone cannot express. node-js
# translates the JS source into fancy-regex syntax (see src/regexp.rs).
= "0.18"
# Still used directly for the `regex`-native escape/quote helpers and re-exported
# types; fancy-regex builds on top of it.
= "1"
= "0.1.25"
[]
= "3"