@doist/twist-cli 2.36.3 → 2.36.5
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/CHANGELOG.md +12 -0
- package/dist/commands/auth/helpers.d.ts +8 -1
- package/dist/commands/auth/helpers.d.ts.map +1 -1
- package/dist/commands/auth/helpers.js +12 -7
- package/dist/commands/auth/helpers.js.map +1 -1
- package/dist/commands/auth/index.d.ts.map +1 -1
- package/dist/commands/auth/index.js +12 -12
- package/dist/commands/auth/index.js.map +1 -1
- package/dist/commands/auth/login.d.ts +3 -3
- package/dist/commands/auth/login.d.ts.map +1 -1
- package/dist/commands/auth/login.js +24 -62
- package/dist/commands/auth/login.js.map +1 -1
- package/dist/commands/auth/logout.d.ts +10 -1
- package/dist/commands/auth/logout.d.ts.map +1 -1
- package/dist/commands/auth/logout.js +18 -6
- package/dist/commands/auth/logout.js.map +1 -1
- package/dist/commands/auth/status.d.ts +15 -3
- package/dist/commands/auth/status.d.ts.map +1 -1
- package/dist/commands/auth/status.js +87 -22
- package/dist/commands/auth/status.js.map +1 -1
- package/dist/commands/changelog.d.ts +0 -5
- package/dist/commands/changelog.d.ts.map +1 -1
- package/dist/commands/changelog.js +9 -103
- package/dist/commands/changelog.js.map +1 -1
- package/dist/commands/channel/list.js +5 -5
- package/dist/commands/channel/list.js.map +1 -1
- package/dist/commands/channel/threads.d.ts.map +1 -1
- package/dist/commands/channel/threads.js +5 -3
- package/dist/commands/channel/threads.js.map +1 -1
- package/dist/commands/config/view.d.ts.map +1 -1
- package/dist/commands/config/view.js +3 -3
- package/dist/commands/config/view.js.map +1 -1
- package/dist/commands/conversation/helpers.d.ts.map +1 -1
- package/dist/commands/conversation/helpers.js +4 -3
- package/dist/commands/conversation/helpers.js.map +1 -1
- package/dist/commands/conversation/unread.d.ts.map +1 -1
- package/dist/commands/conversation/unread.js +5 -4
- package/dist/commands/conversation/unread.js.map +1 -1
- package/dist/commands/conversation/view.d.ts.map +1 -1
- package/dist/commands/conversation/view.js +8 -6
- package/dist/commands/conversation/view.js.map +1 -1
- package/dist/commands/inbox.d.ts.map +1 -1
- package/dist/commands/inbox.js +9 -7
- package/dist/commands/inbox.js.map +1 -1
- package/dist/commands/thread/view.d.ts.map +1 -1
- package/dist/commands/thread/view.js +14 -12
- package/dist/commands/thread/view.js.map +1 -1
- package/dist/commands/update/index.d.ts.map +1 -1
- package/dist/commands/update/index.js +43 -14
- package/dist/commands/update/index.js.map +1 -1
- package/dist/index.js +27 -4
- package/dist/index.js.map +1 -1
- package/dist/lib/api.d.ts +23 -5
- package/dist/lib/api.d.ts.map +1 -1
- package/dist/lib/api.js +61 -3
- package/dist/lib/api.js.map +1 -1
- package/dist/lib/auth-pages.d.ts +3 -0
- package/dist/lib/auth-pages.d.ts.map +1 -0
- package/dist/lib/{oauth-server.js → auth-pages.js} +3 -120
- package/dist/lib/auth-pages.js.map +1 -0
- package/dist/lib/auth-provider.d.ts +28 -0
- package/dist/lib/auth-provider.d.ts.map +1 -0
- package/dist/lib/auth-provider.js +241 -0
- package/dist/lib/auth-provider.js.map +1 -0
- package/dist/lib/auth.d.ts +16 -10
- package/dist/lib/auth.d.ts.map +1 -1
- package/dist/lib/auth.js +18 -0
- package/dist/lib/auth.js.map +1 -1
- package/dist/lib/config.d.ts +23 -2
- package/dist/lib/config.d.ts.map +1 -1
- package/dist/lib/config.js +95 -47
- package/dist/lib/config.js.map +1 -1
- package/dist/lib/errors.d.ts +15 -6
- package/dist/lib/errors.d.ts.map +1 -1
- package/dist/lib/errors.js +14 -9
- package/dist/lib/errors.js.map +1 -1
- package/dist/lib/global-args.d.ts +35 -21
- package/dist/lib/global-args.d.ts.map +1 -1
- package/dist/lib/global-args.js +84 -64
- package/dist/lib/global-args.js.map +1 -1
- package/dist/lib/markdown.d.ts +1 -0
- package/dist/lib/markdown.d.ts.map +1 -1
- package/dist/lib/markdown.js +9 -14
- package/dist/lib/markdown.js.map +1 -1
- package/dist/lib/options.d.ts +2 -3
- package/dist/lib/options.d.ts.map +1 -1
- package/dist/lib/output.d.ts +5 -3
- package/dist/lib/output.d.ts.map +1 -1
- package/dist/lib/output.js +15 -17
- package/dist/lib/output.js.map +1 -1
- package/dist/lib/skills/content.d.ts +1 -1
- package/dist/lib/skills/content.d.ts.map +1 -1
- package/dist/lib/skills/content.js +16 -6
- package/dist/lib/skills/content.js.map +1 -1
- package/dist/lib/spinner.d.ts +2 -23
- package/dist/lib/spinner.d.ts.map +1 -1
- package/dist/lib/spinner.js +6 -107
- package/dist/lib/spinner.js.map +1 -1
- package/dist/lib/update.d.ts +9 -13
- package/dist/lib/update.d.ts.map +1 -1
- package/dist/lib/update.js +17 -43
- package/dist/lib/update.js.map +1 -1
- package/package.json +6 -6
- package/dist/commands/update/action.d.ts +0 -12
- package/dist/commands/update/action.d.ts.map +0 -1
- package/dist/commands/update/action.js +0 -104
- package/dist/commands/update/action.js.map +0 -1
- package/dist/commands/update/switch.d.ts +0 -5
- package/dist/commands/update/switch.d.ts.map +0 -1
- package/dist/commands/update/switch.js +0 -28
- package/dist/commands/update/switch.js.map +0 -1
- package/dist/lib/oauth-server.d.ts +0 -13
- package/dist/lib/oauth-server.d.ts.map +0 -1
- package/dist/lib/oauth-server.js.map +0 -1
- package/dist/lib/oauth.d.ts +0 -31
- package/dist/lib/oauth.d.ts.map +0 -1
- package/dist/lib/oauth.js +0 -150
- package/dist/lib/oauth.js.map +0 -1
- package/dist/lib/pkce.d.ts +0 -16
- package/dist/lib/pkce.d.ts.map +0 -1
- package/dist/lib/pkce.js +0 -35
- package/dist/lib/pkce.js.map +0 -1
- package/dist/test-helpers/empty-output.d.ts +0 -18
- package/dist/test-helpers/empty-output.d.ts.map +0 -1
- package/dist/test-helpers/empty-output.js +0 -43
- package/dist/test-helpers/empty-output.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"switch.d.ts","sourceRoot":"","sources":["../../../src/commands/update/switch.ts"],"names":[],"mappings":"AAIA,wBAAsB,aAAa,CAAC,OAAO,EAAE;IACzC,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,UAAU,CAAC,EAAE,OAAO,CAAA;CACvB,GAAG,OAAO,CAAC,IAAI,CAAC,CAgChB"}
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
import chalk from 'chalk';
|
|
2
|
-
import { getConfig, setConfig } from '../../lib/config.js';
|
|
3
|
-
import { CliError } from '../../lib/errors.js';
|
|
4
|
-
export async function switchChannel(options) {
|
|
5
|
-
if (options.stable && options.preRelease) {
|
|
6
|
-
throw new CliError('CONFLICTING_OPTIONS', 'Specify either --stable or --pre-release, not both.');
|
|
7
|
-
}
|
|
8
|
-
if (!options.stable && !options.preRelease) {
|
|
9
|
-
throw new CliError('CONFLICTING_OPTIONS', 'Specify --stable or --pre-release.');
|
|
10
|
-
}
|
|
11
|
-
const channel = options.preRelease ? 'pre-release' : 'stable';
|
|
12
|
-
const config = await getConfig();
|
|
13
|
-
config.updateChannel = channel;
|
|
14
|
-
await setConfig(config);
|
|
15
|
-
if (channel === 'pre-release') {
|
|
16
|
-
console.log(chalk.green('✓'), `Update channel set to ${chalk.magenta('pre-release')}`);
|
|
17
|
-
console.log();
|
|
18
|
-
console.log(chalk.yellow('Note:'), 'Pre-release updates follow the', chalk.cyan('next'), 'branch.');
|
|
19
|
-
console.log('When pre-release changes are merged into a stable release, no further');
|
|
20
|
-
console.log('pre-release updates will be published until a new pre-release cycle begins.');
|
|
21
|
-
console.log('Remember to switch back to stable when done:');
|
|
22
|
-
console.log(chalk.dim(' tw update switch --stable'));
|
|
23
|
-
}
|
|
24
|
-
else {
|
|
25
|
-
console.log(chalk.green('✓'), 'Update channel set to stable');
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
//# sourceMappingURL=switch.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"switch.js","sourceRoot":"","sources":["../../../src/commands/update/switch.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,EAAE,SAAS,EAAE,SAAS,EAAsB,MAAM,qBAAqB,CAAA;AAC9E,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAA;AAE9C,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,OAGnC;IACG,IAAI,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;QACvC,MAAM,IAAI,QAAQ,CACd,qBAAqB,EACrB,qDAAqD,CACxD,CAAA;IACL,CAAC;IACD,IAAI,CAAC,OAAO,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC;QACzC,MAAM,IAAI,QAAQ,CAAC,qBAAqB,EAAE,oCAAoC,CAAC,CAAA;IACnF,CAAC;IAED,MAAM,OAAO,GAAkB,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAA;IAC5E,MAAM,MAAM,GAAG,MAAM,SAAS,EAAE,CAAA;IAChC,MAAM,CAAC,aAAa,GAAG,OAAO,CAAA;IAC9B,MAAM,SAAS,CAAC,MAAM,CAAC,CAAA;IAEvB,IAAI,OAAO,KAAK,aAAa,EAAE,CAAC;QAC5B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,yBAAyB,KAAK,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE,CAAC,CAAA;QACtF,OAAO,CAAC,GAAG,EAAE,CAAA;QACb,OAAO,CAAC,GAAG,CACP,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,EACrB,gCAAgC,EAChC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,EAClB,SAAS,CACZ,CAAA;QACD,OAAO,CAAC,GAAG,CAAC,uEAAuE,CAAC,CAAA;QACpF,OAAO,CAAC,GAAG,CAAC,6EAA6E,CAAC,CAAA;QAC1F,OAAO,CAAC,GAAG,CAAC,8CAA8C,CAAC,CAAA;QAC3D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC,CAAA;IACzD,CAAC;SAAM,CAAC;QACJ,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,8BAA8B,CAAC,CAAA;IACjE,CAAC;AACL,CAAC"}
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
export declare const PORT = 8766;
|
|
2
|
-
export declare const OAUTH_REDIRECT_URI = "http://localhost:8766/callback";
|
|
3
|
-
interface CallbackResult {
|
|
4
|
-
code: string;
|
|
5
|
-
cleanup: () => void;
|
|
6
|
-
}
|
|
7
|
-
/**
|
|
8
|
-
* Start a local HTTP server to handle OAuth callback
|
|
9
|
-
* Returns a promise that resolves when the callback is received with valid state
|
|
10
|
-
*/
|
|
11
|
-
export declare function startCallbackServer(expectedState: string): Promise<CallbackResult>;
|
|
12
|
-
export {};
|
|
13
|
-
//# sourceMappingURL=oauth-server.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"oauth-server.d.ts","sourceRoot":"","sources":["../../src/lib/oauth-server.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,IAAI,OAAO,CAAA;AACxB,eAAO,MAAM,kBAAkB,mCAAmC,CAAA;AAKlE,UAAU,cAAc;IACpB,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,IAAI,CAAA;CACtB;AAED;;;GAGG;AACH,wBAAsB,mBAAmB,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CA2DxF"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"oauth-server.js","sourceRoot":"","sources":["../../src/lib/oauth-server.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/oauth.d.ts
DELETED
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* OAuth flow coordination for Twist API authentication
|
|
3
|
-
*/
|
|
4
|
-
export declare const AUTHORIZATION_URL = "https://twist.com/oauth/authorize";
|
|
5
|
-
export declare const TOKEN_URL = "https://twist.com/oauth/access_token";
|
|
6
|
-
export declare const REGISTRATION_URL = "https://twist.com/oauth/register";
|
|
7
|
-
export declare const OAUTH_REDIRECT_URI = "http://localhost:8766/callback";
|
|
8
|
-
export declare const READ_WRITE_SCOPES: string;
|
|
9
|
-
export declare const READ_ONLY_SCOPES: string;
|
|
10
|
-
/**
|
|
11
|
-
* OAuth client credentials from dynamic registration
|
|
12
|
-
*/
|
|
13
|
-
export interface OAuthClient {
|
|
14
|
-
client_id: string;
|
|
15
|
-
client_secret: string;
|
|
16
|
-
}
|
|
17
|
-
/**
|
|
18
|
-
* Register a dynamic OAuth client for this CLI session
|
|
19
|
-
*/
|
|
20
|
-
export declare function registerDynamicClient(): Promise<OAuthClient>;
|
|
21
|
-
/**
|
|
22
|
-
* Build the authorization URL for the OAuth flow
|
|
23
|
-
*/
|
|
24
|
-
export declare function buildAuthorizationUrl(clientId: string, codeChallenge: string, state: string, options?: {
|
|
25
|
-
readOnly?: boolean;
|
|
26
|
-
}): string;
|
|
27
|
-
/**
|
|
28
|
-
* Exchange authorization code for access token using PKCE
|
|
29
|
-
*/
|
|
30
|
-
export declare function exchangeCodeForToken(code: string, codeVerifier: string, client: OAuthClient): Promise<string>;
|
|
31
|
-
//# sourceMappingURL=oauth.d.ts.map
|
package/dist/lib/oauth.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"oauth.d.ts","sourceRoot":"","sources":["../../src/lib/oauth.ts"],"names":[],"mappings":"AAAA;;GAEG;AAOH,eAAO,MAAM,iBAAiB,sCAAsC,CAAA;AACpE,eAAO,MAAM,SAAS,yCAAyC,CAAA;AAC/D,eAAO,MAAM,gBAAgB,qCAAqC,CAAA;AAClE,eAAO,MAAM,kBAAkB,mCAAmC,CAAA;AAGlE,eAAO,MAAM,iBAAiB,QAkBnB,CAAA;AAGX,eAAO,MAAM,gBAAgB,QAWlB,CAAA;AAEX;;GAEG;AACH,MAAM,WAAW,WAAW;IACxB,SAAS,EAAE,MAAM,CAAA;IACjB,aAAa,EAAE,MAAM,CAAA;CACxB;AAED;;GAEG;AACH,wBAAsB,qBAAqB,IAAI,OAAO,CAAC,WAAW,CAAC,CA6DlE;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CACjC,QAAQ,EAAE,MAAM,EAChB,aAAa,EAAE,MAAM,EACrB,KAAK,EAAE,MAAM,EACb,OAAO,GAAE;IAAE,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAO,GACrC,MAAM,CAaR;AAED;;GAEG;AACH,wBAAsB,oBAAoB,CACtC,IAAI,EAAE,MAAM,EACZ,YAAY,EAAE,MAAM,EACpB,MAAM,EAAE,WAAW,GACpB,OAAO,CAAC,MAAM,CAAC,CAkEjB"}
|
package/dist/lib/oauth.js
DELETED
|
@@ -1,150 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* OAuth flow coordination for Twist API authentication
|
|
3
|
-
*/
|
|
4
|
-
import { CliError } from './errors.js';
|
|
5
|
-
const AUTH_HINTS = ['Try again: tw auth login', 'Or set TWIST_API_TOKEN environment variable'];
|
|
6
|
-
// OAuth configuration for Twist (using well-known endpoints with dynamic client registration)
|
|
7
|
-
export const AUTHORIZATION_URL = 'https://twist.com/oauth/authorize';
|
|
8
|
-
export const TOKEN_URL = 'https://twist.com/oauth/access_token';
|
|
9
|
-
export const REGISTRATION_URL = 'https://twist.com/oauth/register';
|
|
10
|
-
export const OAUTH_REDIRECT_URI = 'http://localhost:8766/callback';
|
|
11
|
-
// OAuth scopes needed for full read-write CLI operations
|
|
12
|
-
export const READ_WRITE_SCOPES = [
|
|
13
|
-
'user:read', // Read user information and session details
|
|
14
|
-
'user:write', // Update user settings (e.g. away status)
|
|
15
|
-
'workspaces:read', // Read workspace information
|
|
16
|
-
'channels:read', // Read channel information
|
|
17
|
-
'threads:read', // Read thread information
|
|
18
|
-
'threads:write', // Create and manage threads
|
|
19
|
-
'comments:read', // Read comments/messages
|
|
20
|
-
'comments:write', // Send comments/messages
|
|
21
|
-
'messages:read', // Read messages
|
|
22
|
-
'messages:write', // Send messages
|
|
23
|
-
'reactions:read', // Read reactions
|
|
24
|
-
'reactions:write', // Add reactions
|
|
25
|
-
'groups:read', // Read group information
|
|
26
|
-
'groups:write', // Create and update groups; add users
|
|
27
|
-
'groups:remove', // Delete groups; remove users from groups
|
|
28
|
-
'search:read', // Search functionality
|
|
29
|
-
'notifications:read', // Read notifications
|
|
30
|
-
].join(' ');
|
|
31
|
-
// OAuth scopes for read-only CLI operations (no :write scopes)
|
|
32
|
-
export const READ_ONLY_SCOPES = [
|
|
33
|
-
'user:read',
|
|
34
|
-
'workspaces:read',
|
|
35
|
-
'channels:read',
|
|
36
|
-
'threads:read',
|
|
37
|
-
'comments:read',
|
|
38
|
-
'messages:read',
|
|
39
|
-
'reactions:read',
|
|
40
|
-
'groups:read',
|
|
41
|
-
'search:read',
|
|
42
|
-
'notifications:read',
|
|
43
|
-
].join(' ');
|
|
44
|
-
/**
|
|
45
|
-
* Register a dynamic OAuth client for this CLI session
|
|
46
|
-
*/
|
|
47
|
-
export async function registerDynamicClient() {
|
|
48
|
-
const clientData = {
|
|
49
|
-
client_name: 'Twist CLI',
|
|
50
|
-
client_uri: 'https://github.com/doist/twist-cli',
|
|
51
|
-
redirect_uris: [OAUTH_REDIRECT_URI],
|
|
52
|
-
grant_types: ['authorization_code'],
|
|
53
|
-
response_types: ['code'],
|
|
54
|
-
token_endpoint_auth_method: 'client_secret_basic', // Use Basic auth for token exchange
|
|
55
|
-
application_type: 'native', // CLI is a native application
|
|
56
|
-
logo_uri: 'https://raw.githubusercontent.com/Doist/twist-cli/d65c447ff453eb36af585044c2f5f2f602bcdb34/icons/twist-cli.png',
|
|
57
|
-
};
|
|
58
|
-
try {
|
|
59
|
-
const response = await fetch(REGISTRATION_URL, {
|
|
60
|
-
method: 'POST',
|
|
61
|
-
headers: {
|
|
62
|
-
'Content-Type': 'application/json',
|
|
63
|
-
Accept: 'application/json',
|
|
64
|
-
},
|
|
65
|
-
body: JSON.stringify(clientData),
|
|
66
|
-
});
|
|
67
|
-
if (!response.ok) {
|
|
68
|
-
const errorText = await response.text();
|
|
69
|
-
throw new CliError('AUTH_FAILED', `Client registration failed: ${response.status} ${response.statusText} - ${errorText}`, AUTH_HINTS);
|
|
70
|
-
}
|
|
71
|
-
const result = await response.json();
|
|
72
|
-
if (!result.client_id || !result.client_secret) {
|
|
73
|
-
throw new CliError('AUTH_FAILED', 'Invalid client registration response: missing client_id or client_secret', AUTH_HINTS);
|
|
74
|
-
}
|
|
75
|
-
return {
|
|
76
|
-
client_id: result.client_id,
|
|
77
|
-
client_secret: result.client_secret,
|
|
78
|
-
};
|
|
79
|
-
}
|
|
80
|
-
catch (error) {
|
|
81
|
-
if (error instanceof CliError)
|
|
82
|
-
throw error;
|
|
83
|
-
if (error instanceof Error) {
|
|
84
|
-
throw new CliError('AUTH_FAILED', `Failed to register OAuth client: ${error.message}`, AUTH_HINTS);
|
|
85
|
-
}
|
|
86
|
-
throw new CliError('AUTH_FAILED', 'Failed to register OAuth client: Unknown error', AUTH_HINTS);
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
/**
|
|
90
|
-
* Build the authorization URL for the OAuth flow
|
|
91
|
-
*/
|
|
92
|
-
export function buildAuthorizationUrl(clientId, codeChallenge, state, options = {}) {
|
|
93
|
-
const scope = options.readOnly ? READ_ONLY_SCOPES : READ_WRITE_SCOPES;
|
|
94
|
-
const params = new URLSearchParams({
|
|
95
|
-
client_id: clientId,
|
|
96
|
-
response_type: 'code',
|
|
97
|
-
redirect_uri: OAUTH_REDIRECT_URI,
|
|
98
|
-
scope,
|
|
99
|
-
state,
|
|
100
|
-
code_challenge: codeChallenge,
|
|
101
|
-
code_challenge_method: 'S256',
|
|
102
|
-
});
|
|
103
|
-
return `${AUTHORIZATION_URL}?${params.toString()}`;
|
|
104
|
-
}
|
|
105
|
-
/**
|
|
106
|
-
* Exchange authorization code for access token using PKCE
|
|
107
|
-
*/
|
|
108
|
-
export async function exchangeCodeForToken(code, codeVerifier, client) {
|
|
109
|
-
const body = new URLSearchParams({
|
|
110
|
-
grant_type: 'authorization_code',
|
|
111
|
-
code,
|
|
112
|
-
redirect_uri: OAUTH_REDIRECT_URI,
|
|
113
|
-
code_verifier: codeVerifier,
|
|
114
|
-
});
|
|
115
|
-
// Use HTTP Basic Authentication for client credentials
|
|
116
|
-
const credentials = `${client.client_id}:${client.client_secret}`;
|
|
117
|
-
const encodedCredentials = btoa(credentials);
|
|
118
|
-
try {
|
|
119
|
-
const response = await fetch(TOKEN_URL, {
|
|
120
|
-
method: 'POST',
|
|
121
|
-
headers: {
|
|
122
|
-
'Content-Type': 'application/x-www-form-urlencoded',
|
|
123
|
-
Accept: 'application/json',
|
|
124
|
-
Authorization: `Basic ${encodedCredentials}`,
|
|
125
|
-
},
|
|
126
|
-
body: body.toString(),
|
|
127
|
-
});
|
|
128
|
-
if (!response.ok) {
|
|
129
|
-
const errorText = await response.text();
|
|
130
|
-
throw new CliError('AUTH_FAILED', `Token exchange failed: ${response.status} ${response.statusText} - ${errorText}`, AUTH_HINTS);
|
|
131
|
-
}
|
|
132
|
-
const data = await response.json();
|
|
133
|
-
if (data.error) {
|
|
134
|
-
throw new CliError('AUTH_FAILED', `OAuth error: ${data.error} - ${data.error_description || 'Unknown error'}`, AUTH_HINTS);
|
|
135
|
-
}
|
|
136
|
-
if (!data.access_token) {
|
|
137
|
-
throw new CliError('AUTH_FAILED', 'No access token received from OAuth server', AUTH_HINTS);
|
|
138
|
-
}
|
|
139
|
-
return data.access_token;
|
|
140
|
-
}
|
|
141
|
-
catch (error) {
|
|
142
|
-
if (error instanceof CliError)
|
|
143
|
-
throw error;
|
|
144
|
-
if (error instanceof Error) {
|
|
145
|
-
throw new CliError('AUTH_FAILED', `Failed to exchange code for token: ${error.message}`, AUTH_HINTS);
|
|
146
|
-
}
|
|
147
|
-
throw new CliError('AUTH_FAILED', 'Failed to exchange code for token: Unknown error', AUTH_HINTS);
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
//# sourceMappingURL=oauth.js.map
|
package/dist/lib/oauth.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"oauth.js","sourceRoot":"","sources":["../../src/lib/oauth.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/pkce.d.ts
DELETED
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Generate a cryptographically secure random code verifier for PKCE.
|
|
3
|
-
* Returns a base64url-encoded string with 43-128 characters.
|
|
4
|
-
*/
|
|
5
|
-
export declare function generateCodeVerifier(): string;
|
|
6
|
-
/**
|
|
7
|
-
* Generate a code challenge from a code verifier using SHA256 and base64url encoding.
|
|
8
|
-
* This is the S256 method as specified in RFC 7636.
|
|
9
|
-
*/
|
|
10
|
-
export declare function generateCodeChallenge(verifier: string): string;
|
|
11
|
-
/**
|
|
12
|
-
* Generate a cryptographically secure random state parameter for CSRF protection.
|
|
13
|
-
* Returns a base64url-encoded string.
|
|
14
|
-
*/
|
|
15
|
-
export declare function generateState(): string;
|
|
16
|
-
//# sourceMappingURL=pkce.d.ts.map
|
package/dist/lib/pkce.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"pkce.d.ts","sourceRoot":"","sources":["../../src/lib/pkce.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,wBAAgB,oBAAoB,IAAI,MAAM,CAI7C;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAG9D;AAED;;;GAGG;AACH,wBAAgB,aAAa,IAAI,MAAM,CAItC"}
|
package/dist/lib/pkce.js
DELETED
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
import { createHash, randomBytes } from 'node:crypto';
|
|
2
|
-
/**
|
|
3
|
-
* Generate a cryptographically secure random code verifier for PKCE.
|
|
4
|
-
* Returns a base64url-encoded string with 43-128 characters.
|
|
5
|
-
*/
|
|
6
|
-
export function generateCodeVerifier() {
|
|
7
|
-
// Generate 32 random bytes (256 bits) which gives us 43 base64url characters
|
|
8
|
-
const buffer = randomBytes(32);
|
|
9
|
-
return base64urlEncode(buffer);
|
|
10
|
-
}
|
|
11
|
-
/**
|
|
12
|
-
* Generate a code challenge from a code verifier using SHA256 and base64url encoding.
|
|
13
|
-
* This is the S256 method as specified in RFC 7636.
|
|
14
|
-
*/
|
|
15
|
-
export function generateCodeChallenge(verifier) {
|
|
16
|
-
const hash = createHash('sha256').update(verifier).digest();
|
|
17
|
-
return base64urlEncode(hash);
|
|
18
|
-
}
|
|
19
|
-
/**
|
|
20
|
-
* Generate a cryptographically secure random state parameter for CSRF protection.
|
|
21
|
-
* Returns a base64url-encoded string.
|
|
22
|
-
*/
|
|
23
|
-
export function generateState() {
|
|
24
|
-
// Generate 16 random bytes (128 bits) for the state parameter
|
|
25
|
-
const buffer = randomBytes(16);
|
|
26
|
-
return base64urlEncode(buffer);
|
|
27
|
-
}
|
|
28
|
-
/**
|
|
29
|
-
* Base64url encode a buffer (RFC 4648 Section 5).
|
|
30
|
-
* This removes padding and uses URL-safe characters.
|
|
31
|
-
*/
|
|
32
|
-
function base64urlEncode(buffer) {
|
|
33
|
-
return buffer.toString('base64').replace(/\+/g, '-').replace(/\//g, '_').replace(/=/g, '');
|
|
34
|
-
}
|
|
35
|
-
//# sourceMappingURL=pkce.js.map
|
package/dist/lib/pkce.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"pkce.js","sourceRoot":"","sources":["../../src/lib/pkce.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAErD;;;GAGG;AACH,MAAM,UAAU,oBAAoB;IAChC,6EAA6E;IAC7E,MAAM,MAAM,GAAG,WAAW,CAAC,EAAE,CAAC,CAAA;IAC9B,OAAO,eAAe,CAAC,MAAM,CAAC,CAAA;AAClC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,qBAAqB,CAAC,QAAgB;IAClD,MAAM,IAAI,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,MAAM,EAAE,CAAA;IAC3D,OAAO,eAAe,CAAC,IAAI,CAAC,CAAA;AAChC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,aAAa;IACzB,8DAA8D;IAC9D,MAAM,MAAM,GAAG,WAAW,CAAC,EAAE,CAAC,CAAA;IAC9B,OAAO,eAAe,CAAC,MAAM,CAAC,CAAA;AAClC,CAAC;AAED;;;GAGG;AACH,SAAS,eAAe,CAAC,MAAc;IACnC,OAAO,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAA;AAC9F,CAAC"}
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
type EmptyOutputConfig = {
|
|
2
|
-
setup: () => void | Promise<void>;
|
|
3
|
-
run: (extraArgs: string[]) => Promise<void>;
|
|
4
|
-
humanMessage: string | RegExp;
|
|
5
|
-
};
|
|
6
|
-
/**
|
|
7
|
-
* Asserts the standard `printEmpty` contract for a command:
|
|
8
|
-
* --json → prints exactly "[]"
|
|
9
|
-
* --ndjson → does not call console.log at all (no stray newline)
|
|
10
|
-
* neither → prints the human-readable message
|
|
11
|
-
*
|
|
12
|
-
* `setup` runs before each test (use it to (re)wire mocks for an empty
|
|
13
|
-
* result). `run` is called with the extra CLI args to append to the
|
|
14
|
-
* command being tested.
|
|
15
|
-
*/
|
|
16
|
-
export declare function describeEmptyMachineOutput(label: string, config: EmptyOutputConfig): void;
|
|
17
|
-
export {};
|
|
18
|
-
//# sourceMappingURL=empty-output.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"empty-output.d.ts","sourceRoot":"","sources":["../../src/test-helpers/empty-output.ts"],"names":[],"mappings":"AAEA,KAAK,iBAAiB,GAAG;IACrB,KAAK,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACjC,GAAG,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IAC3C,YAAY,EAAE,MAAM,GAAG,MAAM,CAAA;CAChC,CAAA;AAED;;;;;;;;;GASG;AACH,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,iBAAiB,GAAG,IAAI,CAkCzF"}
|
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
|
|
2
|
-
/**
|
|
3
|
-
* Asserts the standard `printEmpty` contract for a command:
|
|
4
|
-
* --json → prints exactly "[]"
|
|
5
|
-
* --ndjson → does not call console.log at all (no stray newline)
|
|
6
|
-
* neither → prints the human-readable message
|
|
7
|
-
*
|
|
8
|
-
* `setup` runs before each test (use it to (re)wire mocks for an empty
|
|
9
|
-
* result). `run` is called with the extra CLI args to append to the
|
|
10
|
-
* command being tested.
|
|
11
|
-
*/
|
|
12
|
-
export function describeEmptyMachineOutput(label, config) {
|
|
13
|
-
describe(label, () => {
|
|
14
|
-
let logSpy;
|
|
15
|
-
beforeEach(async () => {
|
|
16
|
-
await config.setup();
|
|
17
|
-
logSpy = vi.spyOn(console, 'log').mockImplementation(() => { });
|
|
18
|
-
});
|
|
19
|
-
afterEach(() => {
|
|
20
|
-
logSpy.mockRestore();
|
|
21
|
-
});
|
|
22
|
-
it('outputs "[]" for --json', async () => {
|
|
23
|
-
await config.run(['--json']);
|
|
24
|
-
expect(logSpy).toHaveBeenCalledTimes(1);
|
|
25
|
-
expect(logSpy).toHaveBeenCalledWith('[]');
|
|
26
|
-
});
|
|
27
|
-
it('does not call console.log for --ndjson (no stray newline)', async () => {
|
|
28
|
-
await config.run(['--ndjson']);
|
|
29
|
-
expect(logSpy).not.toHaveBeenCalled();
|
|
30
|
-
});
|
|
31
|
-
it('prints human message when no machine output flag is set', async () => {
|
|
32
|
-
await config.run([]);
|
|
33
|
-
const output = logSpy.mock.calls.map((call) => String(call[0])).join('\n');
|
|
34
|
-
if (typeof config.humanMessage === 'string') {
|
|
35
|
-
expect(output).toContain(config.humanMessage);
|
|
36
|
-
}
|
|
37
|
-
else {
|
|
38
|
-
expect(output).toMatch(config.humanMessage);
|
|
39
|
-
}
|
|
40
|
-
});
|
|
41
|
-
});
|
|
42
|
-
}
|
|
43
|
-
//# sourceMappingURL=empty-output.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"empty-output.js","sourceRoot":"","sources":["../../src/test-helpers/empty-output.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AAQxE;;;;;;;;;GASG;AACH,MAAM,UAAU,0BAA0B,CAAC,KAAa,EAAE,MAAyB;IAC/E,QAAQ,CAAC,KAAK,EAAE,GAAG,EAAE;QACjB,IAAI,MAAmC,CAAA;QAEvC,UAAU,CAAC,KAAK,IAAI,EAAE;YAClB,MAAM,MAAM,CAAC,KAAK,EAAE,CAAA;YACpB,MAAM,GAAG,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,kBAAkB,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAA;QAClE,CAAC,CAAC,CAAA;QAEF,SAAS,CAAC,GAAG,EAAE;YACX,MAAM,CAAC,WAAW,EAAE,CAAA;QACxB,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,yBAAyB,EAAE,KAAK,IAAI,EAAE;YACrC,MAAM,MAAM,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAA;YAC5B,MAAM,CAAC,MAAM,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAA;YACvC,MAAM,CAAC,MAAM,CAAC,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAA;QAC7C,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,2DAA2D,EAAE,KAAK,IAAI,EAAE;YACvE,MAAM,MAAM,CAAC,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC,CAAA;YAC9B,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAA;QACzC,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,yDAAyD,EAAE,KAAK,IAAI,EAAE;YACrE,MAAM,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;YACpB,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAe,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YACrF,IAAI,OAAO,MAAM,CAAC,YAAY,KAAK,QAAQ,EAAE,CAAC;gBAC1C,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,YAAY,CAAC,CAAA;YACjD,CAAC;iBAAM,CAAC;gBACJ,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,YAAY,CAAC,CAAA;YAC/C,CAAC;QACL,CAAC,CAAC,CAAA;IACN,CAAC,CAAC,CAAA;AACN,CAAC"}
|