@alwaysmeticulous/client 2.307.0 → 2.311.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/api/__tests__/agent.api.spec.js +89 -2
- package/dist/api/__tests__/agent.api.spec.js.map +1 -1
- package/dist/api/agent.api.d.ts +112 -2
- package/dist/api/agent.api.d.ts.map +1 -1
- package/dist/api/agent.api.js +76 -7
- package/dist/api/agent.api.js.map +1 -1
- package/dist/api/agentic-session-generation.api.d.ts +222 -0
- package/dist/api/agentic-session-generation.api.d.ts.map +1 -0
- package/dist/api/agentic-session-generation.api.js +109 -0
- package/dist/api/agentic-session-generation.api.js.map +1 -0
- package/dist/api/project-deployments.api.d.ts +21 -0
- package/dist/api/project-deployments.api.d.ts.map +1 -1
- package/dist/api/project-deployments.api.js +15 -14
- package/dist/api/project-deployments.api.js.map +1 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +20 -4
- package/dist/index.js.map +1 -1
- package/dist/oauth/__tests__/oauth-device-login.spec.d.ts +2 -0
- package/dist/oauth/__tests__/oauth-device-login.spec.d.ts.map +1 -0
- package/dist/oauth/__tests__/oauth-device-login.spec.js +310 -0
- package/dist/oauth/__tests__/oauth-device-login.spec.js.map +1 -0
- package/dist/oauth/oauth-constants.d.ts +1 -0
- package/dist/oauth/oauth-constants.d.ts.map +1 -1
- package/dist/oauth/oauth-constants.js +23 -9
- package/dist/oauth/oauth-constants.js.map +1 -1
- package/dist/oauth/oauth-device-login.d.ts +3 -0
- package/dist/oauth/oauth-device-login.d.ts.map +1 -0
- package/dist/oauth/oauth-device-login.js +169 -0
- package/dist/oauth/oauth-device-login.js.map +1 -0
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +3 -3
package/dist/index.js
CHANGED
|
@@ -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]="248f07f8-7dd2-5974-a2ca-c20b35afb389")}catch(e){}}();
|
|
3
3
|
|
|
4
4
|
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
5
5
|
if (k2 === undefined) k2 = k;
|
|
@@ -16,11 +16,12 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
16
16
|
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
17
17
|
};
|
|
18
18
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
19
|
-
exports.
|
|
20
|
-
exports.getRelevantSessions = exports.maybeEnrichFetchError = exports.isFetchError = exports.getRegistryAuth = exports.agentTriggerTestRun = exports.agentUploadGitDiffBuild = exports.agentUploadContainerBuild = exports.agentUploadAssetBuild = exports.getContainerDeployment = exports.downloadProjectDeployment = exports.completeAssetChunkUpload = exports.requestAssetChunkUpload = exports.triggerRunWithUploadedAssetChunks = exports.createRunWithUploadedAssetChunks = exports.completeContainerUpload = exports.completeAssetUpload = exports.requestGitDiffUpload = exports.requestUploadPart = exports.requestMultipartAssetUpload = exports.requestAssetUpload = exports.retryTransientUploadErrors = exports.isTransientUploadError = exports.UploadError = exports.putFileToSignedUrl = exports.getProxyAgent = exports.isOAuthJwt = exports.isJwtExpired = exports.getJwtClaims = exports.migrateLegacySelectedProjectIfPresent = exports.resolveDefaultProjectId = exports.getStoredOAuthTokens = exports.clearOAuthTokens = exports.getValidAccessToken = void 0;
|
|
19
|
+
exports.makeRequest = exports.isInteractiveContext = exports.createClientWithOAuth = exports.createClient = exports.readFileBasedToken = exports.getAuthToken = exports.getApiToken = exports.IN_PROGRESS_TEST_RUN_STATUS = exports.getIsLocked = exports.emitTelemetry = exports.getLatestTestRunResults = exports.getTestRunReplayDiffs = exports.getTestRunData = exports.markTestRunExpectsCustomChecks = exports.getTestRunNetworkPatchingResult = exports.getTestRun = exports.executeSecureTunnelTestRun = exports.getPrDiffForTestRun = exports.getPrDiff = exports.getPrDescriptionForTestRun = exports.getReplayDiff = exports.postSessionIdNotification = exports.getRecordingCommandId = exports.getBackendReplayEnv = exports.getRecordedSessionData = exports.getRecordedSession = exports.getReplayV3DownloadUrls = exports.getReplayDownloadUrl = exports.getReplay = exports.requestSourceCodeUploadUrl = exports.getSourceArchiveUrl = exports.getRepoUrl = exports.getProject = exports.clearOAuthDefaultProject = exports.setOAuthDefaultProject = exports.getOAuthDefaultProject = exports.getOAuthProjects = exports.getWhoami = exports.trackAgentFeatureUsage = exports.getSessions = exports.getTimelineDiff = exports.getScreenshotUrls = exports.getReplayDiffJsCoverage = exports.getReplayJsCoverage = exports.getTestRunJsCoverage = exports.getTestRunForCommit = exports.getScreenshotDomDiff = exports.getTestRunDiffsSummaryCounts = exports.getTestRunDiffsSummary = exports.getStructuredSessionData = void 0;
|
|
20
|
+
exports.getRelevantSessions = exports.maybeEnrichFetchError = exports.isFetchError = exports.getRegistryAuth = exports.releaseAgenticRepoLease = exports.heartbeatAgenticRepoLease = exports.getAgenticRepoLeaseStatus = exports.acquireAgenticRepoLease = exports.listAgenticRepoTree = exports.searchAgenticRepoCode = exports.getAgenticRepoFile = exports.getAgenticChangedFiles = exports.reportAgenticRunResult = exports.completeAgenticSessionGeneration = exports.requestAgenticInstructionsUpload = exports.agentTriggerTestRun = exports.agentUploadGitDiffBuild = exports.agentUploadContainerBuild = exports.agentUploadAssetBuild = exports.getContainerDeployment = exports.downloadProjectDeployment = exports.completeAssetChunkUpload = exports.requestAssetChunkUpload = exports.triggerRunWithUploadedAssetChunks = exports.createRunWithUploadedAssetChunks = exports.completeContainerUpload = exports.completeAssetUpload = exports.requestGitDiffUpload = exports.requestUploadPart = exports.requestMultipartAssetUpload = exports.requestAssetUpload = exports.retryTransientUploadErrors = exports.isTransientUploadError = exports.UploadError = exports.putFileToSignedUrl = exports.getProxyAgent = exports.isOAuthJwt = exports.isJwtExpired = exports.getJwtClaims = exports.migrateLegacySelectedProjectIfPresent = exports.resolveDefaultProjectId = exports.getStoredOAuthTokens = exports.clearOAuthTokens = exports.getValidAccessToken = exports.performDeviceLogin = exports.performOAuthLogin = exports.resolveApiTokenWithOAuth = void 0;
|
|
21
21
|
var agent_api_1 = require("./api/agent.api");
|
|
22
22
|
Object.defineProperty(exports, "getStructuredSessionData", { enumerable: true, get: function () { return agent_api_1.getStructuredSessionData; } });
|
|
23
23
|
Object.defineProperty(exports, "getTestRunDiffsSummary", { enumerable: true, get: function () { return agent_api_1.getTestRunDiffsSummary; } });
|
|
24
|
+
Object.defineProperty(exports, "getTestRunDiffsSummaryCounts", { enumerable: true, get: function () { return agent_api_1.getTestRunDiffsSummaryCounts; } });
|
|
24
25
|
Object.defineProperty(exports, "getScreenshotDomDiff", { enumerable: true, get: function () { return agent_api_1.getScreenshotDomDiff; } });
|
|
25
26
|
Object.defineProperty(exports, "getTestRunForCommit", { enumerable: true, get: function () { return agent_api_1.getTestRunForCommit; } });
|
|
26
27
|
Object.defineProperty(exports, "getTestRunJsCoverage", { enumerable: true, get: function () { return agent_api_1.getTestRunJsCoverage; } });
|
|
@@ -28,6 +29,7 @@ Object.defineProperty(exports, "getReplayJsCoverage", { enumerable: true, get: f
|
|
|
28
29
|
Object.defineProperty(exports, "getReplayDiffJsCoverage", { enumerable: true, get: function () { return agent_api_1.getReplayDiffJsCoverage; } });
|
|
29
30
|
Object.defineProperty(exports, "getScreenshotUrls", { enumerable: true, get: function () { return agent_api_1.getScreenshotUrls; } });
|
|
30
31
|
Object.defineProperty(exports, "getTimelineDiff", { enumerable: true, get: function () { return agent_api_1.getTimelineDiff; } });
|
|
32
|
+
Object.defineProperty(exports, "getSessions", { enumerable: true, get: function () { return agent_api_1.getSessions; } });
|
|
31
33
|
Object.defineProperty(exports, "trackAgentFeatureUsage", { enumerable: true, get: function () { return agent_api_1.trackAgentFeatureUsage; } });
|
|
32
34
|
__exportStar(require("./api/github-cloud-replay.api"), exports);
|
|
33
35
|
var oauth_api_1 = require("./api/oauth.api");
|
|
@@ -82,6 +84,8 @@ Object.defineProperty(exports, "makeRequest", { enumerable: true, get: function
|
|
|
82
84
|
Object.defineProperty(exports, "resolveApiTokenWithOAuth", { enumerable: true, get: function () { return client_1.resolveApiTokenWithOAuth; } });
|
|
83
85
|
var oauth_login_1 = require("./oauth/oauth-login");
|
|
84
86
|
Object.defineProperty(exports, "performOAuthLogin", { enumerable: true, get: function () { return oauth_login_1.performOAuthLogin; } });
|
|
87
|
+
var oauth_device_login_1 = require("./oauth/oauth-device-login");
|
|
88
|
+
Object.defineProperty(exports, "performDeviceLogin", { enumerable: true, get: function () { return oauth_device_login_1.performDeviceLogin; } });
|
|
85
89
|
var oauth_refresh_1 = require("./oauth/oauth-refresh");
|
|
86
90
|
Object.defineProperty(exports, "getValidAccessToken", { enumerable: true, get: function () { return oauth_refresh_1.getValidAccessToken; } });
|
|
87
91
|
var oauth_token_store_1 = require("./oauth/oauth-token-store");
|
|
@@ -120,6 +124,18 @@ Object.defineProperty(exports, "agentUploadAssetBuild", { enumerable: true, get:
|
|
|
120
124
|
Object.defineProperty(exports, "agentUploadContainerBuild", { enumerable: true, get: function () { return project_deployments_api_1.agentUploadContainerBuild; } });
|
|
121
125
|
Object.defineProperty(exports, "agentUploadGitDiffBuild", { enumerable: true, get: function () { return project_deployments_api_1.agentUploadGitDiffBuild; } });
|
|
122
126
|
Object.defineProperty(exports, "agentTriggerTestRun", { enumerable: true, get: function () { return project_deployments_api_1.agentTriggerTestRun; } });
|
|
127
|
+
var agentic_session_generation_api_1 = require("./api/agentic-session-generation.api");
|
|
128
|
+
Object.defineProperty(exports, "requestAgenticInstructionsUpload", { enumerable: true, get: function () { return agentic_session_generation_api_1.requestAgenticInstructionsUpload; } });
|
|
129
|
+
Object.defineProperty(exports, "completeAgenticSessionGeneration", { enumerable: true, get: function () { return agentic_session_generation_api_1.completeAgenticSessionGeneration; } });
|
|
130
|
+
Object.defineProperty(exports, "reportAgenticRunResult", { enumerable: true, get: function () { return agentic_session_generation_api_1.reportAgenticRunResult; } });
|
|
131
|
+
Object.defineProperty(exports, "getAgenticChangedFiles", { enumerable: true, get: function () { return agentic_session_generation_api_1.getAgenticChangedFiles; } });
|
|
132
|
+
Object.defineProperty(exports, "getAgenticRepoFile", { enumerable: true, get: function () { return agentic_session_generation_api_1.getAgenticRepoFile; } });
|
|
133
|
+
Object.defineProperty(exports, "searchAgenticRepoCode", { enumerable: true, get: function () { return agentic_session_generation_api_1.searchAgenticRepoCode; } });
|
|
134
|
+
Object.defineProperty(exports, "listAgenticRepoTree", { enumerable: true, get: function () { return agentic_session_generation_api_1.listAgenticRepoTree; } });
|
|
135
|
+
Object.defineProperty(exports, "acquireAgenticRepoLease", { enumerable: true, get: function () { return agentic_session_generation_api_1.acquireAgenticRepoLease; } });
|
|
136
|
+
Object.defineProperty(exports, "getAgenticRepoLeaseStatus", { enumerable: true, get: function () { return agentic_session_generation_api_1.getAgenticRepoLeaseStatus; } });
|
|
137
|
+
Object.defineProperty(exports, "heartbeatAgenticRepoLease", { enumerable: true, get: function () { return agentic_session_generation_api_1.heartbeatAgenticRepoLease; } });
|
|
138
|
+
Object.defineProperty(exports, "releaseAgenticRepoLease", { enumerable: true, get: function () { return agentic_session_generation_api_1.releaseAgenticRepoLease; } });
|
|
123
139
|
var registry_api_1 = require("./api/registry.api");
|
|
124
140
|
Object.defineProperty(exports, "getRegistryAuth", { enumerable: true, get: function () { return registry_api_1.getRegistryAuth; } });
|
|
125
141
|
var errors_1 = require("./errors");
|
|
@@ -128,4 +144,4 @@ Object.defineProperty(exports, "maybeEnrichFetchError", { enumerable: true, get:
|
|
|
128
144
|
var local_changes_api_1 = require("./api/local-changes.api");
|
|
129
145
|
Object.defineProperty(exports, "getRelevantSessions", { enumerable: true, get: function () { return local_changes_api_1.getRelevantSessions; } });
|
|
130
146
|
//# sourceMappingURL=index.js.map
|
|
131
|
-
//# debugId=
|
|
147
|
+
//# debugId=248f07f8-7dd2-5974-a2ca-c20b35afb389
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../src/index.ts"],"sourceRoot":"","names":[],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA,
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/index.ts"],"sourceRoot":"","names":[],"mappings":"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","debugId":"248f07f8-7dd2-5974-a2ca-c20b35afb389"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oauth-device-login.spec.d.ts","sourceRoot":"","sources":["../../../src/oauth/__tests__/oauth-device-login.spec.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,310 @@
|
|
|
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]="4c9291f6-ed20-5fe9-8a45-7d2690d55b38")}catch(e){}}();
|
|
3
|
+
|
|
4
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
5
|
+
if (k2 === undefined) k2 = k;
|
|
6
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
7
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
8
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
9
|
+
}
|
|
10
|
+
Object.defineProperty(o, k2, desc);
|
|
11
|
+
}) : (function(o, m, k, k2) {
|
|
12
|
+
if (k2 === undefined) k2 = k;
|
|
13
|
+
o[k2] = m[k];
|
|
14
|
+
}));
|
|
15
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
16
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
17
|
+
}) : function(o, v) {
|
|
18
|
+
o["default"] = v;
|
|
19
|
+
});
|
|
20
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
21
|
+
var ownKeys = function(o) {
|
|
22
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
23
|
+
var ar = [];
|
|
24
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
25
|
+
return ar;
|
|
26
|
+
};
|
|
27
|
+
return ownKeys(o);
|
|
28
|
+
};
|
|
29
|
+
return function (mod) {
|
|
30
|
+
if (mod && mod.__esModule) return mod;
|
|
31
|
+
var result = {};
|
|
32
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
33
|
+
__setModuleDefault(result, mod);
|
|
34
|
+
return result;
|
|
35
|
+
};
|
|
36
|
+
})();
|
|
37
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
38
|
+
const vitest_1 = require("vitest");
|
|
39
|
+
const oauth_pkce_1 = require("../oauth-pkce");
|
|
40
|
+
// Real performDeviceLogin() calls storeOAuthTokens() on success, which writes
|
|
41
|
+
// to ~/.meticulous/oauth-tokens.json. Mock it so the success-path tests below
|
|
42
|
+
// can't overwrite a developer's real login or fail with EPERM in locked-down CI.
|
|
43
|
+
vitest_1.vi.mock("../oauth-token-store", () => ({
|
|
44
|
+
storeOAuthTokens: vitest_1.vi.fn(),
|
|
45
|
+
}));
|
|
46
|
+
const DEVICE_AUTHORIZATION_ENDPOINT = "https://issuer.example/device";
|
|
47
|
+
const TOKEN_ENDPOINT = "https://issuer.example/token";
|
|
48
|
+
const jsonResponse = (status, body) => ({
|
|
49
|
+
ok: status >= 200 && status < 300,
|
|
50
|
+
status,
|
|
51
|
+
text: () => Promise.resolve(JSON.stringify(body)),
|
|
52
|
+
json: () => Promise.resolve(body),
|
|
53
|
+
});
|
|
54
|
+
const discoveryResponse = ({ omitDeviceAuthorizationEndpoint = false, } = {}) => jsonResponse(200, {
|
|
55
|
+
token_endpoint: TOKEN_ENDPOINT,
|
|
56
|
+
...(omitDeviceAuthorizationEndpoint
|
|
57
|
+
? {}
|
|
58
|
+
: { device_authorization_endpoint: DEVICE_AUTHORIZATION_ENDPOINT }),
|
|
59
|
+
});
|
|
60
|
+
const deviceAuthorizationResponse = ({ interval, expiresIn = 600, } = {}) => jsonResponse(200, {
|
|
61
|
+
device_code: "device-code-1",
|
|
62
|
+
user_code: "ABCD-EFGH",
|
|
63
|
+
verification_uri: DEVICE_AUTHORIZATION_ENDPOINT,
|
|
64
|
+
expires_in: expiresIn,
|
|
65
|
+
...(interval !== undefined ? { interval } : {}),
|
|
66
|
+
});
|
|
67
|
+
(0, vitest_1.describe)("performDeviceLogin", () => {
|
|
68
|
+
let fetchMock;
|
|
69
|
+
(0, vitest_1.beforeEach)(() => {
|
|
70
|
+
vitest_1.vi.resetModules();
|
|
71
|
+
vitest_1.vi.useFakeTimers();
|
|
72
|
+
fetchMock = vitest_1.vi.fn();
|
|
73
|
+
vitest_1.vi.stubGlobal("fetch", fetchMock);
|
|
74
|
+
});
|
|
75
|
+
(0, vitest_1.afterEach)(() => {
|
|
76
|
+
vitest_1.vi.useRealTimers();
|
|
77
|
+
vitest_1.vi.unstubAllGlobals();
|
|
78
|
+
});
|
|
79
|
+
const importPerformDeviceLogin = async () => {
|
|
80
|
+
const module = await Promise.resolve().then(() => __importStar(require("../oauth-device-login")));
|
|
81
|
+
return module.performDeviceLogin;
|
|
82
|
+
};
|
|
83
|
+
(0, vitest_1.it)("succeeds after a couple of pending polls", async () => {
|
|
84
|
+
fetchMock
|
|
85
|
+
.mockResolvedValueOnce(discoveryResponse())
|
|
86
|
+
.mockResolvedValueOnce(deviceAuthorizationResponse({ interval: 5 }))
|
|
87
|
+
.mockResolvedValueOnce(jsonResponse(400, { error: "authorization_pending" }))
|
|
88
|
+
.mockResolvedValueOnce(jsonResponse(400, { error: "authorization_pending" }))
|
|
89
|
+
.mockResolvedValueOnce(jsonResponse(200, {
|
|
90
|
+
access_token: "access-1",
|
|
91
|
+
refresh_token: "refresh-1",
|
|
92
|
+
expires_in: 300,
|
|
93
|
+
id_token: "id-1",
|
|
94
|
+
}));
|
|
95
|
+
const performDeviceLogin = await importPerformDeviceLogin();
|
|
96
|
+
const resultPromise = performDeviceLogin();
|
|
97
|
+
await vitest_1.vi.advanceTimersByTimeAsync(5000);
|
|
98
|
+
await vitest_1.vi.advanceTimersByTimeAsync(5000);
|
|
99
|
+
await vitest_1.vi.advanceTimersByTimeAsync(5000);
|
|
100
|
+
const tokens = await resultPromise;
|
|
101
|
+
(0, vitest_1.expect)(tokens.accessToken).toBe("access-1");
|
|
102
|
+
(0, vitest_1.expect)(tokens.refreshToken).toBe("refresh-1");
|
|
103
|
+
(0, vitest_1.expect)(tokens.idToken).toBe("id-1");
|
|
104
|
+
(0, vitest_1.expect)(fetchMock).toHaveBeenCalledTimes(5);
|
|
105
|
+
const deviceAuthCall = fetchMock.mock.calls[1];
|
|
106
|
+
(0, vitest_1.expect)(deviceAuthCall?.[0]).toBe(DEVICE_AUTHORIZATION_ENDPOINT);
|
|
107
|
+
const deviceAuthBody = new URLSearchParams(deviceAuthCall?.[1]?.body);
|
|
108
|
+
const codeChallenge = deviceAuthBody.get("code_challenge");
|
|
109
|
+
(0, vitest_1.expect)(codeChallenge).toBeTruthy();
|
|
110
|
+
(0, vitest_1.expect)(deviceAuthBody.get("code_challenge_method")).toBe("S256");
|
|
111
|
+
const tokenCall = fetchMock.mock.calls[2];
|
|
112
|
+
(0, vitest_1.expect)(tokenCall?.[0]).toBe(TOKEN_ENDPOINT);
|
|
113
|
+
const tokenCallBody = new URLSearchParams(tokenCall?.[1]?.body);
|
|
114
|
+
(0, vitest_1.expect)(tokenCallBody.get("grant_type")).toBe("urn:ietf:params:oauth:grant-type:device_code");
|
|
115
|
+
const codeVerifier = tokenCallBody.get("code_verifier");
|
|
116
|
+
(0, vitest_1.expect)(codeVerifier).toBeTruthy();
|
|
117
|
+
(0, vitest_1.expect)((0, oauth_pkce_1.generateCodeChallenge)(codeVerifier ?? "")).toBe(codeChallenge);
|
|
118
|
+
});
|
|
119
|
+
(0, vitest_1.it)("increases the interval by 5s on slow_down and keeps polling", async () => {
|
|
120
|
+
fetchMock
|
|
121
|
+
.mockResolvedValueOnce(discoveryResponse())
|
|
122
|
+
.mockResolvedValueOnce(deviceAuthorizationResponse({ interval: 5 }))
|
|
123
|
+
.mockResolvedValueOnce(jsonResponse(400, { error: "slow_down" }))
|
|
124
|
+
.mockResolvedValueOnce(jsonResponse(200, {
|
|
125
|
+
access_token: "access-2",
|
|
126
|
+
refresh_token: "refresh-2",
|
|
127
|
+
expires_in: 300,
|
|
128
|
+
}));
|
|
129
|
+
const performDeviceLogin = await importPerformDeviceLogin();
|
|
130
|
+
const resultPromise = performDeviceLogin();
|
|
131
|
+
// First poll fires at t=5s (the initial interval) and returns slow_down,
|
|
132
|
+
// bumping the interval to 10s.
|
|
133
|
+
await vitest_1.vi.advanceTimersByTimeAsync(5000);
|
|
134
|
+
(0, vitest_1.expect)(fetchMock).toHaveBeenCalledTimes(3);
|
|
135
|
+
// A poll at the old 5s cadence (t=10s) must NOT have fired yet, since the
|
|
136
|
+
// interval grew to 10s after the slow_down response.
|
|
137
|
+
await vitest_1.vi.advanceTimersByTimeAsync(5000);
|
|
138
|
+
(0, vitest_1.expect)(fetchMock).toHaveBeenCalledTimes(3);
|
|
139
|
+
// The next poll happens once the full 10s interval has elapsed (t=15s).
|
|
140
|
+
await vitest_1.vi.advanceTimersByTimeAsync(5000);
|
|
141
|
+
(0, vitest_1.expect)(fetchMock).toHaveBeenCalledTimes(4);
|
|
142
|
+
const tokens = await resultPromise;
|
|
143
|
+
(0, vitest_1.expect)(tokens.accessToken).toBe("access-2");
|
|
144
|
+
});
|
|
145
|
+
(0, vitest_1.it)("does not grow the interval on authorization_pending", async () => {
|
|
146
|
+
fetchMock
|
|
147
|
+
.mockResolvedValueOnce(discoveryResponse())
|
|
148
|
+
.mockResolvedValueOnce(deviceAuthorizationResponse({ interval: 5 }))
|
|
149
|
+
.mockResolvedValueOnce(jsonResponse(400, { error: "authorization_pending" }))
|
|
150
|
+
.mockResolvedValueOnce(jsonResponse(200, {
|
|
151
|
+
access_token: "access-3",
|
|
152
|
+
refresh_token: "refresh-3",
|
|
153
|
+
expires_in: 300,
|
|
154
|
+
}));
|
|
155
|
+
const performDeviceLogin = await importPerformDeviceLogin();
|
|
156
|
+
const resultPromise = performDeviceLogin();
|
|
157
|
+
// First poll fires at t=5s (the initial interval) and returns pending.
|
|
158
|
+
await vitest_1.vi.advanceTimersByTimeAsync(5000);
|
|
159
|
+
(0, vitest_1.expect)(fetchMock).toHaveBeenCalledTimes(3);
|
|
160
|
+
// A poll at t=9s must NOT have fired yet, since a pending response leaves
|
|
161
|
+
// the 5s interval unchanged (unlike slow_down, which grows it).
|
|
162
|
+
await vitest_1.vi.advanceTimersByTimeAsync(4000);
|
|
163
|
+
(0, vitest_1.expect)(fetchMock).toHaveBeenCalledTimes(3);
|
|
164
|
+
// The next poll happens once the unchanged 5s interval has elapsed (t=10s).
|
|
165
|
+
await vitest_1.vi.advanceTimersByTimeAsync(1000);
|
|
166
|
+
(0, vitest_1.expect)(fetchMock).toHaveBeenCalledTimes(4);
|
|
167
|
+
const tokens = await resultPromise;
|
|
168
|
+
(0, vitest_1.expect)(tokens.accessToken).toBe("access-3");
|
|
169
|
+
});
|
|
170
|
+
(0, vitest_1.it)("throws a clear error when the user denies the login", async () => {
|
|
171
|
+
fetchMock
|
|
172
|
+
.mockResolvedValueOnce(discoveryResponse())
|
|
173
|
+
.mockResolvedValueOnce(deviceAuthorizationResponse({ interval: 5 }))
|
|
174
|
+
.mockResolvedValueOnce(jsonResponse(400, { error: "access_denied" }));
|
|
175
|
+
const performDeviceLogin = await importPerformDeviceLogin();
|
|
176
|
+
const resultPromise = performDeviceLogin();
|
|
177
|
+
const expectation = (0, vitest_1.expect)(resultPromise).rejects.toThrow("Login was denied.");
|
|
178
|
+
await vitest_1.vi.advanceTimersByTimeAsync(5000);
|
|
179
|
+
await expectation;
|
|
180
|
+
});
|
|
181
|
+
(0, vitest_1.it)("throws a clear error when the server reports the device code expired", async () => {
|
|
182
|
+
fetchMock
|
|
183
|
+
.mockResolvedValueOnce(discoveryResponse())
|
|
184
|
+
.mockResolvedValueOnce(deviceAuthorizationResponse({ interval: 5 }))
|
|
185
|
+
.mockResolvedValueOnce(jsonResponse(400, { error: "expired_token" }));
|
|
186
|
+
const performDeviceLogin = await importPerformDeviceLogin();
|
|
187
|
+
const resultPromise = performDeviceLogin();
|
|
188
|
+
const expectation = (0, vitest_1.expect)(resultPromise).rejects.toThrow("Device code expired, run login again.");
|
|
189
|
+
await vitest_1.vi.advanceTimersByTimeAsync(5000);
|
|
190
|
+
await expectation;
|
|
191
|
+
});
|
|
192
|
+
(0, vitest_1.it)("makes a final poll at the deadline before giving up locally", async () => {
|
|
193
|
+
fetchMock
|
|
194
|
+
.mockResolvedValueOnce(discoveryResponse())
|
|
195
|
+
.mockResolvedValueOnce(deviceAuthorizationResponse({ interval: 5, expiresIn: 8 }))
|
|
196
|
+
.mockResolvedValueOnce(jsonResponse(400, { error: "authorization_pending" }))
|
|
197
|
+
.mockResolvedValueOnce(jsonResponse(400, { error: "authorization_pending" }));
|
|
198
|
+
const performDeviceLogin = await importPerformDeviceLogin();
|
|
199
|
+
const resultPromise = performDeviceLogin();
|
|
200
|
+
const expectation = (0, vitest_1.expect)(resultPromise).rejects.toThrow("Device code expired, run login again.");
|
|
201
|
+
// First poll at t=5s: still within the 8s deadline.
|
|
202
|
+
await vitest_1.vi.advanceTimersByTimeAsync(5000);
|
|
203
|
+
(0, vitest_1.expect)(fetchMock).toHaveBeenCalledTimes(3);
|
|
204
|
+
// Remaining lifetime is 3s, so the sleep is capped to that instead of the
|
|
205
|
+
// full 5s interval, and a final poll fires right at the t=8s deadline.
|
|
206
|
+
await vitest_1.vi.advanceTimersByTimeAsync(3000);
|
|
207
|
+
await expectation;
|
|
208
|
+
(0, vitest_1.expect)(fetchMock).toHaveBeenCalledTimes(4);
|
|
209
|
+
});
|
|
210
|
+
(0, vitest_1.it)("succeeds when approval arrives after the last pending poll but before expiry", async () => {
|
|
211
|
+
fetchMock
|
|
212
|
+
.mockResolvedValueOnce(discoveryResponse())
|
|
213
|
+
.mockResolvedValueOnce(deviceAuthorizationResponse({ interval: 5, expiresIn: 8 }))
|
|
214
|
+
.mockResolvedValueOnce(jsonResponse(400, { error: "authorization_pending" }))
|
|
215
|
+
.mockResolvedValueOnce(jsonResponse(200, {
|
|
216
|
+
access_token: "access-late",
|
|
217
|
+
refresh_token: "refresh-late",
|
|
218
|
+
expires_in: 300,
|
|
219
|
+
}));
|
|
220
|
+
const performDeviceLogin = await importPerformDeviceLogin();
|
|
221
|
+
const resultPromise = performDeviceLogin();
|
|
222
|
+
await vitest_1.vi.advanceTimersByTimeAsync(5000);
|
|
223
|
+
await vitest_1.vi.advanceTimersByTimeAsync(3000);
|
|
224
|
+
const tokens = await resultPromise;
|
|
225
|
+
(0, vitest_1.expect)(tokens.accessToken).toBe("access-late");
|
|
226
|
+
(0, vitest_1.expect)(fetchMock).toHaveBeenCalledTimes(4);
|
|
227
|
+
});
|
|
228
|
+
(0, vitest_1.it)("throws a clear error when the device authorization grant is not enabled on the realm", async () => {
|
|
229
|
+
fetchMock.mockResolvedValueOnce(discoveryResponse({ omitDeviceAuthorizationEndpoint: true }));
|
|
230
|
+
const performDeviceLogin = await importPerformDeviceLogin();
|
|
231
|
+
await (0, vitest_1.expect)(performDeviceLogin()).rejects.toThrow(/device_authorization_endpoint/);
|
|
232
|
+
(0, vitest_1.expect)(fetchMock).toHaveBeenCalledTimes(1);
|
|
233
|
+
});
|
|
234
|
+
(0, vitest_1.it)("throws a clear error when Keycloak rejects the client as unauthorized for the device grant", async () => {
|
|
235
|
+
// Verified against a real Keycloak 26.2.5: discovery still advertises
|
|
236
|
+
// `device_authorization_endpoint` even when the grant is disabled on this
|
|
237
|
+
// specific client (it's realm-level, not per-client) — Keycloak instead
|
|
238
|
+
// rejects the device-authorization POST itself with `unauthorized_client`.
|
|
239
|
+
fetchMock.mockResolvedValueOnce(discoveryResponse()).mockResolvedValueOnce(jsonResponse(400, {
|
|
240
|
+
error: "unauthorized_client",
|
|
241
|
+
error_description: "Client is not allowed to initiate OAuth 2.0 Device Authorization Grant. The flow is disabled for the client.",
|
|
242
|
+
}));
|
|
243
|
+
const performDeviceLogin = await importPerformDeviceLogin();
|
|
244
|
+
await (0, vitest_1.expect)(performDeviceLogin()).rejects.toThrow(/not enabled for the meticulous-cli client/);
|
|
245
|
+
(0, vitest_1.expect)(fetchMock).toHaveBeenCalledTimes(2);
|
|
246
|
+
});
|
|
247
|
+
(0, vitest_1.it)("throws a clear error when the device authorization response is missing expires_in", async () => {
|
|
248
|
+
fetchMock.mockResolvedValueOnce(discoveryResponse()).mockResolvedValueOnce(jsonResponse(200, {
|
|
249
|
+
device_code: "device-code-1",
|
|
250
|
+
user_code: "ABCD-EFGH",
|
|
251
|
+
verification_uri: DEVICE_AUTHORIZATION_ENDPOINT,
|
|
252
|
+
// expires_in omitted
|
|
253
|
+
}));
|
|
254
|
+
const performDeviceLogin = await importPerformDeviceLogin();
|
|
255
|
+
await (0, vitest_1.expect)(performDeviceLogin()).rejects.toThrow(/expires_in/);
|
|
256
|
+
(0, vitest_1.expect)(fetchMock).toHaveBeenCalledTimes(2);
|
|
257
|
+
});
|
|
258
|
+
(0, vitest_1.it)("throws a clear error when the device authorization response is missing user_code", async () => {
|
|
259
|
+
fetchMock.mockResolvedValueOnce(discoveryResponse()).mockResolvedValueOnce(jsonResponse(200, {
|
|
260
|
+
device_code: "device-code-1",
|
|
261
|
+
verification_uri: DEVICE_AUTHORIZATION_ENDPOINT,
|
|
262
|
+
expires_in: 600,
|
|
263
|
+
}));
|
|
264
|
+
const performDeviceLogin = await importPerformDeviceLogin();
|
|
265
|
+
await (0, vitest_1.expect)(performDeviceLogin()).rejects.toThrow(/user_code/);
|
|
266
|
+
(0, vitest_1.expect)(fetchMock).toHaveBeenCalledTimes(2);
|
|
267
|
+
});
|
|
268
|
+
(0, vitest_1.it)("tolerates a transient network error while polling and keeps going", async () => {
|
|
269
|
+
fetchMock
|
|
270
|
+
.mockResolvedValueOnce(discoveryResponse())
|
|
271
|
+
.mockResolvedValueOnce(deviceAuthorizationResponse({ interval: 5 }))
|
|
272
|
+
.mockRejectedValueOnce(new Error("network blip"))
|
|
273
|
+
.mockResolvedValueOnce(jsonResponse(200, {
|
|
274
|
+
access_token: "access-4",
|
|
275
|
+
refresh_token: "refresh-4",
|
|
276
|
+
expires_in: 300,
|
|
277
|
+
}));
|
|
278
|
+
const performDeviceLogin = await importPerformDeviceLogin();
|
|
279
|
+
const resultPromise = performDeviceLogin();
|
|
280
|
+
// The network error at t=5s doesn't grow the interval or abort the flow,
|
|
281
|
+
// so the next poll still fires at the unchanged 5s cadence (t=10s).
|
|
282
|
+
await vitest_1.vi.advanceTimersByTimeAsync(5000);
|
|
283
|
+
(0, vitest_1.expect)(fetchMock).toHaveBeenCalledTimes(3);
|
|
284
|
+
await vitest_1.vi.advanceTimersByTimeAsync(5000);
|
|
285
|
+
(0, vitest_1.expect)(fetchMock).toHaveBeenCalledTimes(4);
|
|
286
|
+
const tokens = await resultPromise;
|
|
287
|
+
(0, vitest_1.expect)(tokens.accessToken).toBe("access-4");
|
|
288
|
+
});
|
|
289
|
+
(0, vitest_1.it)("tolerates a transient 5xx from the token endpoint and keeps polling", async () => {
|
|
290
|
+
fetchMock
|
|
291
|
+
.mockResolvedValueOnce(discoveryResponse())
|
|
292
|
+
.mockResolvedValueOnce(deviceAuthorizationResponse({ interval: 5 }))
|
|
293
|
+
.mockResolvedValueOnce(jsonResponse(503, "Service Unavailable"))
|
|
294
|
+
.mockResolvedValueOnce(jsonResponse(200, {
|
|
295
|
+
access_token: "access-5",
|
|
296
|
+
refresh_token: "refresh-5",
|
|
297
|
+
expires_in: 300,
|
|
298
|
+
}));
|
|
299
|
+
const performDeviceLogin = await importPerformDeviceLogin();
|
|
300
|
+
const resultPromise = performDeviceLogin();
|
|
301
|
+
await vitest_1.vi.advanceTimersByTimeAsync(5000);
|
|
302
|
+
(0, vitest_1.expect)(fetchMock).toHaveBeenCalledTimes(3);
|
|
303
|
+
await vitest_1.vi.advanceTimersByTimeAsync(5000);
|
|
304
|
+
(0, vitest_1.expect)(fetchMock).toHaveBeenCalledTimes(4);
|
|
305
|
+
const tokens = await resultPromise;
|
|
306
|
+
(0, vitest_1.expect)(tokens.accessToken).toBe("access-5");
|
|
307
|
+
});
|
|
308
|
+
});
|
|
309
|
+
//# sourceMappingURL=oauth-device-login.spec.js.map
|
|
310
|
+
//# debugId=4c9291f6-ed20-5fe9-8a45-7d2690d55b38
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oauth-device-login.spec.js","sources":["../../../src/oauth/__tests__/oauth-device-login.spec.ts"],"sourceRoot":"","names":[],"mappings":"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","debugId":"4c9291f6-ed20-5fe9-8a45-7d2690d55b38"}
|
|
@@ -2,5 +2,6 @@ export declare const KEYCLOAK_ISSUER_URL: string;
|
|
|
2
2
|
export declare const CLI_CLIENT_ID = "meticulous-cli";
|
|
3
3
|
export declare const OAUTH_SCOPES = "openid email profile offline_access";
|
|
4
4
|
export declare const getTokenEndpoint: () => Promise<string>;
|
|
5
|
+
export declare const getDeviceAuthorizationEndpoint: () => Promise<string>;
|
|
5
6
|
export declare const getWebappBaseUrl: () => string;
|
|
6
7
|
//# sourceMappingURL=oauth-constants.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"oauth-constants.d.ts","sourceRoot":"","sources":["../../src/oauth/oauth-constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,mBAAmB,QAEoB,CAAC;AAErD,eAAO,MAAM,aAAa,mBAAmB,CAAC;AAE9C,eAAO,MAAM,YAAY,wCAAwC,CAAC;
|
|
1
|
+
{"version":3,"file":"oauth-constants.d.ts","sourceRoot":"","sources":["../../src/oauth/oauth-constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,mBAAmB,QAEoB,CAAC;AAErD,eAAO,MAAM,aAAa,mBAAmB,CAAC;AAE9C,eAAO,MAAM,YAAY,wCAAwC,CAAC;AAgClE,eAAO,MAAM,gBAAgB,QAAa,OAAO,CAAC,MAAM,CAGvD,CAAC;AAEF,eAAO,MAAM,8BAA8B,QAAa,OAAO,CAAC,MAAM,CAUrE,CAAC;AAIF,eAAO,MAAM,gBAAgB,QAAO,MAenC,CAAC"}
|
|
@@ -1,17 +1,17 @@
|
|
|
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]="4836117c-ca38-52ca-af60-a97d89220835")}catch(e){}}();
|
|
3
3
|
|
|
4
4
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
5
|
-
exports.getWebappBaseUrl = exports.getTokenEndpoint = exports.OAUTH_SCOPES = exports.CLI_CLIENT_ID = exports.KEYCLOAK_ISSUER_URL = void 0;
|
|
5
|
+
exports.getWebappBaseUrl = exports.getDeviceAuthorizationEndpoint = exports.getTokenEndpoint = exports.OAUTH_SCOPES = exports.CLI_CLIENT_ID = exports.KEYCLOAK_ISSUER_URL = void 0;
|
|
6
6
|
exports.KEYCLOAK_ISSUER_URL = process.env["METICULOUS_OAUTH_ISSUER_URL"] ||
|
|
7
7
|
"https://app.meticulous.ai/auth/realms/meticulous";
|
|
8
8
|
exports.CLI_CLIENT_ID = "meticulous-cli";
|
|
9
9
|
exports.OAUTH_SCOPES = "openid email profile offline_access";
|
|
10
10
|
const WELL_KNOWN_PATH = "/.well-known/openid-configuration";
|
|
11
|
-
let
|
|
12
|
-
const
|
|
13
|
-
if (
|
|
14
|
-
return
|
|
11
|
+
let cachedOidcConfiguration = null;
|
|
12
|
+
const getOidcConfiguration = async () => {
|
|
13
|
+
if (cachedOidcConfiguration) {
|
|
14
|
+
return cachedOidcConfiguration;
|
|
15
15
|
}
|
|
16
16
|
const response = await fetch(`${exports.KEYCLOAK_ISSUER_URL}${WELL_KNOWN_PATH}`);
|
|
17
17
|
if (!response.ok) {
|
|
@@ -21,10 +21,24 @@ const getTokenEndpoint = async () => {
|
|
|
21
21
|
if (!config.token_endpoint) {
|
|
22
22
|
throw new Error("OpenID configuration missing token_endpoint");
|
|
23
23
|
}
|
|
24
|
-
|
|
25
|
-
return
|
|
24
|
+
cachedOidcConfiguration = config;
|
|
25
|
+
return cachedOidcConfiguration;
|
|
26
|
+
};
|
|
27
|
+
const getTokenEndpoint = async () => {
|
|
28
|
+
const config = await getOidcConfiguration();
|
|
29
|
+
return config.token_endpoint;
|
|
26
30
|
};
|
|
27
31
|
exports.getTokenEndpoint = getTokenEndpoint;
|
|
32
|
+
const getDeviceAuthorizationEndpoint = async () => {
|
|
33
|
+
const config = await getOidcConfiguration();
|
|
34
|
+
if (!config.device_authorization_endpoint) {
|
|
35
|
+
throw new Error("OpenID configuration missing device_authorization_endpoint. " +
|
|
36
|
+
"The OAuth 2.0 Device Authorization Grant is not enabled for the " +
|
|
37
|
+
`meticulous-cli client on this realm (${exports.KEYCLOAK_ISSUER_URL}).`);
|
|
38
|
+
}
|
|
39
|
+
return config.device_authorization_endpoint;
|
|
40
|
+
};
|
|
41
|
+
exports.getDeviceAuthorizationEndpoint = getDeviceAuthorizationEndpoint;
|
|
28
42
|
const DEFAULT_WEBAPP_BASE_URL = "https://app.meticulous.ai";
|
|
29
43
|
const getWebappBaseUrl = () => {
|
|
30
44
|
const apiUrlFromEnv = process.env["METICULOUS_API_URL"];
|
|
@@ -39,4 +53,4 @@ const getWebappBaseUrl = () => {
|
|
|
39
53
|
};
|
|
40
54
|
exports.getWebappBaseUrl = getWebappBaseUrl;
|
|
41
55
|
//# sourceMappingURL=oauth-constants.js.map
|
|
42
|
-
//# debugId=
|
|
56
|
+
//# debugId=4836117c-ca38-52ca-af60-a97d89220835
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"oauth-constants.js","sources":["../../src/oauth/oauth-constants.ts"],"sourceRoot":"","names":[],"mappings":";;;;;AAAa,QAAA,mBAAmB,GAC9B,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC;IAC1C,kDAAkD,CAAC;AAExC,QAAA,aAAa,GAAG,gBAAgB,CAAC;AAEjC,QAAA,YAAY,GAAG,qCAAqC,CAAC;AAElE,MAAM,eAAe,GAAG,mCAAmC,CAAC;
|
|
1
|
+
{"version":3,"file":"oauth-constants.js","sources":["../../src/oauth/oauth-constants.ts"],"sourceRoot":"","names":[],"mappings":";;;;;AAAa,QAAA,mBAAmB,GAC9B,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC;IAC1C,kDAAkD,CAAC;AAExC,QAAA,aAAa,GAAG,gBAAgB,CAAC;AAEjC,QAAA,YAAY,GAAG,qCAAqC,CAAC;AAElE,MAAM,eAAe,GAAG,mCAAmC,CAAC;AAO5D,IAAI,uBAAuB,GAA6B,IAAI,CAAC;AAE7D,MAAM,oBAAoB,GAAG,KAAK,IAAgC,EAAE;IAClE,IAAI,uBAAuB,EAAE,CAAC;QAC5B,OAAO,uBAAuB,CAAC;IACjC,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,2BAAmB,GAAG,eAAe,EAAE,CAAC,CAAC;IACzE,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CACb,yCAAyC,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,EAAE,CAClF,CAAC;IACJ,CAAC;IAED,MAAM,MAAM,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAsB,CAAC;IAC5D,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC;QAC3B,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;IACjE,CAAC;IAED,uBAAuB,GAAG,MAAM,CAAC;IACjC,OAAO,uBAAuB,CAAC;AACjC,CAAC,CAAC;AAEK,MAAM,gBAAgB,GAAG,KAAK,IAAqB,EAAE;IAC1D,MAAM,MAAM,GAAG,MAAM,oBAAoB,EAAE,CAAC;IAC5C,OAAO,MAAM,CAAC,cAAc,CAAC;AAC/B,CAAC,CAAC;AAHW,QAAA,gBAAgB,oBAG3B;AAEK,MAAM,8BAA8B,GAAG,KAAK,IAAqB,EAAE;IACxE,MAAM,MAAM,GAAG,MAAM,oBAAoB,EAAE,CAAC;IAC5C,IAAI,CAAC,MAAM,CAAC,6BAA6B,EAAE,CAAC;QAC1C,MAAM,IAAI,KAAK,CACb,8DAA8D;YAC5D,kEAAkE;YAClE,wCAAwC,2BAAmB,IAAI,CAClE,CAAC;IACJ,CAAC;IACD,OAAO,MAAM,CAAC,6BAA6B,CAAC;AAC9C,CAAC,CAAC;AAVW,QAAA,8BAA8B,kCAUzC;AAEF,MAAM,uBAAuB,GAAG,2BAA2B,CAAC;AAErD,MAAM,gBAAgB,GAAG,GAAW,EAAE;IAC3C,MAAM,aAAa,GAAG,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;IAExD,IAAI,aAAa,IAAI,aAAa,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;QACzD,yEAAyE;QACzE,mCAAmC;QACnC,OAAO,aAAa;aACjB,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC;aACxB,OAAO,CACN,iBAAiB,EACjB,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE,CAAC,aAAa,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAClD,CAAC;IACN,CAAC;IAED,OAAO,uBAAuB,CAAC;AACjC,CAAC,CAAC;AAfW,QAAA,gBAAgB,oBAe3B","debugId":"4836117c-ca38-52ca-af60-a97d89220835"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oauth-device-login.d.ts","sourceRoot":"","sources":["../../src/oauth/oauth-device-login.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AA2B7D,eAAO,MAAM,kBAAkB,QAAa,OAAO,CAAC,iBAAiB,CA+BpE,CAAC"}
|