@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,218 @@
|
|
|
1
|
+
import { createHash, randomBytes, timingSafeEqual } from "node:crypto";
|
|
2
|
+
import { createServer } from "node:http";
|
|
3
|
+
import { CefenseError, CancelledError } from "./errors.js";
|
|
4
|
+
import { USER_AGENT } from "../version.js";
|
|
5
|
+
const LOGIN_TIMEOUT_MS = 5 * 60_000;
|
|
6
|
+
function base64url(input) {
|
|
7
|
+
return input.toString("base64").replace(/\+/g, "-").replace(/\//g, "_").replace(/=+$/, "");
|
|
8
|
+
}
|
|
9
|
+
export function challengeFor(verifier) {
|
|
10
|
+
return base64url(createHash("sha256").update(verifier).digest());
|
|
11
|
+
}
|
|
12
|
+
export function createPkcePair() {
|
|
13
|
+
const verifier = base64url(randomBytes(32));
|
|
14
|
+
return { verifier, challenge: challengeFor(verifier) };
|
|
15
|
+
}
|
|
16
|
+
export function constantTimeEquals(left, right) {
|
|
17
|
+
const a = Buffer.from(left);
|
|
18
|
+
const b = Buffer.from(right);
|
|
19
|
+
if (a.length !== b.length)
|
|
20
|
+
return false;
|
|
21
|
+
return timingSafeEqual(a, b);
|
|
22
|
+
}
|
|
23
|
+
export function redirectPorts(redirectUris) {
|
|
24
|
+
const ports = [];
|
|
25
|
+
for (const uri of redirectUris) {
|
|
26
|
+
try {
|
|
27
|
+
const parsed = new URL(uri);
|
|
28
|
+
const port = Number.parseInt(parsed.port, 10);
|
|
29
|
+
if (Number.isInteger(port) && port > 0)
|
|
30
|
+
ports.push(port);
|
|
31
|
+
}
|
|
32
|
+
catch {
|
|
33
|
+
continue;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
return ports;
|
|
37
|
+
}
|
|
38
|
+
function resultPage(title, message, ok) {
|
|
39
|
+
const accent = ok ? "#1f9d55" : "#c53030";
|
|
40
|
+
return `<!doctype html><html lang="en"><head><meta charset="utf-8"><title>Cefense</title><style>
|
|
41
|
+
:root{color-scheme:light dark}
|
|
42
|
+
body{margin:0;min-height:100vh;display:grid;place-items:center;background:#0b0d10;color:#e6e8eb;
|
|
43
|
+
font:16px/1.6 ui-sans-serif,-apple-system,Segoe UI,Roboto,sans-serif}
|
|
44
|
+
.card{max-width:26rem;padding:2.5rem;text-align:center}
|
|
45
|
+
h1{font-size:1.25rem;margin:0 0 .5rem;color:${accent}}
|
|
46
|
+
p{margin:0;color:#9aa3ad}
|
|
47
|
+
</style></head><body><div class="card"><h1>${title}</h1><p>${message}</p></div></body></html>`;
|
|
48
|
+
}
|
|
49
|
+
async function listenOnFirstFreePort(server, ports) {
|
|
50
|
+
const candidates = ports.length > 0 ? ports : [0];
|
|
51
|
+
let lastError = null;
|
|
52
|
+
for (const port of candidates) {
|
|
53
|
+
try {
|
|
54
|
+
await new Promise((resolve, reject) => {
|
|
55
|
+
const onError = (error) => {
|
|
56
|
+
server.removeListener("listening", onListening);
|
|
57
|
+
reject(error);
|
|
58
|
+
};
|
|
59
|
+
const onListening = () => {
|
|
60
|
+
server.removeListener("error", onError);
|
|
61
|
+
resolve();
|
|
62
|
+
};
|
|
63
|
+
server.once("error", onError);
|
|
64
|
+
server.once("listening", onListening);
|
|
65
|
+
server.listen(port, "127.0.0.1");
|
|
66
|
+
});
|
|
67
|
+
return server.address().port;
|
|
68
|
+
}
|
|
69
|
+
catch (error) {
|
|
70
|
+
lastError = error;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
throw new CefenseError(`Could not open a local callback listener on any of ports ${candidates.join(", ")}.`, {
|
|
74
|
+
remedy: "Free one of those ports and try again.",
|
|
75
|
+
cause: lastError,
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
export async function requestAuthorizationCode(config, handlers) {
|
|
79
|
+
const { verifier, challenge } = createPkcePair();
|
|
80
|
+
const state = base64url(randomBytes(16));
|
|
81
|
+
let settle = null;
|
|
82
|
+
let fail = null;
|
|
83
|
+
const pending = new Promise((resolve, reject) => {
|
|
84
|
+
settle = resolve;
|
|
85
|
+
fail = reject;
|
|
86
|
+
});
|
|
87
|
+
let redirectUri = "";
|
|
88
|
+
const server = createServer((request, response) => {
|
|
89
|
+
const url = new URL(request.url ?? "/", "http://127.0.0.1");
|
|
90
|
+
if (url.pathname !== "/callback") {
|
|
91
|
+
response.writeHead(404).end();
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
const send = (status, title, message, ok) => {
|
|
95
|
+
response.writeHead(status, { "content-type": "text/html; charset=utf-8", "cache-control": "no-store" });
|
|
96
|
+
response.end(resultPage(title, message, ok));
|
|
97
|
+
};
|
|
98
|
+
const error = url.searchParams.get("error");
|
|
99
|
+
if (error) {
|
|
100
|
+
send(400, "Sign-in failed", url.searchParams.get("error_description") ?? error, false);
|
|
101
|
+
fail?.(new CefenseError(`Authorization failed: ${url.searchParams.get("error_description") ?? error}`));
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
const returnedState = url.searchParams.get("state") ?? "";
|
|
105
|
+
if (!constantTimeEquals(returnedState, state)) {
|
|
106
|
+
send(400, "Sign-in failed", "The security check on this response did not match.", false);
|
|
107
|
+
fail?.(new CefenseError("The authorization response failed its state check."));
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
const issuer = url.searchParams.get("iss");
|
|
111
|
+
if (issuer && issuer.replace(/\/+$/, "") !== config.auth.issuer.replace(/\/+$/, "")) {
|
|
112
|
+
send(400, "Sign-in failed", "This response came from an unexpected identity provider.", false);
|
|
113
|
+
fail?.(new CefenseError("The authorization response came from an unexpected issuer."));
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
const code = url.searchParams.get("code");
|
|
117
|
+
if (!code) {
|
|
118
|
+
send(400, "Sign-in failed", "No authorization code was returned.", false);
|
|
119
|
+
fail?.(new CefenseError("The authorization response carried no code."));
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
122
|
+
send(200, "You are signed in", "Return to your terminal to continue.", true);
|
|
123
|
+
settle?.({ code, redirectUri, verifier });
|
|
124
|
+
});
|
|
125
|
+
const port = await listenOnFirstFreePort(server, redirectPorts(config.auth.redirectUris));
|
|
126
|
+
redirectUri = `http://127.0.0.1:${port}/callback`;
|
|
127
|
+
const authorizeUrl = new URL(config.auth.authorizationEndpoint);
|
|
128
|
+
authorizeUrl.searchParams.set("response_type", "code");
|
|
129
|
+
authorizeUrl.searchParams.set("client_id", config.auth.clientId);
|
|
130
|
+
authorizeUrl.searchParams.set("redirect_uri", redirectUri);
|
|
131
|
+
authorizeUrl.searchParams.set("scope", config.auth.scopes.join(" "));
|
|
132
|
+
authorizeUrl.searchParams.set("state", state);
|
|
133
|
+
authorizeUrl.searchParams.set("code_challenge", challenge);
|
|
134
|
+
authorizeUrl.searchParams.set("code_challenge_method", config.auth.codeChallengeMethod || "S256");
|
|
135
|
+
handlers.onUrl(authorizeUrl.toString());
|
|
136
|
+
const timeout = setTimeout(() => {
|
|
137
|
+
fail?.(new CefenseError("Timed out waiting for the browser sign-in to finish.", {
|
|
138
|
+
remedy: `If the browser showed an OAuth error instead of a sign-in page, ${redirectUri} ` +
|
|
139
|
+
"is probably not registered on the Clerk OAuth application.",
|
|
140
|
+
}));
|
|
141
|
+
}, LOGIN_TIMEOUT_MS);
|
|
142
|
+
const onInterrupt = () => fail?.(new CancelledError("Sign-in cancelled."));
|
|
143
|
+
process.once("SIGINT", onInterrupt);
|
|
144
|
+
try {
|
|
145
|
+
return await pending;
|
|
146
|
+
}
|
|
147
|
+
finally {
|
|
148
|
+
clearTimeout(timeout);
|
|
149
|
+
process.removeListener("SIGINT", onInterrupt);
|
|
150
|
+
server.close();
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
async function postForm(url, body) {
|
|
154
|
+
return fetch(url, {
|
|
155
|
+
method: "POST",
|
|
156
|
+
headers: {
|
|
157
|
+
"content-type": "application/x-www-form-urlencoded",
|
|
158
|
+
accept: "application/json",
|
|
159
|
+
"user-agent": USER_AGENT,
|
|
160
|
+
},
|
|
161
|
+
body: new URLSearchParams(body).toString(),
|
|
162
|
+
signal: AbortSignal.timeout(30_000),
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
function toCredentials(config, token, previousRefresh) {
|
|
166
|
+
return {
|
|
167
|
+
accessToken: token.access_token,
|
|
168
|
+
refreshToken: token.refresh_token ?? previousRefresh,
|
|
169
|
+
expiresAt: token.expires_in ? Date.now() + token.expires_in * 1000 : null,
|
|
170
|
+
subject: null,
|
|
171
|
+
email: null,
|
|
172
|
+
clientId: config.auth.clientId,
|
|
173
|
+
issuer: config.auth.issuer,
|
|
174
|
+
};
|
|
175
|
+
}
|
|
176
|
+
export async function exchangeCode(config, authorization) {
|
|
177
|
+
const response = await postForm(config.auth.tokenEndpoint, {
|
|
178
|
+
grant_type: "authorization_code",
|
|
179
|
+
code: authorization.code,
|
|
180
|
+
redirect_uri: authorization.redirectUri,
|
|
181
|
+
code_verifier: authorization.verifier,
|
|
182
|
+
client_id: config.auth.clientId,
|
|
183
|
+
});
|
|
184
|
+
if (!response.ok) {
|
|
185
|
+
const detail = await response.text().catch(() => "");
|
|
186
|
+
throw new CefenseError(`The identity provider rejected the sign-in (${response.status}).`, {
|
|
187
|
+
remedy: detail ? `It said: ${detail.slice(0, 300)}` : "Run cf auth login again.",
|
|
188
|
+
});
|
|
189
|
+
}
|
|
190
|
+
return toCredentials(config, (await response.json()), null);
|
|
191
|
+
}
|
|
192
|
+
export async function refreshCredentials(config, refreshToken) {
|
|
193
|
+
const response = await postForm(config.auth.tokenEndpoint, {
|
|
194
|
+
grant_type: "refresh_token",
|
|
195
|
+
refresh_token: refreshToken,
|
|
196
|
+
client_id: config.auth.clientId,
|
|
197
|
+
});
|
|
198
|
+
if (!response.ok) {
|
|
199
|
+
throw new CefenseError("Your saved sign-in could not be refreshed.", {
|
|
200
|
+
remedy: "Run cf auth login.",
|
|
201
|
+
});
|
|
202
|
+
}
|
|
203
|
+
return toCredentials(config, (await response.json()), refreshToken);
|
|
204
|
+
}
|
|
205
|
+
export async function revokeToken(config, token) {
|
|
206
|
+
try {
|
|
207
|
+
const response = await postForm(config.auth.revocationEndpoint, {
|
|
208
|
+
token,
|
|
209
|
+
token_type_hint: "refresh_token",
|
|
210
|
+
client_id: config.auth.clientId,
|
|
211
|
+
});
|
|
212
|
+
return response.ok;
|
|
213
|
+
}
|
|
214
|
+
catch {
|
|
215
|
+
return false;
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
//# sourceMappingURL=oauth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oauth.js","sourceRoot":"","sources":["../../src/core/oauth.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { CefenseClient } from "./client.js";
|
|
2
|
+
import type { Project } from "./types.js";
|
|
3
|
+
export interface RepoLocation {
|
|
4
|
+
owner: string;
|
|
5
|
+
name: string;
|
|
6
|
+
fullName: string;
|
|
7
|
+
}
|
|
8
|
+
export declare function gitToplevel(cwd?: string): string | null;
|
|
9
|
+
export declare function parseGithubRemote(url: string): RepoLocation | null;
|
|
10
|
+
export declare function gitRemote(cwd?: string): RepoLocation | null;
|
|
11
|
+
export declare function defaultScope(cwd?: string): string;
|
|
12
|
+
export declare function parseRepoArgument(value: string): RepoLocation | null;
|
|
13
|
+
export declare function matchProject(projects: Project[], value: string): Project | null;
|
|
14
|
+
export interface ResolveOptions {
|
|
15
|
+
repo?: string;
|
|
16
|
+
cwd?: string;
|
|
17
|
+
pick?: (projects: Project[]) => Promise<Project | null>;
|
|
18
|
+
}
|
|
19
|
+
export interface Resolution {
|
|
20
|
+
project: Project;
|
|
21
|
+
source: "flag" | "environment" | "default" | "git" | "only" | "prompt";
|
|
22
|
+
}
|
|
23
|
+
export declare function resolveProject(client: CefenseClient, projects: Project[], options?: ResolveOptions): Promise<Resolution>;
|
|
24
|
+
//# sourceMappingURL=repo.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repo.d.ts","sourceRoot":"","sources":["../../src/core/repo.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAE1C,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;CAClB;AAeD,wBAAgB,WAAW,CAAC,GAAG,SAAgB,GAAG,MAAM,GAAG,IAAI,CAE9D;AAED,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI,CAiBlE;AAED,wBAAgB,SAAS,CAAC,GAAG,SAAgB,GAAG,YAAY,GAAG,IAAI,CAMlE;AAED,wBAAgB,YAAY,CAAC,GAAG,SAAgB,GAAG,MAAM,CAExD;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI,CAQpE;AAED,wBAAgB,YAAY,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,GAAG,IAAI,CAS/E;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,CAAC,QAAQ,EAAE,OAAO,EAAE,KAAK,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;CACzD;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS,GAAG,KAAK,GAAG,MAAM,GAAG,QAAQ,CAAC;CACxE;AAED,wBAAsB,cAAc,CAClC,MAAM,EAAE,aAAa,EACrB,QAAQ,EAAE,OAAO,EAAE,EACnB,OAAO,GAAE,cAAmB,GAC3B,OAAO,CAAC,UAAU,CAAC,CAyCrB"}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import { execFileSync } from "node:child_process";
|
|
2
|
+
import { readRepoDefault } from "./config.js";
|
|
3
|
+
import { UsageError } from "./errors.js";
|
|
4
|
+
function git(args, cwd) {
|
|
5
|
+
try {
|
|
6
|
+
return execFileSync("git", args, {
|
|
7
|
+
cwd,
|
|
8
|
+
encoding: "utf8",
|
|
9
|
+
stdio: ["ignore", "pipe", "ignore"],
|
|
10
|
+
timeout: 3000,
|
|
11
|
+
}).trim();
|
|
12
|
+
}
|
|
13
|
+
catch {
|
|
14
|
+
return null;
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
export function gitToplevel(cwd = process.cwd()) {
|
|
18
|
+
return git(["rev-parse", "--show-toplevel"], cwd);
|
|
19
|
+
}
|
|
20
|
+
export function parseGithubRemote(url) {
|
|
21
|
+
const cleaned = url.trim().replace(/\.git$/i, "");
|
|
22
|
+
const patterns = [
|
|
23
|
+
/^git@github\.com:([^/]+)\/(.+)$/i,
|
|
24
|
+
/^ssh:\/\/git@github\.com\/([^/]+)\/(.+)$/i,
|
|
25
|
+
/^https?:\/\/(?:[^@]+@)?github\.com\/([^/]+)\/([^/]+)/i,
|
|
26
|
+
/^github\.com\/([^/]+)\/([^/]+)/i,
|
|
27
|
+
];
|
|
28
|
+
for (const pattern of patterns) {
|
|
29
|
+
const match = cleaned.match(pattern);
|
|
30
|
+
if (match?.[1] && match[2]) {
|
|
31
|
+
const owner = match[1];
|
|
32
|
+
const name = match[2].split("/")[0];
|
|
33
|
+
return { owner, name, fullName: `${owner}/${name}` };
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
return null;
|
|
37
|
+
}
|
|
38
|
+
export function gitRemote(cwd = process.cwd()) {
|
|
39
|
+
const url = git(["remote", "get-url", "origin"], cwd) ??
|
|
40
|
+
git(["remote", "get-url", "upstream"], cwd) ??
|
|
41
|
+
null;
|
|
42
|
+
return url ? parseGithubRemote(url) : null;
|
|
43
|
+
}
|
|
44
|
+
export function defaultScope(cwd = process.cwd()) {
|
|
45
|
+
return gitToplevel(cwd) ?? cwd;
|
|
46
|
+
}
|
|
47
|
+
export function parseRepoArgument(value) {
|
|
48
|
+
const fromUrl = parseGithubRemote(value);
|
|
49
|
+
if (fromUrl)
|
|
50
|
+
return fromUrl;
|
|
51
|
+
const parts = value.trim().replace(/^\/+|\/+$/g, "").split("/");
|
|
52
|
+
if (parts.length === 2 && parts[0] && parts[1]) {
|
|
53
|
+
return { owner: parts[0], name: parts[1], fullName: `${parts[0]}/${parts[1]}` };
|
|
54
|
+
}
|
|
55
|
+
return null;
|
|
56
|
+
}
|
|
57
|
+
export function matchProject(projects, value) {
|
|
58
|
+
const location = parseRepoArgument(value);
|
|
59
|
+
const wanted = (location?.fullName ?? value).toLowerCase();
|
|
60
|
+
return (projects.find((project) => project.fullName.toLowerCase() === wanted) ??
|
|
61
|
+
projects.find((project) => project.githubRepoId === value) ??
|
|
62
|
+
projects.find((project) => project.name.toLowerCase() === wanted) ??
|
|
63
|
+
null);
|
|
64
|
+
}
|
|
65
|
+
export async function resolveProject(client, projects, options = {}) {
|
|
66
|
+
void client;
|
|
67
|
+
const cwd = options.cwd ?? process.cwd();
|
|
68
|
+
if (projects.length === 0) {
|
|
69
|
+
throw new UsageError("No repositories are connected yet.", "Run cf repo connect.");
|
|
70
|
+
}
|
|
71
|
+
const explicit = options.repo ?? process.env.CEFENSE_REPO;
|
|
72
|
+
if (explicit) {
|
|
73
|
+
const match = matchProject(projects, explicit);
|
|
74
|
+
if (!match) {
|
|
75
|
+
throw new UsageError(`${explicit} is not connected to Cefense.`, `Run cf repo connect ${explicit}.`);
|
|
76
|
+
}
|
|
77
|
+
return { project: match, source: options.repo ? "flag" : "environment" };
|
|
78
|
+
}
|
|
79
|
+
const scope = defaultScope(cwd);
|
|
80
|
+
const stored = readRepoDefault(scope);
|
|
81
|
+
if (stored) {
|
|
82
|
+
const match = matchProject(projects, stored.fullName) ?? matchProject(projects, stored.githubRepoId);
|
|
83
|
+
if (match)
|
|
84
|
+
return { project: match, source: "default" };
|
|
85
|
+
}
|
|
86
|
+
const remote = gitRemote(cwd);
|
|
87
|
+
if (remote) {
|
|
88
|
+
const match = matchProject(projects, remote.fullName);
|
|
89
|
+
if (match)
|
|
90
|
+
return { project: match, source: "git" };
|
|
91
|
+
}
|
|
92
|
+
if (projects.length === 1)
|
|
93
|
+
return { project: projects[0], source: "only" };
|
|
94
|
+
if (options.pick) {
|
|
95
|
+
const picked = await options.pick(projects);
|
|
96
|
+
if (picked)
|
|
97
|
+
return { project: picked, source: "prompt" };
|
|
98
|
+
}
|
|
99
|
+
throw new UsageError("More than one repository is connected and none is selected here.", "Pass --repo owner/name, or set one with cf repo set-default.");
|
|
100
|
+
}
|
|
101
|
+
//# sourceMappingURL=repo.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repo.js","sourceRoot":"","sources":["../../src/core/repo.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { CefenseClient } from "./client.js";
|
|
2
|
+
import { type CredentialBackend } from "./credentials.js";
|
|
3
|
+
import type { CliConfigResponse, StoredCredentials } from "./types.js";
|
|
4
|
+
export interface GlobalOptions {
|
|
5
|
+
apiUrl?: string;
|
|
6
|
+
repo?: string;
|
|
7
|
+
json?: boolean;
|
|
8
|
+
color?: boolean;
|
|
9
|
+
verbose?: boolean;
|
|
10
|
+
yes?: boolean;
|
|
11
|
+
noLink?: boolean;
|
|
12
|
+
}
|
|
13
|
+
export interface Session {
|
|
14
|
+
apiUrl: string;
|
|
15
|
+
config: CliConfigResponse | null;
|
|
16
|
+
credentials: StoredCredentials | null;
|
|
17
|
+
backend: CredentialBackend;
|
|
18
|
+
client: CefenseClient;
|
|
19
|
+
}
|
|
20
|
+
export declare function openSession(options?: GlobalOptions, requirements?: {
|
|
21
|
+
auth?: boolean;
|
|
22
|
+
discovery?: boolean;
|
|
23
|
+
}): Promise<Session>;
|
|
24
|
+
//# sourceMappingURL=session.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/core/session.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,OAAO,EAAmB,KAAK,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAG3E,OAAO,KAAK,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAEvE,MAAM,WAAW,aAAa;IAC5B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,OAAO;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,iBAAiB,GAAG,IAAI,CAAC;IACjC,WAAW,EAAE,iBAAiB,GAAG,IAAI,CAAC;IACtC,OAAO,EAAE,iBAAiB,CAAC;IAC3B,MAAM,EAAE,aAAa,CAAC;CACvB;AAED,wBAAsB,WAAW,CAC/B,OAAO,GAAE,aAAkB,EAC3B,YAAY,GAAE;IAAE,IAAI,CAAC,EAAE,OAAO,CAAC;IAAC,SAAS,CAAC,EAAE,OAAO,CAAA;CAAO,GACzD,OAAO,CAAC,OAAO,CAAC,CA0BlB"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { CefenseClient } from "./client.js";
|
|
2
|
+
import { assertVersionSupported, fetchDiscovery } from "./discovery.js";
|
|
3
|
+
import { loadCredentials } from "./credentials.js";
|
|
4
|
+
import { resolveApiUrl } from "./config.js";
|
|
5
|
+
import { AuthRequiredError, CefenseError } from "./errors.js";
|
|
6
|
+
export async function openSession(options = {}, requirements = {}) {
|
|
7
|
+
const apiUrl = resolveApiUrl(options.apiUrl);
|
|
8
|
+
const { credentials, backend } = await loadCredentials(apiUrl);
|
|
9
|
+
let config = null;
|
|
10
|
+
if (requirements.discovery !== false) {
|
|
11
|
+
try {
|
|
12
|
+
config = await fetchDiscovery(apiUrl);
|
|
13
|
+
assertVersionSupported(config);
|
|
14
|
+
}
|
|
15
|
+
catch (error) {
|
|
16
|
+
if (requirements.auth || error instanceof CefenseError === false)
|
|
17
|
+
throw error;
|
|
18
|
+
config = null;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
if (requirements.auth && !credentials) {
|
|
22
|
+
throw new AuthRequiredError(`You are not signed in to ${apiUrl}.`);
|
|
23
|
+
}
|
|
24
|
+
return {
|
|
25
|
+
apiUrl,
|
|
26
|
+
config,
|
|
27
|
+
credentials,
|
|
28
|
+
backend,
|
|
29
|
+
client: new CefenseClient({ apiUrl, config, credentials }),
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=session.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/core/session.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,sBAAsB,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AACxE,OAAO,EAAE,eAAe,EAA0B,MAAM,kBAAkB,CAAC;AAC3E,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAqB9D,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,UAAyB,EAAE,EAC3B,eAAwD,EAAE;IAE1D,MAAM,MAAM,GAAG,aAAa,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAC7C,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,GAAG,MAAM,eAAe,CAAC,MAAM,CAAC,CAAC;IAE/D,IAAI,MAAM,GAA6B,IAAI,CAAC;IAC5C,IAAI,YAAY,CAAC,SAAS,KAAK,KAAK,EAAE,CAAC;QACrC,IAAI,CAAC;YACH,MAAM,GAAG,MAAM,cAAc,CAAC,MAAM,CAAC,CAAC;YACtC,sBAAsB,CAAC,MAAM,CAAC,CAAC;QACjC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,YAAY,CAAC,IAAI,IAAI,KAAK,YAAY,YAAY,KAAK,KAAK;gBAAE,MAAM,KAAK,CAAC;YAC9E,MAAM,GAAG,IAAI,CAAC;QAChB,CAAC;IACH,CAAC;IAED,IAAI,YAAY,CAAC,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;QACtC,MAAM,IAAI,iBAAiB,CAAC,4BAA4B,MAAM,GAAG,CAAC,CAAC;IACrE,CAAC;IAED,OAAO;QACL,MAAM;QACN,MAAM;QACN,WAAW;QACX,OAAO;QACP,MAAM,EAAE,IAAI,aAAa,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC;KAC3D,CAAC;AACJ,CAAC"}
|