mdshelf 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.gitignore +2 -0
- package/README.md +257 -0
- package/binary-install.js +212 -0
- package/binary.js +128 -0
- package/install.js +4 -0
- package/npm-shrinkwrap.json +546 -0
- package/package.json +108 -0
- package/run-mdshelf.js +4 -0
package/.gitignore
ADDED
package/README.md
ADDED
|
@@ -0,0 +1,257 @@
|
|
|
1
|
+
# mdshelf
|
|
2
|
+
|
|
3
|
+
A single-binary Rust server that turns folders of Markdown files into browsable sites — with hot reload, frontmatter, MiniJinja layouts, and a bundled mobile-first theme. Mount multiple content trees under their own URL prefixes (e.g. `/docs`, `/notes`, `/blog`).
|
|
4
|
+
|
|
5
|
+
## Features
|
|
6
|
+
|
|
7
|
+
**Content**
|
|
8
|
+
- Multiple independent sites, each mounted at a distinct URL prefix
|
|
9
|
+
- YAML frontmatter: `title`, `description`, `layout`, `sidebar_order`, `draft`
|
|
10
|
+
- Rich Markdown extensions: tables, task lists, footnotes, math (`$…$` and ` ```math `), strikethrough, superscript, autolinks, description lists, multiline block quotes
|
|
11
|
+
- Intra-site `.md` links rewritten to clean URLs automatically
|
|
12
|
+
- Mixed content directories — point at any folder; only `.md` files are rendered, everything else (images, fonts, assets) are skipped.
|
|
13
|
+
- Draft pages (`draft: true`) return 404 and are invisible to visitors
|
|
14
|
+
|
|
15
|
+
**Navigation**
|
|
16
|
+
- Auto-generated table of contents from headings
|
|
17
|
+
- Breadcrumb trail derived from the directory structure
|
|
18
|
+
- Prev / next page navigation
|
|
19
|
+
- Auto-generated index pages for folders that have no `index.md`
|
|
20
|
+
- Home page listing all mounted sites with page counts
|
|
21
|
+
|
|
22
|
+
**Theme**
|
|
23
|
+
- Bundled `mdshelf-theme` — mobile-first, responsive, light/dark aware
|
|
24
|
+
- Syntax highlighting (class-based, served from `/__mdshelf/syntax.css`)
|
|
25
|
+
- Layered theme overrides: per-site > global > built-in
|
|
26
|
+
- Per-site accent colors — auto-assigned from a palette or configured explicitly
|
|
27
|
+
- MiniJinja templates for layouts and partials — override any file without forking the whole theme
|
|
28
|
+
|
|
29
|
+
**Server**
|
|
30
|
+
- **Hot reload** — WebSocket-based live reload; the browser refreshes automatically the moment you save a file
|
|
31
|
+
- Response compression (gzip / brotli / zstd via tower-http)
|
|
32
|
+
- Native system service integration: launchd (macOS), systemd (Linux), Windows SCM
|
|
33
|
+
- Config discovery: `./mdshelf.toml` then `~/.config/mdshelf/mdshelf.toml`
|
|
34
|
+
|
|
35
|
+
## Installation
|
|
36
|
+
|
|
37
|
+
### Homebrew (macOS / Linux)
|
|
38
|
+
|
|
39
|
+
```bash
|
|
40
|
+
brew install prbski/tap/mdshelf
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
### Shell script (macOS / Linux)
|
|
44
|
+
|
|
45
|
+
```bash
|
|
46
|
+
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/prbski/mdshelf/releases/latest/download/mdshelf-installer.sh | sh
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
### PowerShell (Windows)
|
|
50
|
+
|
|
51
|
+
```powershell
|
|
52
|
+
powershell -ExecutionPolicy Bypass -c "irm https://github.com/prbski/mdshelf/releases/latest/download/mdshelf-installer.ps1 | iex"
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
### npm / npx
|
|
56
|
+
|
|
57
|
+
```bash
|
|
58
|
+
npm install -g mdshelf
|
|
59
|
+
# or run without installing:
|
|
60
|
+
npx mdshelf
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
### Cargo
|
|
64
|
+
|
|
65
|
+
```bash
|
|
66
|
+
cargo install mdshelf
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
## Upgrading
|
|
70
|
+
|
|
71
|
+
Stop the service, install the new binary with the same method you used originally, then restart:
|
|
72
|
+
|
|
73
|
+
```bash
|
|
74
|
+
mdshelf stop
|
|
75
|
+
# re-run your original installer, e.g.:
|
|
76
|
+
brew upgrade prbski/tap/mdshelf
|
|
77
|
+
mdshelf start
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
> If you installed as a system-level service (without `--user`) prefix the `stop` and `start` commands with `sudo`.
|
|
81
|
+
|
|
82
|
+
## Getting started
|
|
83
|
+
|
|
84
|
+
Scaffold a config and sample content into `~/.config/mdshelf`:
|
|
85
|
+
|
|
86
|
+
```bash
|
|
87
|
+
mdshelf init
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
Pass a directory to create a project-local setup instead:
|
|
91
|
+
|
|
92
|
+
```bash
|
|
93
|
+
mdshelf init . --with-theme
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
Then start the server:
|
|
97
|
+
|
|
98
|
+
```bash
|
|
99
|
+
mdshelf serve
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
Open `http://127.0.0.1:4444/` for the site index.
|
|
103
|
+
|
|
104
|
+
## Commands
|
|
105
|
+
|
|
106
|
+
| Command | Description |
|
|
107
|
+
|---|---|
|
|
108
|
+
| `mdshelf init [dir]` | Scaffold config and sample content |
|
|
109
|
+
| `mdshelf serve` | Start the web server |
|
|
110
|
+
| `mdshelf check` | Validate config and scan content |
|
|
111
|
+
| `mdshelf install` | Register as a native system service |
|
|
112
|
+
| `mdshelf start` | Start the installed service |
|
|
113
|
+
| `mdshelf stop` | Stop the installed service |
|
|
114
|
+
| `mdshelf restart` | Restart the installed service |
|
|
115
|
+
| `mdshelf status` | Show service status |
|
|
116
|
+
| `mdshelf uninstall` | Remove the service registration |
|
|
117
|
+
|
|
118
|
+
All commands accept `--config <path>` to point at a specific config file. Default search order: `./mdshelf.toml`, then `~/.config/mdshelf/mdshelf.toml`.
|
|
119
|
+
|
|
120
|
+
## Configuration
|
|
121
|
+
|
|
122
|
+
```toml
|
|
123
|
+
host = "127.0.0.1"
|
|
124
|
+
port = 4444
|
|
125
|
+
|
|
126
|
+
[server]
|
|
127
|
+
live_reload = true
|
|
128
|
+
|
|
129
|
+
[theme]
|
|
130
|
+
name = "mdshelf-theme"
|
|
131
|
+
# directory = "./theme" # override bundled theme
|
|
132
|
+
|
|
133
|
+
[[sites]]
|
|
134
|
+
path = "./docs"
|
|
135
|
+
mount = "/docs"
|
|
136
|
+
title = "Docs"
|
|
137
|
+
|
|
138
|
+
[[sites]]
|
|
139
|
+
path = "./notes"
|
|
140
|
+
mount = "/notes"
|
|
141
|
+
title = "Notes"
|
|
142
|
+
|
|
143
|
+
[[sites]]
|
|
144
|
+
path = "./blog"
|
|
145
|
+
mount = "/blog"
|
|
146
|
+
title = "Blog"
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
Each `[[sites]]` block mounts a directory at a URL prefix. Only `.md` files are rendered — other files (images, fonts, etc.) are served as static assets. `mount` must not be `/`. Add as many sites as you like.
|
|
150
|
+
|
|
151
|
+
See [examples/mdshelf.toml](examples/mdshelf.toml) for a complete example.
|
|
152
|
+
|
|
153
|
+
## Frontmatter
|
|
154
|
+
|
|
155
|
+
YAML between `---` delimiters is supported:
|
|
156
|
+
|
|
157
|
+
```yaml
|
|
158
|
+
---
|
|
159
|
+
title: Page title
|
|
160
|
+
description: Optional summary
|
|
161
|
+
layout: doc
|
|
162
|
+
sidebar_order: 10
|
|
163
|
+
draft: false
|
|
164
|
+
---
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
## Theme customisation
|
|
168
|
+
|
|
169
|
+
Override or extend templates by pointing `[theme].directory` at a local directory:
|
|
170
|
+
|
|
171
|
+
- `layouts/` — `base.html`, `doc.html`, `home.html`, `error.html`
|
|
172
|
+
- `partials/` — `header.html`, `sidebar.html`, `toc.html`, `breadcrumbs.html`, `footer.html`
|
|
173
|
+
- `assets/` — static files served from `/__assets/...`
|
|
174
|
+
|
|
175
|
+
Syntax highlighting CSS is served from `/__mdshelf/syntax.css` (class-based, light/dark aware).
|
|
176
|
+
|
|
177
|
+
## System service
|
|
178
|
+
|
|
179
|
+
Install and manage a native service (launchd on macOS, systemd on Linux, SCM on Windows):
|
|
180
|
+
|
|
181
|
+
```bash
|
|
182
|
+
mdshelf install
|
|
183
|
+
mdshelf start
|
|
184
|
+
mdshelf status
|
|
185
|
+
mdshelf stop
|
|
186
|
+
mdshelf uninstall
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
`--config` is optional and follows the same default search order as other commands. The resolved absolute path is baked into the service definition at install time, so the service always finds its config regardless of working directory.
|
|
190
|
+
|
|
191
|
+
Use `--user` for a per-user service where the platform supports it.
|
|
192
|
+
|
|
193
|
+
## Serving on port 80
|
|
194
|
+
|
|
195
|
+
Set `host` and `port` in your config:
|
|
196
|
+
|
|
197
|
+
```toml
|
|
198
|
+
host = "0.0.0.0"
|
|
199
|
+
port = 80
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
Port 80 is a privileged port on macOS and Linux, so the service must run as root. Install it without `--user`:
|
|
203
|
+
|
|
204
|
+
```bash
|
|
205
|
+
sudo mdshelf install
|
|
206
|
+
sudo mdshelf start
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
The service starts automatically on boot and binds port 80 without any further interaction.
|
|
210
|
+
|
|
211
|
+
> Use `host = "127.0.0.1"` instead of `0.0.0.0` if you only need local access (e.g. when fronted by Tailscale or a reverse proxy).
|
|
212
|
+
|
|
213
|
+
## HTTPS via Tailscale
|
|
214
|
+
|
|
215
|
+
The cleanest way to expose mdshelf over HTTPS — with a valid certificate and no reverse proxy setup — is [Tailscale Serve](https://tailscale.com/kb/1242/tailscale-serve).
|
|
216
|
+
|
|
217
|
+
Run mdshelf bound to `127.0.0.1` and tell Tailscale to proxy it. The `--bg` flag keeps it running after the terminal closes:
|
|
218
|
+
|
|
219
|
+
```bash
|
|
220
|
+
tailscale serve --bg 4444
|
|
221
|
+
```
|
|
222
|
+
|
|
223
|
+
Tailscale provisions a certificate automatically and makes the site available **only within your tailnet** at `https://<machine>.<tailnet>.ts.net`.
|
|
224
|
+
|
|
225
|
+
```bash
|
|
226
|
+
tailscale serve status # confirm the URL
|
|
227
|
+
```
|
|
228
|
+
|
|
229
|
+
Pair it with `mdshelf install && mdshelf start` (see [System service](#system-service)) so both services survive reboots.
|
|
230
|
+
|
|
231
|
+
To stop serving:
|
|
232
|
+
|
|
233
|
+
```bash
|
|
234
|
+
tailscale serve off
|
|
235
|
+
```
|
|
236
|
+
|
|
237
|
+
### Public access via Tailscale Funnel
|
|
238
|
+
|
|
239
|
+
To make the site reachable from the **public internet** (not just your tailnet), use Funnel instead:
|
|
240
|
+
|
|
241
|
+
```bash
|
|
242
|
+
tailscale funnel --bg 4444
|
|
243
|
+
```
|
|
244
|
+
|
|
245
|
+
The site becomes accessible at the same `*.ts.net` URL from anywhere, without any DNS or firewall configuration. To stop:
|
|
246
|
+
|
|
247
|
+
```bash
|
|
248
|
+
tailscale funnel off
|
|
249
|
+
```
|
|
250
|
+
|
|
251
|
+
## Logging
|
|
252
|
+
|
|
253
|
+
Set `MDSHELF_LOG` (or `RUST_LOG`) for finer-grained output:
|
|
254
|
+
|
|
255
|
+
```bash
|
|
256
|
+
MDSHELF_LOG=debug mdshelf serve
|
|
257
|
+
```
|
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
const { createWriteStream, existsSync, mkdirSync, mkdtemp } = require("fs");
|
|
2
|
+
const { join, sep } = require("path");
|
|
3
|
+
const { spawnSync } = require("child_process");
|
|
4
|
+
const { tmpdir } = require("os");
|
|
5
|
+
|
|
6
|
+
const axios = require("axios");
|
|
7
|
+
const rimraf = require("rimraf");
|
|
8
|
+
const tmpDir = tmpdir();
|
|
9
|
+
|
|
10
|
+
const error = (msg) => {
|
|
11
|
+
console.error(msg);
|
|
12
|
+
process.exit(1);
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
class Package {
|
|
16
|
+
constructor(platform, name, url, filename, zipExt, binaries) {
|
|
17
|
+
let errors = [];
|
|
18
|
+
if (typeof url !== "string") {
|
|
19
|
+
errors.push("url must be a string");
|
|
20
|
+
} else {
|
|
21
|
+
try {
|
|
22
|
+
new URL(url);
|
|
23
|
+
} catch (e) {
|
|
24
|
+
errors.push(e);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
if (name && typeof name !== "string") {
|
|
28
|
+
errors.push("package name must be a string");
|
|
29
|
+
}
|
|
30
|
+
if (!name) {
|
|
31
|
+
errors.push("You must specify the name of your package");
|
|
32
|
+
}
|
|
33
|
+
if (binaries && typeof binaries !== "object") {
|
|
34
|
+
errors.push("binaries must be a string => string map");
|
|
35
|
+
}
|
|
36
|
+
if (!binaries) {
|
|
37
|
+
errors.push("You must specify the binaries in the package");
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
if (errors.length > 0) {
|
|
41
|
+
let errorMsg =
|
|
42
|
+
"One or more of the parameters you passed to the Binary constructor are invalid:\n";
|
|
43
|
+
errors.forEach((error) => {
|
|
44
|
+
errorMsg += error;
|
|
45
|
+
});
|
|
46
|
+
errorMsg +=
|
|
47
|
+
'\n\nCorrect usage: new Package("my-binary", "https://example.com/binary/download.tar.gz", {"my-binary": "my-binary"})';
|
|
48
|
+
error(errorMsg);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
this.platform = platform;
|
|
52
|
+
this.url = url;
|
|
53
|
+
this.name = name;
|
|
54
|
+
this.filename = filename;
|
|
55
|
+
this.zipExt = zipExt;
|
|
56
|
+
this.installDirectory = join(__dirname, "node_modules", ".bin_real");
|
|
57
|
+
this.binaries = binaries;
|
|
58
|
+
|
|
59
|
+
if (!existsSync(this.installDirectory)) {
|
|
60
|
+
mkdirSync(this.installDirectory, { recursive: true });
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
exists() {
|
|
65
|
+
for (const binaryName in this.binaries) {
|
|
66
|
+
const binRelPath = this.binaries[binaryName];
|
|
67
|
+
const binPath = join(this.installDirectory, binRelPath);
|
|
68
|
+
if (!existsSync(binPath)) {
|
|
69
|
+
return false;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
return true;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
install(fetchOptions, suppressLogs = false) {
|
|
76
|
+
if (this.exists()) {
|
|
77
|
+
if (!suppressLogs) {
|
|
78
|
+
console.error(
|
|
79
|
+
`${this.name} is already installed, skipping installation.`,
|
|
80
|
+
);
|
|
81
|
+
}
|
|
82
|
+
return Promise.resolve();
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
if (existsSync(this.installDirectory)) {
|
|
86
|
+
rimraf.sync(this.installDirectory);
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
mkdirSync(this.installDirectory, { recursive: true });
|
|
90
|
+
|
|
91
|
+
if (!suppressLogs) {
|
|
92
|
+
console.error(`Downloading release from ${this.url}`);
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
return axios({ ...fetchOptions, url: this.url, responseType: "stream" })
|
|
96
|
+
.then((res) => {
|
|
97
|
+
return new Promise((resolve, reject) => {
|
|
98
|
+
mkdtemp(`${tmpDir}${sep}`, (err, directory) => {
|
|
99
|
+
let tempFile = join(directory, this.filename);
|
|
100
|
+
const sink = res.data.pipe(createWriteStream(tempFile));
|
|
101
|
+
sink.on("error", (err) => reject(err));
|
|
102
|
+
sink.on("close", () => {
|
|
103
|
+
if (/\.tar\.*/.test(this.zipExt)) {
|
|
104
|
+
const result = spawnSync("tar", [
|
|
105
|
+
"xf",
|
|
106
|
+
tempFile,
|
|
107
|
+
// The tarballs are stored with a leading directory
|
|
108
|
+
// component; we strip one component in the
|
|
109
|
+
// shell installers too.
|
|
110
|
+
"--strip-components",
|
|
111
|
+
"1",
|
|
112
|
+
"-C",
|
|
113
|
+
this.installDirectory,
|
|
114
|
+
]);
|
|
115
|
+
if (result.status == 0) {
|
|
116
|
+
resolve();
|
|
117
|
+
} else if (result.error) {
|
|
118
|
+
reject(result.error);
|
|
119
|
+
} else {
|
|
120
|
+
reject(
|
|
121
|
+
new Error(
|
|
122
|
+
`An error occurred untarring the artifact: stdout: ${result.stdout}; stderr: ${result.stderr}`,
|
|
123
|
+
),
|
|
124
|
+
);
|
|
125
|
+
}
|
|
126
|
+
} else if (this.zipExt == ".zip") {
|
|
127
|
+
let result;
|
|
128
|
+
if (this.platform.artifactName.includes("windows")) {
|
|
129
|
+
// Windows does not have "unzip" by default on many installations, instead
|
|
130
|
+
// we use Expand-Archive from powershell
|
|
131
|
+
result = spawnSync("powershell.exe", [
|
|
132
|
+
"-NoProfile",
|
|
133
|
+
"-NonInteractive",
|
|
134
|
+
"-Command",
|
|
135
|
+
`& {
|
|
136
|
+
param([string]$LiteralPath, [string]$DestinationPath)
|
|
137
|
+
Expand-Archive -LiteralPath $LiteralPath -DestinationPath $DestinationPath -Force
|
|
138
|
+
}`,
|
|
139
|
+
tempFile,
|
|
140
|
+
this.installDirectory,
|
|
141
|
+
]);
|
|
142
|
+
} else {
|
|
143
|
+
result = spawnSync("unzip", [
|
|
144
|
+
"-q",
|
|
145
|
+
tempFile,
|
|
146
|
+
"-d",
|
|
147
|
+
this.installDirectory,
|
|
148
|
+
]);
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
if (result.status == 0) {
|
|
152
|
+
resolve();
|
|
153
|
+
} else if (result.error) {
|
|
154
|
+
reject(result.error);
|
|
155
|
+
} else {
|
|
156
|
+
reject(
|
|
157
|
+
new Error(
|
|
158
|
+
`An error occurred unzipping the artifact: stdout: ${result.stdout}; stderr: ${result.stderr}`,
|
|
159
|
+
),
|
|
160
|
+
);
|
|
161
|
+
}
|
|
162
|
+
} else {
|
|
163
|
+
reject(
|
|
164
|
+
new Error(`Unrecognized file extension: ${this.zipExt}`),
|
|
165
|
+
);
|
|
166
|
+
}
|
|
167
|
+
});
|
|
168
|
+
});
|
|
169
|
+
});
|
|
170
|
+
})
|
|
171
|
+
.then(() => {
|
|
172
|
+
if (!suppressLogs) {
|
|
173
|
+
console.error(`${this.name} has been installed!`);
|
|
174
|
+
}
|
|
175
|
+
})
|
|
176
|
+
.catch((e) => {
|
|
177
|
+
error(`Error fetching release: ${e.message}`);
|
|
178
|
+
});
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
run(binaryName, fetchOptions) {
|
|
182
|
+
const promise = !this.exists()
|
|
183
|
+
? this.install(fetchOptions, true)
|
|
184
|
+
: Promise.resolve();
|
|
185
|
+
|
|
186
|
+
promise
|
|
187
|
+
.then(() => {
|
|
188
|
+
const [, , ...args] = process.argv;
|
|
189
|
+
|
|
190
|
+
const options = { cwd: process.cwd(), stdio: "inherit" };
|
|
191
|
+
|
|
192
|
+
const binRelPath = this.binaries[binaryName];
|
|
193
|
+
if (!binRelPath) {
|
|
194
|
+
error(`${binaryName} is not a known binary in ${this.name}`);
|
|
195
|
+
}
|
|
196
|
+
const binPath = join(this.installDirectory, binRelPath);
|
|
197
|
+
const result = spawnSync(binPath, args, options);
|
|
198
|
+
|
|
199
|
+
if (result.error) {
|
|
200
|
+
error(result.error);
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
process.exit(result.status);
|
|
204
|
+
})
|
|
205
|
+
.catch((e) => {
|
|
206
|
+
error(e.message);
|
|
207
|
+
process.exit(1);
|
|
208
|
+
});
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
module.exports.Package = Package;
|
package/binary.js
ADDED
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
const { Package } = require("./binary-install");
|
|
2
|
+
const os = require("os");
|
|
3
|
+
const cTable = require("console.table");
|
|
4
|
+
const libc = require("detect-libc");
|
|
5
|
+
const { configureProxy } = require("axios-proxy-builder");
|
|
6
|
+
|
|
7
|
+
const error = (msg) => {
|
|
8
|
+
console.error(msg);
|
|
9
|
+
process.exit(1);
|
|
10
|
+
};
|
|
11
|
+
|
|
12
|
+
const {
|
|
13
|
+
name,
|
|
14
|
+
artifactDownloadUrls,
|
|
15
|
+
supportedPlatforms,
|
|
16
|
+
glibcMinimum,
|
|
17
|
+
} = require("./package.json");
|
|
18
|
+
|
|
19
|
+
// FIXME: implement NPM installer handling of fallback download URLs
|
|
20
|
+
const artifactDownloadUrl = artifactDownloadUrls[0];
|
|
21
|
+
const builderGlibcMajorVersion = glibcMinimum.major;
|
|
22
|
+
const builderGlibcMinorVersion = glibcMinimum.series;
|
|
23
|
+
|
|
24
|
+
const getPlatform = () => {
|
|
25
|
+
const rawOsType = os.type();
|
|
26
|
+
const rawArchitecture = os.arch();
|
|
27
|
+
|
|
28
|
+
// We want to use rust-style target triples as the canonical key
|
|
29
|
+
// for a platform, so translate the "os" library's concepts into rust ones
|
|
30
|
+
let osType = "";
|
|
31
|
+
switch (rawOsType) {
|
|
32
|
+
case "Windows_NT":
|
|
33
|
+
osType = "pc-windows-msvc";
|
|
34
|
+
break;
|
|
35
|
+
case "Darwin":
|
|
36
|
+
osType = "apple-darwin";
|
|
37
|
+
break;
|
|
38
|
+
case "Linux":
|
|
39
|
+
osType = "unknown-linux-gnu";
|
|
40
|
+
break;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
let arch = "";
|
|
44
|
+
switch (rawArchitecture) {
|
|
45
|
+
case "x64":
|
|
46
|
+
arch = "x86_64";
|
|
47
|
+
break;
|
|
48
|
+
case "arm64":
|
|
49
|
+
arch = "aarch64";
|
|
50
|
+
break;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
if (rawOsType === "Linux") {
|
|
54
|
+
if (libc.familySync() == "musl") {
|
|
55
|
+
osType = "unknown-linux-musl-dynamic";
|
|
56
|
+
} else if (libc.isNonGlibcLinuxSync()) {
|
|
57
|
+
console.warn(
|
|
58
|
+
"Your libc is neither glibc nor musl; trying static musl binary instead",
|
|
59
|
+
);
|
|
60
|
+
osType = "unknown-linux-musl-static";
|
|
61
|
+
} else {
|
|
62
|
+
let libcVersion = libc.versionSync();
|
|
63
|
+
let splitLibcVersion = libcVersion.split(".");
|
|
64
|
+
let libcMajorVersion = splitLibcVersion[0];
|
|
65
|
+
let libcMinorVersion = splitLibcVersion[1];
|
|
66
|
+
if (
|
|
67
|
+
libcMajorVersion != builderGlibcMajorVersion ||
|
|
68
|
+
libcMinorVersion < builderGlibcMinorVersion
|
|
69
|
+
) {
|
|
70
|
+
// We can't run the glibc binaries, but we can run the static musl ones
|
|
71
|
+
// if they exist
|
|
72
|
+
console.warn(
|
|
73
|
+
"Your glibc isn't compatible; trying static musl binary instead",
|
|
74
|
+
);
|
|
75
|
+
osType = "unknown-linux-musl-static";
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
// Assume the above succeeded and build a target triple to look things up with.
|
|
81
|
+
// If any of it failed, this lookup will fail and we'll handle it like normal.
|
|
82
|
+
let targetTriple = `${arch}-${osType}`;
|
|
83
|
+
let platform = supportedPlatforms[targetTriple];
|
|
84
|
+
|
|
85
|
+
if (!platform) {
|
|
86
|
+
error(
|
|
87
|
+
`Platform with type "${rawOsType}" and architecture "${rawArchitecture}" is not supported by ${name}.\nYour system must be one of the following:\n\n${Object.keys(
|
|
88
|
+
supportedPlatforms,
|
|
89
|
+
).join(",")}`,
|
|
90
|
+
);
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
return platform;
|
|
94
|
+
};
|
|
95
|
+
|
|
96
|
+
const getPackage = () => {
|
|
97
|
+
const platform = getPlatform();
|
|
98
|
+
const url = `${artifactDownloadUrl}/${platform.artifactName}`;
|
|
99
|
+
let filename = platform.artifactName;
|
|
100
|
+
let ext = platform.zipExt;
|
|
101
|
+
let binary = new Package(platform, name, url, filename, ext, platform.bins);
|
|
102
|
+
|
|
103
|
+
return binary;
|
|
104
|
+
};
|
|
105
|
+
|
|
106
|
+
const install = (suppressLogs) => {
|
|
107
|
+
if (!artifactDownloadUrl || artifactDownloadUrl.length === 0) {
|
|
108
|
+
console.warn("in demo mode, not installing binaries");
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
const package = getPackage();
|
|
112
|
+
const proxy = configureProxy(package.url);
|
|
113
|
+
|
|
114
|
+
return package.install(proxy, suppressLogs);
|
|
115
|
+
};
|
|
116
|
+
|
|
117
|
+
const run = (binaryName) => {
|
|
118
|
+
const package = getPackage();
|
|
119
|
+
const proxy = configureProxy(package.url);
|
|
120
|
+
|
|
121
|
+
package.run(binaryName, proxy);
|
|
122
|
+
};
|
|
123
|
+
|
|
124
|
+
module.exports = {
|
|
125
|
+
install,
|
|
126
|
+
run,
|
|
127
|
+
getPackage,
|
|
128
|
+
};
|
package/install.js
ADDED
|
@@ -0,0 +1,546 @@
|
|
|
1
|
+
{
|
|
2
|
+
"lockfileVersion": 3,
|
|
3
|
+
"name": "mdshelf",
|
|
4
|
+
"packages": {
|
|
5
|
+
"": {
|
|
6
|
+
"bin": {
|
|
7
|
+
"mdshelf": "run-mdshelf.js"
|
|
8
|
+
},
|
|
9
|
+
"dependencies": {
|
|
10
|
+
"axios": "^1.13.5",
|
|
11
|
+
"axios-proxy-builder": "^0.1.2",
|
|
12
|
+
"console.table": "^0.10.0",
|
|
13
|
+
"detect-libc": "^2.1.2",
|
|
14
|
+
"rimraf": "^6.1.3"
|
|
15
|
+
},
|
|
16
|
+
"devDependencies": {
|
|
17
|
+
"prettier": "^3.8.1"
|
|
18
|
+
},
|
|
19
|
+
"engines": {
|
|
20
|
+
"node": ">=14",
|
|
21
|
+
"npm": ">=6"
|
|
22
|
+
},
|
|
23
|
+
"hasInstallScript": true,
|
|
24
|
+
"license": "MIT OR Apache-2.0",
|
|
25
|
+
"name": "mdshelf",
|
|
26
|
+
"version": "0.9.0"
|
|
27
|
+
},
|
|
28
|
+
"node_modules/@isaacs/cliui": {
|
|
29
|
+
"engines": {
|
|
30
|
+
"node": ">=18"
|
|
31
|
+
},
|
|
32
|
+
"integrity": "sha512-AokJm4tuBHillT+FpMtxQ60n8ObyXBatq7jD2/JA9dxbDDokKQm8KMht5ibGzLVU9IJDIKK4TPKgMHEYMn3lMg==",
|
|
33
|
+
"license": "BlueOak-1.0.0",
|
|
34
|
+
"resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-9.0.0.tgz",
|
|
35
|
+
"version": "9.0.0"
|
|
36
|
+
},
|
|
37
|
+
"node_modules/asynckit": {
|
|
38
|
+
"integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==",
|
|
39
|
+
"license": "MIT",
|
|
40
|
+
"resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
|
|
41
|
+
"version": "0.4.0"
|
|
42
|
+
},
|
|
43
|
+
"node_modules/axios": {
|
|
44
|
+
"dependencies": {
|
|
45
|
+
"follow-redirects": "^1.15.11",
|
|
46
|
+
"form-data": "^4.0.5",
|
|
47
|
+
"proxy-from-env": "^1.1.0"
|
|
48
|
+
},
|
|
49
|
+
"integrity": "sha512-cz4ur7Vb0xS4/KUN0tPWe44eqxrIu31me+fbang3ijiNscE129POzipJJA6zniq2C/Z6sJCjMimjS8Lc/GAs8Q==",
|
|
50
|
+
"license": "MIT",
|
|
51
|
+
"resolved": "https://registry.npmjs.org/axios/-/axios-1.13.5.tgz",
|
|
52
|
+
"version": "1.13.5"
|
|
53
|
+
},
|
|
54
|
+
"node_modules/axios-proxy-builder": {
|
|
55
|
+
"dependencies": {
|
|
56
|
+
"tunnel": "^0.0.6"
|
|
57
|
+
},
|
|
58
|
+
"integrity": "sha512-6uBVsBZzkB3tCC8iyx59mCjQckhB8+GQrI9Cop8eC7ybIsvs/KtnNgEBfRMSEa7GqK2VBGUzgjNYMdPIfotyPA==",
|
|
59
|
+
"license": "MIT",
|
|
60
|
+
"resolved": "https://registry.npmjs.org/axios-proxy-builder/-/axios-proxy-builder-0.1.2.tgz",
|
|
61
|
+
"version": "0.1.2"
|
|
62
|
+
},
|
|
63
|
+
"node_modules/balanced-match": {
|
|
64
|
+
"dependencies": {
|
|
65
|
+
"jackspeak": "^4.2.3"
|
|
66
|
+
},
|
|
67
|
+
"engines": {
|
|
68
|
+
"node": "20 || >=22"
|
|
69
|
+
},
|
|
70
|
+
"integrity": "sha512-x0K50QvKQ97fdEz2kPehIerj+YTeptKF9hyYkKf6egnwmMWAkADiO0QCzSp0R5xN8FTZgYaBfSaue46Ej62nMg==",
|
|
71
|
+
"license": "MIT",
|
|
72
|
+
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.2.tgz",
|
|
73
|
+
"version": "4.0.2"
|
|
74
|
+
},
|
|
75
|
+
"node_modules/brace-expansion": {
|
|
76
|
+
"dependencies": {
|
|
77
|
+
"balanced-match": "^4.0.2"
|
|
78
|
+
},
|
|
79
|
+
"engines": {
|
|
80
|
+
"node": "20 || >=22"
|
|
81
|
+
},
|
|
82
|
+
"integrity": "sha512-Pdk8c9poy+YhOgVWw1JNN22/HcivgKWwpxKq04M/jTmHyCZn12WPJebZxdjSa5TmBqISrUSgNYU3eRORljfCCw==",
|
|
83
|
+
"license": "MIT",
|
|
84
|
+
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.2.tgz",
|
|
85
|
+
"version": "5.0.2"
|
|
86
|
+
},
|
|
87
|
+
"node_modules/call-bind-apply-helpers": {
|
|
88
|
+
"dependencies": {
|
|
89
|
+
"es-errors": "^1.3.0",
|
|
90
|
+
"function-bind": "^1.1.2"
|
|
91
|
+
},
|
|
92
|
+
"engines": {
|
|
93
|
+
"node": ">= 0.4"
|
|
94
|
+
},
|
|
95
|
+
"integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==",
|
|
96
|
+
"license": "MIT",
|
|
97
|
+
"resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz",
|
|
98
|
+
"version": "1.0.2"
|
|
99
|
+
},
|
|
100
|
+
"node_modules/clone": {
|
|
101
|
+
"engines": {
|
|
102
|
+
"node": ">=0.8"
|
|
103
|
+
},
|
|
104
|
+
"integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==",
|
|
105
|
+
"license": "MIT",
|
|
106
|
+
"optional": true,
|
|
107
|
+
"resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz",
|
|
108
|
+
"version": "1.0.4"
|
|
109
|
+
},
|
|
110
|
+
"node_modules/combined-stream": {
|
|
111
|
+
"dependencies": {
|
|
112
|
+
"delayed-stream": "~1.0.0"
|
|
113
|
+
},
|
|
114
|
+
"engines": {
|
|
115
|
+
"node": ">= 0.8"
|
|
116
|
+
},
|
|
117
|
+
"integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
|
|
118
|
+
"license": "MIT",
|
|
119
|
+
"resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
|
|
120
|
+
"version": "1.0.8"
|
|
121
|
+
},
|
|
122
|
+
"node_modules/console.table": {
|
|
123
|
+
"dependencies": {
|
|
124
|
+
"easy-table": "1.1.0"
|
|
125
|
+
},
|
|
126
|
+
"engines": {
|
|
127
|
+
"node": "> 0.10"
|
|
128
|
+
},
|
|
129
|
+
"integrity": "sha512-dPyZofqggxuvSf7WXvNjuRfnsOk1YazkVP8FdxH4tcH2c37wc79/Yl6Bhr7Lsu00KMgy2ql/qCMuNu8xctZM8g==",
|
|
130
|
+
"license": "MIT",
|
|
131
|
+
"resolved": "https://registry.npmjs.org/console.table/-/console.table-0.10.0.tgz",
|
|
132
|
+
"version": "0.10.0"
|
|
133
|
+
},
|
|
134
|
+
"node_modules/defaults": {
|
|
135
|
+
"dependencies": {
|
|
136
|
+
"clone": "^1.0.2"
|
|
137
|
+
},
|
|
138
|
+
"funding": {
|
|
139
|
+
"url": "https://github.com/sponsors/sindresorhus"
|
|
140
|
+
},
|
|
141
|
+
"integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==",
|
|
142
|
+
"license": "MIT",
|
|
143
|
+
"optional": true,
|
|
144
|
+
"resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz",
|
|
145
|
+
"version": "1.0.4"
|
|
146
|
+
},
|
|
147
|
+
"node_modules/delayed-stream": {
|
|
148
|
+
"engines": {
|
|
149
|
+
"node": ">=0.4.0"
|
|
150
|
+
},
|
|
151
|
+
"integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
|
|
152
|
+
"license": "MIT",
|
|
153
|
+
"resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
|
|
154
|
+
"version": "1.0.0"
|
|
155
|
+
},
|
|
156
|
+
"node_modules/detect-libc": {
|
|
157
|
+
"engines": {
|
|
158
|
+
"node": ">=8"
|
|
159
|
+
},
|
|
160
|
+
"integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==",
|
|
161
|
+
"license": "Apache-2.0",
|
|
162
|
+
"resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz",
|
|
163
|
+
"version": "2.1.2"
|
|
164
|
+
},
|
|
165
|
+
"node_modules/dunder-proto": {
|
|
166
|
+
"dependencies": {
|
|
167
|
+
"call-bind-apply-helpers": "^1.0.1",
|
|
168
|
+
"es-errors": "^1.3.0",
|
|
169
|
+
"gopd": "^1.2.0"
|
|
170
|
+
},
|
|
171
|
+
"engines": {
|
|
172
|
+
"node": ">= 0.4"
|
|
173
|
+
},
|
|
174
|
+
"integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==",
|
|
175
|
+
"license": "MIT",
|
|
176
|
+
"resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",
|
|
177
|
+
"version": "1.0.1"
|
|
178
|
+
},
|
|
179
|
+
"node_modules/easy-table": {
|
|
180
|
+
"integrity": "sha512-oq33hWOSSnl2Hoh00tZWaIPi1ievrD9aFG82/IgjlycAnW9hHx5PkJiXpxPsgEE+H7BsbVQXFVFST8TEXS6/pA==",
|
|
181
|
+
"license": "MIT",
|
|
182
|
+
"optionalDependencies": {
|
|
183
|
+
"wcwidth": ">=1.0.1"
|
|
184
|
+
},
|
|
185
|
+
"resolved": "https://registry.npmjs.org/easy-table/-/easy-table-1.1.0.tgz",
|
|
186
|
+
"version": "1.1.0"
|
|
187
|
+
},
|
|
188
|
+
"node_modules/es-define-property": {
|
|
189
|
+
"engines": {
|
|
190
|
+
"node": ">= 0.4"
|
|
191
|
+
},
|
|
192
|
+
"integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==",
|
|
193
|
+
"license": "MIT",
|
|
194
|
+
"resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz",
|
|
195
|
+
"version": "1.0.1"
|
|
196
|
+
},
|
|
197
|
+
"node_modules/es-errors": {
|
|
198
|
+
"engines": {
|
|
199
|
+
"node": ">= 0.4"
|
|
200
|
+
},
|
|
201
|
+
"integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
|
|
202
|
+
"license": "MIT",
|
|
203
|
+
"resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
|
|
204
|
+
"version": "1.3.0"
|
|
205
|
+
},
|
|
206
|
+
"node_modules/es-object-atoms": {
|
|
207
|
+
"dependencies": {
|
|
208
|
+
"es-errors": "^1.3.0"
|
|
209
|
+
},
|
|
210
|
+
"engines": {
|
|
211
|
+
"node": ">= 0.4"
|
|
212
|
+
},
|
|
213
|
+
"integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==",
|
|
214
|
+
"license": "MIT",
|
|
215
|
+
"resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz",
|
|
216
|
+
"version": "1.1.1"
|
|
217
|
+
},
|
|
218
|
+
"node_modules/es-set-tostringtag": {
|
|
219
|
+
"dependencies": {
|
|
220
|
+
"es-errors": "^1.3.0",
|
|
221
|
+
"get-intrinsic": "^1.2.6",
|
|
222
|
+
"has-tostringtag": "^1.0.2",
|
|
223
|
+
"hasown": "^2.0.2"
|
|
224
|
+
},
|
|
225
|
+
"engines": {
|
|
226
|
+
"node": ">= 0.4"
|
|
227
|
+
},
|
|
228
|
+
"integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==",
|
|
229
|
+
"license": "MIT",
|
|
230
|
+
"resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz",
|
|
231
|
+
"version": "2.1.0"
|
|
232
|
+
},
|
|
233
|
+
"node_modules/follow-redirects": {
|
|
234
|
+
"engines": {
|
|
235
|
+
"node": ">=4.0"
|
|
236
|
+
},
|
|
237
|
+
"funding": [
|
|
238
|
+
{
|
|
239
|
+
"type": "individual",
|
|
240
|
+
"url": "https://github.com/sponsors/RubenVerborgh"
|
|
241
|
+
}
|
|
242
|
+
],
|
|
243
|
+
"integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==",
|
|
244
|
+
"license": "MIT",
|
|
245
|
+
"peerDependenciesMeta": {
|
|
246
|
+
"debug": {
|
|
247
|
+
"optional": true
|
|
248
|
+
}
|
|
249
|
+
},
|
|
250
|
+
"resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz",
|
|
251
|
+
"version": "1.15.11"
|
|
252
|
+
},
|
|
253
|
+
"node_modules/form-data": {
|
|
254
|
+
"dependencies": {
|
|
255
|
+
"asynckit": "^0.4.0",
|
|
256
|
+
"combined-stream": "^1.0.8",
|
|
257
|
+
"es-set-tostringtag": "^2.1.0",
|
|
258
|
+
"hasown": "^2.0.2",
|
|
259
|
+
"mime-types": "^2.1.12"
|
|
260
|
+
},
|
|
261
|
+
"engines": {
|
|
262
|
+
"node": ">= 6"
|
|
263
|
+
},
|
|
264
|
+
"integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==",
|
|
265
|
+
"license": "MIT",
|
|
266
|
+
"resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz",
|
|
267
|
+
"version": "4.0.5"
|
|
268
|
+
},
|
|
269
|
+
"node_modules/function-bind": {
|
|
270
|
+
"funding": {
|
|
271
|
+
"url": "https://github.com/sponsors/ljharb"
|
|
272
|
+
},
|
|
273
|
+
"integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
|
|
274
|
+
"license": "MIT",
|
|
275
|
+
"resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
|
|
276
|
+
"version": "1.1.2"
|
|
277
|
+
},
|
|
278
|
+
"node_modules/get-intrinsic": {
|
|
279
|
+
"dependencies": {
|
|
280
|
+
"call-bind-apply-helpers": "^1.0.2",
|
|
281
|
+
"es-define-property": "^1.0.1",
|
|
282
|
+
"es-errors": "^1.3.0",
|
|
283
|
+
"es-object-atoms": "^1.1.1",
|
|
284
|
+
"function-bind": "^1.1.2",
|
|
285
|
+
"get-proto": "^1.0.1",
|
|
286
|
+
"gopd": "^1.2.0",
|
|
287
|
+
"has-symbols": "^1.1.0",
|
|
288
|
+
"hasown": "^2.0.2",
|
|
289
|
+
"math-intrinsics": "^1.1.0"
|
|
290
|
+
},
|
|
291
|
+
"engines": {
|
|
292
|
+
"node": ">= 0.4"
|
|
293
|
+
},
|
|
294
|
+
"funding": {
|
|
295
|
+
"url": "https://github.com/sponsors/ljharb"
|
|
296
|
+
},
|
|
297
|
+
"integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==",
|
|
298
|
+
"license": "MIT",
|
|
299
|
+
"resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
|
|
300
|
+
"version": "1.3.0"
|
|
301
|
+
},
|
|
302
|
+
"node_modules/get-proto": {
|
|
303
|
+
"dependencies": {
|
|
304
|
+
"dunder-proto": "^1.0.1",
|
|
305
|
+
"es-object-atoms": "^1.0.0"
|
|
306
|
+
},
|
|
307
|
+
"engines": {
|
|
308
|
+
"node": ">= 0.4"
|
|
309
|
+
},
|
|
310
|
+
"integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==",
|
|
311
|
+
"license": "MIT",
|
|
312
|
+
"resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz",
|
|
313
|
+
"version": "1.0.1"
|
|
314
|
+
},
|
|
315
|
+
"node_modules/glob": {
|
|
316
|
+
"dependencies": {
|
|
317
|
+
"minimatch": "^10.2.0",
|
|
318
|
+
"minipass": "^7.1.2",
|
|
319
|
+
"path-scurry": "^2.0.0"
|
|
320
|
+
},
|
|
321
|
+
"engines": {
|
|
322
|
+
"node": "20 || >=22"
|
|
323
|
+
},
|
|
324
|
+
"funding": {
|
|
325
|
+
"url": "https://github.com/sponsors/isaacs"
|
|
326
|
+
},
|
|
327
|
+
"integrity": "sha512-/g3B0mC+4x724v1TgtBlBtt2hPi/EWptsIAmXUx9Z2rvBYleQcsrmaOzd5LyL50jf/Soi83ZDJmw2+XqvH/EeA==",
|
|
328
|
+
"license": "BlueOak-1.0.0",
|
|
329
|
+
"resolved": "https://registry.npmjs.org/glob/-/glob-13.0.3.tgz",
|
|
330
|
+
"version": "13.0.3"
|
|
331
|
+
},
|
|
332
|
+
"node_modules/gopd": {
|
|
333
|
+
"engines": {
|
|
334
|
+
"node": ">= 0.4"
|
|
335
|
+
},
|
|
336
|
+
"funding": {
|
|
337
|
+
"url": "https://github.com/sponsors/ljharb"
|
|
338
|
+
},
|
|
339
|
+
"integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==",
|
|
340
|
+
"license": "MIT",
|
|
341
|
+
"resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
|
|
342
|
+
"version": "1.2.0"
|
|
343
|
+
},
|
|
344
|
+
"node_modules/has-symbols": {
|
|
345
|
+
"engines": {
|
|
346
|
+
"node": ">= 0.4"
|
|
347
|
+
},
|
|
348
|
+
"funding": {
|
|
349
|
+
"url": "https://github.com/sponsors/ljharb"
|
|
350
|
+
},
|
|
351
|
+
"integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==",
|
|
352
|
+
"license": "MIT",
|
|
353
|
+
"resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz",
|
|
354
|
+
"version": "1.1.0"
|
|
355
|
+
},
|
|
356
|
+
"node_modules/has-tostringtag": {
|
|
357
|
+
"dependencies": {
|
|
358
|
+
"has-symbols": "^1.0.3"
|
|
359
|
+
},
|
|
360
|
+
"engines": {
|
|
361
|
+
"node": ">= 0.4"
|
|
362
|
+
},
|
|
363
|
+
"funding": {
|
|
364
|
+
"url": "https://github.com/sponsors/ljharb"
|
|
365
|
+
},
|
|
366
|
+
"integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==",
|
|
367
|
+
"license": "MIT",
|
|
368
|
+
"resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz",
|
|
369
|
+
"version": "1.0.2"
|
|
370
|
+
},
|
|
371
|
+
"node_modules/hasown": {
|
|
372
|
+
"dependencies": {
|
|
373
|
+
"function-bind": "^1.1.2"
|
|
374
|
+
},
|
|
375
|
+
"engines": {
|
|
376
|
+
"node": ">= 0.4"
|
|
377
|
+
},
|
|
378
|
+
"integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
|
|
379
|
+
"license": "MIT",
|
|
380
|
+
"resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
|
|
381
|
+
"version": "2.0.2"
|
|
382
|
+
},
|
|
383
|
+
"node_modules/jackspeak": {
|
|
384
|
+
"dependencies": {
|
|
385
|
+
"@isaacs/cliui": "^9.0.0"
|
|
386
|
+
},
|
|
387
|
+
"engines": {
|
|
388
|
+
"node": "20 || >=22"
|
|
389
|
+
},
|
|
390
|
+
"funding": {
|
|
391
|
+
"url": "https://github.com/sponsors/isaacs"
|
|
392
|
+
},
|
|
393
|
+
"integrity": "sha512-ykkVRwrYvFm1nb2AJfKKYPr0emF6IiXDYUaFx4Zn9ZuIH7MrzEZ3sD5RlqGXNRpHtvUHJyOnCEFxOlNDtGo7wg==",
|
|
394
|
+
"license": "BlueOak-1.0.0",
|
|
395
|
+
"resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.2.3.tgz",
|
|
396
|
+
"version": "4.2.3"
|
|
397
|
+
},
|
|
398
|
+
"node_modules/lru-cache": {
|
|
399
|
+
"engines": {
|
|
400
|
+
"node": "20 || >=22"
|
|
401
|
+
},
|
|
402
|
+
"integrity": "sha512-ESL2CrkS/2wTPfuend7Zhkzo2u0daGJ/A2VucJOgQ/C48S/zB8MMeMHSGKYpXhIjbPxfuezITkaBH1wqv00DDQ==",
|
|
403
|
+
"license": "BlueOak-1.0.0",
|
|
404
|
+
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.6.tgz",
|
|
405
|
+
"version": "11.2.6"
|
|
406
|
+
},
|
|
407
|
+
"node_modules/math-intrinsics": {
|
|
408
|
+
"engines": {
|
|
409
|
+
"node": ">= 0.4"
|
|
410
|
+
},
|
|
411
|
+
"integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==",
|
|
412
|
+
"license": "MIT",
|
|
413
|
+
"resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
|
|
414
|
+
"version": "1.1.0"
|
|
415
|
+
},
|
|
416
|
+
"node_modules/mime-db": {
|
|
417
|
+
"engines": {
|
|
418
|
+
"node": ">= 0.6"
|
|
419
|
+
},
|
|
420
|
+
"integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
|
|
421
|
+
"license": "MIT",
|
|
422
|
+
"resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
|
|
423
|
+
"version": "1.52.0"
|
|
424
|
+
},
|
|
425
|
+
"node_modules/mime-types": {
|
|
426
|
+
"dependencies": {
|
|
427
|
+
"mime-db": "1.52.0"
|
|
428
|
+
},
|
|
429
|
+
"engines": {
|
|
430
|
+
"node": ">= 0.6"
|
|
431
|
+
},
|
|
432
|
+
"integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
|
|
433
|
+
"license": "MIT",
|
|
434
|
+
"resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
|
|
435
|
+
"version": "2.1.35"
|
|
436
|
+
},
|
|
437
|
+
"node_modules/minimatch": {
|
|
438
|
+
"dependencies": {
|
|
439
|
+
"brace-expansion": "^5.0.2"
|
|
440
|
+
},
|
|
441
|
+
"engines": {
|
|
442
|
+
"node": "20 || >=22"
|
|
443
|
+
},
|
|
444
|
+
"funding": {
|
|
445
|
+
"url": "https://github.com/sponsors/isaacs"
|
|
446
|
+
},
|
|
447
|
+
"integrity": "sha512-ugkC31VaVg9cF0DFVoADH12k6061zNZkZON+aX8AWsR9GhPcErkcMBceb6znR8wLERM2AkkOxy2nWRLpT9Jq5w==",
|
|
448
|
+
"license": "BlueOak-1.0.0",
|
|
449
|
+
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.0.tgz",
|
|
450
|
+
"version": "10.2.0"
|
|
451
|
+
},
|
|
452
|
+
"node_modules/minipass": {
|
|
453
|
+
"engines": {
|
|
454
|
+
"node": ">=16 || 14 >=14.17"
|
|
455
|
+
},
|
|
456
|
+
"integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==",
|
|
457
|
+
"license": "ISC",
|
|
458
|
+
"resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz",
|
|
459
|
+
"version": "7.1.2"
|
|
460
|
+
},
|
|
461
|
+
"node_modules/package-json-from-dist": {
|
|
462
|
+
"integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==",
|
|
463
|
+
"license": "BlueOak-1.0.0",
|
|
464
|
+
"resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz",
|
|
465
|
+
"version": "1.0.1"
|
|
466
|
+
},
|
|
467
|
+
"node_modules/path-scurry": {
|
|
468
|
+
"dependencies": {
|
|
469
|
+
"lru-cache": "^11.0.0",
|
|
470
|
+
"minipass": "^7.1.2"
|
|
471
|
+
},
|
|
472
|
+
"engines": {
|
|
473
|
+
"node": "20 || >=22"
|
|
474
|
+
},
|
|
475
|
+
"funding": {
|
|
476
|
+
"url": "https://github.com/sponsors/isaacs"
|
|
477
|
+
},
|
|
478
|
+
"integrity": "sha512-oWyT4gICAu+kaA7QWk/jvCHWarMKNs6pXOGWKDTr7cw4IGcUbW+PeTfbaQiLGheFRpjo6O9J0PmyMfQPjH71oA==",
|
|
479
|
+
"license": "BlueOak-1.0.0",
|
|
480
|
+
"resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.1.tgz",
|
|
481
|
+
"version": "2.0.1"
|
|
482
|
+
},
|
|
483
|
+
"node_modules/prettier": {
|
|
484
|
+
"bin": {
|
|
485
|
+
"prettier": "bin/prettier.cjs"
|
|
486
|
+
},
|
|
487
|
+
"dev": true,
|
|
488
|
+
"engines": {
|
|
489
|
+
"node": ">=14"
|
|
490
|
+
},
|
|
491
|
+
"funding": {
|
|
492
|
+
"url": "https://github.com/prettier/prettier?sponsor=1"
|
|
493
|
+
},
|
|
494
|
+
"integrity": "sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg==",
|
|
495
|
+
"license": "MIT",
|
|
496
|
+
"resolved": "https://registry.npmjs.org/prettier/-/prettier-3.8.1.tgz",
|
|
497
|
+
"version": "3.8.1"
|
|
498
|
+
},
|
|
499
|
+
"node_modules/proxy-from-env": {
|
|
500
|
+
"integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==",
|
|
501
|
+
"license": "MIT",
|
|
502
|
+
"resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
|
|
503
|
+
"version": "1.1.0"
|
|
504
|
+
},
|
|
505
|
+
"node_modules/rimraf": {
|
|
506
|
+
"bin": {
|
|
507
|
+
"rimraf": "dist/esm/bin.mjs"
|
|
508
|
+
},
|
|
509
|
+
"dependencies": {
|
|
510
|
+
"glob": "^13.0.3",
|
|
511
|
+
"package-json-from-dist": "^1.0.1"
|
|
512
|
+
},
|
|
513
|
+
"engines": {
|
|
514
|
+
"node": "20 || >=22"
|
|
515
|
+
},
|
|
516
|
+
"funding": {
|
|
517
|
+
"url": "https://github.com/sponsors/isaacs"
|
|
518
|
+
},
|
|
519
|
+
"integrity": "sha512-LKg+Cr2ZF61fkcaK1UdkH2yEBBKnYjTyWzTJT6KNPcSPaiT7HSdhtMXQuN5wkTX0Xu72KQ1l8S42rlmexS2hSA==",
|
|
520
|
+
"license": "BlueOak-1.0.0",
|
|
521
|
+
"resolved": "https://registry.npmjs.org/rimraf/-/rimraf-6.1.3.tgz",
|
|
522
|
+
"version": "6.1.3"
|
|
523
|
+
},
|
|
524
|
+
"node_modules/tunnel": {
|
|
525
|
+
"engines": {
|
|
526
|
+
"node": ">=0.6.11 <=0.7.0 || >=0.7.3"
|
|
527
|
+
},
|
|
528
|
+
"integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==",
|
|
529
|
+
"license": "MIT",
|
|
530
|
+
"resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz",
|
|
531
|
+
"version": "0.0.6"
|
|
532
|
+
},
|
|
533
|
+
"node_modules/wcwidth": {
|
|
534
|
+
"dependencies": {
|
|
535
|
+
"defaults": "^1.0.3"
|
|
536
|
+
},
|
|
537
|
+
"integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==",
|
|
538
|
+
"license": "MIT",
|
|
539
|
+
"optional": true,
|
|
540
|
+
"resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz",
|
|
541
|
+
"version": "1.0.1"
|
|
542
|
+
}
|
|
543
|
+
},
|
|
544
|
+
"requires": true,
|
|
545
|
+
"version": "0.9.0"
|
|
546
|
+
}
|
package/package.json
ADDED
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
{
|
|
2
|
+
"artifactDownloadUrls": [
|
|
3
|
+
"https://github.com/prbski/mdshelf/releases/download/v0.9.0"
|
|
4
|
+
],
|
|
5
|
+
"author": "Patryk Porebski",
|
|
6
|
+
"bin": {
|
|
7
|
+
"mdshelf": "run-mdshelf.js"
|
|
8
|
+
},
|
|
9
|
+
"dependencies": {
|
|
10
|
+
"axios": "^1.13.5",
|
|
11
|
+
"axios-proxy-builder": "^0.1.2",
|
|
12
|
+
"console.table": "^0.10.0",
|
|
13
|
+
"detect-libc": "^2.1.2",
|
|
14
|
+
"rimraf": "^6.1.3"
|
|
15
|
+
},
|
|
16
|
+
"description": "A Rust web server that serves folders of markdown files as websites.",
|
|
17
|
+
"devDependencies": {
|
|
18
|
+
"prettier": "^3.8.1"
|
|
19
|
+
},
|
|
20
|
+
"engines": {
|
|
21
|
+
"node": ">=14",
|
|
22
|
+
"npm": ">=6"
|
|
23
|
+
},
|
|
24
|
+
"glibcMinimum": {
|
|
25
|
+
"major": 2,
|
|
26
|
+
"series": 35
|
|
27
|
+
},
|
|
28
|
+
"homepage": "https://github.com/prbski/mdshelf",
|
|
29
|
+
"license": "MIT OR Apache-2.0",
|
|
30
|
+
"name": "mdshelf",
|
|
31
|
+
"preferUnplugged": true,
|
|
32
|
+
"repository": "https://github.com/prbski/mdshelf",
|
|
33
|
+
"scripts": {
|
|
34
|
+
"fmt": "prettier --write **/*.js",
|
|
35
|
+
"fmt:check": "prettier --check **/*.js",
|
|
36
|
+
"postinstall": "node ./install.js"
|
|
37
|
+
},
|
|
38
|
+
"supportedPlatforms": {
|
|
39
|
+
"aarch64-apple-darwin": {
|
|
40
|
+
"artifactName": "mdshelf-aarch64-apple-darwin.tar.xz",
|
|
41
|
+
"bins": {
|
|
42
|
+
"mdshelf": "mdshelf"
|
|
43
|
+
},
|
|
44
|
+
"zipExt": ".tar.xz"
|
|
45
|
+
},
|
|
46
|
+
"aarch64-pc-windows-msvc": {
|
|
47
|
+
"artifactName": "mdshelf-x86_64-pc-windows-msvc.zip",
|
|
48
|
+
"bins": {
|
|
49
|
+
"mdshelf": "mdshelf.exe"
|
|
50
|
+
},
|
|
51
|
+
"zipExt": ".zip"
|
|
52
|
+
},
|
|
53
|
+
"aarch64-unknown-linux-gnu": {
|
|
54
|
+
"artifactName": "mdshelf-aarch64-unknown-linux-gnu.tar.xz",
|
|
55
|
+
"bins": {
|
|
56
|
+
"mdshelf": "mdshelf"
|
|
57
|
+
},
|
|
58
|
+
"zipExt": ".tar.xz"
|
|
59
|
+
},
|
|
60
|
+
"x86_64-apple-darwin": {
|
|
61
|
+
"artifactName": "mdshelf-x86_64-apple-darwin.tar.xz",
|
|
62
|
+
"bins": {
|
|
63
|
+
"mdshelf": "mdshelf"
|
|
64
|
+
},
|
|
65
|
+
"zipExt": ".tar.xz"
|
|
66
|
+
},
|
|
67
|
+
"x86_64-pc-windows-gnu": {
|
|
68
|
+
"artifactName": "mdshelf-x86_64-pc-windows-msvc.zip",
|
|
69
|
+
"bins": {
|
|
70
|
+
"mdshelf": "mdshelf.exe"
|
|
71
|
+
},
|
|
72
|
+
"zipExt": ".zip"
|
|
73
|
+
},
|
|
74
|
+
"x86_64-pc-windows-msvc": {
|
|
75
|
+
"artifactName": "mdshelf-x86_64-pc-windows-msvc.zip",
|
|
76
|
+
"bins": {
|
|
77
|
+
"mdshelf": "mdshelf.exe"
|
|
78
|
+
},
|
|
79
|
+
"zipExt": ".zip"
|
|
80
|
+
},
|
|
81
|
+
"x86_64-unknown-linux-gnu": {
|
|
82
|
+
"artifactName": "mdshelf-x86_64-unknown-linux-gnu.tar.xz",
|
|
83
|
+
"bins": {
|
|
84
|
+
"mdshelf": "mdshelf"
|
|
85
|
+
},
|
|
86
|
+
"zipExt": ".tar.xz"
|
|
87
|
+
},
|
|
88
|
+
"x86_64-unknown-linux-musl-dynamic": {
|
|
89
|
+
"artifactName": "mdshelf-x86_64-unknown-linux-musl.tar.xz",
|
|
90
|
+
"bins": {
|
|
91
|
+
"mdshelf": "mdshelf"
|
|
92
|
+
},
|
|
93
|
+
"zipExt": ".tar.xz"
|
|
94
|
+
},
|
|
95
|
+
"x86_64-unknown-linux-musl-static": {
|
|
96
|
+
"artifactName": "mdshelf-x86_64-unknown-linux-musl.tar.xz",
|
|
97
|
+
"bins": {
|
|
98
|
+
"mdshelf": "mdshelf"
|
|
99
|
+
},
|
|
100
|
+
"zipExt": ".tar.xz"
|
|
101
|
+
}
|
|
102
|
+
},
|
|
103
|
+
"version": "0.9.0",
|
|
104
|
+
"volta": {
|
|
105
|
+
"node": "18.14.1",
|
|
106
|
+
"npm": "9.5.0"
|
|
107
|
+
}
|
|
108
|
+
}
|
package/run-mdshelf.js
ADDED