@kamaras/venpm 0.0.1 → 0.1.1
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 +204 -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 +101 -0
- package/dist/cli/config-cmd.js.map +1 -0
- package/dist/cli/context.d.ts +3 -0
- package/dist/cli/context.d.ts.map +1 -0
- package/dist/cli/context.js +153 -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 +230 -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 +68 -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 +84 -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 +68 -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 +156 -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 +32 -0
- package/dist/core/builder.d.ts.map +1 -0
- package/dist/core/builder.js +76 -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 +6 -0
- package/dist/core/prompt.d.ts.map +1 -0
- package/dist/core/prompt.js +78 -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 +208 -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 +40 -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,CAgF7D"}
|
|
@@ -0,0 +1,84 @@
|
|
|
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
|
+
.option("--no-restart", "Skip Discord restart without prompting")
|
|
12
|
+
.option("--restart", "Restart Discord without prompting")
|
|
13
|
+
.action(async (cmdOptions) => {
|
|
14
|
+
const globalOpts = program.opts();
|
|
15
|
+
const ctx = createRealIOContext(globalOpts);
|
|
16
|
+
const configPath = globalOpts.config ?? getConfigPath();
|
|
17
|
+
const config = await loadConfig(ctx.fs, configPath);
|
|
18
|
+
// Resolve Vencord path
|
|
19
|
+
const vencordPath = config.vencord.path ?? await detectVencordPath(ctx.fs);
|
|
20
|
+
if (!vencordPath) {
|
|
21
|
+
if (globalOpts.json) {
|
|
22
|
+
writeJson(jsonError("Vencord path not found. Set vencord.path in config or $VENPM_VENCORD_PATH."));
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
ctx.logger.error("Vencord path not found. Set vencord.path in config or $VENPM_VENCORD_PATH.");
|
|
26
|
+
process.exitCode = 1;
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
// Resolve Discord binary for optional restart
|
|
30
|
+
const discordBinary = config.discord.binary ?? await detectDiscordBinary(ctx.fs);
|
|
31
|
+
// Determine restart behaviour — explicit flags override config
|
|
32
|
+
let shouldRestart = false;
|
|
33
|
+
if (cmdOptions.noRestart) {
|
|
34
|
+
shouldRestart = false;
|
|
35
|
+
}
|
|
36
|
+
else if (cmdOptions.restart) {
|
|
37
|
+
shouldRestart = !!discordBinary;
|
|
38
|
+
}
|
|
39
|
+
else {
|
|
40
|
+
const restartMode = config.discord.restart;
|
|
41
|
+
if (restartMode === "always" && discordBinary) {
|
|
42
|
+
shouldRestart = true;
|
|
43
|
+
}
|
|
44
|
+
else if (restartMode === "ask" && discordBinary) {
|
|
45
|
+
shouldRestart = await ctx.prompter.confirm("Restart Discord after rebuild?", false);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
ctx.logger.info(`Building Vencord at ${vencordPath}...`);
|
|
49
|
+
try {
|
|
50
|
+
const result = await buildAndDeploy(ctx.fs, ctx.shell, vencordPath, {
|
|
51
|
+
restart: shouldRestart,
|
|
52
|
+
discordBinary: discordBinary ?? undefined,
|
|
53
|
+
});
|
|
54
|
+
if (globalOpts.json) {
|
|
55
|
+
writeJson(jsonSuccess({
|
|
56
|
+
built: true,
|
|
57
|
+
deployed: result.deployed,
|
|
58
|
+
restarted: result.restarted,
|
|
59
|
+
}));
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
ctx.logger.success("Build complete");
|
|
63
|
+
if (result.deployed && result.deployPath) {
|
|
64
|
+
ctx.logger.info(`Deployed to ${result.deployPath}`);
|
|
65
|
+
}
|
|
66
|
+
else if (!result.deployed) {
|
|
67
|
+
ctx.logger.warn("Deploy target not found — skipped copy step");
|
|
68
|
+
}
|
|
69
|
+
if (result.restarted) {
|
|
70
|
+
ctx.logger.info("Discord restarted");
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
catch (err) {
|
|
74
|
+
if (globalOpts.json) {
|
|
75
|
+
writeJson(jsonError(`Build failed: ${err.message}`));
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
ctx.logger.error(`Build failed: ${err.message}`);
|
|
79
|
+
process.exitCode = 1;
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
//# 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":"AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACrE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAEnD,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,GAAc,EAAE,KAAa,EAAE,UAAyB,EAAE;IAC1F,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,GAAG,CAAC,EAAE,EAAE,OAAO,CAAC,MAAM,IAAI,aAAa,EAAE,CAAC,CAAC;IAC3E,MAAM,KAAK,GAAG,MAAM,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACtC,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,GAAG,MAAM,eAAe,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;IACpG,MAAM,SAAS,CAAC,GAAG,CAAC,EAAE,EAAE,YAAY,CAAC,CAAC;IAEtC,KAAK,MAAM,EAAE,IAAI,OAAO,EAAE,CAAC;QACvB,IAAI,EAAE,CAAC,KAAK,EAAE,CAAC;YACX,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,+BAA+B,EAAE,CAAC,QAAQ,MAAM,EAAE,CAAC,KAAK,EAAE,CAAC,CAAC;QAChF,CAAC;IACL,CAAC;IAED,MAAM,OAAO,GAAG,aAAa,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IAE9C,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACf,SAAS,CAAC,WAAW,CAAC;YAClB,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;gBACvB,IAAI,EAAE,CAAC,CAAC,IAAI;gBACZ,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO;gBACxB,WAAW,EAAE,CAAC,CAAC,KAAK,CAAC,WAAW,IAAI,IAAI;gBACxC,IAAI,EAAE,CAAC,CAAC,QAAQ;aACnB,CAAC,CAAC;SACN,CAAC,CAAC,CAAC;QACJ,OAAO;IACX,CAAC;IAED,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,8BAA8B,KAAK,GAAG,CAAC,CAAC;QACxD,OAAO;IACX,CAAC;IAED,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,uBAAuB,KAAK,MAAM,OAAO,CAAC,MAAM,YAAY,CAAC,CAAC;IAC9E,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC1B,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,KAAK,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC5E,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,KAAK,CAAC,OAAO,GAAG,IAAI,EAAE,CAAC,CAAC;QACjE,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,aAAa,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;IACnD,CAAC;AACL,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,OAAgB;IAClD,OAAO;SACF,OAAO,CAAC,gBAAgB,CAAC;SACzB,WAAW,CAAC,+CAA+C,CAAC;SAC5D,MAAM,CAAC,KAAK,EAAE,KAAa,EAAE,EAAE;QAC5B,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,EAAiB,CAAC;QACjD,MAAM,GAAG,GAAG,mBAAmB,CAAC,UAAU,CAAC,CAAC;QAC5C,MAAM,aAAa,CAAC,GAAG,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;AACX,CAAC"}
|
|
@@ -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,CAc/D"}
|