@kamaras/venpm 0.0.1 → 0.1.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/LICENSE +21 -0
- package/README.md +65 -0
- package/actions/publish-index/action.yml +50 -0
- package/dist/cli/config-cmd.d.ts +3 -0
- package/dist/cli/config-cmd.d.ts.map +1 -0
- package/dist/cli/config-cmd.js +100 -0
- package/dist/cli/config-cmd.js.map +1 -0
- package/dist/cli/context.d.ts +6 -0
- package/dist/cli/context.d.ts.map +1 -0
- package/dist/cli/context.js +149 -0
- package/dist/cli/context.js.map +1 -0
- package/dist/cli/create.d.ts +23 -0
- package/dist/cli/create.d.ts.map +1 -0
- package/dist/cli/create.js +238 -0
- package/dist/cli/create.js.map +1 -0
- package/dist/cli/doctor.d.ts +3 -0
- package/dist/cli/doctor.d.ts.map +1 -0
- package/dist/cli/doctor.js +67 -0
- package/dist/cli/doctor.js.map +1 -0
- package/dist/cli/info.d.ts +5 -0
- package/dist/cli/info.d.ts.map +1 -0
- package/dist/cli/info.js +105 -0
- package/dist/cli/info.js.map +1 -0
- package/dist/cli/install.d.ts +5 -0
- package/dist/cli/install.d.ts.map +1 -0
- package/dist/cli/install.js +252 -0
- package/dist/cli/install.js.map +1 -0
- package/dist/cli/list.d.ts +5 -0
- package/dist/cli/list.d.ts.map +1 -0
- package/dist/cli/list.js +41 -0
- package/dist/cli/list.js.map +1 -0
- package/dist/cli/rebuild.d.ts +3 -0
- package/dist/cli/rebuild.d.ts.map +1 -0
- package/dist/cli/rebuild.js +74 -0
- package/dist/cli/rebuild.js.map +1 -0
- package/dist/cli/repo.d.ts +3 -0
- package/dist/cli/repo.d.ts.map +1 -0
- package/dist/cli/repo.js +93 -0
- package/dist/cli/repo.js.map +1 -0
- package/dist/cli/search.d.ts +5 -0
- package/dist/cli/search.d.ts.map +1 -0
- package/dist/cli/search.js +50 -0
- package/dist/cli/search.js.map +1 -0
- package/dist/cli/uninstall.d.ts +5 -0
- package/dist/cli/uninstall.d.ts.map +1 -0
- package/dist/cli/uninstall.js +69 -0
- package/dist/cli/uninstall.js.map +1 -0
- package/dist/cli/update.d.ts +5 -0
- package/dist/cli/update.d.ts.map +1 -0
- package/dist/cli/update.js +161 -0
- package/dist/cli/update.js.map +1 -0
- package/dist/cli/validate.d.ts +3 -0
- package/dist/cli/validate.d.ts.map +1 -0
- package/dist/cli/validate.js +99 -0
- package/dist/cli/validate.js.map +1 -0
- package/dist/core/builder.d.ts +31 -0
- package/dist/core/builder.d.ts.map +1 -0
- package/dist/core/builder.js +65 -0
- package/dist/core/builder.js.map +1 -0
- package/dist/core/cache.d.ts +17 -0
- package/dist/core/cache.d.ts.map +1 -0
- package/dist/core/cache.js +36 -0
- package/dist/core/cache.js.map +1 -0
- package/dist/core/config.d.ts +7 -0
- package/dist/core/config.d.ts.map +1 -0
- package/dist/core/config.js +32 -0
- package/dist/core/config.js.map +1 -0
- package/dist/core/detect.d.ts +28 -0
- package/dist/core/detect.d.ts.map +1 -0
- package/dist/core/detect.js +100 -0
- package/dist/core/detect.js.map +1 -0
- package/dist/core/fetcher.d.ts +21 -0
- package/dist/core/fetcher.d.ts.map +1 -0
- package/dist/core/fetcher.js +92 -0
- package/dist/core/fetcher.js.map +1 -0
- package/dist/core/json.d.ts +9 -0
- package/dist/core/json.d.ts.map +1 -0
- package/dist/core/json.js +10 -0
- package/dist/core/json.js.map +1 -0
- package/dist/core/lockfile.d.ts +9 -0
- package/dist/core/lockfile.d.ts.map +1 -0
- package/dist/core/lockfile.js +30 -0
- package/dist/core/lockfile.js.map +1 -0
- package/dist/core/log.d.ts +8 -0
- package/dist/core/log.d.ts.map +1 -0
- package/dist/core/log.js +24 -0
- package/dist/core/log.js.map +1 -0
- package/dist/core/paths.d.ts +4 -0
- package/dist/core/paths.d.ts.map +1 -0
- package/dist/core/paths.js +33 -0
- package/dist/core/paths.js.map +1 -0
- package/dist/core/prompt.d.ts +5 -0
- package/dist/core/prompt.d.ts.map +1 -0
- package/dist/core/prompt.js +67 -0
- package/dist/core/prompt.js.map +1 -0
- package/dist/core/registry.d.ts +52 -0
- package/dist/core/registry.d.ts.map +1 -0
- package/dist/core/registry.js +134 -0
- package/dist/core/registry.js.map +1 -0
- package/dist/core/resolver.d.ts +47 -0
- package/dist/core/resolver.d.ts.map +1 -0
- package/dist/core/resolver.js +153 -0
- package/dist/core/resolver.js.map +1 -0
- package/dist/core/schema.d.ts +8 -0
- package/dist/core/schema.d.ts.map +1 -0
- package/dist/core/schema.js +47 -0
- package/dist/core/schema.js.map +1 -0
- package/dist/core/types.d.ts +206 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +3 -0
- package/dist/core/types.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +37 -0
- package/dist/index.js.map +1 -0
- package/package.json +42 -6
- package/schemas/v1/config.schema.json +53 -0
- package/schemas/v1/lockfile.schema.json +43 -0
- package/schemas/v1/plugins.schema.json +69 -0
|
@@ -0,0 +1,252 @@
|
|
|
1
|
+
import { join } from "node:path";
|
|
2
|
+
import { loadConfig } from "../core/config.js";
|
|
3
|
+
import { loadLockfile, saveLockfile, addInstalled } from "../core/lockfile.js";
|
|
4
|
+
import { fetchAllIndexes, resolvePlugin } from "../core/registry.js";
|
|
5
|
+
import { loadCache, saveCache } from "../core/cache.js";
|
|
6
|
+
import { generateInstallPlan, ResolverError } from "../core/resolver.js";
|
|
7
|
+
import { fetchPlugin, fetchViaLocal } from "../core/fetcher.js";
|
|
8
|
+
import { buildAndDeploy } from "../core/builder.js";
|
|
9
|
+
import { detectVencordPath, detectDiscordBinary } from "../core/detect.js";
|
|
10
|
+
import { getConfigPath, getLockfilePath } from "../core/paths.js";
|
|
11
|
+
import { jsonSuccess, jsonError, writeJson } from "../core/json.js";
|
|
12
|
+
import { createRealIOContext } from "./context.js";
|
|
13
|
+
// ─── Public API ───────────────────────────────────────────────────────────────
|
|
14
|
+
export async function executeInstall(ctx, pluginName, options) {
|
|
15
|
+
const { fs, http, git, shell, prompter, logger } = ctx;
|
|
16
|
+
// 1. Load config and lockfile
|
|
17
|
+
const configPath = options.config ?? getConfigPath();
|
|
18
|
+
const lockfilePath = getLockfilePath();
|
|
19
|
+
const config = await loadConfig(fs, configPath);
|
|
20
|
+
let lockfile = await loadLockfile(fs, lockfilePath);
|
|
21
|
+
// 2. Resolve Vencord path
|
|
22
|
+
const vencordPath = config.vencord.path ?? await detectVencordPath(fs);
|
|
23
|
+
if (!vencordPath) {
|
|
24
|
+
if (options.json) {
|
|
25
|
+
process.exitCode = 1;
|
|
26
|
+
writeJson(jsonError("Could not find Vencord source path. Set vencord.path in config or VENPM_VENCORD_PATH env var."));
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
logger.error("Could not find Vencord source path. Set vencord.path in config or VENPM_VENCORD_PATH env var.");
|
|
30
|
+
process.exitCode = 1;
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
const userpluginDir = join(vencordPath, "src", "userplugins");
|
|
34
|
+
// 3. Handle --local flag: symlink and update lockfile, then done
|
|
35
|
+
if (options.local) {
|
|
36
|
+
const localPath = options.local;
|
|
37
|
+
const dest = join(userpluginDir, pluginName);
|
|
38
|
+
logger.info(`Symlinking ${localPath} → ${dest}`);
|
|
39
|
+
await fetchViaLocal(fs, localPath, dest);
|
|
40
|
+
lockfile = addInstalled(lockfile, pluginName, {
|
|
41
|
+
version: "local",
|
|
42
|
+
repo: "local",
|
|
43
|
+
method: "local",
|
|
44
|
+
pinned: false,
|
|
45
|
+
installed_at: new Date().toISOString(),
|
|
46
|
+
});
|
|
47
|
+
await saveLockfile(fs, lockfilePath, lockfile);
|
|
48
|
+
if (options.json) {
|
|
49
|
+
writeJson(jsonSuccess({ installed: [{ name: pluginName, version: "local", method: "local" }], warnings: [] }));
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
logger.success(`Installed ${pluginName} from local path`);
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
// 4. Fetch all indexes (with cache)
|
|
56
|
+
const cache = await loadCache(fs);
|
|
57
|
+
const { results: fetchedIndexes, updatedCache } = await fetchAllIndexes(http, config.repos, { cache });
|
|
58
|
+
await saveCache(fs, updatedCache);
|
|
59
|
+
const validIndexes = fetchedIndexes.filter(fi => fi.index !== undefined);
|
|
60
|
+
for (const fi of fetchedIndexes) {
|
|
61
|
+
if (fi.error) {
|
|
62
|
+
logger.warn(`Failed to fetch index from repo "${fi.repoName}": ${fi.error}`);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
// 5. Resolve plugin
|
|
66
|
+
const match = resolvePlugin(fetchedIndexes, pluginName, options.from);
|
|
67
|
+
if (!match) {
|
|
68
|
+
const msg = options.from
|
|
69
|
+
? `Plugin "${pluginName}" not found in repo "${options.from}"`
|
|
70
|
+
: `Plugin "${pluginName}" not found in any configured repo`;
|
|
71
|
+
if (options.json) {
|
|
72
|
+
process.exitCode = 1;
|
|
73
|
+
writeJson(jsonError(msg));
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
logger.error(msg);
|
|
77
|
+
process.exitCode = 1;
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
// Check for multiple matches (without --from, warn if plugin appears in multiple repos)
|
|
81
|
+
if (!options.from) {
|
|
82
|
+
const allMatches = fetchedIndexes.filter(fi => fi.index?.plugins[pluginName]);
|
|
83
|
+
if (allMatches.length > 1) {
|
|
84
|
+
logger.warn(`Plugin "${pluginName}" found in multiple repos: ${allMatches.map(fi => fi.repoName).join(", ")}. ` +
|
|
85
|
+
`Using "${match.repoName}". Use --from <repo> to specify.`);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
// 6. Generate install plan
|
|
89
|
+
const gitAvailable = await git.available();
|
|
90
|
+
let forceMethod;
|
|
91
|
+
if (options.git)
|
|
92
|
+
forceMethod = "git";
|
|
93
|
+
else if (options.tarball)
|
|
94
|
+
forceMethod = "tarball";
|
|
95
|
+
const pluginIndexes = validIndexes
|
|
96
|
+
.map(fi => fi.index)
|
|
97
|
+
.filter(idx => idx !== undefined);
|
|
98
|
+
let plan;
|
|
99
|
+
try {
|
|
100
|
+
plan = generateInstallPlan(pluginIndexes, pluginName, lockfile, {
|
|
101
|
+
gitAvailable,
|
|
102
|
+
forceMethod,
|
|
103
|
+
version: options.version,
|
|
104
|
+
fromRepo: options.from,
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
catch (err) {
|
|
108
|
+
if (err instanceof ResolverError) {
|
|
109
|
+
if (options.json) {
|
|
110
|
+
process.exitCode = 1;
|
|
111
|
+
writeJson(jsonError(err.message));
|
|
112
|
+
return;
|
|
113
|
+
}
|
|
114
|
+
logger.error(err.message);
|
|
115
|
+
process.exitCode = 1;
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
throw err;
|
|
119
|
+
}
|
|
120
|
+
if (plan.entries.length === 0) {
|
|
121
|
+
logger.info(`Plugin "${pluginName}" is already installed.`);
|
|
122
|
+
return;
|
|
123
|
+
}
|
|
124
|
+
// 7. Show plan and confirm
|
|
125
|
+
logger.info(`Install plan:`);
|
|
126
|
+
for (const entry of plan.entries) {
|
|
127
|
+
const depLabel = entry.isDependency ? " (dependency)" : "";
|
|
128
|
+
logger.info(` ${entry.name}@${entry.version} via ${entry.method}${depLabel}`);
|
|
129
|
+
}
|
|
130
|
+
// Warn about missing optional dependencies
|
|
131
|
+
if (plan.missingOptional?.length) {
|
|
132
|
+
logger.warn(`Recommended plugins not installed: ${plan.missingOptional.join(", ")}`);
|
|
133
|
+
logger.info(` Install with: venpm install ${plan.missingOptional.join(" ")}`);
|
|
134
|
+
}
|
|
135
|
+
const confirmed = await prompter.confirm(`Proceed with installation?`, true);
|
|
136
|
+
if (!confirmed) {
|
|
137
|
+
logger.info("Installation cancelled.");
|
|
138
|
+
return;
|
|
139
|
+
}
|
|
140
|
+
// 8. Fetch each entry and update lockfile
|
|
141
|
+
const installedEntries = [];
|
|
142
|
+
for (const entry of plan.entries) {
|
|
143
|
+
logger.info(`Installing ${entry.name}@${entry.version} via ${entry.method}...`);
|
|
144
|
+
try {
|
|
145
|
+
const result = await fetchPlugin(entry, userpluginDir, { fs, git, http });
|
|
146
|
+
lockfile = addInstalled(lockfile, entry.name, {
|
|
147
|
+
version: entry.version,
|
|
148
|
+
repo: entry.repo,
|
|
149
|
+
method: result.method,
|
|
150
|
+
pinned: options.version !== undefined,
|
|
151
|
+
git_ref: result.git_ref,
|
|
152
|
+
installed_at: new Date().toISOString(),
|
|
153
|
+
path: result.path,
|
|
154
|
+
});
|
|
155
|
+
installedEntries.push({ name: entry.name, version: entry.version, method: result.method });
|
|
156
|
+
}
|
|
157
|
+
catch (err) {
|
|
158
|
+
const msg = `Failed to install ${entry.name}: ${err instanceof Error ? err.message : err}`;
|
|
159
|
+
if (options.json) {
|
|
160
|
+
process.exitCode = 1;
|
|
161
|
+
writeJson(jsonError(msg));
|
|
162
|
+
return;
|
|
163
|
+
}
|
|
164
|
+
logger.error(msg);
|
|
165
|
+
process.exitCode = 1;
|
|
166
|
+
return;
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
// 9. Save lockfile
|
|
170
|
+
await saveLockfile(fs, lockfilePath, lockfile);
|
|
171
|
+
if (options.json) {
|
|
172
|
+
writeJson(jsonSuccess({
|
|
173
|
+
installed: installedEntries,
|
|
174
|
+
warnings: plan.missingOptional?.length
|
|
175
|
+
? [`Recommended plugins not installed: ${plan.missingOptional.join(", ")}`]
|
|
176
|
+
: [],
|
|
177
|
+
}));
|
|
178
|
+
return;
|
|
179
|
+
}
|
|
180
|
+
logger.success(`Successfully installed ${pluginName}`);
|
|
181
|
+
// 10. Handle rebuild
|
|
182
|
+
const effectiveRebuildMode = resolveRebuildMode(options, config.rebuild);
|
|
183
|
+
if (effectiveRebuildMode === "always" || options.rebuild) {
|
|
184
|
+
if (!options.noBuild) {
|
|
185
|
+
await runRebuild(ctx, vencordPath);
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
else if (effectiveRebuildMode === "ask" && !options.noBuild) {
|
|
189
|
+
const doRebuild = await prompter.confirm("Rebuild Vencord now?", true);
|
|
190
|
+
if (doRebuild) {
|
|
191
|
+
await runRebuild(ctx, vencordPath);
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
// "never" or noBuild: skip rebuild silently
|
|
195
|
+
}
|
|
196
|
+
// ─── Helpers ──────────────────────────────────────────────────────────────────
|
|
197
|
+
function resolveRebuildMode(options, configMode) {
|
|
198
|
+
if (options.noBuild)
|
|
199
|
+
return "never";
|
|
200
|
+
if (options.rebuild)
|
|
201
|
+
return "always";
|
|
202
|
+
return configMode;
|
|
203
|
+
}
|
|
204
|
+
async function runRebuild(ctx, vencordPath) {
|
|
205
|
+
const { fs, shell, logger } = ctx;
|
|
206
|
+
logger.info("Rebuilding Vencord...");
|
|
207
|
+
const discordBinary = await detectDiscordBinary(fs);
|
|
208
|
+
try {
|
|
209
|
+
const result = await buildAndDeploy(fs, shell, vencordPath, {
|
|
210
|
+
restart: discordBinary !== null,
|
|
211
|
+
discordBinary: discordBinary ?? undefined,
|
|
212
|
+
});
|
|
213
|
+
if (result.deployed) {
|
|
214
|
+
logger.success(`Deployed to ${result.deployPath}`);
|
|
215
|
+
}
|
|
216
|
+
else {
|
|
217
|
+
logger.info("Build complete (deploy path not found, skipped deploy)");
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
catch (err) {
|
|
221
|
+
logger.error(`Rebuild failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
// ─── CLI Registration ─────────────────────────────────────────────────────────
|
|
225
|
+
export function registerInstallCommand(program) {
|
|
226
|
+
program
|
|
227
|
+
.command("install <plugin>")
|
|
228
|
+
.description("Install a plugin and its dependencies")
|
|
229
|
+
.option("--version <semver>", "Install specific version")
|
|
230
|
+
.option("--from <repo>", "Install from a specific repo")
|
|
231
|
+
.option("--local <path>", "Symlink a local directory")
|
|
232
|
+
.option("--git", "Force git clone")
|
|
233
|
+
.option("--tarball", "Force tarball download")
|
|
234
|
+
.option("--no-build", "Skip Vencord rebuild")
|
|
235
|
+
.option("--rebuild", "Force Vencord rebuild")
|
|
236
|
+
.action(async (pluginName, opts) => {
|
|
237
|
+
const globalOpts = program.opts();
|
|
238
|
+
const ctx = createRealIOContext({ ...globalOpts });
|
|
239
|
+
const options = {
|
|
240
|
+
...globalOpts,
|
|
241
|
+
version: opts["version"],
|
|
242
|
+
from: opts["from"],
|
|
243
|
+
local: opts["local"],
|
|
244
|
+
git: opts["git"],
|
|
245
|
+
tarball: opts["tarball"],
|
|
246
|
+
noBuild: opts["build"] === false, // commander uses --no-build → build=false
|
|
247
|
+
rebuild: opts["rebuild"],
|
|
248
|
+
};
|
|
249
|
+
await executeInstall(ctx, pluginName, options);
|
|
250
|
+
});
|
|
251
|
+
}
|
|
252
|
+
//# sourceMappingURL=install.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install.js","sourceRoot":"","sources":["../../src/cli/install.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { Command } from "commander";
|
|
2
|
+
import type { IOContext, GlobalOptions } from "../core/types.js";
|
|
3
|
+
export declare function executeList(ctx: IOContext, options?: GlobalOptions): Promise<void>;
|
|
4
|
+
export declare function registerListCommand(program: Command): void;
|
|
5
|
+
//# sourceMappingURL=list.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../src/cli/list.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,KAAK,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAMjE,wBAAsB,WAAW,CAAC,GAAG,EAAE,SAAS,EAAE,OAAO,GAAE,aAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CA2B5F;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAS1D"}
|
package/dist/cli/list.js
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { loadLockfile } from "../core/lockfile.js";
|
|
2
|
+
import { getLockfilePath } from "../core/paths.js";
|
|
3
|
+
import { jsonSuccess, writeJson } from "../core/json.js";
|
|
4
|
+
import { createRealIOContext } from "./context.js";
|
|
5
|
+
export async function executeList(ctx, options = {}) {
|
|
6
|
+
const lockfile = await loadLockfile(ctx.fs, getLockfilePath());
|
|
7
|
+
const installed = Object.entries(lockfile.installed);
|
|
8
|
+
if (options.json) {
|
|
9
|
+
writeJson(jsonSuccess({
|
|
10
|
+
plugins: installed.map(([name, info]) => ({
|
|
11
|
+
name,
|
|
12
|
+
version: info.version,
|
|
13
|
+
repo: info.repo,
|
|
14
|
+
method: info.method,
|
|
15
|
+
pinned: info.pinned,
|
|
16
|
+
})),
|
|
17
|
+
}));
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
if (installed.length === 0) {
|
|
21
|
+
ctx.logger.info("No plugins installed");
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
ctx.logger.info(`Installed plugins (${installed.length}):\n`);
|
|
25
|
+
for (const [name, info] of installed) {
|
|
26
|
+
const pin = info.pinned ? " (pinned)" : "";
|
|
27
|
+
const method = info.method === "local" ? " [local]" : "";
|
|
28
|
+
ctx.logger.info(` ${name}@${info.version}${pin}${method} — from ${info.repo}`);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
export function registerListCommand(program) {
|
|
32
|
+
program
|
|
33
|
+
.command("list")
|
|
34
|
+
.description("List installed plugins")
|
|
35
|
+
.action(async () => {
|
|
36
|
+
const globalOpts = program.opts();
|
|
37
|
+
const ctx = createRealIOContext(globalOpts);
|
|
38
|
+
await executeList(ctx, globalOpts);
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=list.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list.js","sourceRoot":"","sources":["../../src/cli/list.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAEnD,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,GAAc,EAAE,UAAyB,EAAE;IACzE,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,GAAG,CAAC,EAAE,EAAE,eAAe,EAAE,CAAC,CAAC;IAC/D,MAAM,SAAS,GAAG,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;IAErD,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACf,SAAS,CAAC,WAAW,CAAC;YAClB,OAAO,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;gBACtC,IAAI;gBACJ,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,MAAM,EAAE,IAAI,CAAC,MAAM;gBACnB,MAAM,EAAE,IAAI,CAAC,MAAM;aACtB,CAAC,CAAC;SACN,CAAC,CAAC,CAAC;QACJ,OAAO;IACX,CAAC;IAED,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;QACxC,OAAO;IACX,CAAC;IACD,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,sBAAsB,SAAS,CAAC,MAAM,MAAM,CAAC,CAAC;IAC9D,KAAK,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,SAAS,EAAE,CAAC;QACnC,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3C,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;QACzD,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,IAAI,IAAI,IAAI,CAAC,OAAO,GAAG,GAAG,GAAG,MAAM,WAAW,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;IACpF,CAAC;AACL,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,OAAgB;IAChD,OAAO;SACF,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,wBAAwB,CAAC;SACrC,MAAM,CAAC,KAAK,IAAI,EAAE;QACf,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,EAAiB,CAAC;QACjD,MAAM,GAAG,GAAG,mBAAmB,CAAC,UAAU,CAAC,CAAC;QAC5C,MAAM,WAAW,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;AACX,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rebuild.d.ts","sourceRoot":"","sources":["../../src/cli/rebuild.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AASzC,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAyE7D"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { loadConfig } from "../core/config.js";
|
|
2
|
+
import { getConfigPath } from "../core/paths.js";
|
|
3
|
+
import { detectVencordPath, detectDiscordBinary } from "../core/detect.js";
|
|
4
|
+
import { buildAndDeploy } from "../core/builder.js";
|
|
5
|
+
import { jsonSuccess, jsonError, writeJson } from "../core/json.js";
|
|
6
|
+
import { createRealIOContext } from "./context.js";
|
|
7
|
+
export function registerRebuildCommand(program) {
|
|
8
|
+
program
|
|
9
|
+
.command("rebuild")
|
|
10
|
+
.description("Rebuild Vencord after plugin changes")
|
|
11
|
+
.action(async () => {
|
|
12
|
+
const globalOpts = program.opts();
|
|
13
|
+
const ctx = createRealIOContext(globalOpts);
|
|
14
|
+
const configPath = globalOpts.config ?? getConfigPath();
|
|
15
|
+
const config = await loadConfig(ctx.fs, configPath);
|
|
16
|
+
// Resolve Vencord path
|
|
17
|
+
const vencordPath = config.vencord.path ?? await detectVencordPath(ctx.fs);
|
|
18
|
+
if (!vencordPath) {
|
|
19
|
+
if (globalOpts.json) {
|
|
20
|
+
writeJson(jsonError("Vencord path not found. Set vencord.path in config or $VENPM_VENCORD_PATH."));
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
ctx.logger.error("Vencord path not found. Set vencord.path in config or $VENPM_VENCORD_PATH.");
|
|
24
|
+
process.exitCode = 1;
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
// Resolve Discord binary for optional restart
|
|
28
|
+
const discordBinary = config.discord.binary ?? await detectDiscordBinary(ctx.fs);
|
|
29
|
+
// Determine restart behaviour
|
|
30
|
+
let shouldRestart = false;
|
|
31
|
+
const restartMode = config.discord.restart;
|
|
32
|
+
if (restartMode === "always" && discordBinary) {
|
|
33
|
+
shouldRestart = true;
|
|
34
|
+
}
|
|
35
|
+
else if (restartMode === "ask" && discordBinary) {
|
|
36
|
+
shouldRestart = await ctx.prompter.confirm("Restart Discord after rebuild?", false);
|
|
37
|
+
}
|
|
38
|
+
ctx.logger.info(`Building Vencord at ${vencordPath}...`);
|
|
39
|
+
try {
|
|
40
|
+
const result = await buildAndDeploy(ctx.fs, ctx.shell, vencordPath, {
|
|
41
|
+
restart: shouldRestart,
|
|
42
|
+
discordBinary: discordBinary ?? undefined,
|
|
43
|
+
});
|
|
44
|
+
if (globalOpts.json) {
|
|
45
|
+
writeJson(jsonSuccess({
|
|
46
|
+
built: true,
|
|
47
|
+
deployed: result.deployed,
|
|
48
|
+
restarted: shouldRestart && !!discordBinary,
|
|
49
|
+
}));
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
ctx.logger.success("Build complete");
|
|
53
|
+
if (result.deployed && result.deployPath) {
|
|
54
|
+
ctx.logger.info(`Deployed to ${result.deployPath}`);
|
|
55
|
+
}
|
|
56
|
+
else if (!result.deployed) {
|
|
57
|
+
ctx.logger.warn("Deploy target not found — skipped copy step");
|
|
58
|
+
}
|
|
59
|
+
if (shouldRestart && discordBinary) {
|
|
60
|
+
ctx.logger.info("Discord restarted");
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
catch (err) {
|
|
64
|
+
if (globalOpts.json) {
|
|
65
|
+
writeJson(jsonError(`Build failed: ${err.message}`));
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
ctx.logger.error(`Build failed: ${err.message}`);
|
|
69
|
+
process.exitCode = 1;
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=rebuild.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rebuild.js","sourceRoot":"","sources":["../../src/cli/rebuild.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repo.d.ts","sourceRoot":"","sources":["../../src/cli/repo.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOzC,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAmG1D"}
|
package/dist/cli/repo.js
ADDED
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import { loadConfig, saveConfig } from "../core/config.js";
|
|
2
|
+
import { getConfigPath } from "../core/paths.js";
|
|
3
|
+
import { jsonSuccess, jsonError, writeJson } from "../core/json.js";
|
|
4
|
+
import { createRealIOContext } from "./context.js";
|
|
5
|
+
export function registerRepoCommand(program) {
|
|
6
|
+
const repo = program
|
|
7
|
+
.command("repo")
|
|
8
|
+
.description("Manage plugin repositories");
|
|
9
|
+
repo
|
|
10
|
+
.command("add <url>")
|
|
11
|
+
.description("Add a plugin repository")
|
|
12
|
+
.option("-n, --name <alias>", "Alias for the repository")
|
|
13
|
+
.action(async (url, options) => {
|
|
14
|
+
const parentOpts = program.opts();
|
|
15
|
+
const ctx = createRealIOContext(parentOpts);
|
|
16
|
+
const configPath = parentOpts.config ?? getConfigPath();
|
|
17
|
+
const config = await loadConfig(ctx.fs, configPath);
|
|
18
|
+
let name = options.name;
|
|
19
|
+
if (!name) {
|
|
20
|
+
try {
|
|
21
|
+
name = new URL(url).hostname.replace(/^www\./, "");
|
|
22
|
+
}
|
|
23
|
+
catch {
|
|
24
|
+
name = url;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
const existing = config.repos.find(r => r.name === name);
|
|
28
|
+
if (existing) {
|
|
29
|
+
if (parentOpts.json) {
|
|
30
|
+
writeJson(jsonError(`Repository with name "${name}" already exists (${existing.url})`));
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
ctx.logger.error(`Repository with name "${name}" already exists (${existing.url})`);
|
|
34
|
+
process.exitCode = 1;
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
config.repos.push({ name, url });
|
|
38
|
+
await saveConfig(ctx.fs, configPath, config);
|
|
39
|
+
if (parentOpts.json) {
|
|
40
|
+
writeJson(jsonSuccess({ name, url }));
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
ctx.logger.success(`Added repository "${name}" → ${url}`);
|
|
44
|
+
});
|
|
45
|
+
repo
|
|
46
|
+
.command("remove <name>")
|
|
47
|
+
.description("Remove a plugin repository by name")
|
|
48
|
+
.action(async (name) => {
|
|
49
|
+
const parentOpts = program.opts();
|
|
50
|
+
const ctx = createRealIOContext(parentOpts);
|
|
51
|
+
const configPath = parentOpts.config ?? getConfigPath();
|
|
52
|
+
const config = await loadConfig(ctx.fs, configPath);
|
|
53
|
+
const index = config.repos.findIndex(r => r.name === name);
|
|
54
|
+
if (index === -1) {
|
|
55
|
+
if (parentOpts.json) {
|
|
56
|
+
writeJson(jsonError(`Repository "${name}" not found`));
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
ctx.logger.error(`Repository "${name}" not found`);
|
|
60
|
+
process.exitCode = 1;
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
config.repos.splice(index, 1);
|
|
64
|
+
await saveConfig(ctx.fs, configPath, config);
|
|
65
|
+
if (parentOpts.json) {
|
|
66
|
+
writeJson(jsonSuccess({ removed: name }));
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
ctx.logger.success(`Removed repository "${name}"`);
|
|
70
|
+
});
|
|
71
|
+
repo
|
|
72
|
+
.command("list")
|
|
73
|
+
.description("List all configured repositories")
|
|
74
|
+
.action(async () => {
|
|
75
|
+
const parentOpts = program.opts();
|
|
76
|
+
const ctx = createRealIOContext(parentOpts);
|
|
77
|
+
const configPath = parentOpts.config ?? getConfigPath();
|
|
78
|
+
const config = await loadConfig(ctx.fs, configPath);
|
|
79
|
+
if (parentOpts.json) {
|
|
80
|
+
writeJson(jsonSuccess({ repos: config.repos.map(r => ({ name: r.name, url: r.url })) }));
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
if (config.repos.length === 0) {
|
|
84
|
+
ctx.logger.info("No repositories configured");
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
ctx.logger.info(`Configured repositories (${config.repos.length}):\n`);
|
|
88
|
+
for (const r of config.repos) {
|
|
89
|
+
ctx.logger.info(` ${r.name} ${r.url}`);
|
|
90
|
+
}
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
//# sourceMappingURL=repo.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repo.js","sourceRoot":"","sources":["../../src/cli/repo.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { Command } from "commander";
|
|
2
|
+
import type { IOContext, GlobalOptions } from "../core/types.js";
|
|
3
|
+
export declare function executeSearch(ctx: IOContext, query: string, options?: GlobalOptions): Promise<void>;
|
|
4
|
+
export declare function registerSearchCommand(program: Command): void;
|
|
5
|
+
//# sourceMappingURL=search.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../src/cli/search.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,KAAK,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAQjE,wBAAsB,aAAa,CAAC,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,GAAE,aAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CAqC7G;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAS5D"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { loadConfig } from "../core/config.js";
|
|
2
|
+
import { getConfigPath } from "../core/paths.js";
|
|
3
|
+
import { fetchAllIndexes, searchPlugins } from "../core/registry.js";
|
|
4
|
+
import { loadCache, saveCache } from "../core/cache.js";
|
|
5
|
+
import { jsonSuccess, writeJson } from "../core/json.js";
|
|
6
|
+
import { createRealIOContext } from "./context.js";
|
|
7
|
+
export async function executeSearch(ctx, query, options = {}) {
|
|
8
|
+
const config = await loadConfig(ctx.fs, options.config ?? getConfigPath());
|
|
9
|
+
const cache = await loadCache(ctx.fs);
|
|
10
|
+
const { results: indexes, updatedCache } = await fetchAllIndexes(ctx.http, config.repos, { cache });
|
|
11
|
+
await saveCache(ctx.fs, updatedCache);
|
|
12
|
+
for (const fi of indexes) {
|
|
13
|
+
if (fi.error) {
|
|
14
|
+
ctx.logger.warn(`Failed to fetch index from "${fi.repoName}": ${fi.error}`);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
const results = searchPlugins(indexes, query);
|
|
18
|
+
if (options.json) {
|
|
19
|
+
writeJson(jsonSuccess({
|
|
20
|
+
results: results.map(r => ({
|
|
21
|
+
name: r.name,
|
|
22
|
+
version: r.entry.version,
|
|
23
|
+
description: r.entry.description ?? null,
|
|
24
|
+
repo: r.repoName,
|
|
25
|
+
})),
|
|
26
|
+
}));
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
if (results.length === 0) {
|
|
30
|
+
ctx.logger.info(`No plugins found matching "${query}"`);
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
ctx.logger.info(`Search results for "${query}" (${results.length} found):\n`);
|
|
34
|
+
for (const match of results) {
|
|
35
|
+
const desc = match.entry.description ? ` — ${match.entry.description}` : "";
|
|
36
|
+
ctx.logger.info(` ${match.name}@${match.entry.version}${desc}`);
|
|
37
|
+
ctx.logger.info(` repo: ${match.repoName}`);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
export function registerSearchCommand(program) {
|
|
41
|
+
program
|
|
42
|
+
.command("search <query>")
|
|
43
|
+
.description("Search for plugins in configured repositories")
|
|
44
|
+
.action(async (query) => {
|
|
45
|
+
const globalOpts = program.opts();
|
|
46
|
+
const ctx = createRealIOContext(globalOpts);
|
|
47
|
+
await executeSearch(ctx, query, globalOpts);
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=search.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/cli/search.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { Command } from "commander";
|
|
2
|
+
import type { IOContext, GlobalOptions } from "../core/types.js";
|
|
3
|
+
export declare function executeUninstall(ctx: IOContext, pluginName: string, options: GlobalOptions): Promise<void>;
|
|
4
|
+
export declare function registerUninstallCommand(program: Command): void;
|
|
5
|
+
//# sourceMappingURL=uninstall.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"uninstall.d.ts","sourceRoot":"","sources":["../../src/cli/uninstall.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,KAAK,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AASjE,wBAAsB,gBAAgB,CAAC,GAAG,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAkDhH;AAED,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAe/D"}
|