@bashlife/boxbox-beta 73.0.0 → 74.0.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/nibble-lock.json +128 -0
- package/package.json +3 -2
- package/src/commands/nibble-lock.json +80 -0
- package/src/commands/nibble.js +249 -0
- package/src/index.js +1 -0
package/nibble-lock.json
ADDED
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
{
|
|
2
|
+
"packages": {
|
|
3
|
+
"chalk": {
|
|
4
|
+
"version": "5.6.2",
|
|
5
|
+
"resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz"
|
|
6
|
+
},
|
|
7
|
+
"commander": {
|
|
8
|
+
"version": "15.0.0",
|
|
9
|
+
"resolved": "https://registry.npmjs.org/commander/-/commander-15.0.0.tgz"
|
|
10
|
+
},
|
|
11
|
+
"run-applescript": {
|
|
12
|
+
"version": "7.1.0",
|
|
13
|
+
"resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.1.0.tgz"
|
|
14
|
+
},
|
|
15
|
+
"bundle-name": {
|
|
16
|
+
"version": "4.1.0",
|
|
17
|
+
"resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz"
|
|
18
|
+
},
|
|
19
|
+
"default-browser-id": {
|
|
20
|
+
"version": "5.0.1",
|
|
21
|
+
"resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.1.tgz"
|
|
22
|
+
},
|
|
23
|
+
"default-browser": {
|
|
24
|
+
"version": "5.5.0",
|
|
25
|
+
"resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.5.0.tgz"
|
|
26
|
+
},
|
|
27
|
+
"define-lazy-prop": {
|
|
28
|
+
"version": "3.0.0",
|
|
29
|
+
"resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz"
|
|
30
|
+
},
|
|
31
|
+
"is-in-ssh": {
|
|
32
|
+
"version": "1.0.0",
|
|
33
|
+
"resolved": "https://registry.npmjs.org/is-in-ssh/-/is-in-ssh-1.0.0.tgz"
|
|
34
|
+
},
|
|
35
|
+
"is-docker": {
|
|
36
|
+
"version": "3.0.0",
|
|
37
|
+
"resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz"
|
|
38
|
+
},
|
|
39
|
+
"is-inside-container": {
|
|
40
|
+
"version": "1.0.0",
|
|
41
|
+
"resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz"
|
|
42
|
+
},
|
|
43
|
+
"powershell-utils": {
|
|
44
|
+
"version": "0.2.0",
|
|
45
|
+
"resolved": "https://registry.npmjs.org/powershell-utils/-/powershell-utils-0.2.0.tgz"
|
|
46
|
+
},
|
|
47
|
+
"is-wsl": {
|
|
48
|
+
"version": "3.1.1",
|
|
49
|
+
"resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.1.tgz"
|
|
50
|
+
},
|
|
51
|
+
"wsl-utils": {
|
|
52
|
+
"version": "0.4.0",
|
|
53
|
+
"resolved": "https://registry.npmjs.org/wsl-utils/-/wsl-utils-0.4.0.tgz"
|
|
54
|
+
},
|
|
55
|
+
"open": {
|
|
56
|
+
"version": "11.0.0",
|
|
57
|
+
"resolved": "https://registry.npmjs.org/open/-/open-11.0.0.tgz"
|
|
58
|
+
},
|
|
59
|
+
"mimic-function": {
|
|
60
|
+
"version": "5.0.1",
|
|
61
|
+
"resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz"
|
|
62
|
+
},
|
|
63
|
+
"onetime": {
|
|
64
|
+
"version": "7.0.0",
|
|
65
|
+
"resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz"
|
|
66
|
+
},
|
|
67
|
+
"signal-exit": {
|
|
68
|
+
"version": "4.1.0",
|
|
69
|
+
"resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz"
|
|
70
|
+
},
|
|
71
|
+
"restore-cursor": {
|
|
72
|
+
"version": "5.1.0",
|
|
73
|
+
"resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz"
|
|
74
|
+
},
|
|
75
|
+
"cli-cursor": {
|
|
76
|
+
"version": "5.0.0",
|
|
77
|
+
"resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz"
|
|
78
|
+
},
|
|
79
|
+
"cli-spinners": {
|
|
80
|
+
"version": "3.4.0",
|
|
81
|
+
"resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-3.4.0.tgz"
|
|
82
|
+
},
|
|
83
|
+
"is-interactive": {
|
|
84
|
+
"version": "2.0.0",
|
|
85
|
+
"resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-2.0.0.tgz"
|
|
86
|
+
},
|
|
87
|
+
"is-unicode-supported": {
|
|
88
|
+
"version": "2.1.0",
|
|
89
|
+
"resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.1.0.tgz"
|
|
90
|
+
},
|
|
91
|
+
"yoctocolors": {
|
|
92
|
+
"version": "2.1.2",
|
|
93
|
+
"resolved": "https://registry.npmjs.org/yoctocolors/-/yoctocolors-2.1.2.tgz"
|
|
94
|
+
},
|
|
95
|
+
"log-symbols": {
|
|
96
|
+
"version": "7.0.1",
|
|
97
|
+
"resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-7.0.1.tgz"
|
|
98
|
+
},
|
|
99
|
+
"stdin-discarder": {
|
|
100
|
+
"version": "0.3.2",
|
|
101
|
+
"resolved": "https://registry.npmjs.org/stdin-discarder/-/stdin-discarder-0.3.2.tgz"
|
|
102
|
+
},
|
|
103
|
+
"get-east-asian-width": {
|
|
104
|
+
"version": "1.6.0",
|
|
105
|
+
"resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.6.0.tgz"
|
|
106
|
+
},
|
|
107
|
+
"ansi-regex": {
|
|
108
|
+
"version": "6.2.2",
|
|
109
|
+
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz"
|
|
110
|
+
},
|
|
111
|
+
"strip-ansi": {
|
|
112
|
+
"version": "7.2.0",
|
|
113
|
+
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz"
|
|
114
|
+
},
|
|
115
|
+
"string-width": {
|
|
116
|
+
"version": "8.2.2",
|
|
117
|
+
"resolved": "https://registry.npmjs.org/string-width/-/string-width-8.2.2.tgz"
|
|
118
|
+
},
|
|
119
|
+
"ora": {
|
|
120
|
+
"version": "9.4.1",
|
|
121
|
+
"resolved": "https://registry.npmjs.org/ora/-/ora-9.4.1.tgz"
|
|
122
|
+
},
|
|
123
|
+
"deploy-summit": {
|
|
124
|
+
"version": "1.0.0",
|
|
125
|
+
"resolved": "https://registry.npmjs.org/deploy-summit/-/deploy-summit-1.0.0.tgz"
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bashlife/boxbox-beta",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "74.0.0",
|
|
4
4
|
"description": "A modern BusyBox-style CLI toolkit with custom commands.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"author": "bashlife",
|
|
@@ -18,6 +18,7 @@
|
|
|
18
18
|
],
|
|
19
19
|
"license": "UNLICENSED",
|
|
20
20
|
"dependencies": {
|
|
21
|
-
"boxbox-unfinished": "^65.0.2"
|
|
21
|
+
"boxbox-unfinished": "^65.0.2",
|
|
22
|
+
"tar": "^7.5.22"
|
|
22
23
|
}
|
|
23
24
|
}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
{
|
|
2
|
+
"packages": {
|
|
3
|
+
"chalk": {
|
|
4
|
+
"version": "5.6.2",
|
|
5
|
+
"resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz"
|
|
6
|
+
},
|
|
7
|
+
"commander": {
|
|
8
|
+
"version": "15.0.0",
|
|
9
|
+
"resolved": "https://registry.npmjs.org/commander/-/commander-15.0.0.tgz"
|
|
10
|
+
},
|
|
11
|
+
"run-applescript": {
|
|
12
|
+
"version": "7.1.0",
|
|
13
|
+
"resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.1.0.tgz"
|
|
14
|
+
},
|
|
15
|
+
"bundle-name": {
|
|
16
|
+
"version": "4.1.0",
|
|
17
|
+
"resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz"
|
|
18
|
+
},
|
|
19
|
+
"default-browser-id": {
|
|
20
|
+
"version": "5.0.1",
|
|
21
|
+
"resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.1.tgz"
|
|
22
|
+
},
|
|
23
|
+
"default-browser": {
|
|
24
|
+
"version": "5.5.0",
|
|
25
|
+
"resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.5.0.tgz"
|
|
26
|
+
},
|
|
27
|
+
"define-lazy-prop": {
|
|
28
|
+
"version": "3.0.0",
|
|
29
|
+
"resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz"
|
|
30
|
+
},
|
|
31
|
+
"is-in-ssh": {
|
|
32
|
+
"version": "1.0.0",
|
|
33
|
+
"resolved": "https://registry.npmjs.org/is-in-ssh/-/is-in-ssh-1.0.0.tgz"
|
|
34
|
+
},
|
|
35
|
+
"is-docker": {
|
|
36
|
+
"version": "3.0.0",
|
|
37
|
+
"resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz"
|
|
38
|
+
},
|
|
39
|
+
"is-inside-container": {
|
|
40
|
+
"version": "1.0.0",
|
|
41
|
+
"resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz"
|
|
42
|
+
},
|
|
43
|
+
"powershell-utils": {
|
|
44
|
+
"version": "0.2.0",
|
|
45
|
+
"resolved": "https://registry.npmjs.org/powershell-utils/-/powershell-utils-0.2.0.tgz"
|
|
46
|
+
},
|
|
47
|
+
"is-wsl": {
|
|
48
|
+
"version": "3.1.1",
|
|
49
|
+
"resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.1.tgz"
|
|
50
|
+
},
|
|
51
|
+
"wsl-utils": {
|
|
52
|
+
"version": "0.4.0",
|
|
53
|
+
"resolved": "https://registry.npmjs.org/wsl-utils/-/wsl-utils-0.4.0.tgz"
|
|
54
|
+
},
|
|
55
|
+
"open": {
|
|
56
|
+
"version": "11.0.0",
|
|
57
|
+
"resolved": "https://registry.npmjs.org/open/-/open-11.0.0.tgz"
|
|
58
|
+
},
|
|
59
|
+
"mimic-function": {
|
|
60
|
+
"version": "5.0.1",
|
|
61
|
+
"resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz"
|
|
62
|
+
},
|
|
63
|
+
"onetime": {
|
|
64
|
+
"version": "7.0.0",
|
|
65
|
+
"resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz"
|
|
66
|
+
},
|
|
67
|
+
"signal-exit": {
|
|
68
|
+
"version": "4.1.0",
|
|
69
|
+
"resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz"
|
|
70
|
+
},
|
|
71
|
+
"restore-cursor": {
|
|
72
|
+
"version": "5.1.0",
|
|
73
|
+
"resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz"
|
|
74
|
+
},
|
|
75
|
+
"cli-cursor": {
|
|
76
|
+
"version": "5.0.0",
|
|
77
|
+
"resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz"
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
@@ -0,0 +1,249 @@
|
|
|
1
|
+
import https from "https";
|
|
2
|
+
import fs from "fs";
|
|
3
|
+
import path from "path";
|
|
4
|
+
import os from "os";
|
|
5
|
+
import * as tar from "tar";
|
|
6
|
+
|
|
7
|
+
const HOME = os.homedir();
|
|
8
|
+
|
|
9
|
+
const NIBBLE_DIR = path.join(HOME, ".nibble");
|
|
10
|
+
const PACKAGES_DIR = path.join(NIBBLE_DIR, "packages");
|
|
11
|
+
const BIN_DIR = path.join(NIBBLE_DIR, "bin");
|
|
12
|
+
|
|
13
|
+
const DB_FILE = path.join(NIBBLE_DIR, "installed.json");
|
|
14
|
+
const LOCK_FILE = path.join(process.cwd(), "nibble-lock.json");
|
|
15
|
+
|
|
16
|
+
fs.mkdirSync(PACKAGES_DIR, { recursive: true });
|
|
17
|
+
fs.mkdirSync(BIN_DIR, { recursive: true });
|
|
18
|
+
|
|
19
|
+
const installing = new Set();
|
|
20
|
+
|
|
21
|
+
function fetchJSON(url) {
|
|
22
|
+
return new Promise((resolve, reject) => {
|
|
23
|
+
https.get(url, { headers: { "User-Agent": "Nibble" } }, res => {
|
|
24
|
+
let data = "";
|
|
25
|
+
res.on("data", chunk => data += chunk);
|
|
26
|
+
res.on("end", () => {
|
|
27
|
+
try {
|
|
28
|
+
resolve(JSON.parse(data));
|
|
29
|
+
} catch {
|
|
30
|
+
reject(new Error("Invalid JSON"));
|
|
31
|
+
}
|
|
32
|
+
});
|
|
33
|
+
}).on("error", reject);
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
function download(url, file) {
|
|
38
|
+
return new Promise((resolve, reject) => {
|
|
39
|
+
const output = fs.createWriteStream(file);
|
|
40
|
+
https.get(url, res => {
|
|
41
|
+
res.pipe(output);
|
|
42
|
+
output.on("finish", () => {
|
|
43
|
+
output.close();
|
|
44
|
+
resolve();
|
|
45
|
+
});
|
|
46
|
+
}).on("error", reject);
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
function loadJSON(file, fallback) {
|
|
51
|
+
if (!fs.existsSync(file)) return fallback;
|
|
52
|
+
return JSON.parse(fs.readFileSync(file, "utf8"));
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
function saveJSON(file, data) {
|
|
56
|
+
fs.writeFileSync(file, JSON.stringify(data, null, 2));
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
function safeName(name) {
|
|
60
|
+
return name.replaceAll("/", "__");
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
function parsePackage(input) {
|
|
64
|
+
if (input.startsWith("@")) {
|
|
65
|
+
const index = input.lastIndexOf("@");
|
|
66
|
+
if (index > 0) {
|
|
67
|
+
return { name: input.slice(0, index), version: input.slice(index + 1) };
|
|
68
|
+
}
|
|
69
|
+
return { name: input, version: null };
|
|
70
|
+
}
|
|
71
|
+
const parts = input.split("@");
|
|
72
|
+
return { name: parts[0], version: parts[1] || null };
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
function resolveVersion(meta, wanted) {
|
|
76
|
+
if (!wanted) return meta["dist-tags"].latest;
|
|
77
|
+
if (meta.versions[wanted]) return wanted;
|
|
78
|
+
|
|
79
|
+
const versions = Object.keys(meta.versions).reverse();
|
|
80
|
+
|
|
81
|
+
if (wanted.startsWith("^")) {
|
|
82
|
+
const major = wanted.slice(1).split(".")[0];
|
|
83
|
+
return versions.find(v => v.startsWith(`${major}.`));
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
if (wanted.startsWith("~")) {
|
|
87
|
+
const base = wanted.slice(1).split(".").slice(0, 2).join(".");
|
|
88
|
+
return versions.find(v => v.startsWith(base));
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
return meta["dist-tags"].latest;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
function linkBins(root, pkg) {
|
|
95
|
+
if (!pkg.bin) return;
|
|
96
|
+
const bins = typeof pkg.bin === "string" ? { [pkg.name]: pkg.bin } : pkg.bin;
|
|
97
|
+
|
|
98
|
+
for (const [name, file] of Object.entries(bins)) {
|
|
99
|
+
const target = path.join(root, file);
|
|
100
|
+
const link = path.join(BIN_DIR, name);
|
|
101
|
+
try { fs.unlinkSync(link); } catch {}
|
|
102
|
+
fs.symlinkSync(target, link);
|
|
103
|
+
console.log(`Linked ${name}`);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
async function install(input) {
|
|
108
|
+
const parsed = parsePackage(input);
|
|
109
|
+
const name = parsed.name;
|
|
110
|
+
|
|
111
|
+
if (installing.has(name)) return;
|
|
112
|
+
installing.add(name);
|
|
113
|
+
|
|
114
|
+
console.log(`Installing ${input}`);
|
|
115
|
+
|
|
116
|
+
const meta = await fetchJSON(`https://registry.npmjs.org/${name}`);
|
|
117
|
+
const version = resolveVersion(meta, parsed.version);
|
|
118
|
+
const info = meta.versions[version];
|
|
119
|
+
if (!info) throw new Error("Version not found");
|
|
120
|
+
|
|
121
|
+
const packageDir = path.join(PACKAGES_DIR, name);
|
|
122
|
+
const archive = path.join(NIBBLE_DIR, safeName(name) + ".tgz");
|
|
123
|
+
|
|
124
|
+
console.log(`Downloading ${name}@${version}`);
|
|
125
|
+
await download(info.dist.tarball, archive);
|
|
126
|
+
|
|
127
|
+
fs.mkdirSync(packageDir, { recursive: true });
|
|
128
|
+
await tar.x({ file: archive, cwd: packageDir });
|
|
129
|
+
|
|
130
|
+
// Delete the archive after extraction
|
|
131
|
+
try { fs.unlinkSync(archive); } catch {}
|
|
132
|
+
|
|
133
|
+
const root = path.join(packageDir, "package");
|
|
134
|
+
const pkg = JSON.parse(fs.readFileSync(path.join(root, "package.json"), "utf8"));
|
|
135
|
+
|
|
136
|
+
// Install dependencies recursively
|
|
137
|
+
if (pkg.dependencies) {
|
|
138
|
+
for (const [dep, range] of Object.entries(pkg.dependencies)) {
|
|
139
|
+
await install(`${dep}@${range}`);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
// Create node_modules and symlink dependencies
|
|
144
|
+
const nodeModules = path.join(root, "node_modules");
|
|
145
|
+
fs.mkdirSync(nodeModules, { recursive: true });
|
|
146
|
+
|
|
147
|
+
for (const dep of Object.keys(pkg.dependencies || {})) {
|
|
148
|
+
const depPath = path.join(nodeModules, dep);
|
|
149
|
+
try { fs.unlinkSync(depPath); } catch {}
|
|
150
|
+
fs.symlinkSync(path.join(PACKAGES_DIR, dep, "package"), depPath, "junction");
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
// Link any executable bins
|
|
154
|
+
linkBins(root, pkg);
|
|
155
|
+
|
|
156
|
+
// Update installed database
|
|
157
|
+
const db = loadJSON(DB_FILE, {});
|
|
158
|
+
db[name] = { version, tarball: info.dist.tarball };
|
|
159
|
+
saveJSON(DB_FILE, db);
|
|
160
|
+
|
|
161
|
+
// Update lockfile
|
|
162
|
+
const lock = loadJSON(LOCK_FILE, { packages: {} });
|
|
163
|
+
lock.packages[name] = { version, resolved: info.dist.tarball };
|
|
164
|
+
saveJSON(LOCK_FILE, lock);
|
|
165
|
+
|
|
166
|
+
installing.delete(name);
|
|
167
|
+
console.log(`Installed ${name}@${version}`);
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
async function uninstall(name) {
|
|
171
|
+
const db = loadJSON(DB_FILE, {});
|
|
172
|
+
if (!db[name]) {
|
|
173
|
+
console.log("Not installed");
|
|
174
|
+
return;
|
|
175
|
+
}
|
|
176
|
+
fs.rmSync(path.join(PACKAGES_DIR, name), { recursive: true, force: true });
|
|
177
|
+
delete db[name];
|
|
178
|
+
saveJSON(DB_FILE, db);
|
|
179
|
+
console.log(`Removed ${name}`);
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
async function update(name) {
|
|
183
|
+
const db = loadJSON(DB_FILE, {});
|
|
184
|
+
if (!db[name]) {
|
|
185
|
+
console.log("Not installed");
|
|
186
|
+
return;
|
|
187
|
+
}
|
|
188
|
+
const meta = await fetchJSON(`https://registry.npmjs.org/${name}`);
|
|
189
|
+
const latest = meta["dist-tags"].latest;
|
|
190
|
+
if (latest === db[name].version) {
|
|
191
|
+
console.log("Already latest");
|
|
192
|
+
return;
|
|
193
|
+
}
|
|
194
|
+
await uninstall(name);
|
|
195
|
+
await install(`${name}@${latest}`);
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
async function info(name) {
|
|
199
|
+
const data = await fetchJSON(`https://registry.npmjs.org/${name}`);
|
|
200
|
+
console.log(`
|
|
201
|
+
${data.name}
|
|
202
|
+
|
|
203
|
+
${data.description || ""}
|
|
204
|
+
|
|
205
|
+
Latest:
|
|
206
|
+
${data["dist-tags"].latest}
|
|
207
|
+
|
|
208
|
+
Versions:
|
|
209
|
+
${Object.keys(data.versions).length}
|
|
210
|
+
`);
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
async function search(query) {
|
|
214
|
+
const data = await fetchJSON(`https://registry.npmjs.org/-/v1/search?text=${query}`);
|
|
215
|
+
for (const item of data.objects) {
|
|
216
|
+
console.log(item.package.name);
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
export default async function(args) {
|
|
221
|
+
switch(args[0]) {
|
|
222
|
+
case "search":
|
|
223
|
+
await search(args[1]);
|
|
224
|
+
break;
|
|
225
|
+
case "info":
|
|
226
|
+
await info(args[1]);
|
|
227
|
+
break;
|
|
228
|
+
case "install":
|
|
229
|
+
await install(args[1]);
|
|
230
|
+
break;
|
|
231
|
+
case "uninstall":
|
|
232
|
+
await uninstall(args[1]);
|
|
233
|
+
break;
|
|
234
|
+
case "update":
|
|
235
|
+
await update(args[1]);
|
|
236
|
+
break;
|
|
237
|
+
default:
|
|
238
|
+
console.log(`
|
|
239
|
+
Nibble Package Manager
|
|
240
|
+
|
|
241
|
+
Commands:
|
|
242
|
+
search <package>
|
|
243
|
+
info <package>
|
|
244
|
+
install <package>
|
|
245
|
+
uninstall <package>
|
|
246
|
+
update <package>
|
|
247
|
+
`);
|
|
248
|
+
}
|
|
249
|
+
}
|