@alwaysmeticulous/cli 2.298.0 → 2.299.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/command-utils/common-options.d.ts +1 -0
- package/dist/command-utils/common-options.d.ts.map +1 -0
- package/dist/command-utils/download-session.utils.d.ts +3 -2
- package/dist/command-utils/download-session.utils.d.ts.map +1 -0
- package/dist/command-utils/download-session.utils.js +2 -2
- package/dist/command-utils/download-session.utils.js.map +1 -1
- package/dist/command-utils/parse-rewrites.d.ts +2 -1
- package/dist/command-utils/parse-rewrites.d.ts.map +1 -0
- package/dist/command-utils/sentry.utils.d.ts +1 -0
- package/dist/command-utils/sentry.utils.d.ts.map +1 -0
- package/dist/command-utils/sentry.utils.js +4 -4
- package/dist/command-utils/sentry.utils.js.map +1 -1
- package/dist/commands/agent/index.d.ts +2 -1
- package/dist/commands/agent/index.d.ts.map +1 -0
- package/dist/commands/agent/js-coverage-diff.command.d.ts +2 -1
- package/dist/commands/agent/js-coverage-diff.command.d.ts.map +1 -0
- package/dist/commands/agent/js-coverage.command.d.ts +2 -1
- package/dist/commands/agent/js-coverage.command.d.ts.map +1 -0
- package/dist/commands/agent/js-coverage.command.js +2 -2
- package/dist/commands/agent/js-coverage.command.js.map +1 -1
- package/dist/commands/agent/screenshot-dom-diff.command.d.ts +2 -1
- package/dist/commands/agent/screenshot-dom-diff.command.d.ts.map +1 -0
- package/dist/commands/agent/screenshot-image-files.command.d.ts +2 -1
- package/dist/commands/agent/screenshot-image-files.command.d.ts.map +1 -0
- package/dist/commands/agent/screenshot-image.command.d.ts +2 -1
- package/dist/commands/agent/screenshot-image.command.d.ts.map +1 -0
- package/dist/commands/agent/test-run-diffs.command.d.ts +2 -1
- package/dist/commands/agent/test-run-diffs.command.d.ts.map +1 -0
- package/dist/commands/agent/test-run-diffs.utils.d.ts +2 -1
- package/dist/commands/agent/test-run-diffs.utils.d.ts.map +1 -0
- package/dist/commands/agent/test-run-diffs.utils.spec.d.ts +1 -0
- package/dist/commands/agent/test-run-diffs.utils.spec.d.ts.map +1 -0
- package/dist/commands/agent/test-run-for-commit.command.d.ts +2 -1
- package/dist/commands/agent/test-run-for-commit.command.d.ts.map +1 -0
- package/dist/commands/agent/timeline.command.d.ts +2 -1
- package/dist/commands/agent/timeline.command.d.ts.map +1 -0
- 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 +2 -1
- package/dist/commands/auth/index.d.ts.map +1 -0
- 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 +2 -1
- package/dist/commands/auth/logout.command.d.ts.map +1 -0
- package/dist/commands/auth/logout.command.js +28 -6
- package/dist/commands/auth/logout.command.js.map +1 -1
- package/dist/commands/auth/set-project.command.d.ts +7 -2
- package/dist/commands/auth/set-project.command.d.ts.map +1 -0
- 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/unset-project.command.d.ts +2 -1
- package/dist/commands/auth/unset-project.command.d.ts.map +1 -0
- package/dist/commands/auth/unset-project.command.js +4 -3
- package/dist/commands/auth/unset-project.command.js.map +1 -1
- package/dist/commands/auth/whoami.command.d.ts +2 -1
- package/dist/commands/auth/whoami.command.d.ts.map +1 -0
- package/dist/commands/auth/whoami.command.js +37 -3
- package/dist/commands/auth/whoami.command.js.map +1 -1
- package/dist/commands/ci/index.d.ts +2 -1
- package/dist/commands/ci/index.d.ts.map +1 -0
- package/dist/commands/ci/prepare.command.d.ts +3 -2
- package/dist/commands/ci/prepare.command.d.ts.map +1 -0
- package/dist/commands/ci/resolve-git-options.d.ts +1 -0
- package/dist/commands/ci/resolve-git-options.d.ts.map +1 -0
- package/dist/commands/ci/resolve-git-options.js +8 -3
- package/dist/commands/ci/resolve-git-options.js.map +1 -1
- package/dist/commands/ci/run-local.command.d.ts +4 -3
- package/dist/commands/ci/run-local.command.d.ts.map +1 -0
- package/dist/commands/ci/run-local.command.js +2 -2
- package/dist/commands/ci/run-local.command.js.map +1 -1
- package/dist/commands/ci/run-with-uploaded-asset-chunks.command.d.ts +2 -1
- package/dist/commands/ci/run-with-uploaded-asset-chunks.command.d.ts.map +1 -0
- package/dist/commands/ci/run-with-uploaded-asset-chunks.command.js +2 -2
- package/dist/commands/ci/run-with-uploaded-asset-chunks.command.js.map +1 -1
- package/dist/commands/ci/run.command.d.ts +2 -1
- package/dist/commands/ci/run.command.d.ts.map +1 -0
- package/dist/commands/ci/run.command.js +10 -4
- package/dist/commands/ci/run.command.js.map +1 -1
- package/dist/commands/ci/start-tunnel.command.d.ts +2 -1
- package/dist/commands/ci/start-tunnel.command.d.ts.map +1 -0
- package/dist/commands/ci/start-tunnel.command.js +3 -3
- package/dist/commands/ci/start-tunnel.command.js.map +1 -1
- package/dist/commands/ci/upload-asset-chunk.command.d.ts +2 -1
- package/dist/commands/ci/upload-asset-chunk.command.d.ts.map +1 -0
- package/dist/commands/ci/upload-assets.command.d.ts +2 -1
- package/dist/commands/ci/upload-assets.command.d.ts.map +1 -0
- package/dist/commands/ci/upload-assets.command.js +3 -3
- package/dist/commands/ci/upload-assets.command.js.map +1 -1
- package/dist/commands/ci/upload-container.command.d.ts +3 -2
- package/dist/commands/ci/upload-container.command.d.ts.map +1 -0
- package/dist/commands/ci/upload-container.command.js +2 -2
- package/dist/commands/ci/upload-container.command.js.map +1 -1
- package/dist/commands/debug/clean-workspaces.d.ts +1 -0
- package/dist/commands/debug/clean-workspaces.d.ts.map +1 -0
- package/dist/commands/debug/index.d.ts +2 -1
- package/dist/commands/debug/index.d.ts.map +1 -0
- package/dist/commands/debug/index.js +2 -2
- package/dist/commands/debug/index.js.map +1 -1
- package/dist/commands/debug/present-workspace.d.ts +1 -0
- package/dist/commands/debug/present-workspace.d.ts.map +1 -0
- package/dist/commands/debug/present-workspace.js +2 -2
- package/dist/commands/debug/present-workspace.js.map +1 -1
- package/dist/commands/debug/project-worktree.d.ts +2 -1
- package/dist/commands/debug/project-worktree.d.ts.map +1 -0
- package/dist/commands/deprecated-aliases.d.ts +2 -1
- package/dist/commands/deprecated-aliases.d.ts.map +1 -0
- package/dist/commands/download/index.d.ts +2 -1
- package/dist/commands/download/index.d.ts.map +1 -0
- package/dist/commands/download/replay.command.d.ts +2 -1
- package/dist/commands/download/replay.command.d.ts.map +1 -0
- package/dist/commands/download/session.command.d.ts +2 -1
- package/dist/commands/download/session.command.d.ts.map +1 -0
- package/dist/commands/download/test-run.command.d.ts +2 -1
- package/dist/commands/download/test-run.command.d.ts.map +1 -0
- package/dist/commands/download/test-run.command.js +2 -2
- package/dist/commands/download/test-run.command.js.map +1 -1
- package/dist/commands/local/get-edited-files.utils.d.ts +2 -1
- package/dist/commands/local/get-edited-files.utils.d.ts.map +1 -0
- package/dist/commands/local/get-edited-files.utils.js +3 -3
- package/dist/commands/local/get-edited-files.utils.js.map +1 -1
- package/dist/commands/local/get-edited-files.utils.spec.d.ts +1 -0
- package/dist/commands/local/get-edited-files.utils.spec.d.ts.map +1 -0
- package/dist/commands/local/index.d.ts +2 -1
- package/dist/commands/local/index.d.ts.map +1 -0
- package/dist/commands/local/relevant-sessions.command.d.ts +2 -1
- package/dist/commands/local/relevant-sessions.command.d.ts.map +1 -0
- package/dist/commands/local/relevant-sessions.command.js +2 -2
- package/dist/commands/local/relevant-sessions.command.js.map +1 -1
- package/dist/commands/project/index.d.ts +2 -1
- package/dist/commands/project/index.d.ts.map +1 -0
- package/dist/commands/project/index.js +7 -3
- package/dist/commands/project/index.js.map +1 -1
- package/dist/commands/project/show.command.d.ts +2 -1
- package/dist/commands/project/show.command.d.ts.map +1 -0
- package/dist/commands/project/show.command.js +2 -2
- package/dist/commands/project/show.command.js.map +1 -1
- package/dist/commands/project/upload-source.command.d.ts +2 -1
- package/dist/commands/project/upload-source.command.d.ts.map +1 -0
- package/dist/commands/record/index.d.ts +2 -1
- package/dist/commands/record/index.d.ts.map +1 -0
- package/dist/commands/record/login.command.d.ts +2 -1
- package/dist/commands/record/login.command.d.ts.map +1 -0
- package/dist/commands/record/login.command.js +2 -2
- package/dist/commands/record/login.command.js.map +1 -1
- package/dist/commands/record/session.command.d.ts +2 -1
- package/dist/commands/record/session.command.d.ts.map +1 -0
- package/dist/commands/record/session.command.js +2 -2
- package/dist/commands/record/session.command.js.map +1 -1
- package/dist/commands/replay-debugger.ui.d.ts +4 -3
- package/dist/commands/replay-debugger.ui.d.ts.map +1 -0
- package/dist/commands/replay-debugger.ui.js +2 -2
- package/dist/commands/replay-debugger.ui.js.map +1 -1
- package/dist/commands/replay.command.d.ts +4 -3
- package/dist/commands/replay.command.d.ts.map +1 -0
- package/dist/commands/replay.command.js +8 -4
- package/dist/commands/replay.command.js.map +1 -1
- package/dist/commands/schema.command.d.ts +2 -1
- package/dist/commands/schema.command.d.ts.map +1 -0
- package/dist/commands/schema.command.js +4 -3
- package/dist/commands/schema.command.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/main.d.ts +1 -0
- package/dist/main.d.ts.map +1 -0
- package/dist/main.js +2 -2
- package/dist/main.js.map +1 -1
- package/dist/utils/__tests__/handle-auth-failure.spec.d.ts +1 -0
- package/dist/utils/__tests__/handle-auth-failure.spec.d.ts.map +1 -0
- package/dist/utils/__tests__/handle-auth-failure.spec.js +2 -2
- package/dist/utils/__tests__/handle-auth-failure.spec.js.map +1 -1
- package/dist/utils/__tests__/resolve-project-identifier.spec.d.ts +1 -0
- package/dist/utils/__tests__/resolve-project-identifier.spec.d.ts.map +1 -0
- package/dist/utils/__tests__/resolve-test-run-from-commit.spec.d.ts +1 -0
- package/dist/utils/__tests__/resolve-test-run-from-commit.spec.d.ts.map +1 -0
- package/dist/utils/__tests__/resolve-test-run-from-commit.spec.js +2 -2
- package/dist/utils/__tests__/resolve-test-run-from-commit.spec.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/cli-user-error.d.ts +1 -0
- package/dist/utils/cli-user-error.d.ts.map +1 -0
- package/dist/utils/constants.d.ts +1 -0
- package/dist/utils/constants.d.ts.map +1 -0
- package/dist/utils/environment.utils.d.ts +1 -0
- package/dist/utils/environment.utils.d.ts.map +1 -0
- package/dist/utils/format-coverage-ranges.d.ts +2 -1
- package/dist/utils/format-coverage-ranges.d.ts.map +1 -0
- package/dist/utils/handle-auth-failure.d.ts +1 -0
- package/dist/utils/handle-auth-failure.d.ts.map +1 -0
- package/dist/utils/out-of-date-client-error.d.ts +2 -1
- package/dist/utils/out-of-date-client-error.d.ts.map +1 -0
- package/dist/utils/resolve-project-identifier.d.ts +1 -0
- package/dist/utils/resolve-project-identifier.d.ts.map +1 -0
- package/dist/utils/resolve-test-run-from-commit.d.ts +3 -2
- package/dist/utils/resolve-test-run-from-commit.d.ts.map +1 -0
- package/dist/utils/resolve-test-run-from-commit.js +2 -2
- package/dist/utils/resolve-test-run-from-commit.js.map +1 -1
- 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 +13 -13
|
@@ -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":"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","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"}
|
|
@@ -0,0 +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;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"}
|
|
@@ -0,0 +1 @@
|
|
|
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,17 +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
|
-
handler: (0, sentry_utils_1.wrapHandler)(
|
|
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");
|
|
17
|
-
return;
|
|
16
|
+
logger.info("Dry run: would clear stored OAuth tokens and selected project");
|
|
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);
|
|
23
|
+
return Promise.resolve();
|
|
21
24
|
}),
|
|
22
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
|
+
};
|
|
23
45
|
//# sourceMappingURL=logout.command.js.map
|
|
24
|
-
//# 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,2 +1,7 @@
|
|
|
1
|
-
import { CommandModule } from "yargs";
|
|
2
|
-
|
|
1
|
+
import type { CommandModule } from "yargs";
|
|
2
|
+
interface Options {
|
|
3
|
+
project?: string;
|
|
4
|
+
}
|
|
5
|
+
export declare const setProjectCommand: CommandModule<unknown, Options>;
|
|
6
|
+
export {};
|
|
7
|
+
//# sourceMappingURL=set-project.command.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"unset-project.command.d.ts","sourceRoot":"","sources":["../../../src/commands/auth/unset-project.command.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAG3C,eAAO,MAAM,mBAAmB,EAAE,aAejC,CAAC"}
|