@cefense-npm/cefense-cli 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.md +21 -0
- package/dist/commands/auth.d.ts +9 -0
- package/dist/commands/auth.d.ts.map +1 -0
- package/dist/commands/auth.js +190 -0
- package/dist/commands/auth.js.map +1 -0
- package/dist/commands/fix.d.ts +3 -0
- package/dist/commands/fix.d.ts.map +1 -0
- package/dist/commands/fix.js +146 -0
- package/dist/commands/fix.js.map +1 -0
- package/dist/commands/fixactions.d.ts +12 -0
- package/dist/commands/fixactions.d.ts.map +1 -0
- package/dist/commands/fixactions.js +176 -0
- package/dist/commands/fixactions.js.map +1 -0
- package/dist/commands/link.d.ts +8 -0
- package/dist/commands/link.d.ts.map +1 -0
- package/dist/commands/link.js +0 -0
- package/dist/commands/link.js.map +1 -0
- package/dist/commands/observed.d.ts +18 -0
- package/dist/commands/observed.d.ts.map +1 -0
- package/dist/commands/observed.js +254 -0
- package/dist/commands/observed.js.map +1 -0
- package/dist/commands/pick.d.ts +3 -0
- package/dist/commands/pick.d.ts.map +1 -0
- package/dist/commands/pick.js +18 -0
- package/dist/commands/pick.js.map +1 -0
- package/dist/commands/repo.d.ts +12 -0
- package/dist/commands/repo.d.ts.map +1 -0
- package/dist/commands/repo.js +330 -0
- package/dist/commands/repo.js.map +1 -0
- package/dist/commands/scan.d.ts +9 -0
- package/dist/commands/scan.d.ts.map +1 -0
- package/dist/commands/scan.js +98 -0
- package/dist/commands/scan.js.map +1 -0
- package/dist/commands/status.d.ts +5 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +250 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/core/client.d.ts +87 -0
- package/dist/core/client.d.ts.map +1 -0
- package/dist/core/client.js +235 -0
- package/dist/core/client.js.map +1 -0
- package/dist/core/config.d.ts +24 -0
- package/dist/core/config.d.ts.map +1 -0
- package/dist/core/config.js +85 -0
- package/dist/core/config.js.map +1 -0
- package/dist/core/credentials.d.ts +17 -0
- package/dist/core/credentials.d.ts.map +1 -0
- package/dist/core/credentials.js +139 -0
- package/dist/core/credentials.js.map +1 -0
- package/dist/core/discovery.d.ts +8 -0
- package/dist/core/discovery.d.ts.map +1 -0
- package/dist/core/discovery.js +62 -0
- package/dist/core/discovery.js.map +1 -0
- package/dist/core/errors.d.ts +32 -0
- package/dist/core/errors.d.ts.map +1 -0
- package/dist/core/errors.js +56 -0
- package/dist/core/errors.js.map +1 -0
- package/dist/core/index.d.ts +10 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +9 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/oauth.d.ts +20 -0
- package/dist/core/oauth.d.ts.map +1 -0
- package/dist/core/oauth.js +218 -0
- package/dist/core/oauth.js.map +1 -0
- package/dist/core/repo.d.ts +24 -0
- package/dist/core/repo.d.ts.map +1 -0
- package/dist/core/repo.js +101 -0
- package/dist/core/repo.js.map +1 -0
- package/dist/core/session.d.ts +24 -0
- package/dist/core/session.d.ts.map +1 -0
- package/dist/core/session.js +32 -0
- package/dist/core/session.js.map +1 -0
- package/dist/core/types.d.ts +309 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +2 -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 +148 -0
- package/dist/index.js.map +1 -0
- package/dist/ui/browser.d.ts +30 -0
- package/dist/ui/browser.d.ts.map +1 -0
- package/dist/ui/browser.js +350 -0
- package/dist/ui/browser.js.map +1 -0
- package/dist/ui/format.d.ts +15 -0
- package/dist/ui/format.d.ts.map +1 -0
- package/dist/ui/format.js +131 -0
- package/dist/ui/format.js.map +1 -0
- package/dist/ui/output.d.ts +16 -0
- package/dist/ui/output.d.ts.map +1 -0
- package/dist/ui/output.js +63 -0
- package/dist/ui/output.js.map +1 -0
- package/dist/ui/prompts.d.ts +39 -0
- package/dist/ui/prompts.d.ts.map +1 -0
- package/dist/ui/prompts.js +76 -0
- package/dist/ui/prompts.js.map +1 -0
- package/dist/ui/screen.d.ts +27 -0
- package/dist/ui/screen.d.ts.map +1 -0
- package/dist/ui/screen.js +120 -0
- package/dist/ui/screen.js.map +1 -0
- package/dist/ui/spinner.d.ts +8 -0
- package/dist/ui/spinner.d.ts.map +1 -0
- package/dist/ui/spinner.js +98 -0
- package/dist/ui/spinner.js.map +1 -0
- package/dist/ui/table.d.ts +14 -0
- package/dist/ui/table.d.ts.map +1 -0
- package/dist/ui/table.js +47 -0
- package/dist/ui/table.js.map +1 -0
- package/dist/ui/theme.d.ts +44 -0
- package/dist/ui/theme.d.ts.map +1 -0
- package/dist/ui/theme.js +85 -0
- package/dist/ui/theme.js.map +1 -0
- package/dist/version.d.ts +3 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +17 -0
- package/dist/version.js.map +1 -0
- package/package.json +54 -0
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { existsSync, mkdirSync, readFileSync, rmSync, writeFileSync } from "node:fs";
|
|
2
|
+
import { homedir } from "node:os";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
export const DEFAULT_API_URL = "https://cefense.com";
|
|
5
|
+
const DISCOVERY_TTL_MS = 5 * 60_000;
|
|
6
|
+
export function dataDir() {
|
|
7
|
+
return join(homedir(), ".cefense-cli");
|
|
8
|
+
}
|
|
9
|
+
export function ensureDataDir() {
|
|
10
|
+
const dir = dataDir();
|
|
11
|
+
if (!existsSync(dir))
|
|
12
|
+
mkdirSync(dir, { recursive: true, mode: 0o700 });
|
|
13
|
+
return dir;
|
|
14
|
+
}
|
|
15
|
+
function filePath(name) {
|
|
16
|
+
return join(dataDir(), name);
|
|
17
|
+
}
|
|
18
|
+
function readJson(name) {
|
|
19
|
+
try {
|
|
20
|
+
return JSON.parse(readFileSync(filePath(name), "utf8"));
|
|
21
|
+
}
|
|
22
|
+
catch {
|
|
23
|
+
return null;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
function writeJson(name, value, mode = 0o600) {
|
|
27
|
+
ensureDataDir();
|
|
28
|
+
writeFileSync(filePath(name), `${JSON.stringify(value, null, 2)}\n`, { mode });
|
|
29
|
+
}
|
|
30
|
+
export function readPreferences() {
|
|
31
|
+
return readJson("config.json") ?? {};
|
|
32
|
+
}
|
|
33
|
+
export function writePreferences(preferences) {
|
|
34
|
+
writeJson("config.json", preferences);
|
|
35
|
+
}
|
|
36
|
+
export function normaliseApiUrl(value) {
|
|
37
|
+
const trimmed = value.trim().replace(/\/+$/, "");
|
|
38
|
+
const withScheme = /^https?:\/\//i.test(trimmed) ? trimmed : `https://${trimmed}`;
|
|
39
|
+
return new URL(withScheme).origin;
|
|
40
|
+
}
|
|
41
|
+
export function resolveApiUrl(flag) {
|
|
42
|
+
const candidate = flag ?? process.env.CEFENSE_API_URL ?? readPreferences().apiUrl ?? DEFAULT_API_URL;
|
|
43
|
+
return normaliseApiUrl(candidate);
|
|
44
|
+
}
|
|
45
|
+
export function readRepoDefault(scope) {
|
|
46
|
+
return (readJson("defaults.json") ?? {})[scope] ?? null;
|
|
47
|
+
}
|
|
48
|
+
export function writeRepoDefault(scope, value) {
|
|
49
|
+
const all = readJson("defaults.json") ?? {};
|
|
50
|
+
all[scope] = value;
|
|
51
|
+
writeJson("defaults.json", all);
|
|
52
|
+
}
|
|
53
|
+
export function clearRepoDefault(scope) {
|
|
54
|
+
const all = readJson("defaults.json") ?? {};
|
|
55
|
+
if (!(scope in all))
|
|
56
|
+
return false;
|
|
57
|
+
delete all[scope];
|
|
58
|
+
writeJson("defaults.json", all);
|
|
59
|
+
return true;
|
|
60
|
+
}
|
|
61
|
+
export function readCachedDiscovery(apiUrl) {
|
|
62
|
+
const entry = (readJson("discovery.json") ?? {})[apiUrl];
|
|
63
|
+
if (!entry)
|
|
64
|
+
return null;
|
|
65
|
+
if (Date.now() - entry.fetchedAt > DISCOVERY_TTL_MS)
|
|
66
|
+
return null;
|
|
67
|
+
return entry.config;
|
|
68
|
+
}
|
|
69
|
+
export function writeCachedDiscovery(apiUrl, config) {
|
|
70
|
+
const all = readJson("discovery.json") ?? {};
|
|
71
|
+
all[apiUrl] = { fetchedAt: Date.now(), config };
|
|
72
|
+
writeJson("discovery.json", all);
|
|
73
|
+
}
|
|
74
|
+
export function credentialsFilePath() {
|
|
75
|
+
return filePath("credentials.json");
|
|
76
|
+
}
|
|
77
|
+
export function removeCredentialsFile() {
|
|
78
|
+
try {
|
|
79
|
+
rmSync(credentialsFilePath(), { force: true });
|
|
80
|
+
}
|
|
81
|
+
catch {
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/core/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { StoredCredentials } from "./types.js";
|
|
2
|
+
export type CredentialBackend = "keychain" | "file" | "environment" | "none";
|
|
3
|
+
export interface CredentialState {
|
|
4
|
+
credentials: StoredCredentials | null;
|
|
5
|
+
backend: CredentialBackend;
|
|
6
|
+
}
|
|
7
|
+
export declare function keychainName(): string;
|
|
8
|
+
export declare function credentialsFromEnvironment(apiUrl: string): StoredCredentials | null;
|
|
9
|
+
export declare function loadCredentials(apiUrl: string): Promise<CredentialState>;
|
|
10
|
+
export interface SaveResult {
|
|
11
|
+
backend: CredentialBackend;
|
|
12
|
+
warning: string | null;
|
|
13
|
+
}
|
|
14
|
+
export declare function saveCredentials(apiUrl: string, credentials: StoredCredentials): Promise<SaveResult>;
|
|
15
|
+
export declare function deleteCredentials(apiUrl: string): Promise<void>;
|
|
16
|
+
export declare function listStoredOrigins(): Promise<string[]>;
|
|
17
|
+
//# sourceMappingURL=credentials.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"credentials.d.ts","sourceRoot":"","sources":["../../src/core/credentials.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAIpD,MAAM,MAAM,iBAAiB,GAAG,UAAU,GAAG,MAAM,GAAG,aAAa,GAAG,MAAM,CAAC;AAE7E,MAAM,WAAW,eAAe;IAC9B,WAAW,EAAE,iBAAiB,GAAG,IAAI,CAAC;IACtC,OAAO,EAAE,iBAAiB,CAAC;CAC5B;AAsBD,wBAAgB,YAAY,IAAI,MAAM,CAIrC;AAkCD,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,MAAM,GAAG,iBAAiB,GAAG,IAAI,CAYnF;AAED,wBAAsB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CAiB9E;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,iBAAiB,CAAC;IAC3B,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CACxB;AAED,wBAAsB,eAAe,CACnC,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,iBAAiB,GAC7B,OAAO,CAAC,UAAU,CAAC,CA2BrB;AAED,wBAAsB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAerE;AAED,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAE3D"}
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
import { chmodSync, existsSync, readFileSync, writeFileSync } from "node:fs";
|
|
2
|
+
import { credentialsFilePath, ensureDataDir, removeCredentialsFile } from "./config.js";
|
|
3
|
+
const SERVICE = "cefense-cli";
|
|
4
|
+
let keyringModule;
|
|
5
|
+
async function loadKeyring() {
|
|
6
|
+
if (keyringModule !== undefined)
|
|
7
|
+
return keyringModule;
|
|
8
|
+
try {
|
|
9
|
+
keyringModule = (await import("@napi-rs/keyring"));
|
|
10
|
+
}
|
|
11
|
+
catch {
|
|
12
|
+
keyringModule = null;
|
|
13
|
+
}
|
|
14
|
+
return keyringModule;
|
|
15
|
+
}
|
|
16
|
+
export function keychainName() {
|
|
17
|
+
if (process.platform === "darwin")
|
|
18
|
+
return "the macOS Keychain";
|
|
19
|
+
if (process.platform === "win32")
|
|
20
|
+
return "Windows Credential Manager";
|
|
21
|
+
return "the system keyring";
|
|
22
|
+
}
|
|
23
|
+
function parse(raw) {
|
|
24
|
+
if (!raw)
|
|
25
|
+
return null;
|
|
26
|
+
try {
|
|
27
|
+
const value = JSON.parse(raw);
|
|
28
|
+
return typeof value?.accessToken === "string" ? value : null;
|
|
29
|
+
}
|
|
30
|
+
catch {
|
|
31
|
+
return null;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
function readFileStore() {
|
|
35
|
+
try {
|
|
36
|
+
if (!existsSync(credentialsFilePath()))
|
|
37
|
+
return {};
|
|
38
|
+
return JSON.parse(readFileSync(credentialsFilePath(), "utf8"));
|
|
39
|
+
}
|
|
40
|
+
catch {
|
|
41
|
+
return {};
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
function writeFileStore(store) {
|
|
45
|
+
ensureDataDir();
|
|
46
|
+
const path = credentialsFilePath();
|
|
47
|
+
writeFileSync(path, `${JSON.stringify(store, null, 2)}\n`, { mode: 0o600 });
|
|
48
|
+
try {
|
|
49
|
+
chmodSync(path, 0o600);
|
|
50
|
+
}
|
|
51
|
+
catch {
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
export function credentialsFromEnvironment(apiUrl) {
|
|
56
|
+
const token = process.env.CEFENSE_TOKEN?.trim();
|
|
57
|
+
if (!token)
|
|
58
|
+
return null;
|
|
59
|
+
return {
|
|
60
|
+
accessToken: token,
|
|
61
|
+
refreshToken: null,
|
|
62
|
+
expiresAt: null,
|
|
63
|
+
subject: null,
|
|
64
|
+
email: null,
|
|
65
|
+
clientId: "",
|
|
66
|
+
issuer: apiUrl,
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
export async function loadCredentials(apiUrl) {
|
|
70
|
+
const fromEnvironment = credentialsFromEnvironment(apiUrl);
|
|
71
|
+
if (fromEnvironment)
|
|
72
|
+
return { credentials: fromEnvironment, backend: "environment" };
|
|
73
|
+
const keyring = await loadKeyring();
|
|
74
|
+
if (keyring) {
|
|
75
|
+
try {
|
|
76
|
+
const stored = parse(new keyring.Entry(SERVICE, apiUrl).getPassword());
|
|
77
|
+
if (stored)
|
|
78
|
+
return { credentials: stored, backend: "keychain" };
|
|
79
|
+
}
|
|
80
|
+
catch {
|
|
81
|
+
void 0;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
const stored = readFileStore()[apiUrl] ?? null;
|
|
85
|
+
if (stored)
|
|
86
|
+
return { credentials: stored, backend: "file" };
|
|
87
|
+
return { credentials: null, backend: "none" };
|
|
88
|
+
}
|
|
89
|
+
export async function saveCredentials(apiUrl, credentials) {
|
|
90
|
+
const keyring = await loadKeyring();
|
|
91
|
+
if (keyring) {
|
|
92
|
+
try {
|
|
93
|
+
new keyring.Entry(SERVICE, apiUrl).setPassword(JSON.stringify(credentials));
|
|
94
|
+
return { backend: "keychain", warning: null };
|
|
95
|
+
}
|
|
96
|
+
catch (error) {
|
|
97
|
+
if (process.platform === "win32") {
|
|
98
|
+
throw error;
|
|
99
|
+
}
|
|
100
|
+
const store = readFileStore();
|
|
101
|
+
store[apiUrl] = credentials;
|
|
102
|
+
writeFileStore(store);
|
|
103
|
+
return {
|
|
104
|
+
backend: "file",
|
|
105
|
+
warning: `${keychainName()} was unavailable, so the token was written to ${credentialsFilePath()} with owner-only permissions.`,
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
const store = readFileStore();
|
|
110
|
+
store[apiUrl] = credentials;
|
|
111
|
+
writeFileStore(store);
|
|
112
|
+
return {
|
|
113
|
+
backend: "file",
|
|
114
|
+
warning: `No system keyring was available, so the token was written to ${credentialsFilePath()} with owner-only permissions.`,
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
export async function deleteCredentials(apiUrl) {
|
|
118
|
+
const keyring = await loadKeyring();
|
|
119
|
+
if (keyring) {
|
|
120
|
+
try {
|
|
121
|
+
new keyring.Entry(SERVICE, apiUrl).deletePassword();
|
|
122
|
+
}
|
|
123
|
+
catch {
|
|
124
|
+
void 0;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
const store = readFileStore();
|
|
128
|
+
if (apiUrl in store) {
|
|
129
|
+
delete store[apiUrl];
|
|
130
|
+
if (Object.keys(store).length === 0)
|
|
131
|
+
removeCredentialsFile();
|
|
132
|
+
else
|
|
133
|
+
writeFileStore(store);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
export async function listStoredOrigins() {
|
|
137
|
+
return Object.keys(readFileStore());
|
|
138
|
+
}
|
|
139
|
+
//# sourceMappingURL=credentials.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"credentials.js","sourceRoot":"","sources":["../../src/core/credentials.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { CliConfigResponse } from "./types.js";
|
|
2
|
+
declare function compareVersions(left: string, right: string): number;
|
|
3
|
+
export declare function fetchDiscovery(apiUrl: string, options?: {
|
|
4
|
+
refresh?: boolean;
|
|
5
|
+
}): Promise<CliConfigResponse>;
|
|
6
|
+
export declare function assertVersionSupported(config: CliConfigResponse): void;
|
|
7
|
+
export { compareVersions };
|
|
8
|
+
//# sourceMappingURL=discovery.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"discovery.d.ts","sourceRoot":"","sources":["../../src/core/discovery.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAEpD,iBAAS,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAa5D;AAED,wBAAsB,cAAc,CAClC,MAAM,EAAE,MAAM,EACd,OAAO,GAAE;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAO,GAClC,OAAO,CAAC,iBAAiB,CAAC,CAoC5B;AAED,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,iBAAiB,GAAG,IAAI,CAOtE;AAED,OAAO,EAAE,eAAe,EAAE,CAAC"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { CefenseError } from "./errors.js";
|
|
2
|
+
import { readCachedDiscovery, writeCachedDiscovery } from "./config.js";
|
|
3
|
+
import { USER_AGENT, VERSION } from "../version.js";
|
|
4
|
+
function compareVersions(left, right) {
|
|
5
|
+
const parse = (value) => value
|
|
6
|
+
.split("-")[0]
|
|
7
|
+
.split(".")
|
|
8
|
+
.map((part) => Number.parseInt(part, 10) || 0);
|
|
9
|
+
const a = parse(left);
|
|
10
|
+
const b = parse(right);
|
|
11
|
+
for (let index = 0; index < Math.max(a.length, b.length); index += 1) {
|
|
12
|
+
const diff = (a[index] ?? 0) - (b[index] ?? 0);
|
|
13
|
+
if (diff !== 0)
|
|
14
|
+
return diff < 0 ? -1 : 1;
|
|
15
|
+
}
|
|
16
|
+
return 0;
|
|
17
|
+
}
|
|
18
|
+
export async function fetchDiscovery(apiUrl, options = {}) {
|
|
19
|
+
if (!options.refresh) {
|
|
20
|
+
const cached = readCachedDiscovery(apiUrl);
|
|
21
|
+
if (cached)
|
|
22
|
+
return cached;
|
|
23
|
+
}
|
|
24
|
+
let response;
|
|
25
|
+
try {
|
|
26
|
+
response = await fetch(`${apiUrl}/api/cli/config`, {
|
|
27
|
+
headers: { accept: "application/json", "user-agent": USER_AGENT },
|
|
28
|
+
signal: AbortSignal.timeout(15_000),
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
catch (cause) {
|
|
32
|
+
throw new CefenseError(`Could not reach the Cefense API at ${apiUrl}.`, {
|
|
33
|
+
remedy: "Check your connection, or point somewhere else with --api-url.",
|
|
34
|
+
cause,
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
if (response.status === 503) {
|
|
38
|
+
throw new CefenseError("The Cefense CLI is not configured on this instance.", {
|
|
39
|
+
remedy: `Ask an operator to set CEFENSE_CLI_OAUTH_CLIENT_ID on ${apiUrl}.`,
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
if (!response.ok) {
|
|
43
|
+
throw new CefenseError(`The Cefense API at ${apiUrl} returned ${response.status} for /api/cli/config.`, {
|
|
44
|
+
remedy: "Confirm the URL points at a Cefense deployment.",
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
const config = (await response.json());
|
|
48
|
+
if (!config?.auth?.clientId || !config.auth.authorizationEndpoint) {
|
|
49
|
+
throw new CefenseError(`The Cefense API at ${apiUrl} returned an unusable CLI configuration.`);
|
|
50
|
+
}
|
|
51
|
+
writeCachedDiscovery(apiUrl, config);
|
|
52
|
+
return config;
|
|
53
|
+
}
|
|
54
|
+
export function assertVersionSupported(config) {
|
|
55
|
+
if (!config.minimumCliVersion)
|
|
56
|
+
return;
|
|
57
|
+
if (compareVersions(VERSION, config.minimumCliVersion) >= 0)
|
|
58
|
+
return;
|
|
59
|
+
throw new CefenseError(`This Cefense deployment requires CLI ${config.minimumCliVersion} or newer, and this is ${VERSION}.`, { remedy: "Upgrade with npm install -g cefense@latest." });
|
|
60
|
+
}
|
|
61
|
+
export { compareVersions };
|
|
62
|
+
//# sourceMappingURL=discovery.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"discovery.js","sourceRoot":"","sources":["../../src/core/discovery.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
export declare const EXIT_OK = 0;
|
|
2
|
+
export declare const EXIT_FINDINGS = 1;
|
|
3
|
+
export declare const EXIT_USAGE = 2;
|
|
4
|
+
export declare const EXIT_AUTH = 3;
|
|
5
|
+
export declare const EXIT_API = 4;
|
|
6
|
+
export declare const EXIT_INTERRUPTED = 130;
|
|
7
|
+
export declare class CefenseError extends Error {
|
|
8
|
+
readonly remedy: string | null;
|
|
9
|
+
readonly exitCode: number;
|
|
10
|
+
readonly cause: unknown;
|
|
11
|
+
constructor(message: string, options?: {
|
|
12
|
+
remedy?: string | null;
|
|
13
|
+
exitCode?: number;
|
|
14
|
+
cause?: unknown;
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
export declare class AuthRequiredError extends CefenseError {
|
|
18
|
+
constructor(message?: string, remedy?: string);
|
|
19
|
+
}
|
|
20
|
+
export declare class UsageError extends CefenseError {
|
|
21
|
+
constructor(message: string, remedy?: string);
|
|
22
|
+
}
|
|
23
|
+
export declare class CancelledError extends CefenseError {
|
|
24
|
+
constructor(message?: string);
|
|
25
|
+
}
|
|
26
|
+
export declare class FeatureRequiredError extends CefenseError {
|
|
27
|
+
readonly feature: string;
|
|
28
|
+
constructor(feature: string, pricingUrl: string | null, webUrl: string);
|
|
29
|
+
}
|
|
30
|
+
export declare function isCefenseError(value: unknown): value is CefenseError;
|
|
31
|
+
export declare function messageOf(value: unknown): string;
|
|
32
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/core/errors.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,OAAO,IAAI,CAAC;AACzB,eAAO,MAAM,aAAa,IAAI,CAAC;AAC/B,eAAO,MAAM,UAAU,IAAI,CAAC;AAC5B,eAAO,MAAM,SAAS,IAAI,CAAC;AAC3B,eAAO,MAAM,QAAQ,IAAI,CAAC;AAC1B,eAAO,MAAM,gBAAgB,MAAM,CAAC;AAEpC,qBAAa,YAAa,SAAQ,KAAK;IACrC,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,SAAkB,KAAK,EAAE,OAAO,CAAC;gBAG/B,OAAO,EAAE,MAAM,EACf,OAAO,GAAE;QAAE,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,OAAO,CAAA;KAAO;CAQ/E;AAED,qBAAa,iBAAkB,SAAQ,YAAY;gBACrC,OAAO,SAA2B,EAAE,MAAM,SAAuB;CAI9E;AAED,qBAAa,UAAW,SAAQ,YAAY;gBAC9B,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM;CAI7C;AAED,qBAAa,cAAe,SAAQ,YAAY;gBAClC,OAAO,SAAe;CAInC;AAED,qBAAa,oBAAqB,SAAQ,YAAY;IACpD,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;gBAEb,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI,EAAE,MAAM,EAAE,MAAM;CAQvE;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,YAAY,CAEpE;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAGhD"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
export const EXIT_OK = 0;
|
|
2
|
+
export const EXIT_FINDINGS = 1;
|
|
3
|
+
export const EXIT_USAGE = 2;
|
|
4
|
+
export const EXIT_AUTH = 3;
|
|
5
|
+
export const EXIT_API = 4;
|
|
6
|
+
export const EXIT_INTERRUPTED = 130;
|
|
7
|
+
export class CefenseError extends Error {
|
|
8
|
+
remedy;
|
|
9
|
+
exitCode;
|
|
10
|
+
cause;
|
|
11
|
+
constructor(message, options = {}) {
|
|
12
|
+
super(message);
|
|
13
|
+
this.name = "CefenseError";
|
|
14
|
+
this.remedy = options.remedy ?? null;
|
|
15
|
+
this.exitCode = options.exitCode ?? EXIT_API;
|
|
16
|
+
this.cause = options.cause;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
export class AuthRequiredError extends CefenseError {
|
|
20
|
+
constructor(message = "You are not signed in.", remedy = "Run cf auth login.") {
|
|
21
|
+
super(message, { remedy, exitCode: EXIT_AUTH });
|
|
22
|
+
this.name = "AuthRequiredError";
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
export class UsageError extends CefenseError {
|
|
26
|
+
constructor(message, remedy) {
|
|
27
|
+
super(message, { remedy: remedy ?? null, exitCode: EXIT_USAGE });
|
|
28
|
+
this.name = "UsageError";
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
export class CancelledError extends CefenseError {
|
|
32
|
+
constructor(message = "Cancelled.") {
|
|
33
|
+
super(message, { exitCode: EXIT_INTERRUPTED });
|
|
34
|
+
this.name = "CancelledError";
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
export class FeatureRequiredError extends CefenseError {
|
|
38
|
+
feature;
|
|
39
|
+
constructor(feature, pricingUrl, webUrl) {
|
|
40
|
+
super(`The ${feature} feature pack is required.`, {
|
|
41
|
+
remedy: `Unlock it at ${pricingUrl ? new URL(pricingUrl, webUrl).toString() : `${webUrl}/pricing`}, or run cf billing upgrade ${feature}.`,
|
|
42
|
+
exitCode: EXIT_API,
|
|
43
|
+
});
|
|
44
|
+
this.name = "FeatureRequiredError";
|
|
45
|
+
this.feature = feature;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
export function isCefenseError(value) {
|
|
49
|
+
return value instanceof CefenseError;
|
|
50
|
+
}
|
|
51
|
+
export function messageOf(value) {
|
|
52
|
+
if (value instanceof Error)
|
|
53
|
+
return value.message;
|
|
54
|
+
return String(value);
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/core/errors.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,CAAC;AACzB,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,CAAC;AAC/B,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,CAAC;AAC5B,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,CAAC;AAC3B,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,CAAC;AAC1B,MAAM,CAAC,MAAM,gBAAgB,GAAG,GAAG,CAAC;AAEpC,MAAM,OAAO,YAAa,SAAQ,KAAK;IAC5B,MAAM,CAAgB;IACtB,QAAQ,CAAS;IACR,KAAK,CAAU;IAEjC,YACE,OAAe,EACf,UAA0E,EAAE;QAE5E,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,cAAc,CAAC;QAC3B,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,IAAI,CAAC;QACrC,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,QAAQ,CAAC;QAC7C,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;IAC7B,CAAC;CACF;AAED,MAAM,OAAO,iBAAkB,SAAQ,YAAY;IACjD,YAAY,OAAO,GAAG,wBAAwB,EAAE,MAAM,GAAG,oBAAoB;QAC3E,KAAK,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC,CAAC;QAChD,IAAI,CAAC,IAAI,GAAG,mBAAmB,CAAC;IAClC,CAAC;CACF;AAED,MAAM,OAAO,UAAW,SAAQ,YAAY;IAC1C,YAAY,OAAe,EAAE,MAAe;QAC1C,KAAK,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,MAAM,IAAI,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC,CAAC;QACjE,IAAI,CAAC,IAAI,GAAG,YAAY,CAAC;IAC3B,CAAC;CACF;AAED,MAAM,OAAO,cAAe,SAAQ,YAAY;IAC9C,YAAY,OAAO,GAAG,YAAY;QAChC,KAAK,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,gBAAgB,EAAE,CAAC,CAAC;QAC/C,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAC;IAC/B,CAAC;CACF;AAED,MAAM,OAAO,oBAAqB,SAAQ,YAAY;IAC3C,OAAO,CAAS;IAEzB,YAAY,OAAe,EAAE,UAAyB,EAAE,MAAc;QACpE,KAAK,CAAC,OAAO,OAAO,4BAA4B,EAAE;YAChD,MAAM,EAAE,gBAAgB,UAAU,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,GAAG,MAAM,UAAU,+BAA+B,OAAO,GAAG;YAC1I,QAAQ,EAAE,QAAQ;SACnB,CAAC,CAAC;QACH,IAAI,CAAC,IAAI,GAAG,sBAAsB,CAAC;QACnC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;CACF;AAED,MAAM,UAAU,cAAc,CAAC,KAAc;IAC3C,OAAO,KAAK,YAAY,YAAY,CAAC;AACvC,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,KAAc;IACtC,IAAI,KAAK,YAAY,KAAK;QAAE,OAAO,KAAK,CAAC,OAAO,CAAC;IACjD,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;AACvB,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export { CefenseClient } from "./client.js";
|
|
2
|
+
export { openSession, type GlobalOptions, type Session } from "./session.js";
|
|
3
|
+
export { fetchDiscovery, assertVersionSupported, compareVersions } from "./discovery.js";
|
|
4
|
+
export { loadCredentials, saveCredentials, deleteCredentials, listStoredOrigins, credentialsFromEnvironment, keychainName, type CredentialBackend, type CredentialState, } from "./credentials.js";
|
|
5
|
+
export { challengeFor, createPkcePair, exchangeCode, redirectPorts, refreshCredentials, requestAuthorizationCode, revokeToken, } from "./oauth.js";
|
|
6
|
+
export { DEFAULT_API_URL, dataDir, normaliseApiUrl, readPreferences, readRepoDefault, resolveApiUrl, writePreferences, writeRepoDefault, clearRepoDefault, } from "./config.js";
|
|
7
|
+
export { defaultScope, gitRemote, gitToplevel, matchProject, parseGithubRemote, parseRepoArgument, resolveProject, type RepoLocation, type Resolution, } from "./repo.js";
|
|
8
|
+
export { AuthRequiredError, CancelledError, CefenseError, FeatureRequiredError, UsageError, isCefenseError, EXIT_API, EXIT_AUTH, EXIT_FINDINGS, EXIT_INTERRUPTED, EXIT_OK, EXIT_USAGE, } from "./errors.js";
|
|
9
|
+
export type * from "./types.js";
|
|
10
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,KAAK,aAAa,EAAE,KAAK,OAAO,EAAE,MAAM,cAAc,CAAC;AAC7E,OAAO,EAAE,cAAc,EAAE,sBAAsB,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACzF,OAAO,EACL,eAAe,EACf,eAAe,EACf,iBAAiB,EACjB,iBAAiB,EACjB,0BAA0B,EAC1B,YAAY,EACZ,KAAK,iBAAiB,EACtB,KAAK,eAAe,GACrB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,YAAY,EACZ,cAAc,EACd,YAAY,EACZ,aAAa,EACb,kBAAkB,EAClB,wBAAwB,EACxB,WAAW,GACZ,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,eAAe,EACf,OAAO,EACP,eAAe,EACf,eAAe,EACf,eAAe,EACf,aAAa,EACb,gBAAgB,EAChB,gBAAgB,EAChB,gBAAgB,GACjB,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,YAAY,EACZ,SAAS,EACT,WAAW,EACX,YAAY,EACZ,iBAAiB,EACjB,iBAAiB,EACjB,cAAc,EACd,KAAK,YAAY,EACjB,KAAK,UAAU,GAChB,MAAM,WAAW,CAAC;AACnB,OAAO,EACL,iBAAiB,EACjB,cAAc,EACd,YAAY,EACZ,oBAAoB,EACpB,UAAU,EACV,cAAc,EACd,QAAQ,EACR,SAAS,EACT,aAAa,EACb,gBAAgB,EAChB,OAAO,EACP,UAAU,GACX,MAAM,aAAa,CAAC;AACrB,mBAAmB,YAAY,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export { CefenseClient } from "./client.js";
|
|
2
|
+
export { openSession } from "./session.js";
|
|
3
|
+
export { fetchDiscovery, assertVersionSupported, compareVersions } from "./discovery.js";
|
|
4
|
+
export { loadCredentials, saveCredentials, deleteCredentials, listStoredOrigins, credentialsFromEnvironment, keychainName, } from "./credentials.js";
|
|
5
|
+
export { challengeFor, createPkcePair, exchangeCode, redirectPorts, refreshCredentials, requestAuthorizationCode, revokeToken, } from "./oauth.js";
|
|
6
|
+
export { DEFAULT_API_URL, dataDir, normaliseApiUrl, readPreferences, readRepoDefault, resolveApiUrl, writePreferences, writeRepoDefault, clearRepoDefault, } from "./config.js";
|
|
7
|
+
export { defaultScope, gitRemote, gitToplevel, matchProject, parseGithubRemote, parseRepoArgument, resolveProject, } from "./repo.js";
|
|
8
|
+
export { AuthRequiredError, CancelledError, CefenseError, FeatureRequiredError, UsageError, isCefenseError, EXIT_API, EXIT_AUTH, EXIT_FINDINGS, EXIT_INTERRUPTED, EXIT_OK, EXIT_USAGE, } from "./errors.js";
|
|
9
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAoC,MAAM,cAAc,CAAC;AAC7E,OAAO,EAAE,cAAc,EAAE,sBAAsB,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACzF,OAAO,EACL,eAAe,EACf,eAAe,EACf,iBAAiB,EACjB,iBAAiB,EACjB,0BAA0B,EAC1B,YAAY,GAGb,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,YAAY,EACZ,cAAc,EACd,YAAY,EACZ,aAAa,EACb,kBAAkB,EAClB,wBAAwB,EACxB,WAAW,GACZ,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,eAAe,EACf,OAAO,EACP,eAAe,EACf,eAAe,EACf,eAAe,EACf,aAAa,EACb,gBAAgB,EAChB,gBAAgB,EAChB,gBAAgB,GACjB,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,YAAY,EACZ,SAAS,EACT,WAAW,EACX,YAAY,EACZ,iBAAiB,EACjB,iBAAiB,EACjB,cAAc,GAGf,MAAM,WAAW,CAAC;AACnB,OAAO,EACL,iBAAiB,EACjB,cAAc,EACd,YAAY,EACZ,oBAAoB,EACpB,UAAU,EACV,cAAc,EACd,QAAQ,EACR,SAAS,EACT,aAAa,EACb,gBAAgB,EAChB,OAAO,EACP,UAAU,GACX,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { CliConfigResponse, StoredCredentials } from "./types.js";
|
|
2
|
+
export declare function challengeFor(verifier: string): string;
|
|
3
|
+
export declare function createPkcePair(): {
|
|
4
|
+
verifier: string;
|
|
5
|
+
challenge: string;
|
|
6
|
+
};
|
|
7
|
+
export declare function constantTimeEquals(left: string, right: string): boolean;
|
|
8
|
+
export declare function redirectPorts(redirectUris: string[]): number[];
|
|
9
|
+
export interface AuthorizationCode {
|
|
10
|
+
code: string;
|
|
11
|
+
redirectUri: string;
|
|
12
|
+
verifier: string;
|
|
13
|
+
}
|
|
14
|
+
export declare function requestAuthorizationCode(config: CliConfigResponse, handlers: {
|
|
15
|
+
onUrl: (url: string) => void;
|
|
16
|
+
}): Promise<AuthorizationCode>;
|
|
17
|
+
export declare function exchangeCode(config: CliConfigResponse, authorization: AuthorizationCode): Promise<StoredCredentials>;
|
|
18
|
+
export declare function refreshCredentials(config: CliConfigResponse, refreshToken: string): Promise<StoredCredentials>;
|
|
19
|
+
export declare function revokeToken(config: CliConfigResponse, token: string): Promise<boolean>;
|
|
20
|
+
//# sourceMappingURL=oauth.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oauth.d.ts","sourceRoot":"","sources":["../../src/core/oauth.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAQvE,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAErD;AAED,wBAAgB,cAAc,IAAI;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAGxE;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAKvE;AAED,wBAAgB,aAAa,CAAC,YAAY,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAY9D;AA8CD,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,wBAAsB,wBAAwB,CAC5C,MAAM,EAAE,iBAAiB,EACzB,QAAQ,EAAE;IAAE,KAAK,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAA;CAAE,GACzC,OAAO,CAAC,iBAAiB,CAAC,CA2F5B;AAkCD,wBAAsB,YAAY,CAChC,MAAM,EAAE,iBAAiB,EACzB,aAAa,EAAE,iBAAiB,GAC/B,OAAO,CAAC,iBAAiB,CAAC,CAgB5B;AAED,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,iBAAiB,EACzB,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,iBAAiB,CAAC,CAY5B;AAED,wBAAsB,WAAW,CAAC,MAAM,EAAE,iBAAiB,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAW5F"}
|