@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.
Files changed (126) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/dist/commands/auth/helpers.d.ts +8 -1
  3. package/dist/commands/auth/helpers.d.ts.map +1 -1
  4. package/dist/commands/auth/helpers.js +12 -7
  5. package/dist/commands/auth/helpers.js.map +1 -1
  6. package/dist/commands/auth/index.d.ts.map +1 -1
  7. package/dist/commands/auth/index.js +12 -12
  8. package/dist/commands/auth/index.js.map +1 -1
  9. package/dist/commands/auth/login.d.ts +3 -3
  10. package/dist/commands/auth/login.d.ts.map +1 -1
  11. package/dist/commands/auth/login.js +24 -62
  12. package/dist/commands/auth/login.js.map +1 -1
  13. package/dist/commands/auth/logout.d.ts +10 -1
  14. package/dist/commands/auth/logout.d.ts.map +1 -1
  15. package/dist/commands/auth/logout.js +18 -6
  16. package/dist/commands/auth/logout.js.map +1 -1
  17. package/dist/commands/auth/status.d.ts +15 -3
  18. package/dist/commands/auth/status.d.ts.map +1 -1
  19. package/dist/commands/auth/status.js +87 -22
  20. package/dist/commands/auth/status.js.map +1 -1
  21. package/dist/commands/changelog.d.ts +0 -5
  22. package/dist/commands/changelog.d.ts.map +1 -1
  23. package/dist/commands/changelog.js +9 -103
  24. package/dist/commands/changelog.js.map +1 -1
  25. package/dist/commands/channel/list.js +5 -5
  26. package/dist/commands/channel/list.js.map +1 -1
  27. package/dist/commands/channel/threads.d.ts.map +1 -1
  28. package/dist/commands/channel/threads.js +5 -3
  29. package/dist/commands/channel/threads.js.map +1 -1
  30. package/dist/commands/config/view.d.ts.map +1 -1
  31. package/dist/commands/config/view.js +3 -3
  32. package/dist/commands/config/view.js.map +1 -1
  33. package/dist/commands/conversation/helpers.d.ts.map +1 -1
  34. package/dist/commands/conversation/helpers.js +4 -3
  35. package/dist/commands/conversation/helpers.js.map +1 -1
  36. package/dist/commands/conversation/unread.d.ts.map +1 -1
  37. package/dist/commands/conversation/unread.js +5 -4
  38. package/dist/commands/conversation/unread.js.map +1 -1
  39. package/dist/commands/conversation/view.d.ts.map +1 -1
  40. package/dist/commands/conversation/view.js +8 -6
  41. package/dist/commands/conversation/view.js.map +1 -1
  42. package/dist/commands/inbox.d.ts.map +1 -1
  43. package/dist/commands/inbox.js +9 -7
  44. package/dist/commands/inbox.js.map +1 -1
  45. package/dist/commands/thread/view.d.ts.map +1 -1
  46. package/dist/commands/thread/view.js +14 -12
  47. package/dist/commands/thread/view.js.map +1 -1
  48. package/dist/commands/update/index.d.ts.map +1 -1
  49. package/dist/commands/update/index.js +43 -14
  50. package/dist/commands/update/index.js.map +1 -1
  51. package/dist/index.js +27 -4
  52. package/dist/index.js.map +1 -1
  53. package/dist/lib/api.d.ts +23 -5
  54. package/dist/lib/api.d.ts.map +1 -1
  55. package/dist/lib/api.js +61 -3
  56. package/dist/lib/api.js.map +1 -1
  57. package/dist/lib/auth-pages.d.ts +3 -0
  58. package/dist/lib/auth-pages.d.ts.map +1 -0
  59. package/dist/lib/{oauth-server.js → auth-pages.js} +3 -120
  60. package/dist/lib/auth-pages.js.map +1 -0
  61. package/dist/lib/auth-provider.d.ts +28 -0
  62. package/dist/lib/auth-provider.d.ts.map +1 -0
  63. package/dist/lib/auth-provider.js +241 -0
  64. package/dist/lib/auth-provider.js.map +1 -0
  65. package/dist/lib/auth.d.ts +16 -10
  66. package/dist/lib/auth.d.ts.map +1 -1
  67. package/dist/lib/auth.js +18 -0
  68. package/dist/lib/auth.js.map +1 -1
  69. package/dist/lib/config.d.ts +23 -2
  70. package/dist/lib/config.d.ts.map +1 -1
  71. package/dist/lib/config.js +95 -47
  72. package/dist/lib/config.js.map +1 -1
  73. package/dist/lib/errors.d.ts +15 -6
  74. package/dist/lib/errors.d.ts.map +1 -1
  75. package/dist/lib/errors.js +14 -9
  76. package/dist/lib/errors.js.map +1 -1
  77. package/dist/lib/global-args.d.ts +35 -21
  78. package/dist/lib/global-args.d.ts.map +1 -1
  79. package/dist/lib/global-args.js +84 -64
  80. package/dist/lib/global-args.js.map +1 -1
  81. package/dist/lib/markdown.d.ts +1 -0
  82. package/dist/lib/markdown.d.ts.map +1 -1
  83. package/dist/lib/markdown.js +9 -14
  84. package/dist/lib/markdown.js.map +1 -1
  85. package/dist/lib/options.d.ts +2 -3
  86. package/dist/lib/options.d.ts.map +1 -1
  87. package/dist/lib/output.d.ts +5 -3
  88. package/dist/lib/output.d.ts.map +1 -1
  89. package/dist/lib/output.js +15 -17
  90. package/dist/lib/output.js.map +1 -1
  91. package/dist/lib/skills/content.d.ts +1 -1
  92. package/dist/lib/skills/content.d.ts.map +1 -1
  93. package/dist/lib/skills/content.js +16 -6
  94. package/dist/lib/skills/content.js.map +1 -1
  95. package/dist/lib/spinner.d.ts +2 -23
  96. package/dist/lib/spinner.d.ts.map +1 -1
  97. package/dist/lib/spinner.js +6 -107
  98. package/dist/lib/spinner.js.map +1 -1
  99. package/dist/lib/update.d.ts +9 -13
  100. package/dist/lib/update.d.ts.map +1 -1
  101. package/dist/lib/update.js +17 -43
  102. package/dist/lib/update.js.map +1 -1
  103. package/package.json +6 -6
  104. package/dist/commands/update/action.d.ts +0 -12
  105. package/dist/commands/update/action.d.ts.map +0 -1
  106. package/dist/commands/update/action.js +0 -104
  107. package/dist/commands/update/action.js.map +0 -1
  108. package/dist/commands/update/switch.d.ts +0 -5
  109. package/dist/commands/update/switch.d.ts.map +0 -1
  110. package/dist/commands/update/switch.js +0 -28
  111. package/dist/commands/update/switch.js.map +0 -1
  112. package/dist/lib/oauth-server.d.ts +0 -13
  113. package/dist/lib/oauth-server.d.ts.map +0 -1
  114. package/dist/lib/oauth-server.js.map +0 -1
  115. package/dist/lib/oauth.d.ts +0 -31
  116. package/dist/lib/oauth.d.ts.map +0 -1
  117. package/dist/lib/oauth.js +0 -150
  118. package/dist/lib/oauth.js.map +0 -1
  119. package/dist/lib/pkce.d.ts +0 -16
  120. package/dist/lib/pkce.d.ts.map +0 -1
  121. package/dist/lib/pkce.js +0 -35
  122. package/dist/lib/pkce.js.map +0 -1
  123. package/dist/test-helpers/empty-output.d.ts +0 -18
  124. package/dist/test-helpers/empty-output.d.ts.map +0 -1
  125. package/dist/test-helpers/empty-output.js +0 -43
  126. package/dist/test-helpers/empty-output.js.map +0 -1
@@ -1,5 +0,0 @@
1
- export declare function switchChannel(options: {
2
- stable?: boolean;
3
- preRelease?: boolean;
4
- }): Promise<void>;
5
- //# sourceMappingURL=switch.d.ts.map
@@ -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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"}
@@ -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
@@ -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
@@ -1 +0,0 @@
1
- {"version":3,"file":"oauth.js","sourceRoot":"","sources":["../../src/lib/oauth.ts"],"names":[],"mappings":"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"}
@@ -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
@@ -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
@@ -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"}