Sabu
is a simple CLI HTTP server.
For most simple tasks, there are plenty of static file servers - but each with limitations. Some examples include that http-server doesn't support basic auth, and Harp has rigid configuration. Some don't work with JavaScript frameworks like Vue and React. Others require workarounds for CORS issues.
Sabu aims to be minimal and flexible. As such, it is not (yet) recommended for production use.
It is recommended to install Sabu globally.
$ npm i -g sabu
But it can also be included locally.
$ cd path/to/your-project
$ npm i --save-dev sabu
From a CLI, you can simply run Sabu to start serving files. By default,
it will look for an index.html
, though this is not required.
$ sabu
By default, Saby serves on host 0.0.0.0
and port 8080
, automatically
incrementing the port if it's already in use.
For usage, run the help command.
$ sabu --help
Usage: sabu [options]
Options:
-V, --version output the version number
-h, --host <s> Host (default: "0.0.0.0"
-p, --port <n> Port (default: 8080)
-q, --quiet Quiet startup (no console output)
-a, --auth <s> Basic auth (user:pass)
-c, --config <s> JSON config file with options
-h, --help output usage information
The parameter --auth
for basic HTTP authorization is in the format
of username:password
. If one value is quoted, they both should
be. If multiple colons are found, the password is assumed to be after
the last instance. Some examples of how auth is parsed:
CLI Input | Parsed Username | Parsed Password |
---|---|---|
user:pass |
user |
pass |
user:foo:pass |
user:foo |
pass |
"user":"pass" |
user |
pass |
"user":pass |
"user" |
pass |
user:"pass" |
user |
"pass" |
Sabu can also accept a JSON config file. Any filename is acceptable.
// sabu.conf.json
{
"source": ".",
"host": "localhost",
"port": 8084,
"basicAuth": {
"user": "myuser",
"pass": "mypass"
},
"cors": {
"preflightMaxAge": 5,
"origins": ["*"],
"allowHeaders": [
"X-Access-Token",
"Access-Control-Allow-Origin",
"Access-Control-Allow-Methods",
"Access-Control-Allow-Headers"
],
"exposeHeaders": ["API-Token-Expiry"]
},
"routes": {
"/": "index.html",
"/foo": "foo.json",
"/bar": "bar.json"
}
}
Assuming a file structure like this:
my-project
├── build
│ ├── css
│ ├── images
│ ├── index.html
│ ├── js
├── src
│ ├── ...
├── LICENSE
├── package.json
├── package-lock.json
├── README.md
A likely scenario would be:
$ cd my-project
$ sabu ./build
- An
init
command to generate a default config file - More intentional parsing of CORS config (currently just uses
Object.assign
, overwriting any default configs) - A
watch
option to monitor for file changes
Buy Me a scotch?
Bitcoin: 17sVT44EBTmnVdpikDizran89neP8RXdB8
Ethereum: 0x4f393adc830f2f480011f7507ABdf784455D1796