Nucleus is a specification for a minimal JS runtime that makes it fun to create your own platforms.
# Show version and build options
nucleus --version
# Run an app from a tree in the filesystem.
nucleus app-src -- args...
# Run an app from a zip bundle.
nucleus app.zip -- args...
# Manually build a standalone binary with nucleus embedded.
cat /usr/local/bin/nucleus app.zip > app
chmod +x app
./app args...
# Manually build a standalone binary that links to system nucleus.
echo "#!/usr/local/bin/nucleus" > prefix
cat prefix app.zip > app
chmod + x app
./app args...
# Build app with linked nucleus in shebang
nucleus app.zip --linked --output app
This is a sample application that's using a node.js style require system.
app
├── main.js
└── node_modules
└── node-core
├── bootstrap.js
.
.
.
The only thing special is there must be an main.js
at the root of the tree.
This file will be run in the JS runtime with a global nucleus
injected.
// main.js
// Bootstrap the node environment with the dofile builtin.
nucleus.dofile('node_modules/node-core/bootstrap.js')(function (require, module) {
// node code goes here
});
This global is the only thing custom injected into the JavaScript global scope. It provides access to all the C bindings in nucleus as well as some utility functions to work with the bundle resources and the JS runtime.
This will be the command-line args that were passed to the application
The name of the JS engine being used.
A map of versions of nucleus and it's components.
This allows exiting the process with an optional exit code. If this is never called and the main script returns, then the process exits with 0.
Compile a string into a JavaScript function.
This will load a file as data. Note that data will be one byte per character so that it's binary safe, but ASCII data will be usable as a string. If you wish to decode something that's UTF-8 encoded as a unicode string, do the following trick.
var code = decodeURIComponent(escape(nucleus.readfile("myfile.js")));
If the path is not a file, data will be false
.
This iterates through a directory calling your callback with name and type for
each entry. It will return with true
if the path was a folder and false
if
not.
The type
parameter in the callback is one of "file"
, or "directory"
usually.
This is basically a combination of nucleus.readfile
and nucleus.compile
which
then executes the resulting function returning the result. It's generally used
for bootstrapping an environment or module system.
Basic path-join to be used for paths to dofile
, scandir
, and readfile
.
Base is the base path of the resource bundle. If running from a directory it will be the directory path, if it's a zip, it will be path to the zip.
This will be bindings to libuv exposed to JavaScript.
Bindings to miniz that's used for the bundle logic.
Other bindings...