@alwaysmeticulous/cli 2.298.1 → 2.300.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/dist/commands/auth/__tests__/list-projects.command.spec.d.ts +2 -0
- package/dist/commands/auth/__tests__/list-projects.command.spec.d.ts.map +1 -0
- package/dist/commands/auth/__tests__/list-projects.command.spec.js +108 -0
- package/dist/commands/auth/__tests__/list-projects.command.spec.js.map +1 -0
- package/dist/commands/auth/__tests__/login.command.spec.d.ts +2 -0
- package/dist/commands/auth/__tests__/login.command.spec.d.ts.map +1 -0
- package/dist/commands/auth/__tests__/login.command.spec.js +72 -0
- package/dist/commands/auth/__tests__/login.command.spec.js.map +1 -0
- package/dist/commands/auth/__tests__/logout.command.spec.d.ts +2 -0
- package/dist/commands/auth/__tests__/logout.command.spec.d.ts.map +1 -0
- package/dist/commands/auth/__tests__/logout.command.spec.js +80 -0
- package/dist/commands/auth/__tests__/logout.command.spec.js.map +1 -0
- package/dist/commands/auth/__tests__/whoami.command.spec.d.ts +2 -0
- package/dist/commands/auth/__tests__/whoami.command.spec.d.ts.map +1 -0
- package/dist/commands/auth/__tests__/whoami.command.spec.js +132 -0
- package/dist/commands/auth/__tests__/whoami.command.spec.js.map +1 -0
- package/dist/commands/auth/index.d.ts.map +1 -1
- package/dist/commands/auth/index.js +6 -2
- package/dist/commands/auth/index.js.map +1 -1
- package/dist/commands/auth/list-projects.command.d.ts +7 -0
- package/dist/commands/auth/list-projects.command.d.ts.map +1 -0
- package/dist/commands/auth/list-projects.command.js +66 -0
- package/dist/commands/auth/list-projects.command.js.map +1 -0
- package/dist/commands/auth/login.command.d.ts +7 -0
- package/dist/commands/auth/login.command.d.ts.map +1 -0
- package/dist/commands/auth/login.command.js +46 -0
- package/dist/commands/auth/login.command.js.map +1 -0
- package/dist/commands/auth/logout.command.d.ts.map +1 -1
- package/dist/commands/auth/logout.command.js +25 -4
- package/dist/commands/auth/logout.command.js.map +1 -1
- package/dist/commands/auth/set-project.command.d.ts +5 -1
- package/dist/commands/auth/set-project.command.d.ts.map +1 -1
- package/dist/commands/auth/set-project.command.js +12 -43
- package/dist/commands/auth/set-project.command.js.map +1 -1
- package/dist/commands/auth/whoami.command.d.ts.map +1 -1
- package/dist/commands/auth/whoami.command.js +37 -3
- package/dist/commands/auth/whoami.command.js.map +1 -1
- package/dist/utils/__tests__/select-project.spec.d.ts +2 -0
- package/dist/utils/__tests__/select-project.spec.d.ts.map +1 -0
- package/dist/utils/__tests__/select-project.spec.js +87 -0
- package/dist/utils/__tests__/select-project.spec.js.map +1 -0
- package/dist/utils/select-project.d.ts +25 -0
- package/dist/utils/select-project.d.ts.map +1 -0
- package/dist/utils/select-project.js +88 -0
- package/dist/utils/select-project.js.map +1 -0
- package/package.json +12 -12
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list-projects.command.spec.d.ts","sourceRoot":"","sources":["../../../../src/commands/auth/__tests__/list-projects.command.spec.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="cb5c0ab7-b558-5b29-9e23-e0af70db60b6")}catch(e){}}();
|
|
3
|
+
|
|
4
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
5
|
+
const vitest_1 = require("vitest");
|
|
6
|
+
const cli_user_error_1 = require("../../../utils/cli-user-error");
|
|
7
|
+
const list_projects_command_1 = require("../list-projects.command");
|
|
8
|
+
vitest_1.vi.mock("../../../command-utils/sentry.utils", () => ({
|
|
9
|
+
wrapHandler: (fn) => fn,
|
|
10
|
+
}));
|
|
11
|
+
const loggerMock = {
|
|
12
|
+
info: vitest_1.vi.fn(),
|
|
13
|
+
warn: vitest_1.vi.fn(),
|
|
14
|
+
error: vitest_1.vi.fn(),
|
|
15
|
+
debug: vitest_1.vi.fn(),
|
|
16
|
+
};
|
|
17
|
+
vitest_1.vi.mock("@alwaysmeticulous/common", () => ({
|
|
18
|
+
initLogger: () => loggerMock,
|
|
19
|
+
}));
|
|
20
|
+
const mocks = vitest_1.vi.hoisted(() => ({
|
|
21
|
+
getValidAccessToken: vitest_1.vi.fn(),
|
|
22
|
+
isInteractiveContext: vitest_1.vi.fn(),
|
|
23
|
+
performOAuthLogin: vitest_1.vi.fn(),
|
|
24
|
+
createClient: vitest_1.vi.fn(),
|
|
25
|
+
fetchAccessibleProjects: vitest_1.vi.fn(),
|
|
26
|
+
}));
|
|
27
|
+
vitest_1.vi.mock("@alwaysmeticulous/client", () => ({
|
|
28
|
+
getValidAccessToken: mocks.getValidAccessToken,
|
|
29
|
+
isInteractiveContext: mocks.isInteractiveContext,
|
|
30
|
+
performOAuthLogin: mocks.performOAuthLogin,
|
|
31
|
+
createClient: mocks.createClient,
|
|
32
|
+
}));
|
|
33
|
+
vitest_1.vi.mock("../../../utils/select-project", () => ({
|
|
34
|
+
fetchAccessibleProjects: mocks.fetchAccessibleProjects,
|
|
35
|
+
}));
|
|
36
|
+
const runHandler = (args = {}) => list_projects_command_1.listProjectsCommand.handler(args);
|
|
37
|
+
const project = (org, name, id) => ({
|
|
38
|
+
id,
|
|
39
|
+
name,
|
|
40
|
+
organization: { id: `${org}-id`, name: org },
|
|
41
|
+
});
|
|
42
|
+
(0, vitest_1.describe)("list-projects command", () => {
|
|
43
|
+
let stdout;
|
|
44
|
+
(0, vitest_1.beforeEach)(() => {
|
|
45
|
+
vitest_1.vi.clearAllMocks();
|
|
46
|
+
mocks.createClient.mockReturnValue({});
|
|
47
|
+
stdout = vitest_1.vi.spyOn(process.stdout, "write").mockImplementation(() => true);
|
|
48
|
+
});
|
|
49
|
+
(0, vitest_1.afterEach)(() => {
|
|
50
|
+
stdout.mockRestore();
|
|
51
|
+
});
|
|
52
|
+
const stdoutText = () => stdout.mock.calls.flat().join("");
|
|
53
|
+
(0, vitest_1.describe)("with a stored OAuth login", () => {
|
|
54
|
+
(0, vitest_1.beforeEach)(() => {
|
|
55
|
+
mocks.getValidAccessToken.mockResolvedValue("oauth-jwt");
|
|
56
|
+
});
|
|
57
|
+
(0, vitest_1.it)("writes one slug per line", async () => {
|
|
58
|
+
mocks.fetchAccessibleProjects.mockResolvedValue([
|
|
59
|
+
project("OrgA", "App1", "id-1"),
|
|
60
|
+
project("OrgB", "App2", "id-2"),
|
|
61
|
+
]);
|
|
62
|
+
await runHandler();
|
|
63
|
+
(0, vitest_1.expect)(mocks.performOAuthLogin).not.toHaveBeenCalled();
|
|
64
|
+
(0, vitest_1.expect)(stdoutText()).toBe("OrgA/App1\nOrgB/App2\n");
|
|
65
|
+
});
|
|
66
|
+
(0, vitest_1.it)("writes a JSON array with --json", async () => {
|
|
67
|
+
mocks.fetchAccessibleProjects.mockResolvedValue([
|
|
68
|
+
project("OrgA", "App1", "id-1"),
|
|
69
|
+
]);
|
|
70
|
+
await runHandler({ json: true });
|
|
71
|
+
const payload = JSON.parse(stdoutText());
|
|
72
|
+
(0, vitest_1.expect)(payload).toEqual([
|
|
73
|
+
{ id: "id-1", name: "App1", organization: { name: "OrgA" } },
|
|
74
|
+
]);
|
|
75
|
+
});
|
|
76
|
+
(0, vitest_1.it)("reports an empty account on stderr (human mode) and writes no slugs", async () => {
|
|
77
|
+
mocks.fetchAccessibleProjects.mockResolvedValue([]);
|
|
78
|
+
await runHandler();
|
|
79
|
+
(0, vitest_1.expect)(stdoutText()).toBe("");
|
|
80
|
+
(0, vitest_1.expect)(loggerMock.info.mock.calls.flat().join("\n")).toContain("No projects are accessible");
|
|
81
|
+
});
|
|
82
|
+
});
|
|
83
|
+
(0, vitest_1.describe)("without a stored OAuth login", () => {
|
|
84
|
+
(0, vitest_1.beforeEach)(() => {
|
|
85
|
+
mocks.getValidAccessToken.mockResolvedValue(null);
|
|
86
|
+
});
|
|
87
|
+
(0, vitest_1.it)("throws a CliUserError in a non-interactive context", async () => {
|
|
88
|
+
mocks.isInteractiveContext.mockReturnValue(false);
|
|
89
|
+
await (0, vitest_1.expect)(runHandler()).rejects.toBeInstanceOf(cli_user_error_1.CliUserError);
|
|
90
|
+
(0, vitest_1.expect)(mocks.performOAuthLogin).not.toHaveBeenCalled();
|
|
91
|
+
});
|
|
92
|
+
(0, vitest_1.it)("performs a browser login when interactive, then lists", async () => {
|
|
93
|
+
mocks.isInteractiveContext.mockReturnValue(true);
|
|
94
|
+
mocks.performOAuthLogin.mockResolvedValue({ accessToken: "fresh-jwt" });
|
|
95
|
+
mocks.fetchAccessibleProjects.mockResolvedValue([
|
|
96
|
+
project("OrgA", "App1", "id-1"),
|
|
97
|
+
]);
|
|
98
|
+
await runHandler();
|
|
99
|
+
(0, vitest_1.expect)(mocks.performOAuthLogin).toHaveBeenCalled();
|
|
100
|
+
(0, vitest_1.expect)(mocks.createClient).toHaveBeenCalledWith({
|
|
101
|
+
apiToken: "fresh-jwt",
|
|
102
|
+
});
|
|
103
|
+
(0, vitest_1.expect)(stdoutText()).toBe("OrgA/App1\n");
|
|
104
|
+
});
|
|
105
|
+
});
|
|
106
|
+
});
|
|
107
|
+
//# sourceMappingURL=list-projects.command.spec.js.map
|
|
108
|
+
//# debugId=cb5c0ab7-b558-5b29-9e23-e0af70db60b6
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list-projects.command.spec.js","sources":["../../../../src/commands/auth/__tests__/list-projects.command.spec.ts"],"sourceRoot":"","names":[],"mappings":"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","debugId":"cb5c0ab7-b558-5b29-9e23-e0af70db60b6"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"login.command.spec.d.ts","sourceRoot":"","sources":["../../../../src/commands/auth/__tests__/login.command.spec.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="7a211f87-87fa-56e6-86cc-766e3ab9e9f6")}catch(e){}}();
|
|
3
|
+
|
|
4
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
5
|
+
const vitest_1 = require("vitest");
|
|
6
|
+
const cli_user_error_1 = require("../../../utils/cli-user-error");
|
|
7
|
+
const login_command_1 = require("../login.command");
|
|
8
|
+
vitest_1.vi.mock("../../../command-utils/sentry.utils", () => ({
|
|
9
|
+
wrapHandler: (fn) => fn,
|
|
10
|
+
}));
|
|
11
|
+
const loggerMock = {
|
|
12
|
+
info: vitest_1.vi.fn(),
|
|
13
|
+
warn: vitest_1.vi.fn(),
|
|
14
|
+
error: vitest_1.vi.fn(),
|
|
15
|
+
debug: vitest_1.vi.fn(),
|
|
16
|
+
};
|
|
17
|
+
vitest_1.vi.mock("@alwaysmeticulous/common", () => ({
|
|
18
|
+
initLogger: () => loggerMock,
|
|
19
|
+
}));
|
|
20
|
+
const mocks = vitest_1.vi.hoisted(() => ({
|
|
21
|
+
clearStoredProject: vitest_1.vi.fn(),
|
|
22
|
+
createClient: vitest_1.vi.fn(),
|
|
23
|
+
isInteractiveContext: vitest_1.vi.fn(),
|
|
24
|
+
performOAuthLogin: vitest_1.vi.fn(),
|
|
25
|
+
selectAndStoreProject: vitest_1.vi.fn(),
|
|
26
|
+
}));
|
|
27
|
+
vitest_1.vi.mock("@alwaysmeticulous/client", () => ({
|
|
28
|
+
clearStoredProject: mocks.clearStoredProject,
|
|
29
|
+
createClient: mocks.createClient,
|
|
30
|
+
isInteractiveContext: mocks.isInteractiveContext,
|
|
31
|
+
performOAuthLogin: mocks.performOAuthLogin,
|
|
32
|
+
}));
|
|
33
|
+
vitest_1.vi.mock("../../../utils/select-project", () => ({
|
|
34
|
+
selectAndStoreProject: mocks.selectAndStoreProject,
|
|
35
|
+
}));
|
|
36
|
+
const runHandler = (args = {}) => login_command_1.loginCommand.handler(args);
|
|
37
|
+
(0, vitest_1.describe)("login command", () => {
|
|
38
|
+
(0, vitest_1.beforeEach)(() => {
|
|
39
|
+
vitest_1.vi.clearAllMocks();
|
|
40
|
+
mocks.createClient.mockReturnValue({});
|
|
41
|
+
mocks.performOAuthLogin.mockResolvedValue({ accessToken: "fresh-jwt" });
|
|
42
|
+
mocks.selectAndStoreProject.mockResolvedValue("Org/App");
|
|
43
|
+
});
|
|
44
|
+
(0, vitest_1.it)("throws a CliUserError in a non-interactive context and does not log in", async () => {
|
|
45
|
+
mocks.isInteractiveContext.mockReturnValue(false);
|
|
46
|
+
await (0, vitest_1.expect)(runHandler()).rejects.toBeInstanceOf(cli_user_error_1.CliUserError);
|
|
47
|
+
(0, vitest_1.expect)(mocks.performOAuthLogin).not.toHaveBeenCalled();
|
|
48
|
+
(0, vitest_1.expect)(mocks.clearStoredProject).not.toHaveBeenCalled();
|
|
49
|
+
});
|
|
50
|
+
(0, vitest_1.it)("logs in first, then clears the stale project and selects one", async () => {
|
|
51
|
+
mocks.isInteractiveContext.mockReturnValue(true);
|
|
52
|
+
await runHandler();
|
|
53
|
+
// The stale project is cleared only after a successful login, never before.
|
|
54
|
+
(0, vitest_1.expect)(mocks.performOAuthLogin.mock.invocationCallOrder[0]).toBeLessThan(mocks.clearStoredProject.mock.invocationCallOrder[0]);
|
|
55
|
+
(0, vitest_1.expect)(mocks.createClient).toHaveBeenCalledWith({ apiToken: "fresh-jwt" });
|
|
56
|
+
(0, vitest_1.expect)(mocks.selectAndStoreProject).toHaveBeenCalledWith(vitest_1.expect.objectContaining({ project: undefined }));
|
|
57
|
+
});
|
|
58
|
+
(0, vitest_1.it)("preserves the existing session when the browser login fails", async () => {
|
|
59
|
+
mocks.isInteractiveContext.mockReturnValue(true);
|
|
60
|
+
mocks.performOAuthLogin.mockRejectedValue(new Error("login cancelled"));
|
|
61
|
+
await (0, vitest_1.expect)(runHandler()).rejects.toThrow("login cancelled");
|
|
62
|
+
(0, vitest_1.expect)(mocks.clearStoredProject).not.toHaveBeenCalled();
|
|
63
|
+
(0, vitest_1.expect)(mocks.selectAndStoreProject).not.toHaveBeenCalled();
|
|
64
|
+
});
|
|
65
|
+
(0, vitest_1.it)("passes an explicit --project through to selection", async () => {
|
|
66
|
+
mocks.isInteractiveContext.mockReturnValue(true);
|
|
67
|
+
await runHandler({ project: "Org/App" });
|
|
68
|
+
(0, vitest_1.expect)(mocks.selectAndStoreProject).toHaveBeenCalledWith(vitest_1.expect.objectContaining({ project: "Org/App" }));
|
|
69
|
+
});
|
|
70
|
+
});
|
|
71
|
+
//# sourceMappingURL=login.command.spec.js.map
|
|
72
|
+
//# debugId=7a211f87-87fa-56e6-86cc-766e3ab9e9f6
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"login.command.spec.js","sources":["../../../../src/commands/auth/__tests__/login.command.spec.ts"],"sourceRoot":"","names":[],"mappings":"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","debugId":"7a211f87-87fa-56e6-86cc-766e3ab9e9f6"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logout.command.spec.d.ts","sourceRoot":"","sources":["../../../../src/commands/auth/__tests__/logout.command.spec.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="b691defa-b012-5038-9b9d-61d7c657c6d4")}catch(e){}}();
|
|
3
|
+
|
|
4
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
5
|
+
const vitest_1 = require("vitest");
|
|
6
|
+
const logout_command_1 = require("../logout.command");
|
|
7
|
+
vitest_1.vi.mock("../../../command-utils/sentry.utils", () => ({
|
|
8
|
+
wrapHandler: (fn) => fn,
|
|
9
|
+
}));
|
|
10
|
+
const loggerMock = {
|
|
11
|
+
info: vitest_1.vi.fn(),
|
|
12
|
+
warn: vitest_1.vi.fn(),
|
|
13
|
+
error: vitest_1.vi.fn(),
|
|
14
|
+
debug: vitest_1.vi.fn(),
|
|
15
|
+
};
|
|
16
|
+
vitest_1.vi.mock("@alwaysmeticulous/common", () => ({
|
|
17
|
+
initLogger: () => loggerMock,
|
|
18
|
+
}));
|
|
19
|
+
const mocks = vitest_1.vi.hoisted(() => ({
|
|
20
|
+
clearOAuthTokens: vitest_1.vi.fn(),
|
|
21
|
+
clearStoredProject: vitest_1.vi.fn(),
|
|
22
|
+
readFileBasedToken: vitest_1.vi.fn(),
|
|
23
|
+
}));
|
|
24
|
+
vitest_1.vi.mock("@alwaysmeticulous/client", () => ({
|
|
25
|
+
clearOAuthTokens: mocks.clearOAuthTokens,
|
|
26
|
+
clearStoredProject: mocks.clearStoredProject,
|
|
27
|
+
readFileBasedToken: mocks.readFileBasedToken,
|
|
28
|
+
}));
|
|
29
|
+
const runHandler = (args = {}) => logout_command_1.logoutCommand.handler(args);
|
|
30
|
+
const warnedText = () => loggerMock.warn.mock.calls.flat().join("\n");
|
|
31
|
+
(0, vitest_1.describe)("logout command", () => {
|
|
32
|
+
const originalEnvToken = process.env["METICULOUS_API_TOKEN"];
|
|
33
|
+
(0, vitest_1.beforeEach)(() => {
|
|
34
|
+
vitest_1.vi.clearAllMocks();
|
|
35
|
+
delete process.env["METICULOUS_API_TOKEN"];
|
|
36
|
+
mocks.readFileBasedToken.mockReturnValue(null);
|
|
37
|
+
});
|
|
38
|
+
(0, vitest_1.afterAll)(() => {
|
|
39
|
+
if (originalEnvToken === undefined) {
|
|
40
|
+
delete process.env["METICULOUS_API_TOKEN"];
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
process.env["METICULOUS_API_TOKEN"] = originalEnvToken;
|
|
44
|
+
}
|
|
45
|
+
});
|
|
46
|
+
(0, vitest_1.it)("clears OAuth tokens and the selected project", async () => {
|
|
47
|
+
await runHandler();
|
|
48
|
+
(0, vitest_1.expect)(mocks.clearOAuthTokens).toHaveBeenCalled();
|
|
49
|
+
(0, vitest_1.expect)(mocks.clearStoredProject).toHaveBeenCalled();
|
|
50
|
+
(0, vitest_1.expect)(warnedText()).toBe("");
|
|
51
|
+
});
|
|
52
|
+
(0, vitest_1.it)("does not clear anything on a dry run", async () => {
|
|
53
|
+
await runHandler({ dryRun: true });
|
|
54
|
+
(0, vitest_1.expect)(mocks.clearOAuthTokens).not.toHaveBeenCalled();
|
|
55
|
+
(0, vitest_1.expect)(mocks.clearStoredProject).not.toHaveBeenCalled();
|
|
56
|
+
});
|
|
57
|
+
(0, vitest_1.it)("warns when METICULOUS_API_TOKEN is still set", async () => {
|
|
58
|
+
process.env["METICULOUS_API_TOKEN"] = "still-here";
|
|
59
|
+
await runHandler();
|
|
60
|
+
(0, vitest_1.expect)(warnedText()).toContain("METICULOUS_API_TOKEN");
|
|
61
|
+
});
|
|
62
|
+
(0, vitest_1.it)("warns about a lingering config-file token, naming its path", async () => {
|
|
63
|
+
mocks.readFileBasedToken.mockReturnValue({
|
|
64
|
+
token: "file-token",
|
|
65
|
+
path: "/home/me/.meticulous/config.json",
|
|
66
|
+
});
|
|
67
|
+
await runHandler();
|
|
68
|
+
(0, vitest_1.expect)(warnedText()).toContain("/home/me/.meticulous/config.json");
|
|
69
|
+
});
|
|
70
|
+
(0, vitest_1.it)("does not fail logout when the config file is malformed", async () => {
|
|
71
|
+
mocks.clearOAuthTokens.mockClear();
|
|
72
|
+
mocks.readFileBasedToken.mockImplementation(() => {
|
|
73
|
+
throw new SyntaxError("Unexpected token in JSON");
|
|
74
|
+
});
|
|
75
|
+
await (0, vitest_1.expect)(runHandler()).resolves.toBeUndefined();
|
|
76
|
+
(0, vitest_1.expect)(mocks.clearOAuthTokens).toHaveBeenCalled();
|
|
77
|
+
});
|
|
78
|
+
});
|
|
79
|
+
//# sourceMappingURL=logout.command.spec.js.map
|
|
80
|
+
//# debugId=b691defa-b012-5038-9b9d-61d7c657c6d4
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logout.command.spec.js","sources":["../../../../src/commands/auth/__tests__/logout.command.spec.ts"],"sourceRoot":"","names":[],"mappings":";;;;AAAA,mCAAwE;AACxE,sDAAkD;AAElD,WAAE,CAAC,IAAI,CAAC,qCAAqC,EAAE,GAAG,EAAE,CAAC,CAAC;IACpD,WAAW,EAAE,CAAC,EAAyC,EAAE,EAAE,CAAC,EAAE;CAC/D,CAAC,CAAC,CAAC;AAEJ,MAAM,UAAU,GAAG;IACjB,IAAI,EAAE,WAAE,CAAC,EAAE,EAAE;IACb,IAAI,EAAE,WAAE,CAAC,EAAE,EAAE;IACb,KAAK,EAAE,WAAE,CAAC,EAAE,EAAE;IACd,KAAK,EAAE,WAAE,CAAC,EAAE,EAAE;CACf,CAAC;AAEF,WAAE,CAAC,IAAI,CAAC,0BAA0B,EAAE,GAAG,EAAE,CAAC,CAAC;IACzC,UAAU,EAAE,GAAG,EAAE,CAAC,UAAU;CAC7B,CAAC,CAAC,CAAC;AAEJ,MAAM,KAAK,GAAG,WAAE,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IAC9B,gBAAgB,EAAE,WAAE,CAAC,EAAE,EAAE;IACzB,kBAAkB,EAAE,WAAE,CAAC,EAAE,EAAE;IAC3B,kBAAkB,EAAE,WAAE,CAAC,EAAE,EAAE;CAC5B,CAAC,CAAC,CAAC;AAEJ,WAAE,CAAC,IAAI,CAAC,0BAA0B,EAAE,GAAG,EAAE,CAAC,CAAC;IACzC,gBAAgB,EAAE,KAAK,CAAC,gBAAgB;IACxC,kBAAkB,EAAE,KAAK,CAAC,kBAAkB;IAC5C,kBAAkB,EAAE,KAAK,CAAC,kBAAkB;CAC7C,CAAC,CAAC,CAAC;AAEJ,MAAM,UAAU,GAAG,CAAC,OAA6B,EAAE,EAAE,EAAE,CACpD,8BAA+D,CAAC,OAAO,CACtE,IAAI,CACL,CAAC;AAEJ,MAAM,UAAU,GAAG,GAAG,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAEtE,IAAA,iBAAQ,EAAC,gBAAgB,EAAE,GAAG,EAAE;IAC9B,MAAM,gBAAgB,GAAG,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;IAE7D,IAAA,mBAAU,EAAC,GAAG,EAAE;QACd,WAAE,CAAC,aAAa,EAAE,CAAC;QACnB,OAAO,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;QAC3C,KAAK,CAAC,kBAAkB,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,IAAA,iBAAQ,EAAC,GAAG,EAAE;QACZ,IAAI,gBAAgB,KAAK,SAAS,EAAE,CAAC;YACnC,OAAO,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;QAC7C,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,GAAG,gBAAgB,CAAC;QACzD,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,8CAA8C,EAAE,KAAK,IAAI,EAAE;QAC5D,MAAM,UAAU,EAAE,CAAC;QAEnB,IAAA,eAAM,EAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC,gBAAgB,EAAE,CAAC;QAClD,IAAA,eAAM,EAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC,gBAAgB,EAAE,CAAC;QACpD,IAAA,eAAM,EAAC,UAAU,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAChC,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,sCAAsC,EAAE,KAAK,IAAI,EAAE;QACpD,MAAM,UAAU,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;QAEnC,IAAA,eAAM,EAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;QACtD,IAAA,eAAM,EAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;IAC1D,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,8CAA8C,EAAE,KAAK,IAAI,EAAE;QAC5D,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,GAAG,YAAY,CAAC;QAEnD,MAAM,UAAU,EAAE,CAAC;QAEnB,IAAA,eAAM,EAAC,UAAU,EAAE,CAAC,CAAC,SAAS,CAAC,sBAAsB,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,4DAA4D,EAAE,KAAK,IAAI,EAAE;QAC1E,KAAK,CAAC,kBAAkB,CAAC,eAAe,CAAC;YACvC,KAAK,EAAE,YAAY;YACnB,IAAI,EAAE,kCAAkC;SACzC,CAAC,CAAC;QAEH,MAAM,UAAU,EAAE,CAAC;QAEnB,IAAA,eAAM,EAAC,UAAU,EAAE,CAAC,CAAC,SAAS,CAAC,kCAAkC,CAAC,CAAC;IACrE,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,wDAAwD,EAAE,KAAK,IAAI,EAAE;QACtE,KAAK,CAAC,gBAAgB,CAAC,SAAS,EAAE,CAAC;QACnC,KAAK,CAAC,kBAAkB,CAAC,kBAAkB,CAAC,GAAG,EAAE;YAC/C,MAAM,IAAI,WAAW,CAAC,0BAA0B,CAAC,CAAC;QACpD,CAAC,CAAC,CAAC;QAEH,MAAM,IAAA,eAAM,EAAC,UAAU,EAAE,CAAC,CAAC,QAAQ,CAAC,aAAa,EAAE,CAAC;QACpD,IAAA,eAAM,EAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC,gBAAgB,EAAE,CAAC;IACpD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","debugId":"b691defa-b012-5038-9b9d-61d7c657c6d4"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"whoami.command.spec.d.ts","sourceRoot":"","sources":["../../../../src/commands/auth/__tests__/whoami.command.spec.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="9b6c0776-62bb-5d0e-87d3-41367dd26c55")}catch(e){}}();
|
|
3
|
+
|
|
4
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
5
|
+
const vitest_1 = require("vitest");
|
|
6
|
+
const whoami_command_1 = require("../whoami.command");
|
|
7
|
+
// Make wrapHandler a passthrough so handler errors propagate directly to tests
|
|
8
|
+
// rather than being swallowed by process.exit().
|
|
9
|
+
vitest_1.vi.mock("../../../command-utils/sentry.utils", () => ({
|
|
10
|
+
wrapHandler: (fn) => fn,
|
|
11
|
+
}));
|
|
12
|
+
const loggerMock = {
|
|
13
|
+
info: vitest_1.vi.fn(),
|
|
14
|
+
warn: vitest_1.vi.fn(),
|
|
15
|
+
error: vitest_1.vi.fn(),
|
|
16
|
+
debug: vitest_1.vi.fn(),
|
|
17
|
+
};
|
|
18
|
+
vitest_1.vi.mock("@alwaysmeticulous/common", () => ({
|
|
19
|
+
initLogger: () => loggerMock,
|
|
20
|
+
}));
|
|
21
|
+
const mocks = vitest_1.vi.hoisted(() => ({
|
|
22
|
+
resolveApiTokenWithOAuth: vitest_1.vi.fn(),
|
|
23
|
+
isOAuthJwt: vitest_1.vi.fn(),
|
|
24
|
+
createClient: vitest_1.vi.fn(),
|
|
25
|
+
getWhoami: vitest_1.vi.fn(),
|
|
26
|
+
getStoredProject: vitest_1.vi.fn(),
|
|
27
|
+
getProject: vitest_1.vi.fn(),
|
|
28
|
+
}));
|
|
29
|
+
vitest_1.vi.mock("@alwaysmeticulous/client", () => ({
|
|
30
|
+
resolveApiTokenWithOAuth: mocks.resolveApiTokenWithOAuth,
|
|
31
|
+
isOAuthJwt: mocks.isOAuthJwt,
|
|
32
|
+
createClient: mocks.createClient,
|
|
33
|
+
getWhoami: mocks.getWhoami,
|
|
34
|
+
getStoredProject: mocks.getStoredProject,
|
|
35
|
+
getProject: mocks.getProject,
|
|
36
|
+
}));
|
|
37
|
+
vitest_1.vi.mock("../../../utils/handle-auth-failure", () => ({
|
|
38
|
+
handleAuthFailure: vitest_1.vi.fn().mockReturnValue(false),
|
|
39
|
+
}));
|
|
40
|
+
const runHandler = () => whoami_command_1.whoamiCommand.handler({});
|
|
41
|
+
const loggedText = () => loggerMock.info.mock.calls.flat().join("\n");
|
|
42
|
+
const FAKE_WHOAMI = {
|
|
43
|
+
email: "alice@example.com",
|
|
44
|
+
firstName: "Alice",
|
|
45
|
+
lastName: "Smith",
|
|
46
|
+
isAdmin: false,
|
|
47
|
+
organizations: [],
|
|
48
|
+
};
|
|
49
|
+
(0, vitest_1.describe)("whoami command", () => {
|
|
50
|
+
const originalEnvToken = process.env["METICULOUS_API_TOKEN"];
|
|
51
|
+
(0, vitest_1.beforeEach)(() => {
|
|
52
|
+
vitest_1.vi.clearAllMocks();
|
|
53
|
+
delete process.env["METICULOUS_API_TOKEN"];
|
|
54
|
+
mocks.createClient.mockReturnValue({});
|
|
55
|
+
mocks.getWhoami.mockResolvedValue(FAKE_WHOAMI);
|
|
56
|
+
mocks.getStoredProject.mockReturnValue(null);
|
|
57
|
+
mocks.getProject.mockResolvedValue(null);
|
|
58
|
+
});
|
|
59
|
+
(0, vitest_1.afterAll)(() => {
|
|
60
|
+
if (originalEnvToken === undefined) {
|
|
61
|
+
delete process.env["METICULOUS_API_TOKEN"];
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
process.env["METICULOUS_API_TOKEN"] = originalEnvToken;
|
|
65
|
+
}
|
|
66
|
+
});
|
|
67
|
+
(0, vitest_1.describe)("OAuth token", () => {
|
|
68
|
+
(0, vitest_1.beforeEach)(() => {
|
|
69
|
+
mocks.resolveApiTokenWithOAuth.mockResolvedValue("oauth-jwt");
|
|
70
|
+
mocks.isOAuthJwt.mockReturnValue(true);
|
|
71
|
+
});
|
|
72
|
+
(0, vitest_1.it)("reports the OAuth user and skips the project-token path", async () => {
|
|
73
|
+
await runHandler();
|
|
74
|
+
(0, vitest_1.expect)(mocks.getWhoami).toHaveBeenCalled();
|
|
75
|
+
(0, vitest_1.expect)(mocks.getProject).not.toHaveBeenCalled();
|
|
76
|
+
const logged = loggedText();
|
|
77
|
+
(0, vitest_1.expect)(logged).toContain("Authenticated via: OAuth");
|
|
78
|
+
(0, vitest_1.expect)(logged).toContain("alice@example.com");
|
|
79
|
+
(0, vitest_1.expect)(logged).toContain("Alice Smith");
|
|
80
|
+
});
|
|
81
|
+
(0, vitest_1.it)("logs organizations with their role", async () => {
|
|
82
|
+
mocks.getWhoami.mockResolvedValue({
|
|
83
|
+
...FAKE_WHOAMI,
|
|
84
|
+
organizations: [{ id: "org-1", name: "Acme", role: "owner" }],
|
|
85
|
+
});
|
|
86
|
+
await runHandler();
|
|
87
|
+
(0, vitest_1.expect)(loggedText()).toContain("Acme (owner)");
|
|
88
|
+
});
|
|
89
|
+
(0, vitest_1.it)("logs the selected project when one is stored", async () => {
|
|
90
|
+
mocks.getStoredProject.mockReturnValue("Acme/my-project");
|
|
91
|
+
await runHandler();
|
|
92
|
+
(0, vitest_1.expect)(loggedText()).toContain("Acme/my-project");
|
|
93
|
+
});
|
|
94
|
+
(0, vitest_1.it)("prompts to set a project when none is selected", async () => {
|
|
95
|
+
mocks.getStoredProject.mockReturnValue(null);
|
|
96
|
+
await runHandler();
|
|
97
|
+
(0, vitest_1.expect)(loggedText()).toContain("auth set-project");
|
|
98
|
+
});
|
|
99
|
+
});
|
|
100
|
+
(0, vitest_1.describe)("project API token", () => {
|
|
101
|
+
(0, vitest_1.beforeEach)(() => {
|
|
102
|
+
mocks.resolveApiTokenWithOAuth.mockResolvedValue("project-token");
|
|
103
|
+
mocks.isOAuthJwt.mockReturnValue(false);
|
|
104
|
+
});
|
|
105
|
+
(0, vitest_1.it)("reports the env var as the source and never calls getWhoami", async () => {
|
|
106
|
+
process.env["METICULOUS_API_TOKEN"] = "project-token";
|
|
107
|
+
await runHandler();
|
|
108
|
+
(0, vitest_1.expect)(mocks.getWhoami).not.toHaveBeenCalled();
|
|
109
|
+
(0, vitest_1.expect)(loggedText()).toContain("project API token (METICULOUS_API_TOKEN environment variable)");
|
|
110
|
+
});
|
|
111
|
+
(0, vitest_1.it)("reports the config file as the source when the env var is unset", async () => {
|
|
112
|
+
await runHandler();
|
|
113
|
+
(0, vitest_1.expect)(loggedText()).toContain("project API token (~/.meticulous/config.json)");
|
|
114
|
+
});
|
|
115
|
+
(0, vitest_1.it)("shows the pinned project resolved via token-info", async () => {
|
|
116
|
+
mocks.getProject.mockResolvedValue({
|
|
117
|
+
id: "p1",
|
|
118
|
+
name: "App",
|
|
119
|
+
organization: { id: "o1", name: "Org" },
|
|
120
|
+
});
|
|
121
|
+
await runHandler();
|
|
122
|
+
(0, vitest_1.expect)(loggedText()).toContain("Pinned project: Org/App");
|
|
123
|
+
});
|
|
124
|
+
(0, vitest_1.it)("swallows token-info failures without failing whoami", async () => {
|
|
125
|
+
mocks.getProject.mockRejectedValue(new Error("boom"));
|
|
126
|
+
await (0, vitest_1.expect)(runHandler()).resolves.toBeUndefined();
|
|
127
|
+
(0, vitest_1.expect)(loggedText()).toContain("scoped to a single project");
|
|
128
|
+
});
|
|
129
|
+
});
|
|
130
|
+
});
|
|
131
|
+
//# sourceMappingURL=whoami.command.spec.js.map
|
|
132
|
+
//# debugId=9b6c0776-62bb-5d0e-87d3-41367dd26c55
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"whoami.command.spec.js","sources":["../../../../src/commands/auth/__tests__/whoami.command.spec.ts"],"sourceRoot":"","names":[],"mappings":"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","debugId":"9b6c0776-62bb-5d0e-87d3-41367dd26c55"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/auth/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/auth/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAQ3C,eAAO,MAAM,WAAW,EAAE,aAgBzB,CAAC"}
|
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="
|
|
2
|
+
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="9b0610de-36fb-54ca-bc31-8d6bf85d065a")}catch(e){}}();
|
|
3
3
|
|
|
4
4
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
5
5
|
exports.authCommand = void 0;
|
|
6
|
+
const list_projects_command_1 = require("./list-projects.command");
|
|
7
|
+
const login_command_1 = require("./login.command");
|
|
6
8
|
const logout_command_1 = require("./logout.command");
|
|
7
9
|
const set_project_command_1 = require("./set-project.command");
|
|
8
10
|
const unset_project_command_1 = require("./unset-project.command");
|
|
@@ -11,10 +13,12 @@ exports.authCommand = {
|
|
|
11
13
|
command: "auth",
|
|
12
14
|
describe: "Authentication commands",
|
|
13
15
|
builder: (yargs) => yargs
|
|
16
|
+
.command(login_command_1.loginCommand)
|
|
14
17
|
.command(whoami_command_1.whoamiCommand)
|
|
15
18
|
.command(logout_command_1.logoutCommand)
|
|
16
19
|
.command(set_project_command_1.setProjectCommand)
|
|
17
20
|
.command(unset_project_command_1.unsetProjectCommand)
|
|
21
|
+
.command(list_projects_command_1.listProjectsCommand)
|
|
18
22
|
.demandCommand()
|
|
19
23
|
.help(),
|
|
20
24
|
handler: () => {
|
|
@@ -22,4 +26,4 @@ exports.authCommand = {
|
|
|
22
26
|
},
|
|
23
27
|
};
|
|
24
28
|
//# sourceMappingURL=index.js.map
|
|
25
|
-
//# debugId=
|
|
29
|
+
//# debugId=9b0610de-36fb-54ca-bc31-8d6bf85d065a
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../src/commands/auth/index.ts"],"sourceRoot":"","names":[],"mappings":";;;;;AACA,qDAAiD;AACjD,+DAA0D;AAC1D,mEAA8D;AAC9D,qDAAiD;AAEpC,QAAA,WAAW,GAAkB;IACxC,OAAO,EAAE,MAAM;IACf,QAAQ,EAAE,yBAAyB;IACnC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CACjB,KAAK;SACF,OAAO,CAAC,8BAAa,CAAC;SACtB,OAAO,CAAC,8BAAa,CAAC;SACtB,OAAO,CAAC,uCAAiB,CAAC;SAC1B,OAAO,CAAC,2CAAmB,CAAC;SAC5B,aAAa,EAAE;SACf,IAAI,EAAE;IACX,OAAO,EAAE,GAAG,EAAE;QACZ,0BAA0B;IAC5B,CAAC;CACF,CAAC","debugId":"
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../src/commands/auth/index.ts"],"sourceRoot":"","names":[],"mappings":";;;;;AACA,mEAA8D;AAC9D,mDAA+C;AAC/C,qDAAiD;AACjD,+DAA0D;AAC1D,mEAA8D;AAC9D,qDAAiD;AAEpC,QAAA,WAAW,GAAkB;IACxC,OAAO,EAAE,MAAM;IACf,QAAQ,EAAE,yBAAyB;IACnC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CACjB,KAAK;SACF,OAAO,CAAC,4BAAY,CAAC;SACrB,OAAO,CAAC,8BAAa,CAAC;SACtB,OAAO,CAAC,8BAAa,CAAC;SACtB,OAAO,CAAC,uCAAiB,CAAC;SAC1B,OAAO,CAAC,2CAAmB,CAAC;SAC5B,OAAO,CAAC,2CAAmB,CAAC;SAC5B,aAAa,EAAE;SACf,IAAI,EAAE;IACX,OAAO,EAAE,GAAG,EAAE;QACZ,0BAA0B;IAC5B,CAAC;CACF,CAAC","debugId":"9b0610de-36fb-54ca-bc31-8d6bf85d065a"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list-projects.command.d.ts","sourceRoot":"","sources":["../../../src/commands/auth/list-projects.command.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAK3C,UAAU,OAAO;IACf,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,eAAO,MAAM,mBAAmB,EAAE,aAAa,CAAC,OAAO,EAAE,OAAO,CA4C/D,CAAC"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="c51ff4e2-4e66-55a0-a12f-333f055b9d13")}catch(e){}}();
|
|
3
|
+
|
|
4
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
5
|
+
exports.listProjectsCommand = void 0;
|
|
6
|
+
const client_1 = require("@alwaysmeticulous/client");
|
|
7
|
+
const common_1 = require("@alwaysmeticulous/common");
|
|
8
|
+
const sentry_utils_1 = require("../../command-utils/sentry.utils");
|
|
9
|
+
const cli_user_error_1 = require("../../utils/cli-user-error");
|
|
10
|
+
const select_project_1 = require("../../utils/select-project");
|
|
11
|
+
exports.listProjectsCommand = {
|
|
12
|
+
command: "list-projects",
|
|
13
|
+
describe: "List all Meticulous projects accessible to the authenticated user",
|
|
14
|
+
builder: {
|
|
15
|
+
json: {
|
|
16
|
+
boolean: true,
|
|
17
|
+
description: "Output projects as a JSON array of {id, name, organization: {name}} " +
|
|
18
|
+
"instead of one 'organization/project' slug per line.",
|
|
19
|
+
default: false,
|
|
20
|
+
},
|
|
21
|
+
},
|
|
22
|
+
handler: (0, sentry_utils_1.wrapHandler)(async ({ json }) => {
|
|
23
|
+
const logger = (0, common_1.initLogger)();
|
|
24
|
+
// Enumerating the user's projects is an OAuth-only operation: a
|
|
25
|
+
// project-scoped API token (env var or legacy config) is bound to a single
|
|
26
|
+
// project and cannot list the rest. Rather than asking the user to log out
|
|
27
|
+
// of that token, we just use their OAuth login — performing one now if
|
|
28
|
+
// there isn't a stored one yet (interactive only; CI can't show a browser).
|
|
29
|
+
const apiToken = await resolveOAuthToken();
|
|
30
|
+
const client = (0, client_1.createClient)({ apiToken });
|
|
31
|
+
const projects = await (0, select_project_1.fetchAccessibleProjects)(client);
|
|
32
|
+
if (json) {
|
|
33
|
+
const payload = projects.map((p) => ({
|
|
34
|
+
id: p.id,
|
|
35
|
+
name: p.name,
|
|
36
|
+
organization: { name: p.organization.name },
|
|
37
|
+
}));
|
|
38
|
+
process.stdout.write(JSON.stringify(payload, null, 2) + "\n");
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
if (projects.length === 0) {
|
|
42
|
+
logger.info("No projects are accessible to your account.");
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
for (const p of projects) {
|
|
46
|
+
process.stdout.write(`${p.organization.name}/${p.name}\n`);
|
|
47
|
+
}
|
|
48
|
+
}),
|
|
49
|
+
};
|
|
50
|
+
const resolveOAuthToken = async () => {
|
|
51
|
+
const oauthToken = await (0, client_1.getValidAccessToken)();
|
|
52
|
+
if (oauthToken) {
|
|
53
|
+
return oauthToken;
|
|
54
|
+
}
|
|
55
|
+
if (!(0, client_1.isInteractiveContext)()) {
|
|
56
|
+
throw new cli_user_error_1.CliUserError("`meticulous auth list-projects` lists the projects your user account " +
|
|
57
|
+
"can access, which requires an OAuth login. Run it from an " +
|
|
58
|
+
"interactive terminal to log in via the browser. (A project-scoped " +
|
|
59
|
+
"METICULOUS_API_TOKEN or ~/.meticulous/config.json token cannot " +
|
|
60
|
+
"enumerate projects.)");
|
|
61
|
+
}
|
|
62
|
+
const tokens = await (0, client_1.performOAuthLogin)();
|
|
63
|
+
return tokens.accessToken;
|
|
64
|
+
};
|
|
65
|
+
//# sourceMappingURL=list-projects.command.js.map
|
|
66
|
+
//# debugId=c51ff4e2-4e66-55a0-a12f-333f055b9d13
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list-projects.command.js","sources":["../../../src/commands/auth/list-projects.command.ts"],"sourceRoot":"","names":[],"mappings":";;;;;AAAA,qDAKkC;AAClC,qDAAsD;AAEtD,mEAA+D;AAC/D,+DAA0D;AAC1D,+DAAqE;AAMxD,QAAA,mBAAmB,GAAoC;IAClE,OAAO,EAAE,eAAe;IACxB,QAAQ,EAAE,mEAAmE;IAC7E,OAAO,EAAE;QACP,IAAI,EAAE;YACJ,OAAO,EAAE,IAAI;YACb,WAAW,EACT,sEAAsE;gBACtE,sDAAsD;YACxD,OAAO,EAAE,KAAK;SACf;KACF;IACD,OAAO,EAAE,IAAA,0BAAW,EAAC,KAAK,EAAE,EAAE,IAAI,EAAW,EAAE,EAAE;QAC/C,MAAM,MAAM,GAAG,IAAA,mBAAU,GAAE,CAAC;QAE5B,gEAAgE;QAChE,2EAA2E;QAC3E,2EAA2E;QAC3E,uEAAuE;QACvE,4EAA4E;QAC5E,MAAM,QAAQ,GAAG,MAAM,iBAAiB,EAAE,CAAC;QAE3C,MAAM,MAAM,GAAG,IAAA,qBAAY,EAAC,EAAE,QAAQ,EAAE,CAAC,CAAC;QAC1C,MAAM,QAAQ,GAAG,MAAM,IAAA,wCAAuB,EAAC,MAAM,CAAC,CAAC;QAEvD,IAAI,IAAI,EAAE,CAAC;YACT,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBACnC,EAAE,EAAE,CAAC,CAAC,EAAE;gBACR,IAAI,EAAE,CAAC,CAAC,IAAI;gBACZ,YAAY,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,YAAY,CAAC,IAAI,EAAE;aAC5C,CAAC,CAAC,CAAC;YACJ,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;YAC9D,OAAO;QACT,CAAC;QAED,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1B,MAAM,CAAC,IAAI,CAAC,6CAA6C,CAAC,CAAC;YAC3D,OAAO;QACT,CAAC;QAED,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;YACzB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,YAAY,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC;QAC7D,CAAC;IACH,CAAC,CAAC;CACH,CAAC;AAEF,MAAM,iBAAiB,GAAG,KAAK,IAAqB,EAAE;IACpD,MAAM,UAAU,GAAG,MAAM,IAAA,4BAAmB,GAAE,CAAC;IAC/C,IAAI,UAAU,EAAE,CAAC;QACf,OAAO,UAAU,CAAC;IACpB,CAAC;IAED,IAAI,CAAC,IAAA,6BAAoB,GAAE,EAAE,CAAC;QAC5B,MAAM,IAAI,6BAAY,CACpB,uEAAuE;YACrE,4DAA4D;YAC5D,oEAAoE;YACpE,iEAAiE;YACjE,sBAAsB,CACzB,CAAC;IACJ,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,IAAA,0BAAiB,GAAE,CAAC;IACzC,OAAO,MAAM,CAAC,WAAW,CAAC;AAC5B,CAAC,CAAC","debugId":"c51ff4e2-4e66-55a0-a12f-333f055b9d13"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"login.command.d.ts","sourceRoot":"","sources":["../../../src/commands/auth/login.command.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAK3C,UAAU,OAAO;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,eAAO,MAAM,YAAY,EAAE,aAAa,CAAC,OAAO,EAAE,OAAO,CA4CxD,CAAC"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="cf9ee091-8093-5037-8d6a-a448d5dc40cc")}catch(e){}}();
|
|
3
|
+
|
|
4
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
5
|
+
exports.loginCommand = void 0;
|
|
6
|
+
const client_1 = require("@alwaysmeticulous/client");
|
|
7
|
+
const common_1 = require("@alwaysmeticulous/common");
|
|
8
|
+
const sentry_utils_1 = require("../../command-utils/sentry.utils");
|
|
9
|
+
const cli_user_error_1 = require("../../utils/cli-user-error");
|
|
10
|
+
const select_project_1 = require("../../utils/select-project");
|
|
11
|
+
exports.loginCommand = {
|
|
12
|
+
command: "login",
|
|
13
|
+
describe: "Log in to Meticulous via the browser (OAuth)",
|
|
14
|
+
builder: {
|
|
15
|
+
project: {
|
|
16
|
+
string: true,
|
|
17
|
+
description: "Project to select in 'organization/project' format (e.g. 'MyOrg/My App'). " +
|
|
18
|
+
"When provided, skips the interactive picker after logging in.",
|
|
19
|
+
},
|
|
20
|
+
},
|
|
21
|
+
handler: (0, sentry_utils_1.wrapHandler)(async ({ project }) => {
|
|
22
|
+
const logger = (0, common_1.initLogger)();
|
|
23
|
+
if (!(0, client_1.isInteractiveContext)()) {
|
|
24
|
+
throw new cli_user_error_1.CliUserError("`meticulous auth login` requires an interactive terminal. In " +
|
|
25
|
+
"non-interactive environments, set METICULOUS_API_TOKEN or pass " +
|
|
26
|
+
"`--apiToken` instead.");
|
|
27
|
+
}
|
|
28
|
+
// Force a fresh browser login. Don't clear anything beforehand: if the flow
|
|
29
|
+
// is cancelled, times out, or token exchange fails, the existing session
|
|
30
|
+
// and selected project must survive. A successful login overwrites the
|
|
31
|
+
// stored OAuth tokens anyway.
|
|
32
|
+
const tokens = await (0, client_1.performOAuthLogin)();
|
|
33
|
+
// Logged in fresh (possibly as a different account), so drop any
|
|
34
|
+
// previously-selected project before re-selecting — keeping it would leave
|
|
35
|
+
// a stale selection the new user may not be able to access if the selection
|
|
36
|
+
// step below is interrupted.
|
|
37
|
+
(0, client_1.clearStoredProject)();
|
|
38
|
+
const client = (0, client_1.createClient)({ apiToken: tokens.accessToken });
|
|
39
|
+
// Pick a project for the freshly logged-in user: an explicit `--project`
|
|
40
|
+
// wins, otherwise auto-select when there is only one and prompt otherwise.
|
|
41
|
+
await (0, select_project_1.selectAndStoreProject)({ client, logger, project });
|
|
42
|
+
logger.info("You can change the selected project at any time with `meticulous auth set-project`.");
|
|
43
|
+
}),
|
|
44
|
+
};
|
|
45
|
+
//# sourceMappingURL=login.command.js.map
|
|
46
|
+
//# debugId=cf9ee091-8093-5037-8d6a-a448d5dc40cc
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"login.command.js","sources":["../../../src/commands/auth/login.command.ts"],"sourceRoot":"","names":[],"mappings":";;;;;AAAA,qDAKkC;AAClC,qDAAsD;AAEtD,mEAA+D;AAC/D,+DAA0D;AAC1D,+DAAmE;AAMtD,QAAA,YAAY,GAAoC;IAC3D,OAAO,EAAE,OAAO;IAChB,QAAQ,EAAE,8CAA8C;IACxD,OAAO,EAAE;QACP,OAAO,EAAE;YACP,MAAM,EAAE,IAAI;YACZ,WAAW,EACT,4EAA4E;gBAC5E,+DAA+D;SAClE;KACF;IACD,OAAO,EAAE,IAAA,0BAAW,EAAC,KAAK,EAAE,EAAE,OAAO,EAAW,EAAE,EAAE;QAClD,MAAM,MAAM,GAAG,IAAA,mBAAU,GAAE,CAAC;QAE5B,IAAI,CAAC,IAAA,6BAAoB,GAAE,EAAE,CAAC;YAC5B,MAAM,IAAI,6BAAY,CACpB,+DAA+D;gBAC7D,iEAAiE;gBACjE,uBAAuB,CAC1B,CAAC;QACJ,CAAC;QAED,4EAA4E;QAC5E,yEAAyE;QACzE,uEAAuE;QACvE,8BAA8B;QAC9B,MAAM,MAAM,GAAG,MAAM,IAAA,0BAAiB,GAAE,CAAC;QAEzC,iEAAiE;QACjE,2EAA2E;QAC3E,4EAA4E;QAC5E,6BAA6B;QAC7B,IAAA,2BAAkB,GAAE,CAAC;QAErB,MAAM,MAAM,GAAG,IAAA,qBAAY,EAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC;QAE9D,yEAAyE;QACzE,2EAA2E;QAC3E,MAAM,IAAA,sCAAqB,EAAC,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;QAEzD,MAAM,CAAC,IAAI,CACT,qFAAqF,CACtF,CAAC;IACJ,CAAC,CAAC;CACH,CAAC","debugId":"cf9ee091-8093-5037-8d6a-a448d5dc40cc"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logout.command.d.ts","sourceRoot":"","sources":["../../../src/commands/auth/logout.command.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"logout.command.d.ts","sourceRoot":"","sources":["../../../src/commands/auth/logout.command.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAG3C,UAAU,OAAO;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,eAAO,MAAM,aAAa,EAAE,aAAa,CAAC,OAAO,EAAE,OAAO,CAmBzD,CAAC"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="
|
|
2
|
+
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="2ec189a5-df5a-52e6-8ee9-b1c39783771f")}catch(e){}}();
|
|
3
3
|
|
|
4
4
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
5
5
|
exports.logoutCommand = void 0;
|
|
@@ -8,18 +8,39 @@ const common_1 = require("@alwaysmeticulous/common");
|
|
|
8
8
|
const sentry_utils_1 = require("../../command-utils/sentry.utils");
|
|
9
9
|
exports.logoutCommand = {
|
|
10
10
|
command: "logout",
|
|
11
|
-
describe: "Clear stored OAuth tokens",
|
|
11
|
+
describe: "Clear stored OAuth tokens and selected project",
|
|
12
12
|
builder: {},
|
|
13
13
|
handler: (0, sentry_utils_1.wrapHandler)(({ dryRun }) => {
|
|
14
14
|
const logger = (0, common_1.initLogger)();
|
|
15
15
|
if (dryRun) {
|
|
16
|
-
logger.info("Dry run: would clear stored OAuth tokens");
|
|
16
|
+
logger.info("Dry run: would clear stored OAuth tokens and selected project");
|
|
17
17
|
return Promise.resolve();
|
|
18
18
|
}
|
|
19
19
|
(0, client_1.clearOAuthTokens)();
|
|
20
|
+
(0, client_1.clearStoredProject)();
|
|
20
21
|
logger.info("Logged out successfully.");
|
|
22
|
+
warnAboutRemainingCredentials(logger);
|
|
21
23
|
return Promise.resolve();
|
|
22
24
|
}),
|
|
23
25
|
};
|
|
26
|
+
const warnAboutRemainingCredentials = (logger) => {
|
|
27
|
+
if (process.env["METICULOUS_API_TOKEN"]) {
|
|
28
|
+
logger.warn("Note: METICULOUS_API_TOKEN is still set in your environment and will " +
|
|
29
|
+
"continue to be used. Unset it in your shell to fully log out.");
|
|
30
|
+
}
|
|
31
|
+
// Best-effort: a malformed ~/.meticulous/config.json must not fail logout —
|
|
32
|
+
// the credentials have already been cleared by this point.
|
|
33
|
+
let fileToken = null;
|
|
34
|
+
try {
|
|
35
|
+
fileToken = (0, client_1.readFileBasedToken)();
|
|
36
|
+
}
|
|
37
|
+
catch {
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
if (fileToken) {
|
|
41
|
+
logger.warn(`Note: an apiToken is still present in ${fileToken.path} and ` +
|
|
42
|
+
"will continue to be used. Remove it from that file to fully log out.");
|
|
43
|
+
}
|
|
44
|
+
};
|
|
24
45
|
//# sourceMappingURL=logout.command.js.map
|
|
25
|
-
//# debugId=
|
|
46
|
+
//# debugId=2ec189a5-df5a-52e6-8ee9-b1c39783771f
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logout.command.js","sources":["../../../src/commands/auth/logout.command.ts"],"sourceRoot":"","names":[],"mappings":";;;;;AAAA,
|
|
1
|
+
{"version":3,"file":"logout.command.js","sources":["../../../src/commands/auth/logout.command.ts"],"sourceRoot":"","names":[],"mappings":";;;;;AAAA,qDAIkC;AAClC,qDAAsD;AAGtD,mEAA+D;AAMlD,QAAA,aAAa,GAAoC;IAC5D,OAAO,EAAE,QAAQ;IACjB,QAAQ,EAAE,gDAAgD;IAC1D,OAAO,EAAE,EAAE;IACX,OAAO,EAAE,IAAA,0BAAW,EAAC,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE;QAClC,MAAM,MAAM,GAAG,IAAA,mBAAU,GAAE,CAAC;QAC5B,IAAI,MAAM,EAAE,CAAC;YACX,MAAM,CAAC,IAAI,CACT,+DAA+D,CAChE,CAAC;YACF,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;QAC3B,CAAC;QACD,IAAA,yBAAgB,GAAE,CAAC;QACnB,IAAA,2BAAkB,GAAE,CAAC;QACrB,MAAM,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;QAExC,6BAA6B,CAAC,MAAM,CAAC,CAAC;QACtC,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;IAC3B,CAAC,CAAC;CACH,CAAC;AAEF,MAAM,6BAA6B,GAAG,CAAC,MAAc,EAAQ,EAAE;IAC7D,IAAI,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,EAAE,CAAC;QACxC,MAAM,CAAC,IAAI,CACT,uEAAuE;YACrE,+DAA+D,CAClE,CAAC;IACJ,CAAC;IAED,4EAA4E;IAC5E,2DAA2D;IAC3D,IAAI,SAAS,GAA0C,IAAI,CAAC;IAC5D,IAAI,CAAC;QACH,SAAS,GAAG,IAAA,2BAAkB,GAAE,CAAC;IACnC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO;IACT,CAAC;IACD,IAAI,SAAS,EAAE,CAAC;QACd,MAAM,CAAC,IAAI,CACT,yCAAyC,SAAS,CAAC,IAAI,OAAO;YAC5D,sEAAsE,CACzE,CAAC;IACJ,CAAC;AACH,CAAC,CAAC","debugId":"2ec189a5-df5a-52e6-8ee9-b1c39783771f"}
|
|
@@ -1,3 +1,7 @@
|
|
|
1
1
|
import type { CommandModule } from "yargs";
|
|
2
|
-
|
|
2
|
+
interface Options {
|
|
3
|
+
project?: string;
|
|
4
|
+
}
|
|
5
|
+
export declare const setProjectCommand: CommandModule<unknown, Options>;
|
|
6
|
+
export {};
|
|
3
7
|
//# sourceMappingURL=set-project.command.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"set-project.command.d.ts","sourceRoot":"","sources":["../../../src/commands/auth/set-project.command.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"set-project.command.d.ts","sourceRoot":"","sources":["../../../src/commands/auth/set-project.command.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAK3C,UAAU,OAAO;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,eAAO,MAAM,iBAAiB,EAAE,aAAa,CAAC,OAAO,EAAE,OAAO,CAoC7D,CAAC"}
|
|
@@ -1,22 +1,24 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="
|
|
2
|
+
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="35e70405-cd43-5b5a-b0a4-c6be75f9dbd2")}catch(e){}}();
|
|
3
3
|
|
|
4
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
5
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
6
|
-
};
|
|
7
4
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
5
|
exports.setProjectCommand = void 0;
|
|
9
6
|
const client_1 = require("@alwaysmeticulous/client");
|
|
10
7
|
const common_1 = require("@alwaysmeticulous/common");
|
|
11
|
-
const inquirer_1 = __importDefault(require("inquirer"));
|
|
12
8
|
const sentry_utils_1 = require("../../command-utils/sentry.utils");
|
|
13
9
|
const cli_user_error_1 = require("../../utils/cli-user-error");
|
|
14
|
-
const
|
|
10
|
+
const select_project_1 = require("../../utils/select-project");
|
|
15
11
|
exports.setProjectCommand = {
|
|
16
12
|
command: "set-project",
|
|
17
13
|
describe: "Select the Meticulous project to use with OAuth-authenticated commands",
|
|
18
|
-
builder: {
|
|
19
|
-
|
|
14
|
+
builder: {
|
|
15
|
+
project: {
|
|
16
|
+
string: true,
|
|
17
|
+
description: "Project to select in 'organization/project' format (e.g. 'MyOrg/My App'). " +
|
|
18
|
+
"When provided, skips the interactive picker.",
|
|
19
|
+
},
|
|
20
|
+
},
|
|
21
|
+
handler: (0, sentry_utils_1.wrapHandler)(async ({ project }) => {
|
|
20
22
|
const logger = (0, common_1.initLogger)();
|
|
21
23
|
const apiToken = await (0, client_1.resolveApiTokenWithOAuth)({
|
|
22
24
|
apiToken: null,
|
|
@@ -33,41 +35,8 @@ exports.setProjectCommand = {
|
|
|
33
35
|
"command to log in with OAuth.");
|
|
34
36
|
}
|
|
35
37
|
const client = (0, client_1.createClient)({ apiToken });
|
|
36
|
-
|
|
37
|
-
try {
|
|
38
|
-
projects = await (0, client_1.getOAuthProjects)(client);
|
|
39
|
-
}
|
|
40
|
-
catch (error) {
|
|
41
|
-
(0, handle_auth_failure_1.handleAuthFailure)(error);
|
|
42
|
-
throw error;
|
|
43
|
-
}
|
|
44
|
-
if (projects.length === 0) {
|
|
45
|
-
throw new cli_user_error_1.CliUserError("No projects are accessible to your account. Ask an organization " +
|
|
46
|
-
"admin to add you to a project.");
|
|
47
|
-
}
|
|
48
|
-
const selected = projects.length === 1 ? projects[0] : await promptForProject(projects);
|
|
49
|
-
const projectSlug = `${selected.organization.name}/${selected.name}`;
|
|
50
|
-
(0, client_1.setStoredProject)({ project: projectSlug, projectId: selected.id });
|
|
51
|
-
logger.info(`Selected project: ${projectSlug}`);
|
|
38
|
+
await (0, select_project_1.selectAndStoreProject)({ client, logger, project });
|
|
52
39
|
}),
|
|
53
40
|
};
|
|
54
|
-
const promptForProject = async (projects) => {
|
|
55
|
-
const { projectId } = await inquirer_1.default.prompt([
|
|
56
|
-
{
|
|
57
|
-
type: "list",
|
|
58
|
-
name: "projectId",
|
|
59
|
-
message: "Select a project:",
|
|
60
|
-
choices: projects.map((project) => ({
|
|
61
|
-
name: `${project.organization.name}/${project.name}`,
|
|
62
|
-
value: project.id,
|
|
63
|
-
})),
|
|
64
|
-
},
|
|
65
|
-
]);
|
|
66
|
-
const selected = projects.find((project) => project.id === projectId);
|
|
67
|
-
if (!selected) {
|
|
68
|
-
throw new Error("Selected project not found in fetched list");
|
|
69
|
-
}
|
|
70
|
-
return selected;
|
|
71
|
-
};
|
|
72
41
|
//# sourceMappingURL=set-project.command.js.map
|
|
73
|
-
//# debugId=
|
|
42
|
+
//# debugId=35e70405-cd43-5b5a-b0a4-c6be75f9dbd2
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"set-project.command.js","sources":["../../../src/commands/auth/set-project.command.ts"],"sourceRoot":"","names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"set-project.command.js","sources":["../../../src/commands/auth/set-project.command.ts"],"sourceRoot":"","names":[],"mappings":";;;;;AAAA,qDAIkC;AAClC,qDAAsD;AAEtD,mEAA+D;AAC/D,+DAA0D;AAC1D,+DAAmE;AAMtD,QAAA,iBAAiB,GAAoC;IAChE,OAAO,EAAE,aAAa;IACtB,QAAQ,EACN,wEAAwE;IAC1E,OAAO,EAAE;QACP,OAAO,EAAE;YACP,MAAM,EAAE,IAAI;YACZ,WAAW,EACT,4EAA4E;gBAC5E,8CAA8C;SACjD;KACF;IACD,OAAO,EAAE,IAAA,0BAAW,EAAC,KAAK,EAAE,EAAE,OAAO,EAAW,EAAE,EAAE;QAClD,MAAM,MAAM,GAAG,IAAA,mBAAU,GAAE,CAAC;QAE5B,MAAM,QAAQ,GAAG,MAAM,IAAA,iCAAwB,EAAC;YAC9C,QAAQ,EAAE,IAAI;YACd,gBAAgB,EAAE,IAAI;SACvB,CAAC,CAAC;QAEH,qEAAqE;QACrE,+CAA+C;QAC/C,IAAI,CAAC,IAAA,mBAAU,EAAC,QAAQ,CAAC,EAAE,CAAC;YAC1B,MAAM,IAAI,6BAAY,CACpB,gEAAgE;gBAC9D,+DAA+D;gBAC/D,UAAU;gBACV,gEAAgE;gBAChE,6DAA6D;gBAC7D,+BAA+B,CAClC,CAAC;QACJ,CAAC;QAED,MAAM,MAAM,GAAG,IAAA,qBAAY,EAAC,EAAE,QAAQ,EAAE,CAAC,CAAC;QAC1C,MAAM,IAAA,sCAAqB,EAAC,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;IAC3D,CAAC,CAAC;CACH,CAAC","debugId":"35e70405-cd43-5b5a-b0a4-c6be75f9dbd2"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"whoami.command.d.ts","sourceRoot":"","sources":["../../../src/commands/auth/whoami.command.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"whoami.command.d.ts","sourceRoot":"","sources":["../../../src/commands/auth/whoami.command.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAI3C,eAAO,MAAM,aAAa,EAAE,aA6D3B,CAAC"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="
|
|
2
|
+
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="4bdac823-4185-5e44-95ca-632e090f4ea8")}catch(e){}}();
|
|
3
3
|
|
|
4
4
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
5
5
|
exports.whoamiCommand = void 0;
|
|
@@ -13,12 +13,28 @@ exports.whoamiCommand = {
|
|
|
13
13
|
builder: {},
|
|
14
14
|
handler: (0, sentry_utils_1.wrapHandler)(async () => {
|
|
15
15
|
const logger = (0, common_1.initLogger)();
|
|
16
|
-
const
|
|
16
|
+
const apiToken = await (0, client_1.resolveApiTokenWithOAuth)({
|
|
17
17
|
apiToken: null,
|
|
18
18
|
enableOAuthLogin: true,
|
|
19
19
|
});
|
|
20
|
+
// A project-scoped API token (env var or legacy config) cannot be used
|
|
21
|
+
// against the OAuth-only `/oauth/whoami` endpoint — it would 403. Report
|
|
22
|
+
// the active credential without a doomed round-trip.
|
|
23
|
+
if (!(0, client_1.isOAuthJwt)(apiToken)) {
|
|
24
|
+
const source = process.env["METICULOUS_API_TOKEN"]
|
|
25
|
+
? "METICULOUS_API_TOKEN environment variable"
|
|
26
|
+
: "~/.meticulous/config.json";
|
|
27
|
+
logger.info(`Authenticated via: project API token (${source})`);
|
|
28
|
+
await reportProjectForApiToken(apiToken, logger);
|
|
29
|
+
logger.info("This token is scoped to a single project. To sign in as a user, " +
|
|
30
|
+
"run `meticulous auth logout`, unset METICULOUS_API_TOKEN, then " +
|
|
31
|
+
"`meticulous auth login`.");
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
const client = (0, client_1.createClient)({ apiToken });
|
|
20
35
|
try {
|
|
21
36
|
const { email, firstName, lastName, isAdmin, organizations } = await (0, client_1.getWhoami)(client);
|
|
37
|
+
logger.info("Authenticated via: OAuth");
|
|
22
38
|
logger.info(`Logged in as: ${firstName} ${lastName} (${email})`);
|
|
23
39
|
if (isAdmin) {
|
|
24
40
|
logger.info("Role: Admin");
|
|
@@ -43,5 +59,23 @@ exports.whoamiCommand = {
|
|
|
43
59
|
}
|
|
44
60
|
}),
|
|
45
61
|
};
|
|
62
|
+
/**
|
|
63
|
+
* Resolves and logs the single project a project-scoped API token is bound to,
|
|
64
|
+
* via the `token-info` endpoint. Best-effort: any failure (network, older
|
|
65
|
+
* backend without the endpoint, etc.) is swallowed so `whoami` never fails just
|
|
66
|
+
* because it could not name the pinned project.
|
|
67
|
+
*/
|
|
68
|
+
const reportProjectForApiToken = async (apiToken, logger) => {
|
|
69
|
+
try {
|
|
70
|
+
const client = (0, client_1.createClient)({ apiToken });
|
|
71
|
+
const project = await (0, client_1.getProject)(client);
|
|
72
|
+
if (project) {
|
|
73
|
+
logger.info(`Pinned project: ${project.organization.name}/${project.name}`);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
catch {
|
|
77
|
+
// Ignore — the project name is informational only.
|
|
78
|
+
}
|
|
79
|
+
};
|
|
46
80
|
//# sourceMappingURL=whoami.command.js.map
|
|
47
|
-
//# debugId=
|
|
81
|
+
//# debugId=4bdac823-4185-5e44-95ca-632e090f4ea8
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"whoami.command.js","sources":["../../../src/commands/auth/whoami.command.ts"],"sourceRoot":"","names":[],"mappings":";;;;;AAAA,
|
|
1
|
+
{"version":3,"file":"whoami.command.js","sources":["../../../src/commands/auth/whoami.command.ts"],"sourceRoot":"","names":[],"mappings":"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","debugId":"4bdac823-4185-5e44-95ca-632e090f4ea8"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"select-project.spec.d.ts","sourceRoot":"","sources":["../../../src/utils/__tests__/select-project.spec.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="dbfb60bd-8313-5e78-81c6-1899aba55eff")}catch(e){}}();
|
|
3
|
+
|
|
4
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
5
|
+
const vitest_1 = require("vitest");
|
|
6
|
+
const cli_user_error_1 = require("../cli-user-error");
|
|
7
|
+
const select_project_1 = require("../select-project");
|
|
8
|
+
const mocks = vitest_1.vi.hoisted(() => ({
|
|
9
|
+
getOAuthProjects: vitest_1.vi.fn(),
|
|
10
|
+
setStoredProject: vitest_1.vi.fn(),
|
|
11
|
+
}));
|
|
12
|
+
vitest_1.vi.mock("@alwaysmeticulous/client", () => ({
|
|
13
|
+
getOAuthProjects: mocks.getOAuthProjects,
|
|
14
|
+
setStoredProject: mocks.setStoredProject,
|
|
15
|
+
}));
|
|
16
|
+
const project = (org, name, id) => ({
|
|
17
|
+
id,
|
|
18
|
+
name,
|
|
19
|
+
organization: { id: `${org}-id`, name: org },
|
|
20
|
+
});
|
|
21
|
+
const fakeLogger = { info: vitest_1.vi.fn() };
|
|
22
|
+
const fakeClient = {};
|
|
23
|
+
(0, vitest_1.describe)("selectAndStoreProject", () => {
|
|
24
|
+
(0, vitest_1.beforeEach)(() => {
|
|
25
|
+
vitest_1.vi.clearAllMocks();
|
|
26
|
+
});
|
|
27
|
+
(0, vitest_1.it)("selects an exact organization/project slug match", async () => {
|
|
28
|
+
mocks.getOAuthProjects.mockResolvedValue([
|
|
29
|
+
project("OrgA", "App1", "id-1"),
|
|
30
|
+
project("OrgB", "App2", "id-2"),
|
|
31
|
+
]);
|
|
32
|
+
const result = await (0, select_project_1.selectAndStoreProject)({
|
|
33
|
+
client: fakeClient,
|
|
34
|
+
logger: fakeLogger,
|
|
35
|
+
project: "OrgB/App2",
|
|
36
|
+
});
|
|
37
|
+
(0, vitest_1.expect)(result).toBe("OrgB/App2");
|
|
38
|
+
(0, vitest_1.expect)(mocks.setStoredProject).toHaveBeenCalledWith({
|
|
39
|
+
project: "OrgB/App2",
|
|
40
|
+
projectId: "id-2",
|
|
41
|
+
});
|
|
42
|
+
});
|
|
43
|
+
(0, vitest_1.it)("trims surrounding whitespace from the provided slug", async () => {
|
|
44
|
+
mocks.getOAuthProjects.mockResolvedValue([project("OrgA", "App1", "id-1")]);
|
|
45
|
+
const result = await (0, select_project_1.selectAndStoreProject)({
|
|
46
|
+
client: fakeClient,
|
|
47
|
+
logger: fakeLogger,
|
|
48
|
+
project: " OrgA/App1 ",
|
|
49
|
+
});
|
|
50
|
+
(0, vitest_1.expect)(result).toBe("OrgA/App1");
|
|
51
|
+
});
|
|
52
|
+
(0, vitest_1.it)("matches case-sensitively", async () => {
|
|
53
|
+
mocks.getOAuthProjects.mockResolvedValue([project("OrgA", "App1", "id-1")]);
|
|
54
|
+
await (0, vitest_1.expect)((0, select_project_1.selectAndStoreProject)({
|
|
55
|
+
client: fakeClient,
|
|
56
|
+
logger: fakeLogger,
|
|
57
|
+
project: "orga/app1",
|
|
58
|
+
})).rejects.toBeInstanceOf(cli_user_error_1.CliUserError);
|
|
59
|
+
(0, vitest_1.expect)(mocks.setStoredProject).not.toHaveBeenCalled();
|
|
60
|
+
});
|
|
61
|
+
(0, vitest_1.it)("throws with the available list when the slug is not found", async () => {
|
|
62
|
+
mocks.getOAuthProjects.mockResolvedValue([project("OrgA", "App1", "id-1")]);
|
|
63
|
+
await (0, vitest_1.expect)((0, select_project_1.selectAndStoreProject)({
|
|
64
|
+
client: fakeClient,
|
|
65
|
+
logger: fakeLogger,
|
|
66
|
+
project: "OrgA/Missing",
|
|
67
|
+
})).rejects.toThrow(/Available projects/);
|
|
68
|
+
});
|
|
69
|
+
(0, vitest_1.it)("auto-selects the only project when no slug is provided", async () => {
|
|
70
|
+
mocks.getOAuthProjects.mockResolvedValue([project("OrgA", "App1", "id-1")]);
|
|
71
|
+
const result = await (0, select_project_1.selectAndStoreProject)({
|
|
72
|
+
client: fakeClient,
|
|
73
|
+
logger: fakeLogger,
|
|
74
|
+
});
|
|
75
|
+
(0, vitest_1.expect)(result).toBe("OrgA/App1");
|
|
76
|
+
(0, vitest_1.expect)(mocks.setStoredProject).toHaveBeenCalledWith({
|
|
77
|
+
project: "OrgA/App1",
|
|
78
|
+
projectId: "id-1",
|
|
79
|
+
});
|
|
80
|
+
});
|
|
81
|
+
(0, vitest_1.it)("throws when no projects are accessible", async () => {
|
|
82
|
+
mocks.getOAuthProjects.mockResolvedValue([]);
|
|
83
|
+
await (0, vitest_1.expect)((0, select_project_1.selectAndStoreProject)({ client: fakeClient, logger: fakeLogger })).rejects.toBeInstanceOf(cli_user_error_1.CliUserError);
|
|
84
|
+
});
|
|
85
|
+
});
|
|
86
|
+
//# sourceMappingURL=select-project.spec.js.map
|
|
87
|
+
//# debugId=dbfb60bd-8313-5e78-81c6-1899aba55eff
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"select-project.spec.js","sources":["../../../src/utils/__tests__/select-project.spec.ts"],"sourceRoot":"","names":[],"mappings":"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","debugId":"dbfb60bd-8313-5e78-81c6-1899aba55eff"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { MeticulousClient, OAuthProject } from "@alwaysmeticulous/client";
|
|
2
|
+
import type log from "loglevel";
|
|
3
|
+
/**
|
|
4
|
+
* Fetches the projects accessible to the OAuth caller, surfacing auth failures
|
|
5
|
+
* via `handleAuthFailure`. Shared by the project selection and listing flows.
|
|
6
|
+
*/
|
|
7
|
+
export declare const fetchAccessibleProjects: (client: MeticulousClient) => Promise<OAuthProject[]>;
|
|
8
|
+
/**
|
|
9
|
+
* Picks a project, stores it as the selected project, and logs the selection.
|
|
10
|
+
* Shared by `auth login` and `auth set-project`.
|
|
11
|
+
*
|
|
12
|
+
* - When `project` (an `organization/project` slug) is given, selects that
|
|
13
|
+
* project non-interactively, erroring with the available list if it does
|
|
14
|
+
* not match.
|
|
15
|
+
* - Otherwise auto-selects the only project, or prompts interactively when
|
|
16
|
+
* there are several.
|
|
17
|
+
*
|
|
18
|
+
* Throws `CliUserError` when the caller has no accessible projects.
|
|
19
|
+
*/
|
|
20
|
+
export declare const selectAndStoreProject: ({ client, logger, project, }: {
|
|
21
|
+
client: MeticulousClient;
|
|
22
|
+
logger: log.Logger;
|
|
23
|
+
project?: string | undefined;
|
|
24
|
+
}) => Promise<string>;
|
|
25
|
+
//# sourceMappingURL=select-project.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"select-project.d.ts","sourceRoot":"","sources":["../../src/utils/select-project.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAE/E,OAAO,KAAK,GAAG,MAAM,UAAU,CAAC;AAIhC;;;GAGG;AACH,eAAO,MAAM,uBAAuB,WAC1B,gBAAgB,KACvB,OAAO,CAAC,YAAY,EAAE,CAOxB,CAAC;AAEF;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,qBAAqB,iCAI/B;IACD,MAAM,EAAE,gBAAgB,CAAC;IACzB,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC9B,KAAG,OAAO,CAAC,MAAM,CAmCjB,CAAC"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="ba6428cd-4c56-508f-a912-f9d6c0451237")}catch(e){}}();
|
|
3
|
+
|
|
4
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
5
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
6
|
+
};
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.selectAndStoreProject = exports.fetchAccessibleProjects = void 0;
|
|
9
|
+
const client_1 = require("@alwaysmeticulous/client");
|
|
10
|
+
const inquirer_1 = __importDefault(require("inquirer"));
|
|
11
|
+
const cli_user_error_1 = require("./cli-user-error");
|
|
12
|
+
const handle_auth_failure_1 = require("./handle-auth-failure");
|
|
13
|
+
/**
|
|
14
|
+
* Fetches the projects accessible to the OAuth caller, surfacing auth failures
|
|
15
|
+
* via `handleAuthFailure`. Shared by the project selection and listing flows.
|
|
16
|
+
*/
|
|
17
|
+
const fetchAccessibleProjects = async (client) => {
|
|
18
|
+
try {
|
|
19
|
+
return await (0, client_1.getOAuthProjects)(client);
|
|
20
|
+
}
|
|
21
|
+
catch (error) {
|
|
22
|
+
(0, handle_auth_failure_1.handleAuthFailure)(error);
|
|
23
|
+
throw error;
|
|
24
|
+
}
|
|
25
|
+
};
|
|
26
|
+
exports.fetchAccessibleProjects = fetchAccessibleProjects;
|
|
27
|
+
/**
|
|
28
|
+
* Picks a project, stores it as the selected project, and logs the selection.
|
|
29
|
+
* Shared by `auth login` and `auth set-project`.
|
|
30
|
+
*
|
|
31
|
+
* - When `project` (an `organization/project` slug) is given, selects that
|
|
32
|
+
* project non-interactively, erroring with the available list if it does
|
|
33
|
+
* not match.
|
|
34
|
+
* - Otherwise auto-selects the only project, or prompts interactively when
|
|
35
|
+
* there are several.
|
|
36
|
+
*
|
|
37
|
+
* Throws `CliUserError` when the caller has no accessible projects.
|
|
38
|
+
*/
|
|
39
|
+
const selectAndStoreProject = async ({ client, logger, project, }) => {
|
|
40
|
+
const projects = await (0, exports.fetchAccessibleProjects)(client);
|
|
41
|
+
if (projects.length === 0) {
|
|
42
|
+
throw new cli_user_error_1.CliUserError("No projects are accessible to your account. Ask an organization " +
|
|
43
|
+
"admin to add you to a project.");
|
|
44
|
+
}
|
|
45
|
+
let selected;
|
|
46
|
+
if (project) {
|
|
47
|
+
// Tolerate accidental surrounding whitespace (e.g. from copy-paste), but
|
|
48
|
+
// keep the match case-sensitive: organization/project names are
|
|
49
|
+
// case-sensitive, so two projects could differ only by case and a
|
|
50
|
+
// case-insensitive match would be ambiguous.
|
|
51
|
+
const trimmedProject = project.trim();
|
|
52
|
+
const match = projects.find((p) => `${p.organization.name}/${p.name}` === trimmedProject);
|
|
53
|
+
if (!match) {
|
|
54
|
+
throw new cli_user_error_1.CliUserError(`Project '${trimmedProject}' not found. Available projects:\n${formatProjectList(projects)}`);
|
|
55
|
+
}
|
|
56
|
+
selected = match;
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
selected =
|
|
60
|
+
projects.length === 1 ? projects[0] : await promptForProject(projects);
|
|
61
|
+
}
|
|
62
|
+
const projectSlug = `${selected.organization.name}/${selected.name}`;
|
|
63
|
+
(0, client_1.setStoredProject)({ project: projectSlug, projectId: selected.id });
|
|
64
|
+
logger.info(`Selected project: ${projectSlug}`);
|
|
65
|
+
return projectSlug;
|
|
66
|
+
};
|
|
67
|
+
exports.selectAndStoreProject = selectAndStoreProject;
|
|
68
|
+
const promptForProject = async (projects) => {
|
|
69
|
+
const { projectId } = await inquirer_1.default.prompt([
|
|
70
|
+
{
|
|
71
|
+
type: "list",
|
|
72
|
+
name: "projectId",
|
|
73
|
+
message: "Select a project:",
|
|
74
|
+
choices: projects.map((project) => ({
|
|
75
|
+
name: `${project.organization.name}/${project.name}`,
|
|
76
|
+
value: project.id,
|
|
77
|
+
})),
|
|
78
|
+
},
|
|
79
|
+
]);
|
|
80
|
+
const selected = projects.find((project) => project.id === projectId);
|
|
81
|
+
if (!selected) {
|
|
82
|
+
throw new cli_user_error_1.CliUserError("Selected project not found in fetched list.");
|
|
83
|
+
}
|
|
84
|
+
return selected;
|
|
85
|
+
};
|
|
86
|
+
const formatProjectList = (projects) => projects.map((p) => ` - ${p.organization.name}/${p.name}`).join("\n");
|
|
87
|
+
//# sourceMappingURL=select-project.js.map
|
|
88
|
+
//# debugId=ba6428cd-4c56-508f-a912-f9d6c0451237
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"select-project.js","sources":["../../src/utils/select-project.ts"],"sourceRoot":"","names":[],"mappings":"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","debugId":"ba6428cd-4c56-508f-a912-f9d6c0451237"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@alwaysmeticulous/cli",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.300.0",
|
|
4
4
|
"description": "The Meticulous CLI",
|
|
5
5
|
"license": "ISC",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -23,18 +23,18 @@
|
|
|
23
23
|
"puppeteer-core": "24.14.0",
|
|
24
24
|
"tar": "^7.5.8",
|
|
25
25
|
"yargs": "^17.5.1",
|
|
26
|
-
"@alwaysmeticulous/api": "2.
|
|
27
|
-
"@alwaysmeticulous/client": "2.
|
|
28
|
-
"@alwaysmeticulous/
|
|
29
|
-
"@alwaysmeticulous/
|
|
30
|
-
"@alwaysmeticulous/downloading-helpers": "2.
|
|
31
|
-
"@alwaysmeticulous/record": "2.
|
|
32
|
-
"@alwaysmeticulous/remote-replay-launcher": "2.
|
|
33
|
-
"@alwaysmeticulous/replay-orchestrator-launcher": "2.298.0",
|
|
34
|
-
"@alwaysmeticulous/sdk-bundles-api": "2.297.0",
|
|
35
|
-
"@alwaysmeticulous/sentry": "2.298.0",
|
|
26
|
+
"@alwaysmeticulous/api": "2.300.0",
|
|
27
|
+
"@alwaysmeticulous/client": "2.300.0",
|
|
28
|
+
"@alwaysmeticulous/debug-workspace": "2.300.0",
|
|
29
|
+
"@alwaysmeticulous/common": "2.300.0",
|
|
30
|
+
"@alwaysmeticulous/downloading-helpers": "2.300.0",
|
|
31
|
+
"@alwaysmeticulous/record": "2.300.0",
|
|
32
|
+
"@alwaysmeticulous/remote-replay-launcher": "2.300.0",
|
|
36
33
|
"@alwaysmeticulous/replay-debugger-ui": "2.283.1",
|
|
37
|
-
"@alwaysmeticulous/
|
|
34
|
+
"@alwaysmeticulous/replay-orchestrator-launcher": "2.300.0",
|
|
35
|
+
"@alwaysmeticulous/sdk-bundles-api": "2.300.0",
|
|
36
|
+
"@alwaysmeticulous/sentry": "2.300.0",
|
|
37
|
+
"@alwaysmeticulous/tunnels-client": "2.300.0"
|
|
38
38
|
},
|
|
39
39
|
"devDependencies": {
|
|
40
40
|
"@types/cli-progress": "^3.11.5",
|