@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,100 @@
|
|
|
1
|
+
import { homedir } from "node:os";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
export const VENCORD_SEARCH_PATHS = [
|
|
4
|
+
"~/src/extern/Vencord",
|
|
5
|
+
"~/Vencord",
|
|
6
|
+
"~/.local/share/Vencord",
|
|
7
|
+
"~/Documents/Vencord",
|
|
8
|
+
"./Vencord",
|
|
9
|
+
"../Vencord",
|
|
10
|
+
];
|
|
11
|
+
/** Replace a leading `~` with the user's home directory. */
|
|
12
|
+
export function resolveTilde(p) {
|
|
13
|
+
if (p.startsWith("~/") || p === "~") {
|
|
14
|
+
return join(homedir(), p.slice(1));
|
|
15
|
+
}
|
|
16
|
+
return p;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Detect the Vencord source checkout path.
|
|
20
|
+
*
|
|
21
|
+
* Checks `$VENPM_VENCORD_PATH` first, then scans VENCORD_SEARCH_PATHS.
|
|
22
|
+
* A path is valid when `<path>/package.json` exists.
|
|
23
|
+
*
|
|
24
|
+
* @returns Absolute path string or null when not found.
|
|
25
|
+
*/
|
|
26
|
+
export async function detectVencordPath(fs) {
|
|
27
|
+
const envPath = process.env.VENPM_VENCORD_PATH;
|
|
28
|
+
if (envPath) {
|
|
29
|
+
const resolved = resolveTilde(envPath);
|
|
30
|
+
if (await fs.exists(join(resolved, "package.json"))) {
|
|
31
|
+
return resolved;
|
|
32
|
+
}
|
|
33
|
+
// Env var was set but path is invalid — do not fall through to scan.
|
|
34
|
+
return null;
|
|
35
|
+
}
|
|
36
|
+
for (const rawPath of VENCORD_SEARCH_PATHS) {
|
|
37
|
+
const resolved = resolveTilde(rawPath);
|
|
38
|
+
if (await fs.exists(join(resolved, "package.json"))) {
|
|
39
|
+
return resolved;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
return null;
|
|
43
|
+
}
|
|
44
|
+
/** Platform-specific candidate binary paths for Discord. */
|
|
45
|
+
function discordBinaryCandidates() {
|
|
46
|
+
const platform = process.platform;
|
|
47
|
+
if (platform === "linux") {
|
|
48
|
+
return [
|
|
49
|
+
"/usr/bin/discord",
|
|
50
|
+
"/usr/bin/discord-canary",
|
|
51
|
+
"/usr/bin/vesktop",
|
|
52
|
+
];
|
|
53
|
+
}
|
|
54
|
+
if (platform === "darwin") {
|
|
55
|
+
return [
|
|
56
|
+
"/Applications/Discord.app/Contents/MacOS/Discord",
|
|
57
|
+
"/Applications/Discord Canary.app/Contents/MacOS/Discord Canary",
|
|
58
|
+
];
|
|
59
|
+
}
|
|
60
|
+
// Windows and others: skip glob patterns — return empty.
|
|
61
|
+
return [];
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Detect the Discord binary path.
|
|
65
|
+
*
|
|
66
|
+
* Returns the first candidate that exists on disk, or null.
|
|
67
|
+
*/
|
|
68
|
+
export async function detectDiscordBinary(fs) {
|
|
69
|
+
for (const candidate of discordBinaryCandidates()) {
|
|
70
|
+
if (await fs.exists(candidate)) {
|
|
71
|
+
return candidate;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
return null;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Check whether `git` is available on PATH.
|
|
78
|
+
*/
|
|
79
|
+
export async function checkGitAvailable(shell) {
|
|
80
|
+
try {
|
|
81
|
+
const result = await shell.exec("git", ["--version"]);
|
|
82
|
+
return result.exitCode === 0;
|
|
83
|
+
}
|
|
84
|
+
catch {
|
|
85
|
+
return false;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Check whether `pnpm` is available on PATH.
|
|
90
|
+
*/
|
|
91
|
+
export async function checkPnpmAvailable(shell) {
|
|
92
|
+
try {
|
|
93
|
+
const result = await shell.exec("pnpm", ["--version"]);
|
|
94
|
+
return result.exitCode === 0;
|
|
95
|
+
}
|
|
96
|
+
catch {
|
|
97
|
+
return false;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
//# sourceMappingURL=detect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"detect.js","sourceRoot":"","sources":["../../src/core/detect.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { FileSystem, GitClient, HttpClient, InstallPlanEntry } from "./types.js";
|
|
2
|
+
import type { FetchMethod } from "./types.js";
|
|
3
|
+
export interface FetchResult {
|
|
4
|
+
method: FetchMethod;
|
|
5
|
+
/** Git commit hash (only set when method === "git") */
|
|
6
|
+
git_ref?: string;
|
|
7
|
+
/** Subdirectory path within the plugin dir (carried through from source) */
|
|
8
|
+
path?: string;
|
|
9
|
+
}
|
|
10
|
+
export declare function fetchViaGit(git: GitClient, fs: FileSystem, gitUrl: string, dest: string, options?: {
|
|
11
|
+
path?: string;
|
|
12
|
+
tag?: string;
|
|
13
|
+
}): Promise<FetchResult>;
|
|
14
|
+
export declare function fetchViaTarball(http: HttpClient, fs: FileSystem, tarballUrl: string, dest: string): Promise<FetchResult>;
|
|
15
|
+
export declare function fetchViaLocal(fs: FileSystem, localPath: string, dest: string): Promise<FetchResult>;
|
|
16
|
+
export declare function fetchPlugin(entry: InstallPlanEntry, userpluginDir: string, ctx: {
|
|
17
|
+
fs: FileSystem;
|
|
18
|
+
git: GitClient;
|
|
19
|
+
http: HttpClient;
|
|
20
|
+
}): Promise<FetchResult>;
|
|
21
|
+
//# sourceMappingURL=fetcher.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fetcher.d.ts","sourceRoot":"","sources":["../../src/core/fetcher.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AACtF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAI9C,MAAM,WAAW,WAAW;IACxB,MAAM,EAAE,WAAW,CAAC;IACpB,uDAAuD;IACvD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,4EAA4E;IAC5E,IAAI,CAAC,EAAE,MAAM,CAAC;CACjB;AAID,wBAAsB,WAAW,CAC7B,GAAG,EAAE,SAAS,EACd,EAAE,EAAE,UAAU,EACd,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAO,GAC9C,OAAO,CAAC,WAAW,CAAC,CAoCtB;AAID,wBAAsB,eAAe,CACjC,IAAI,EAAE,UAAU,EAChB,EAAE,EAAE,UAAU,EACd,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,MAAM,GACb,OAAO,CAAC,WAAW,CAAC,CAkBtB;AAID,wBAAsB,aAAa,CAC/B,EAAE,EAAE,UAAU,EACd,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,GACb,OAAO,CAAC,WAAW,CAAC,CAUtB;AAID,wBAAsB,WAAW,CAC7B,KAAK,EAAE,gBAAgB,EACvB,aAAa,EAAE,MAAM,EACrB,GAAG,EAAE;IAAE,EAAE,EAAE,UAAU,CAAC;IAAC,GAAG,EAAE,SAAS,CAAC;IAAC,IAAI,EAAE,UAAU,CAAA;CAAE,GAC1D,OAAO,CAAC,WAAW,CAAC,CAqCtB"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import { randomUUID } from "node:crypto";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { writeFile as writeFileRaw, unlink } from "node:fs/promises";
|
|
4
|
+
import { tmpdir } from "node:os";
|
|
5
|
+
import { extract } from "tar";
|
|
6
|
+
// ─── fetchViaGit ──────────────────────────────────────────────────────────────
|
|
7
|
+
export async function fetchViaGit(git, fs, gitUrl, dest, options = {}) {
|
|
8
|
+
const { path: subPath, tag } = options;
|
|
9
|
+
if (subPath) {
|
|
10
|
+
// Sparse checkout: clone to a temp dir, copy the subdir, clean up.
|
|
11
|
+
const tempDir = join(dest, "..", `venpm-tmp-${randomUUID()}`);
|
|
12
|
+
await git.clone(gitUrl, tempDir, { sparse: [subPath], branch: tag });
|
|
13
|
+
if (tag) {
|
|
14
|
+
await git.checkout(tempDir, tag);
|
|
15
|
+
}
|
|
16
|
+
const git_ref = await git.revParse(tempDir, "HEAD");
|
|
17
|
+
// Copy the subdirectory out to the final destination.
|
|
18
|
+
const subSrc = join(tempDir, subPath);
|
|
19
|
+
await fs.mkdir(dest, { recursive: true });
|
|
20
|
+
await fs.copyDir(subSrc, dest);
|
|
21
|
+
// Clean up the temp clone.
|
|
22
|
+
await fs.rm(tempDir, { recursive: true, force: true });
|
|
23
|
+
return { method: "git", git_ref, path: subPath };
|
|
24
|
+
}
|
|
25
|
+
// Simple full clone.
|
|
26
|
+
await git.clone(gitUrl, dest, { branch: tag });
|
|
27
|
+
if (tag) {
|
|
28
|
+
await git.checkout(dest, tag);
|
|
29
|
+
}
|
|
30
|
+
const git_ref = await git.revParse(dest, "HEAD");
|
|
31
|
+
return { method: "git", git_ref };
|
|
32
|
+
}
|
|
33
|
+
// ─── fetchViaTarball ──────────────────────────────────────────────────────────
|
|
34
|
+
export async function fetchViaTarball(http, fs, tarballUrl, dest) {
|
|
35
|
+
const response = await http.fetch(tarballUrl);
|
|
36
|
+
if (!response.ok) {
|
|
37
|
+
throw new Error(`Failed to download tarball from ${tarballUrl}: HTTP ${response.status}`);
|
|
38
|
+
}
|
|
39
|
+
// Download the buffer, write to a temp file, extract, then clean up.
|
|
40
|
+
const buffer = Buffer.from(await response.arrayBuffer());
|
|
41
|
+
const tmpPath = join(tmpdir(), `venpm-tarball-${randomUUID()}.tar.gz`);
|
|
42
|
+
await writeFileRaw(tmpPath, buffer);
|
|
43
|
+
await fs.mkdir(dest, { recursive: true });
|
|
44
|
+
await extract({ file: tmpPath, cwd: dest, strip: 1 });
|
|
45
|
+
await unlink(tmpPath);
|
|
46
|
+
return { method: "tarball" };
|
|
47
|
+
}
|
|
48
|
+
// ─── fetchViaLocal ────────────────────────────────────────────────────────────
|
|
49
|
+
export async function fetchViaLocal(fs, localPath, dest) {
|
|
50
|
+
const found = await fs.exists(localPath);
|
|
51
|
+
if (!found) {
|
|
52
|
+
throw new Error(`Local path not found: ${localPath}`);
|
|
53
|
+
}
|
|
54
|
+
await fs.symlink(localPath, dest);
|
|
55
|
+
return { method: "local" };
|
|
56
|
+
}
|
|
57
|
+
// ─── fetchPlugin ─────────────────────────────────────────────────────────────
|
|
58
|
+
export async function fetchPlugin(entry, userpluginDir, ctx) {
|
|
59
|
+
const { source, name } = entry;
|
|
60
|
+
const dest = join(userpluginDir, name);
|
|
61
|
+
switch (entry.method) {
|
|
62
|
+
case "git": {
|
|
63
|
+
if (!source.git) {
|
|
64
|
+
throw new Error(`Plugin "${name}" has no git URL in source`);
|
|
65
|
+
}
|
|
66
|
+
// Only pass a tag if the version entry has an explicit git_tag
|
|
67
|
+
const versionEntry = entry.versionEntry;
|
|
68
|
+
const tag = versionEntry?.git_tag;
|
|
69
|
+
return fetchViaGit(ctx.git, ctx.fs, source.git, dest, {
|
|
70
|
+
path: source.path,
|
|
71
|
+
tag,
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
case "tarball": {
|
|
75
|
+
const tarballUrl = source.tarball;
|
|
76
|
+
if (!tarballUrl) {
|
|
77
|
+
throw new Error(`Plugin "${name}" has no tarball URL in source`);
|
|
78
|
+
}
|
|
79
|
+
return fetchViaTarball(ctx.http, ctx.fs, tarballUrl, dest);
|
|
80
|
+
}
|
|
81
|
+
case "local": {
|
|
82
|
+
if (!source.local) {
|
|
83
|
+
throw new Error(`Plugin "${name}" has no local path in source`);
|
|
84
|
+
}
|
|
85
|
+
return fetchViaLocal(ctx.fs, source.local, dest);
|
|
86
|
+
}
|
|
87
|
+
default: {
|
|
88
|
+
throw new Error(`Unknown fetch method: ${entry.method}`);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=fetcher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fetcher.js","sourceRoot":"","sources":["../../src/core/fetcher.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export interface JsonEnvelope<T = unknown> {
|
|
2
|
+
success: boolean;
|
|
3
|
+
error?: string;
|
|
4
|
+
data?: T;
|
|
5
|
+
}
|
|
6
|
+
export declare function jsonSuccess<T>(data: T): JsonEnvelope<T>;
|
|
7
|
+
export declare function jsonError(message: string): JsonEnvelope<never>;
|
|
8
|
+
export declare function writeJson(envelope: JsonEnvelope, write?: (s: string) => void): void;
|
|
9
|
+
//# sourceMappingURL=json.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json.d.ts","sourceRoot":"","sources":["../../src/core/json.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,YAAY,CAAC,CAAC,GAAG,OAAO;IACrC,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,CAAC,CAAC;CACZ;AAED,wBAAgB,WAAW,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC,CAEvD;AAED,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,YAAY,CAAC,KAAK,CAAC,CAE9D;AAED,wBAAgB,SAAS,CAAC,QAAQ,EAAE,YAAY,EAAE,KAAK,GAAE,CAAC,CAAC,EAAE,MAAM,KAAK,IAAmC,GAAG,IAAI,CAEjH"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export function jsonSuccess(data) {
|
|
2
|
+
return { success: true, data };
|
|
3
|
+
}
|
|
4
|
+
export function jsonError(message) {
|
|
5
|
+
return { success: false, error: message };
|
|
6
|
+
}
|
|
7
|
+
export function writeJson(envelope, write = s => process.stdout.write(s)) {
|
|
8
|
+
write(JSON.stringify(envelope) + "\n");
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=json.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json.js","sourceRoot":"","sources":["../../src/core/json.ts"],"names":[],"mappings":"AAMA,MAAM,UAAU,WAAW,CAAI,IAAO;IAClC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;AACnC,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,OAAe;IACrC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;AAC9C,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,QAAsB,EAAE,QAA6B,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IACvG,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC,CAAC;AAC3C,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { FileSystem, InstalledPlugin, LockfileData } from "./types.js";
|
|
2
|
+
export declare const EMPTY_LOCKFILE: LockfileData;
|
|
3
|
+
export declare function loadLockfile(fs: FileSystem, path: string): Promise<LockfileData>;
|
|
4
|
+
export declare function saveLockfile(fs: FileSystem, path: string, data: LockfileData): Promise<void>;
|
|
5
|
+
export declare function isInstalled(data: LockfileData, name: string): boolean;
|
|
6
|
+
export declare function getInstalled(data: LockfileData, name: string): InstalledPlugin | undefined;
|
|
7
|
+
export declare function addInstalled(data: LockfileData, name: string, entry: InstalledPlugin): LockfileData;
|
|
8
|
+
export declare function removeInstalled(data: LockfileData, name: string): LockfileData;
|
|
9
|
+
//# sourceMappingURL=lockfile.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lockfile.d.ts","sourceRoot":"","sources":["../../src/core/lockfile.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE5E,eAAO,MAAM,cAAc,EAAE,YAAgC,CAAC;AAE9D,wBAAsB,YAAY,CAAC,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAKtF;AAED,wBAAsB,YAAY,CAAC,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAGlG;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAErE;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS,CAE1F;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,eAAe,GAAG,YAAY,CAKnG;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,GAAG,YAAY,CAG9E"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { dirname } from "node:path";
|
|
2
|
+
export const EMPTY_LOCKFILE = { installed: {} };
|
|
3
|
+
export async function loadLockfile(fs, path) {
|
|
4
|
+
const exists = await fs.exists(path);
|
|
5
|
+
if (!exists)
|
|
6
|
+
return { ...EMPTY_LOCKFILE, installed: {} };
|
|
7
|
+
const raw = await fs.readFile(path, "utf-8");
|
|
8
|
+
return JSON.parse(raw);
|
|
9
|
+
}
|
|
10
|
+
export async function saveLockfile(fs, path, data) {
|
|
11
|
+
await fs.mkdir(dirname(path), { recursive: true });
|
|
12
|
+
await fs.writeFile(path, JSON.stringify(data, null, 2) + "\n");
|
|
13
|
+
}
|
|
14
|
+
export function isInstalled(data, name) {
|
|
15
|
+
return Object.prototype.hasOwnProperty.call(data.installed, name);
|
|
16
|
+
}
|
|
17
|
+
export function getInstalled(data, name) {
|
|
18
|
+
return data.installed[name];
|
|
19
|
+
}
|
|
20
|
+
export function addInstalled(data, name, entry) {
|
|
21
|
+
return {
|
|
22
|
+
...data,
|
|
23
|
+
installed: { ...data.installed, [name]: entry },
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
export function removeInstalled(data, name) {
|
|
27
|
+
const { [name]: _removed, ...rest } = data.installed;
|
|
28
|
+
return { ...data, installed: rest };
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=lockfile.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lockfile.js","sourceRoot":"","sources":["../../src/core/lockfile.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGpC,MAAM,CAAC,MAAM,cAAc,GAAiB,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC;AAE9D,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,EAAc,EAAE,IAAY;IAC3D,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACrC,IAAI,CAAC,MAAM;QAAE,OAAO,EAAE,GAAG,cAAc,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC;IACzD,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC7C,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAiB,CAAC;AAC3C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,EAAc,EAAE,IAAY,EAAE,IAAkB;IAC/E,MAAM,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACnD,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;AACnE,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,IAAkB,EAAE,IAAY;IACxD,OAAO,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;AACtE,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,IAAkB,EAAE,IAAY;IACzD,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;AAChC,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,IAAkB,EAAE,IAAY,EAAE,KAAsB;IACjF,OAAO;QACH,GAAG,IAAI;QACP,SAAS,EAAE,EAAE,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE;KAClD,CAAC;AACN,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,IAAkB,EAAE,IAAY;IAC5D,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,GAAG,IAAI,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC;IACrD,OAAO,EAAE,GAAG,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;AACxC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"log.d.ts","sourceRoot":"","sources":["../../src/core/log.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAEzC,KAAK,OAAO,GAAG,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;AAEzC,wBAAgB,YAAY,CACxB,OAAO,EAAE;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,OAAO,CAAA;CAAE,EAC7C,KAAK,GAAE,OAAqB,GAC7B,MAAM,CAwBR"}
|
package/dist/core/log.js
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
export function createLogger(options, write = console.log) {
|
|
2
|
+
const { verbose, quiet } = options;
|
|
3
|
+
return {
|
|
4
|
+
info(message) {
|
|
5
|
+
if (!quiet)
|
|
6
|
+
write(message);
|
|
7
|
+
},
|
|
8
|
+
warn(message) {
|
|
9
|
+
write(`⚠ ${message}`);
|
|
10
|
+
},
|
|
11
|
+
error(message) {
|
|
12
|
+
write(`✖ ${message}`);
|
|
13
|
+
},
|
|
14
|
+
verbose(message) {
|
|
15
|
+
if (verbose)
|
|
16
|
+
write(message);
|
|
17
|
+
},
|
|
18
|
+
success(message) {
|
|
19
|
+
if (!quiet)
|
|
20
|
+
write(`✔ ${message}`);
|
|
21
|
+
},
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=log.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"log.js","sourceRoot":"","sources":["../../src/core/log.ts"],"names":[],"mappings":"AAIA,MAAM,UAAU,YAAY,CACxB,OAA6C,EAC7C,QAAiB,OAAO,CAAC,GAAG;IAE5B,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC;IAEnC,OAAO;QACH,IAAI,CAAC,OAAe;YAChB,IAAI,CAAC,KAAK;gBAAE,KAAK,CAAC,OAAO,CAAC,CAAC;QAC/B,CAAC;QAED,IAAI,CAAC,OAAe;YAChB,KAAK,CAAC,KAAK,OAAO,EAAE,CAAC,CAAC;QAC1B,CAAC;QAED,KAAK,CAAC,OAAe;YACjB,KAAK,CAAC,KAAK,OAAO,EAAE,CAAC,CAAC;QAC1B,CAAC;QAED,OAAO,CAAC,OAAe;YACnB,IAAI,OAAO;gBAAE,KAAK,CAAC,OAAO,CAAC,CAAC;QAChC,CAAC;QAED,OAAO,CAAC,OAAe;YACnB,IAAI,CAAC,KAAK;gBAAE,KAAK,CAAC,KAAK,OAAO,EAAE,CAAC,CAAC;QACtC,CAAC;KACJ,CAAC;AACN,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../../src/core/paths.ts"],"names":[],"mappings":"AASA,wBAAgB,YAAY,IAAI,MAAM,CAiBrC;AAMD,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAED,wBAAgB,eAAe,IAAI,MAAM,CAExC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { win32, posix } from "node:path";
|
|
2
|
+
import { homedir } from "node:os";
|
|
3
|
+
const APP_NAME = "venpm";
|
|
4
|
+
function home() {
|
|
5
|
+
return process.env.HOME ?? homedir();
|
|
6
|
+
}
|
|
7
|
+
export function getConfigDir() {
|
|
8
|
+
const platform = process.platform;
|
|
9
|
+
if (platform === "win32") {
|
|
10
|
+
const appData = process.env.APPDATA;
|
|
11
|
+
if (appData)
|
|
12
|
+
return win32.join(appData, APP_NAME);
|
|
13
|
+
return win32.join(home(), "AppData", "Roaming", APP_NAME);
|
|
14
|
+
}
|
|
15
|
+
if (platform === "darwin") {
|
|
16
|
+
return posix.join(home(), "Library", "Application Support", APP_NAME);
|
|
17
|
+
}
|
|
18
|
+
// Linux / other: XDG
|
|
19
|
+
const xdg = process.env.XDG_CONFIG_HOME;
|
|
20
|
+
if (xdg)
|
|
21
|
+
return posix.join(xdg, APP_NAME);
|
|
22
|
+
return posix.join(home(), ".config", APP_NAME);
|
|
23
|
+
}
|
|
24
|
+
function platformJoin(...parts) {
|
|
25
|
+
return process.platform === "win32" ? win32.join(...parts) : posix.join(...parts);
|
|
26
|
+
}
|
|
27
|
+
export function getConfigPath() {
|
|
28
|
+
return platformJoin(getConfigDir(), "config.json");
|
|
29
|
+
}
|
|
30
|
+
export function getLockfilePath() {
|
|
31
|
+
return platformJoin(getConfigDir(), "venpm-lock.json");
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=paths.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/core/paths.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAElC,MAAM,QAAQ,GAAG,OAAO,CAAC;AAEzB,SAAS,IAAI;IACT,OAAO,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,OAAO,EAAE,CAAC;AACzC,CAAC;AAED,MAAM,UAAU,YAAY;IACxB,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;IAElC,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;QACvB,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC;QACpC,IAAI,OAAO;YAAE,OAAO,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QAClD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;IAC9D,CAAC;IAED,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;QACxB,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,qBAAqB,EAAE,QAAQ,CAAC,CAAC;IAC1E,CAAC;IAED,qBAAqB;IACrB,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC;IACxC,IAAI,GAAG;QAAE,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IAC1C,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;AACnD,CAAC;AAED,SAAS,YAAY,CAAC,GAAG,KAAe;IACpC,OAAO,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,CAAC;AACtF,CAAC;AAED,MAAM,UAAU,aAAa;IACzB,OAAO,YAAY,CAAC,YAAY,EAAE,EAAE,aAAa,CAAC,CAAC;AACvD,CAAC;AAED,MAAM,UAAU,eAAe;IAC3B,OAAO,YAAY,CAAC,YAAY,EAAE,EAAE,iBAAiB,CAAC,CAAC;AAC3D,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompt.d.ts","sourceRoot":"","sources":["../../src/core/prompt.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE3C,wBAAgB,cAAc,CAAC,OAAO,EAAE;IAAE,GAAG,EAAE,OAAO,CAAA;CAAE,GAAG,QAAQ,CA+DlE"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
export function createPrompter(options) {
|
|
2
|
+
if (options.yes) {
|
|
3
|
+
return {
|
|
4
|
+
async confirm(_message, defaultValue = true) {
|
|
5
|
+
return defaultValue;
|
|
6
|
+
},
|
|
7
|
+
async input(_message, defaultValue) {
|
|
8
|
+
return defaultValue ?? "";
|
|
9
|
+
},
|
|
10
|
+
async select(_message, choices) {
|
|
11
|
+
return choices[0].value;
|
|
12
|
+
},
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
return {
|
|
16
|
+
async confirm(message, defaultValue = true) {
|
|
17
|
+
const { createInterface } = await import("readline/promises");
|
|
18
|
+
const rl = createInterface({ input: process.stdin, output: process.stdout });
|
|
19
|
+
const hint = defaultValue ? "[Y/n]" : "[y/N]";
|
|
20
|
+
try {
|
|
21
|
+
const answer = await rl.question(`${message} ${hint} `);
|
|
22
|
+
const trimmed = answer.trim().toLowerCase();
|
|
23
|
+
if (trimmed === "")
|
|
24
|
+
return defaultValue;
|
|
25
|
+
return trimmed === "y" || trimmed === "yes";
|
|
26
|
+
}
|
|
27
|
+
finally {
|
|
28
|
+
rl.close();
|
|
29
|
+
}
|
|
30
|
+
},
|
|
31
|
+
async input(message, defaultValue) {
|
|
32
|
+
const { createInterface } = await import("readline/promises");
|
|
33
|
+
const rl = createInterface({ input: process.stdin, output: process.stdout });
|
|
34
|
+
const hint = defaultValue !== undefined ? ` (${defaultValue})` : "";
|
|
35
|
+
try {
|
|
36
|
+
const answer = await rl.question(`${message}${hint}: `);
|
|
37
|
+
const trimmed = answer.trim();
|
|
38
|
+
return trimmed === "" ? (defaultValue ?? "") : trimmed;
|
|
39
|
+
}
|
|
40
|
+
finally {
|
|
41
|
+
rl.close();
|
|
42
|
+
}
|
|
43
|
+
},
|
|
44
|
+
async select(message, choices) {
|
|
45
|
+
const { createInterface } = await import("readline/promises");
|
|
46
|
+
const rl = createInterface({ input: process.stdin, output: process.stdout });
|
|
47
|
+
const lines = choices.map((c, i) => ` ${i + 1}) ${c.label}`).join("\n");
|
|
48
|
+
try {
|
|
49
|
+
// eslint-disable-next-line no-constant-condition
|
|
50
|
+
while (true) {
|
|
51
|
+
const answer = await rl.question(`${message}\n${lines}\nChoice [1]: `);
|
|
52
|
+
const trimmed = answer.trim();
|
|
53
|
+
if (trimmed === "")
|
|
54
|
+
return choices[0].value;
|
|
55
|
+
const idx = parseInt(trimmed, 10) - 1;
|
|
56
|
+
if (!isNaN(idx) && idx >= 0 && idx < choices.length) {
|
|
57
|
+
return choices[idx].value;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
finally {
|
|
62
|
+
rl.close();
|
|
63
|
+
}
|
|
64
|
+
},
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=prompt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompt.js","sourceRoot":"","sources":["../../src/core/prompt.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import type { HttpClient, RepoEntry, PluginIndex, PluginEntry } from "./types.js";
|
|
2
|
+
import type { CacheEntry, IndexCache } from "./cache.js";
|
|
3
|
+
export interface FetchedIndex {
|
|
4
|
+
repoName: string;
|
|
5
|
+
index?: PluginIndex;
|
|
6
|
+
error?: string;
|
|
7
|
+
}
|
|
8
|
+
export interface PluginMatch {
|
|
9
|
+
name: string;
|
|
10
|
+
repoName: string;
|
|
11
|
+
entry: PluginEntry;
|
|
12
|
+
}
|
|
13
|
+
export interface FetchIndexOptions {
|
|
14
|
+
cached?: CacheEntry;
|
|
15
|
+
}
|
|
16
|
+
export interface FetchIndexResult {
|
|
17
|
+
index: PluginIndex;
|
|
18
|
+
updatedEntry?: CacheEntry;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Fetch a single plugin index from `url` using `http`.
|
|
22
|
+
* If a cached entry is provided, sends conditional request headers.
|
|
23
|
+
* On 304 Not Modified, returns the cached body.
|
|
24
|
+
* On 200, updates the cache entry with new ETag/Last-Modified.
|
|
25
|
+
* Throws on HTTP error or invalid JSON.
|
|
26
|
+
*/
|
|
27
|
+
export declare function fetchIndex(http: HttpClient, url: string, options?: FetchIndexOptions): Promise<FetchIndexResult>;
|
|
28
|
+
export interface FetchAllIndexesOptions {
|
|
29
|
+
cache?: IndexCache;
|
|
30
|
+
}
|
|
31
|
+
export interface FetchAllIndexesResult {
|
|
32
|
+
results: FetchedIndex[];
|
|
33
|
+
updatedCache: IndexCache;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Fetch all indexes in parallel, capturing errors into FetchedIndex.error (never throwing).
|
|
37
|
+
* Accepts an optional cache; returns an updated cache with any new/refreshed entries.
|
|
38
|
+
*/
|
|
39
|
+
export declare function fetchAllIndexes(http: HttpClient, repos: RepoEntry[], options?: FetchAllIndexesOptions): Promise<FetchAllIndexesResult>;
|
|
40
|
+
/**
|
|
41
|
+
* Find a plugin by name across fetched indexes.
|
|
42
|
+
* If `fromRepo` is given, only that repo is searched.
|
|
43
|
+
* Returns `undefined` when not found.
|
|
44
|
+
*/
|
|
45
|
+
export declare function resolvePlugin(indexes: FetchedIndex[], pluginName: string, fromRepo?: string): PluginMatch | undefined;
|
|
46
|
+
/**
|
|
47
|
+
* Fuzzy search plugins by name and description across all fetched indexes.
|
|
48
|
+
* Name matches are returned before description-only matches.
|
|
49
|
+
* Case-insensitive substring match.
|
|
50
|
+
*/
|
|
51
|
+
export declare function searchPlugins(indexes: FetchedIndex[], query: string): PluginMatch[];
|
|
52
|
+
//# sourceMappingURL=registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/core/registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAClF,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAGzD,MAAM,WAAW,YAAY;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,WAAW;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,WAAW,CAAC;CACtB;AAED,MAAM,WAAW,iBAAiB;IAC9B,MAAM,CAAC,EAAE,UAAU,CAAC;CACvB;AAED,MAAM,WAAW,gBAAgB;IAC7B,KAAK,EAAE,WAAW,CAAC;IACnB,YAAY,CAAC,EAAE,UAAU,CAAC;CAC7B;AAED;;;;;;GAMG;AACH,wBAAsB,UAAU,CAC5B,IAAI,EAAE,UAAU,EAChB,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE,iBAAiB,GAC5B,OAAO,CAAC,gBAAgB,CAAC,CAiD3B;AAED,MAAM,WAAW,sBAAsB;IACnC,KAAK,CAAC,EAAE,UAAU,CAAC;CACtB;AAED,MAAM,WAAW,qBAAqB;IAClC,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,YAAY,EAAE,UAAU,CAAC;CAC5B;AAED;;;GAGG;AACH,wBAAsB,eAAe,CACjC,IAAI,EAAE,UAAU,EAChB,KAAK,EAAE,SAAS,EAAE,EAClB,OAAO,CAAC,EAAE,sBAAsB,GACjC,OAAO,CAAC,qBAAqB,CAAC,CAoChC;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CACzB,OAAO,EAAE,YAAY,EAAE,EACvB,UAAU,EAAE,MAAM,EAClB,QAAQ,CAAC,EAAE,MAAM,GAClB,WAAW,GAAG,SAAS,CAazB;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,YAAY,EAAE,EAAE,KAAK,EAAE,MAAM,GAAG,WAAW,EAAE,CAmBnF"}
|