Learn the basics of Vanadin step-by-step

Installation of Vanadin

To install Vanadin, you have two options:

  • Install Vanadin via Cargo
  • Install Vanadin manually

Installing Vanadin via Cargo

If you do not have cargo, you can install it by following the Official Installation Guide of Rust & Cargo

After you installed Cargo, run cargo install vanadin to install Vanadin.

To validate the installation, you can run vanadin info and you should see something like this:

[INFO] Running Vanadin v0.1.0
[INFO] Blazingly fast building and testing framework.
[INFO] Made by DraftedDev

Installing Vanadin manually

W.I.P

Your First Project

Initializing Vanadin

To get started, you first need to create a basic .vanadin folder.

To do so, run:

$ vanadin init

Anatomy of your .vanadin

The .vanadin folder is where you define tasks, set environment variables and configure your project.

It should look this:

My Project
├── .vanadin
│   ├── Vanadin.toml
│   └── tasks
│       └── build.js
└── ...

The Vanadin.toml file

The Vanadin.toml file defines the tasks, environment variables and other stuff for Vanadin.

Tasks are defined like this:

[task.task-name]
name = "task-name" # The name of the task. Defaults to the name of the [task.<name>] section
about = "About the task aka the its description" # Defaults to an empty string.
src = "./tasks/my-task.js" # This defaults to './tasks/<task-name>.js' if not specified

The tasks folder

This is the default location of all tasks.

You should define tasks in this folder, but if you want to define them elsewhere, make sure to set the src field in your [task] section.

Environment variables

Environment variables are set in the [env] section of your Vanadin.toml file:

[env]
MY_VARIABLE = "my-value"
SECRET_NUMBER = "123"

These variables are set before the execution of a task, so you can use them in the task.

Running tasks

To run a task, execute:

$ vanadin x -t your-task-name

When creating your .vanadin with vanadin init, you can run the generated build task via vanadin x -t build.

Pre- and Post-Tasks

You can define pre- and post-tasks to execute before and after the main task.

These tasks can be defined in the [task] section like this:

[task.prepare]
about = "Prepare your meal"

[task.eat]
about = "Eat your meal"
pre = ["prepare"]
post = ["cleanup"]

[task.cleanup]
about = "Clean up after your meal"

When running the eat task, the prepare and cleanup tasks will be executed before and afterward.

NOTE 1: The pre and post tasks will be executed in the order they are defined.

NOTE 2: Make sure that pre- and post-tasks do not depend on each other, so that infinite loops may occur.

Learn how to code your first script via JS and pre-defined modules.

Coding in JavaScript

You may have noticed, that all tasks end with .js. This is because all tasks are written in plain old, easy & fast JavaScript.

Vanadin uses the QuickJS Engine under the hood to execute fast and tiny JavaScript code with a tiny runtime and small footprint.

The engine supports most of the ES2023 specification. Due to most tasks not requiring advanced features, Vanadin only supports most basic JavaScript with BaseObject support.

It should also be kept in mind, that scripts are executed in non-global scope and are not strict by default.

Built-in Features

Vanadin provides a set of useful features by default.

Following functions may be called without extra module imports:

print("Some String"); // prints "Some String"
println("Another String"); // prints "Another String" with a newline at the end
assert(condition); // tests if condition is true and throws an error otherwise
throw("Error Message"); // throws an error with the given message

There are also pre-defined constants:

println(ID); // Prints the ID/name of the current task
println(ABOUT); // Prints the description of the current task

Tools & "Runners"

Vanadin contains some special modules for integration with compilers, frameworks and more.

You can import different modules from tools/...:

import { run } from "tools/node";

// runs `node index.js`
run("index.js");

The tools/node Module

The tools/node module provides useful functions for working with Node.js.

Import it with:

import { run, ... } from "tools/node";

Functions


run(file)

Runs the given file in Node.js with extra development features. Basically just runs node <file>. Returns the exit or null if there was no exit code.


node(cmd)

Runs the given command in Node.js. Basically just runs node <cmd>. Returns the exit or null if there was no exit code.


launch(file)

Runs the given file in Node.js without extra development features. Basically just runs node <file>. Returns the exit or null if there was no exit code.


The tools/python Module

The tools/python module provides useful functions for working with Python.

Import it with:

import { run, ... } from "tools/python";

Functions


run(file)

Runs the given file or __main__.py if null is given. Executes the file with extra development features and returns the exit code or null if none was provided.


py(cmd)

Runs the given command using the python command. Returns the exit code or null if none was provided.


launch(file)

Runs the given file or __main__.py if null is given. Executes the file with extra optimization and returns the exit code or null if none was provided.


The tools/cargo Module

The tools/cargo module provides useful functions for working with Rust & Cargo.

Import it with:

import { run, ... } from "tools/cargo";

Functions


cargo(cmd)

Runs the given command and returns the exit code if given, otherwise null.


run()

Executes cargo run and returns the exit code if given, otherwise null.


build()

Executes cargo build and returns the exit code if given, otherwise null.


test(test)

Executes cargo test --test <test> or cargo test if no test is given and returns the exit code if there is one, otherwise null.


clean()

Executes cargo clean and returns the exit code if given, otherwise null.


release()

Builds the crate in release mode with --config strip=true --future-incompat-report and returns the exit code if given, otherwise null.

env Module

The env module provides access to environment variables and basic process variables.

To import the env module, use the import keyword:

import { get, set, ... } from 'env';

Functions


get(key)

Returns the value of the environment variable with the name key.


set(key, value)

Sets the value of the environment variable with the name key to value.


remove(key)

Removes the environment variable with the name key.


dir()

Returns the current working directory.


os()

Returns the operating system name.


arch()

Returns the architecture.


family()

Returns the operating system family.

process Module

The process module provides useful functions for spawning processes, running commands and more.

To import the process module, use the import keyword:

import { cmd, ... } from 'process';

Functions


cmd(command, args)

Runs the given command with the given arguments and returns the exit code. Returns null if an error occurs.


exit(code)

Exits the process with the given exit code.


id()

Returns the current process ID.

fs Module

The fs module provides functions for interacting with the file system.

To import the fs module, use the import keyword:

import { readFile, ... } from 'fs';

Functions


readFile(file)

Returns the contents of the given file as a string or null if an error occurs.


writeFile(file, content)

Writes the given content to the given file.


readFileBytes(file)

Returns the contents of the given file as a byte array or null if an error occurs.


writeFileBytes(file, content)

Writes the given content to the given file as a byte array.


createFile(file)

Creates a new file with the given name.


removeFile(file)

Deletes the given file.


createDir(dir)

Creates a new directory with the given name.


removeDir(dir)

Deletes the given directory.


exists(file)

Checks if the given file exists.

log Module

The log module provides functions to use the built-in Vanadin logger.

To import the log module, use the import keyword:

import { info, ... } from 'log';

Functions


info(msg)

Logs an informational message.


warn(msg)

Logs a warning message.


error(msg)

Logs an error message.


debug(msg)

Logs a debug message.


trace(msg)

Logs a trace message.

math Module

The math module provides functions to use the built-in Vanadin logger.

To import the math module, use the import keyword:

import { sqrt, ... } from 'math';

Functions


sqrt(x)

Returns the square root of x.


pow(base, exp)

Returns the value of base raised to the power of exp.


sin(x)

Returns the sine of x.


cos(x)

Returns the cosine of x.


tan(x)

Returns the tangent of x.


asin(x)

Returns the arc sine of x.


acos(x)

Returns the arc cosine of x.


atan(x)

Returns the arc tangent of x.


sinh(x)

Returns the hyperbolic sine of x.


cosh(x)

Returns the hyperbolic cosine of x.


tanh(x)

Returns the hyperbolic tangent of x.


asinh(x)

Returns the inverse hyperbolic sine of x.


acosh(x)

Returns the inverse hyperbolic cosine of x.


atanh(x)

Returns the inverse hyperbolic tangent of x.


exp(x)

Returns the exponential of x.


log(x, base)

Returns the logarithm of x with the given base.


log2(x)

Returns the base-2 logarithm of x.


log10(x)

Returns the base-10 logarithm of x.


floor(x)

Returns the largest integer less than or equal to x.


ceil(x)

Returns the smallest integer greater than or equal to x.


round(x)

Returns the value of x rounded to the nearest integer.

Constants


E

Euler's number e


PI

Archimedes' constant π

sys Module

The sys module provides functions to retrieve system information.

To import the sys module, use the import keyword:

import { cpuCount, ... } from 'sys';

Functions

NOTE: Most or all of these functions are quite expensive, since they request system information from the OS and are not cached.


cpuCount()

Returns the number of CPUs in the system or null if it cannot be determined.


cpuBrands()

Returns an array of CPU brands in the system.


cpuNames()

Returns an array of CPU names in the system.


cpuFrequencies()

Returns an array of CPU frequencies in the system.


cpuUsages()

Returns an array of CPU usage in the system.


availableMemory()

Returns the available memory in the system.

Generally, free memory refers to unallocated memory whereas available memory refers to memory that is available for (re)use.


freeMemory()

Returns the free memory in the system.

Free memory refers to unallocated memory whereas available memory refers to memory that is available for (re)use.

Windows doesn't report free memory so this method returns the same value as availableMemory().


totalMemory()

Returns the total memory in the system.


usedMemory()

Returns the used memory in the system.

http Module

The http module provides functions to work with the HyperText Transfer Protocol (HTTP).

To import the http module, use the import keyword:

import { serve, ... } from 'http';

Functions


serve({}, func)

Starts an HTTP server with the given function to handle requests and an optional configuration object.

The default config looks like this:

{
    address: 'http://127.0.0.1:8080',
    log: true
}

The func function only takes one argument: the req object.

This object looks like this:

{
    url: 'http://127.0.0.1:8080/',
    method: 'GET',
    headers: [] // list of headers
}

You can also close this server by going to <server-address>/close-vanadin-server where <server-address> is the address of the server.