@doist/twist-cli 2.21.1 → 2.21.3
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/__mocks__/chalk.d.ts +3 -0
- package/dist/__mocks__/chalk.d.ts.map +1 -0
- package/dist/__mocks__/chalk.js +8 -0
- package/dist/__mocks__/chalk.js.map +1 -0
- package/dist/commands/auth.d.ts +3 -0
- package/dist/commands/auth.d.ts.map +1 -0
- package/dist/commands/auth.js +155 -0
- package/dist/commands/auth.js.map +1 -0
- package/dist/commands/away.d.ts +3 -0
- package/dist/commands/away.d.ts.map +1 -0
- package/dist/commands/away.js +120 -0
- package/dist/commands/away.js.map +1 -0
- package/dist/commands/changelog.d.ts +8 -0
- package/dist/commands/changelog.d.ts.map +1 -0
- package/dist/commands/changelog.js +113 -0
- package/dist/commands/changelog.js.map +1 -0
- package/dist/commands/channel.d.ts +3 -0
- package/dist/commands/channel.d.ts.map +1 -0
- package/dist/commands/channel.js +53 -0
- package/dist/commands/channel.js.map +1 -0
- package/dist/commands/comment.d.ts +3 -0
- package/dist/commands/comment.d.ts.map +1 -0
- package/dist/commands/comment.js +99 -0
- package/dist/commands/comment.js.map +1 -0
- package/dist/commands/completion.d.ts +3 -0
- package/dist/commands/completion.d.ts.map +1 -0
- package/dist/commands/completion.js +121 -0
- package/dist/commands/completion.js.map +1 -0
- package/dist/commands/conversation.d.ts +3 -0
- package/dist/commands/conversation.d.ts.map +1 -0
- package/dist/commands/conversation.js +458 -0
- package/dist/commands/conversation.js.map +1 -0
- package/dist/commands/inbox.d.ts +3 -0
- package/dist/commands/inbox.d.ts.map +1 -0
- package/dist/commands/inbox.js +127 -0
- package/dist/commands/inbox.js.map +1 -0
- package/dist/commands/msg.d.ts +3 -0
- package/dist/commands/msg.d.ts.map +1 -0
- package/dist/commands/msg.js +103 -0
- package/dist/commands/msg.js.map +1 -0
- package/dist/commands/react.d.ts +3 -0
- package/dist/commands/react.d.ts.map +1 -0
- package/dist/commands/react.js +102 -0
- package/dist/commands/react.js.map +1 -0
- package/dist/commands/search.d.ts +3 -0
- package/dist/commands/search.d.ts.map +1 -0
- package/dist/commands/search.js +160 -0
- package/dist/commands/search.js.map +1 -0
- package/dist/commands/skill.d.ts +3 -0
- package/dist/commands/skill.d.ts.map +1 -0
- package/dist/commands/skill.js +119 -0
- package/dist/commands/skill.js.map +1 -0
- package/dist/commands/thread/create.d.ts +7 -0
- package/dist/commands/thread/create.d.ts.map +1 -0
- package/dist/commands/thread/create.js +45 -0
- package/dist/commands/thread/create.js.map +1 -0
- package/dist/commands/thread/helpers.d.ts +10 -0
- package/dist/commands/thread/helpers.d.ts.map +1 -0
- package/dist/commands/thread/helpers.js +27 -0
- package/dist/commands/thread/helpers.js.map +1 -0
- package/dist/commands/thread/mutate.d.ts +5 -0
- package/dist/commands/thread/mutate.d.ts.map +1 -0
- package/dist/commands/thread/mutate.js +21 -0
- package/dist/commands/thread/mutate.js.map +1 -0
- package/dist/commands/thread/mute.d.ts +8 -0
- package/dist/commands/thread/mute.d.ts.map +1 -0
- package/dist/commands/thread/mute.js +58 -0
- package/dist/commands/thread/mute.js.map +1 -0
- package/dist/commands/thread/reply.d.ts +9 -0
- package/dist/commands/thread/reply.d.ts.map +1 -0
- package/dist/commands/thread/reply.js +68 -0
- package/dist/commands/thread/reply.js.map +1 -0
- package/dist/commands/thread/view.d.ts +9 -0
- package/dist/commands/thread/view.d.ts.map +1 -0
- package/dist/commands/thread/view.js +175 -0
- package/dist/commands/thread/view.js.map +1 -0
- package/dist/commands/thread.d.ts +3 -0
- package/dist/commands/thread.d.ts.map +1 -0
- package/dist/commands/thread.js +70 -0
- package/dist/commands/thread.js.map +1 -0
- package/dist/commands/update.d.ts +14 -0
- package/dist/commands/update.d.ts.map +1 -0
- package/dist/commands/update.js +91 -0
- package/dist/commands/update.js.map +1 -0
- package/dist/commands/user.d.ts +3 -0
- package/dist/commands/user.d.ts.map +1 -0
- package/dist/commands/user.js +67 -0
- package/dist/commands/user.js.map +1 -0
- package/dist/commands/view.d.ts +3 -0
- package/dist/commands/view.d.ts.map +1 -0
- package/dist/commands/view.js +63 -0
- package/dist/commands/view.js.map +1 -0
- package/dist/commands/workspace.d.ts +3 -0
- package/dist/commands/workspace.d.ts.map +1 -0
- package/dist/commands/workspace.js +48 -0
- package/dist/commands/workspace.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +133 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/api.d.ts +20 -0
- package/dist/lib/api.d.ts.map +1 -0
- package/dist/lib/api.js +229 -0
- package/dist/lib/api.js.map +1 -0
- package/dist/lib/auth.d.ts +21 -0
- package/dist/lib/auth.d.ts.map +1 -0
- package/dist/lib/auth.js +183 -0
- package/dist/lib/auth.js.map +1 -0
- package/dist/lib/completion.d.ts +31 -0
- package/dist/lib/completion.d.ts.map +1 -0
- package/dist/lib/completion.js +173 -0
- package/dist/lib/completion.js.map +1 -0
- package/dist/lib/config.d.ts +13 -0
- package/dist/lib/config.d.ts.map +1 -0
- package/dist/lib/config.js +26 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/dates.d.ts +3 -0
- package/dist/lib/dates.d.ts.map +1 -0
- package/dist/lib/dates.js +44 -0
- package/dist/lib/dates.js.map +1 -0
- package/dist/lib/input.d.ts +3 -0
- package/dist/lib/input.d.ts.map +1 -0
- package/dist/lib/input.js +52 -0
- package/dist/lib/input.js.map +1 -0
- package/dist/lib/markdown.d.ts +2 -0
- package/dist/lib/markdown.d.ts.map +1 -0
- package/dist/lib/markdown.js +16 -0
- package/dist/lib/markdown.js.map +1 -0
- package/dist/lib/oauth-server.d.ts +13 -0
- package/dist/lib/oauth-server.d.ts.map +1 -0
- package/dist/lib/oauth-server.js +824 -0
- package/dist/lib/oauth-server.js.map +1 -0
- package/dist/lib/oauth.d.ts +31 -0
- package/dist/lib/oauth.d.ts.map +1 -0
- package/dist/lib/oauth.js +140 -0
- package/dist/lib/oauth.js.map +1 -0
- package/dist/lib/options.d.ts +17 -0
- package/dist/lib/options.d.ts.map +1 -0
- package/dist/lib/options.js +2 -0
- package/dist/lib/options.js.map +1 -0
- package/dist/lib/output.d.ts +25 -0
- package/dist/lib/output.d.ts.map +1 -0
- package/dist/lib/output.js +128 -0
- package/dist/lib/output.js.map +1 -0
- package/dist/lib/permissions.d.ts +4 -0
- package/dist/lib/permissions.d.ts.map +1 -0
- package/dist/lib/permissions.js +35 -0
- package/dist/lib/permissions.js.map +1 -0
- package/dist/lib/pkce.d.ts +16 -0
- package/dist/lib/pkce.d.ts.map +1 -0
- package/dist/lib/pkce.js +35 -0
- package/dist/lib/pkce.js.map +1 -0
- package/dist/lib/progress.d.ts +29 -0
- package/dist/lib/progress.d.ts.map +1 -0
- package/dist/lib/progress.js +101 -0
- package/dist/lib/progress.js.map +1 -0
- package/dist/lib/public-channels.d.ts +5 -0
- package/dist/lib/public-channels.d.ts.map +1 -0
- package/dist/lib/public-channels.js +35 -0
- package/dist/lib/public-channels.js.map +1 -0
- package/dist/lib/refs.d.ts +37 -0
- package/dist/lib/refs.d.ts.map +1 -0
- package/dist/lib/refs.js +219 -0
- package/dist/lib/refs.js.map +1 -0
- package/dist/lib/search-api.d.ts +25 -0
- package/dist/lib/search-api.d.ts.map +1 -0
- package/dist/lib/search-api.js +85 -0
- package/dist/lib/search-api.js.map +1 -0
- package/dist/lib/secure-store.d.ts +11 -0
- package/dist/lib/secure-store.d.ts.map +1 -0
- package/dist/lib/secure-store.js +57 -0
- package/dist/lib/secure-store.js.map +1 -0
- package/dist/lib/skills/content.d.ts +5 -0
- package/dist/lib/skills/content.d.ts.map +1 -0
- package/dist/lib/skills/content.js +286 -0
- package/dist/lib/skills/content.js.map +1 -0
- package/dist/lib/skills/create-installer.d.ts +9 -0
- package/dist/lib/skills/create-installer.d.ts.map +1 -0
- package/dist/lib/skills/create-installer.js +60 -0
- package/dist/lib/skills/create-installer.js.map +1 -0
- package/dist/lib/skills/index.d.ts +7 -0
- package/dist/lib/skills/index.d.ts.map +1 -0
- package/dist/lib/skills/index.js +54 -0
- package/dist/lib/skills/index.js.map +1 -0
- package/dist/lib/skills/types.d.ts +30 -0
- package/dist/lib/skills/types.d.ts.map +1 -0
- package/dist/lib/skills/types.js +2 -0
- package/dist/lib/skills/types.js.map +1 -0
- package/dist/lib/skills/update-installed.d.ts +9 -0
- package/dist/lib/skills/update-installed.d.ts.map +1 -0
- package/dist/lib/skills/update-installed.js +20 -0
- package/dist/lib/skills/update-installed.js.map +1 -0
- package/dist/lib/spinner.d.ts +24 -0
- package/dist/lib/spinner.d.ts.map +1 -0
- package/dist/lib/spinner.js +126 -0
- package/dist/lib/spinner.js.map +1 -0
- package/dist/postinstall.d.ts +2 -0
- package/dist/postinstall.d.ts.map +1 -0
- package/dist/postinstall.js +3 -0
- package/dist/postinstall.js.map +1 -0
- package/package.json +5 -4
package/dist/lib/api.js
ADDED
|
@@ -0,0 +1,229 @@
|
|
|
1
|
+
import { TwistApi } from '@doist/twist-sdk';
|
|
2
|
+
import { getApiToken } from './auth.js';
|
|
3
|
+
import { getConfig, updateConfig } from './config.js';
|
|
4
|
+
import { ensureWriteAllowed, isMutatingMethod } from './permissions.js';
|
|
5
|
+
import { getProgressTracker } from './progress.js';
|
|
6
|
+
import { withSpinner } from './spinner.js';
|
|
7
|
+
// Mapping of API method paths to user-friendly spinner messages
|
|
8
|
+
const API_SPINNER_MESSAGES = {
|
|
9
|
+
// User operations
|
|
10
|
+
'users.getSessionUser': { text: 'Checking authentication...', color: 'blue' },
|
|
11
|
+
'users.update': { text: 'Updating user...', color: 'yellow' },
|
|
12
|
+
// Workspace operations
|
|
13
|
+
'workspaces.getWorkspaces': { text: 'Loading workspaces...', color: 'blue' },
|
|
14
|
+
'workspaceUsers.getWorkspaceUsers': { text: 'Loading workspace users...', color: 'blue' },
|
|
15
|
+
'workspaceUsers.getUserById': { text: 'Loading user details...', color: 'blue' },
|
|
16
|
+
// Thread operations
|
|
17
|
+
'threads.getThread': { text: 'Loading thread...', color: 'blue' },
|
|
18
|
+
'threads.getUnread': { text: 'Loading unread threads...', color: 'blue' },
|
|
19
|
+
'threads.createThread': { text: 'Creating thread...', color: 'green' },
|
|
20
|
+
'threads.closeThread': { text: 'Closing thread...', color: 'yellow' },
|
|
21
|
+
'threads.reopenThread': { text: 'Reopening thread...', color: 'yellow' },
|
|
22
|
+
'threads.muteThread': { text: 'Muting thread...', color: 'yellow' },
|
|
23
|
+
'threads.unmuteThread': { text: 'Unmuting thread...', color: 'yellow' },
|
|
24
|
+
// Comment operations
|
|
25
|
+
'comments.getComment': { text: 'Loading comment...', color: 'blue' },
|
|
26
|
+
'comments.getComments': { text: 'Loading comments...', color: 'blue' },
|
|
27
|
+
'comments.createComment': { text: 'Creating comment...', color: 'green' },
|
|
28
|
+
'comments.updateComment': { text: 'Updating comment...', color: 'yellow' },
|
|
29
|
+
'comments.deleteComment': { text: 'Deleting comment...', color: 'yellow' },
|
|
30
|
+
// Channel operations
|
|
31
|
+
'channels.getChannel': { text: 'Loading channel...', color: 'blue' },
|
|
32
|
+
'channels.getChannels': { text: 'Loading channels...', color: 'blue' },
|
|
33
|
+
'channels.createChannel': { text: 'Creating channel...', color: 'green' },
|
|
34
|
+
'channels.updateChannel': { text: 'Updating channel...', color: 'yellow' },
|
|
35
|
+
'channels.deleteChannel': { text: 'Deleting channel...', color: 'yellow' },
|
|
36
|
+
// Conversation operations
|
|
37
|
+
'conversations.getConversations': { text: 'Loading conversations...', color: 'blue' },
|
|
38
|
+
'conversations.getConversation': { text: 'Loading conversation...', color: 'blue' },
|
|
39
|
+
'conversations.getUnread': { text: 'Loading unread conversations...', color: 'blue' },
|
|
40
|
+
'conversations.createConversation': { text: 'Creating conversation...', color: 'green' },
|
|
41
|
+
'conversations.archiveConversation': { text: 'Archiving conversation...', color: 'yellow' },
|
|
42
|
+
'conversations.unarchiveConversation': {
|
|
43
|
+
text: 'Unarchiving conversation...',
|
|
44
|
+
color: 'yellow',
|
|
45
|
+
},
|
|
46
|
+
'conversations.muteConversation': { text: 'Muting conversation...', color: 'yellow' },
|
|
47
|
+
'conversations.unmuteConversation': {
|
|
48
|
+
text: 'Unmuting conversation...',
|
|
49
|
+
color: 'yellow',
|
|
50
|
+
},
|
|
51
|
+
// Conversation message operations
|
|
52
|
+
'conversationMessages.getMessage': { text: 'Loading message...', color: 'blue' },
|
|
53
|
+
'conversationMessages.getMessages': { text: 'Loading messages...', color: 'blue' },
|
|
54
|
+
'conversationMessages.createMessage': { text: 'Sending message...', color: 'green' },
|
|
55
|
+
'conversationMessages.updateMessage': { text: 'Updating message...', color: 'yellow' },
|
|
56
|
+
'conversationMessages.deleteMessage': { text: 'Deleting message...', color: 'yellow' },
|
|
57
|
+
// Inbox operations
|
|
58
|
+
'inbox.getInbox': { text: 'Loading inbox...', color: 'blue' },
|
|
59
|
+
'inbox.archiveThread': { text: 'Archiving thread...', color: 'yellow' },
|
|
60
|
+
// Batch operations
|
|
61
|
+
batch: { text: 'Processing batch operations...', color: 'blue' },
|
|
62
|
+
};
|
|
63
|
+
function createSpinnerWrappedApi(api) {
|
|
64
|
+
return new Proxy(api, {
|
|
65
|
+
get(target, property, receiver) {
|
|
66
|
+
const value = Reflect.get(target, property, receiver);
|
|
67
|
+
// If this is a nested object (like workspaces, users, etc.), wrap it too
|
|
68
|
+
if (value &&
|
|
69
|
+
typeof value === 'object' &&
|
|
70
|
+
!Array.isArray(value) &&
|
|
71
|
+
typeof property === 'string') {
|
|
72
|
+
return createNestedSpinnerProxy(value, property);
|
|
73
|
+
}
|
|
74
|
+
return value;
|
|
75
|
+
},
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
function createNestedSpinnerProxy(obj, basePath) {
|
|
79
|
+
return new Proxy(obj, {
|
|
80
|
+
get(target, property, receiver) {
|
|
81
|
+
const originalMethod = Reflect.get(target, property, receiver);
|
|
82
|
+
if (typeof originalMethod !== 'function' || typeof property !== 'string') {
|
|
83
|
+
return originalMethod;
|
|
84
|
+
}
|
|
85
|
+
const fullPath = `${basePath}.${property}`;
|
|
86
|
+
const spinnerConfig = API_SPINNER_MESSAGES[fullPath];
|
|
87
|
+
const shouldCheckPermissions = isMutatingMethod(fullPath);
|
|
88
|
+
if (!spinnerConfig && !shouldCheckPermissions) {
|
|
89
|
+
return originalMethod;
|
|
90
|
+
}
|
|
91
|
+
return (...args) => {
|
|
92
|
+
const progressTracker = getProgressTracker();
|
|
93
|
+
// Extract cursor from args for paginated methods
|
|
94
|
+
let cursor = null;
|
|
95
|
+
if (args.length > 0 && typeof args[0] === 'object' && args[0] !== null) {
|
|
96
|
+
const options = args[0];
|
|
97
|
+
if ('cursor' in options && typeof options.cursor === 'string') {
|
|
98
|
+
cursor = options.cursor;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
// Emit progress event for API call start
|
|
102
|
+
if (progressTracker.isEnabled()) {
|
|
103
|
+
progressTracker.emitApiCall(property, cursor);
|
|
104
|
+
}
|
|
105
|
+
// For mutating methods, check permissions before calling the API
|
|
106
|
+
if (shouldCheckPermissions) {
|
|
107
|
+
return ensureWriteAllowed().then(() => {
|
|
108
|
+
const result = originalMethod.apply(target, args);
|
|
109
|
+
return wrapResult(result, progressTracker, spinnerConfig);
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
const result = originalMethod.apply(target, args);
|
|
113
|
+
return wrapResult(result, progressTracker, spinnerConfig);
|
|
114
|
+
};
|
|
115
|
+
},
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
function wrapResult(result, progressTracker, spinnerConfig) {
|
|
119
|
+
// If the method returns a non-thenable (e.g. batch request builder), return as-is
|
|
120
|
+
if (!result || typeof result.then !== 'function') {
|
|
121
|
+
return result;
|
|
122
|
+
}
|
|
123
|
+
const wrappedPromise = result
|
|
124
|
+
.then((response) => {
|
|
125
|
+
if (progressTracker.isEnabled()) {
|
|
126
|
+
analyzeAndEmitApiResponse(progressTracker, response);
|
|
127
|
+
}
|
|
128
|
+
return response;
|
|
129
|
+
})
|
|
130
|
+
.catch((error) => {
|
|
131
|
+
if (progressTracker.isEnabled()) {
|
|
132
|
+
progressTracker.emitError(error.name || 'API_ERROR', error.message);
|
|
133
|
+
}
|
|
134
|
+
throw error;
|
|
135
|
+
});
|
|
136
|
+
if (spinnerConfig) {
|
|
137
|
+
return withSpinner(spinnerConfig, () => wrappedPromise);
|
|
138
|
+
}
|
|
139
|
+
return wrappedPromise;
|
|
140
|
+
}
|
|
141
|
+
function analyzeAndEmitApiResponse(progressTracker, response) {
|
|
142
|
+
// For paginated responses, extract metadata
|
|
143
|
+
if (response && typeof response === 'object' && response !== null) {
|
|
144
|
+
const resp = response;
|
|
145
|
+
// Check if it's a paginated response with results array
|
|
146
|
+
if ('results' in resp && Array.isArray(resp.results)) {
|
|
147
|
+
progressTracker.emitApiResponse(resp.results.length, Boolean(resp.nextCursor), typeof resp.nextCursor === 'string' ? resp.nextCursor : null);
|
|
148
|
+
return;
|
|
149
|
+
}
|
|
150
|
+
// For array responses (legacy or simple lists)
|
|
151
|
+
if (Array.isArray(response)) {
|
|
152
|
+
progressTracker.emitApiResponse(response.length, false, null);
|
|
153
|
+
return;
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
// For other responses, emit minimal info
|
|
157
|
+
progressTracker.emitApiResponse(1, false, null);
|
|
158
|
+
}
|
|
159
|
+
let apiClient = null;
|
|
160
|
+
export async function getTwistClient() {
|
|
161
|
+
if (!apiClient) {
|
|
162
|
+
const token = await getApiToken();
|
|
163
|
+
const rawApi = new TwistApi(token);
|
|
164
|
+
apiClient = createSpinnerWrappedApi(rawApi);
|
|
165
|
+
}
|
|
166
|
+
return apiClient;
|
|
167
|
+
}
|
|
168
|
+
let workspaceCache = null;
|
|
169
|
+
let sessionUserCache = null;
|
|
170
|
+
export async function fetchWorkspaces() {
|
|
171
|
+
if (workspaceCache) {
|
|
172
|
+
return workspaceCache;
|
|
173
|
+
}
|
|
174
|
+
const client = await getTwistClient();
|
|
175
|
+
workspaceCache = await client.workspaces.getWorkspaces();
|
|
176
|
+
return workspaceCache;
|
|
177
|
+
}
|
|
178
|
+
export function clearWorkspaceCache() {
|
|
179
|
+
workspaceCache = null;
|
|
180
|
+
}
|
|
181
|
+
export async function getCurrentWorkspaceId(flagValue) {
|
|
182
|
+
if (flagValue) {
|
|
183
|
+
return flagValue;
|
|
184
|
+
}
|
|
185
|
+
const config = await getConfig();
|
|
186
|
+
if (config.currentWorkspace) {
|
|
187
|
+
return config.currentWorkspace;
|
|
188
|
+
}
|
|
189
|
+
const sessionUser = await getSessionUser();
|
|
190
|
+
if (sessionUser.defaultWorkspace) {
|
|
191
|
+
await updateConfig({ currentWorkspace: sessionUser.defaultWorkspace });
|
|
192
|
+
return sessionUser.defaultWorkspace;
|
|
193
|
+
}
|
|
194
|
+
const workspaces = await fetchWorkspaces();
|
|
195
|
+
if (workspaces.length === 0) {
|
|
196
|
+
throw new Error('No workspaces found for this user');
|
|
197
|
+
}
|
|
198
|
+
const defaultWorkspace = workspaces[0];
|
|
199
|
+
await updateConfig({ currentWorkspace: defaultWorkspace.id });
|
|
200
|
+
return defaultWorkspace.id;
|
|
201
|
+
}
|
|
202
|
+
export async function getSessionUser() {
|
|
203
|
+
if (sessionUserCache) {
|
|
204
|
+
return sessionUserCache;
|
|
205
|
+
}
|
|
206
|
+
const client = await getTwistClient();
|
|
207
|
+
sessionUserCache = await client.users.getSessionUser();
|
|
208
|
+
return sessionUserCache;
|
|
209
|
+
}
|
|
210
|
+
export async function getWorkspaceUsers(workspaceId) {
|
|
211
|
+
const client = await getTwistClient();
|
|
212
|
+
return client.workspaceUsers.getWorkspaceUsers({ workspaceId });
|
|
213
|
+
}
|
|
214
|
+
export function clearUserCache() {
|
|
215
|
+
sessionUserCache = null;
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* Validates a batch response and returns the data, throwing on errors.
|
|
219
|
+
* Also handles the case where the SDK fails to validate the response schema
|
|
220
|
+
* (e.g. when the batch API wraps entities in a key like `{comment: {...}}`).
|
|
221
|
+
* In that case, the raw transformed data is returned — check for expected fields.
|
|
222
|
+
*/
|
|
223
|
+
export function assertBatchData(response, label) {
|
|
224
|
+
if (response.code >= 400 || response.data == null) {
|
|
225
|
+
throw new Error(`Failed to fetch ${label}.`);
|
|
226
|
+
}
|
|
227
|
+
return response.data;
|
|
228
|
+
}
|
|
229
|
+
//# sourceMappingURL=api.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/lib/api.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { type AuthMode } from './config.js';
|
|
2
|
+
export declare const TOKEN_ENV_VAR = "TWIST_API_TOKEN";
|
|
3
|
+
export type TokenStorageLocation = 'secure-store' | 'config-file';
|
|
4
|
+
export interface TokenStorageResult {
|
|
5
|
+
storage: TokenStorageLocation;
|
|
6
|
+
warning?: string;
|
|
7
|
+
}
|
|
8
|
+
export interface SaveApiTokenOptions {
|
|
9
|
+
authMode?: AuthMode;
|
|
10
|
+
authScope?: string;
|
|
11
|
+
}
|
|
12
|
+
export interface AuthMetadata {
|
|
13
|
+
authMode: AuthMode;
|
|
14
|
+
authScope?: string;
|
|
15
|
+
source: 'env' | 'config';
|
|
16
|
+
}
|
|
17
|
+
export declare function getApiToken(): Promise<string>;
|
|
18
|
+
export declare function getAuthMetadata(): Promise<AuthMetadata>;
|
|
19
|
+
export declare function saveApiToken(token: string, options?: SaveApiTokenOptions): Promise<TokenStorageResult>;
|
|
20
|
+
export declare function clearApiToken(): Promise<TokenStorageResult>;
|
|
21
|
+
//# sourceMappingURL=auth.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/lib/auth.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,QAAQ,EAAoD,MAAM,aAAa,CAAA;AAO7F,eAAO,MAAM,aAAa,oBAAoB,CAAA;AAC9C,MAAM,MAAM,oBAAoB,GAAG,cAAc,GAAG,aAAa,CAAA;AAEjE,MAAM,WAAW,kBAAkB;IAC/B,OAAO,EAAE,oBAAoB,CAAA;IAC7B,OAAO,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,MAAM,WAAW,mBAAmB;IAChC,QAAQ,CAAC,EAAE,QAAQ,CAAA;IACnB,SAAS,CAAC,EAAE,MAAM,CAAA;CACrB;AAED,MAAM,WAAW,YAAY;IACzB,QAAQ,EAAE,QAAQ,CAAA;IAClB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,MAAM,EAAE,KAAK,GAAG,QAAQ,CAAA;CAC3B;AAED,wBAAsB,WAAW,IAAI,OAAO,CAAC,MAAM,CAAC,CAiEnD;AAED,wBAAsB,eAAe,IAAI,OAAO,CAAC,YAAY,CAAC,CAY7D;AAED,wBAAsB,YAAY,CAC9B,KAAK,EAAE,MAAM,EACb,OAAO,GAAE,mBAAwB,GAClC,OAAO,CAAC,kBAAkB,CAAC,CAwC7B;AAED,wBAAsB,aAAa,IAAI,OAAO,CAAC,kBAAkB,CAAC,CAyBjE"}
|
package/dist/lib/auth.js
ADDED
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
import { unlink } from 'node:fs/promises';
|
|
2
|
+
import { getConfig, getConfigPath, setConfig } from './config.js';
|
|
3
|
+
import { createSecureStore, SECURE_STORE_DESCRIPTION, SecureStoreUnavailableError, } from './secure-store.js';
|
|
4
|
+
export const TOKEN_ENV_VAR = 'TWIST_API_TOKEN';
|
|
5
|
+
export async function getApiToken() {
|
|
6
|
+
// Priority 1: Environment variable
|
|
7
|
+
const envToken = process.env[TOKEN_ENV_VAR];
|
|
8
|
+
if (envToken) {
|
|
9
|
+
return envToken;
|
|
10
|
+
}
|
|
11
|
+
const config = await getConfig();
|
|
12
|
+
const configToken = getConfigToken(config);
|
|
13
|
+
const secureStore = createSecureStore();
|
|
14
|
+
if (configToken) {
|
|
15
|
+
try {
|
|
16
|
+
await secureStore.setSecret(configToken);
|
|
17
|
+
const cleanupWarning = await cleanupAuthFallbackState(config, 'Token was migrated to secure storage,');
|
|
18
|
+
if (cleanupWarning) {
|
|
19
|
+
warn(cleanupWarning);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
catch (error) {
|
|
23
|
+
if (!(error instanceof SecureStoreUnavailableError)) {
|
|
24
|
+
throw error;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
return configToken;
|
|
28
|
+
}
|
|
29
|
+
if (config.pendingSecureStoreClear) {
|
|
30
|
+
try {
|
|
31
|
+
await secureStore.deleteSecret();
|
|
32
|
+
const cleanupWarning = await cleanupAuthFallbackState(config, 'Secure-store token was removed,');
|
|
33
|
+
if (cleanupWarning) {
|
|
34
|
+
warn(cleanupWarning);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
catch (error) {
|
|
38
|
+
if (!(error instanceof SecureStoreUnavailableError)) {
|
|
39
|
+
throw error;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
throw new Error(`No API token found. Set ${TOKEN_ENV_VAR} or run \`tw auth login\` or \`tw auth token <token>\`.`);
|
|
43
|
+
}
|
|
44
|
+
try {
|
|
45
|
+
const storedToken = await secureStore.getSecret();
|
|
46
|
+
if (storedToken?.trim()) {
|
|
47
|
+
return storedToken;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
catch (error) {
|
|
51
|
+
if (!(error instanceof SecureStoreUnavailableError)) {
|
|
52
|
+
throw error;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
throw new Error(`No API token found. Set ${TOKEN_ENV_VAR} or run \`tw auth login\` or \`tw auth token <token>\`.`);
|
|
56
|
+
}
|
|
57
|
+
export async function getAuthMetadata() {
|
|
58
|
+
const envToken = process.env[TOKEN_ENV_VAR];
|
|
59
|
+
if (envToken) {
|
|
60
|
+
return { authMode: 'unknown', source: 'env' };
|
|
61
|
+
}
|
|
62
|
+
const config = await getConfig();
|
|
63
|
+
return {
|
|
64
|
+
authMode: config.authMode ?? 'unknown',
|
|
65
|
+
authScope: config.authScope,
|
|
66
|
+
source: 'config',
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
export async function saveApiToken(token, options = {}) {
|
|
70
|
+
// Validate token (non-empty, reasonable length)
|
|
71
|
+
if (!token || token.trim().length < 10) {
|
|
72
|
+
throw new Error('Invalid token: Token must be at least 10 characters');
|
|
73
|
+
}
|
|
74
|
+
const trimmedToken = token.trim();
|
|
75
|
+
const secureStore = createSecureStore();
|
|
76
|
+
try {
|
|
77
|
+
await secureStore.setSecret(trimmedToken);
|
|
78
|
+
const existingConfig = await getConfig();
|
|
79
|
+
const warning = await cleanupAuthFallbackState(existingConfig, 'Token was stored securely,');
|
|
80
|
+
// Persist auth metadata to config — needed for ensureWriteAllowed() enforcement
|
|
81
|
+
try {
|
|
82
|
+
await saveAuthMetadata(options);
|
|
83
|
+
}
|
|
84
|
+
catch {
|
|
85
|
+
if (options.authMode && options.authMode !== 'unknown') {
|
|
86
|
+
warn(`Could not persist auth mode '${options.authMode}' to config. CLI-side write protection may not work in future sessions.`);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
return warning ? { storage: 'secure-store', warning } : { storage: 'secure-store' };
|
|
90
|
+
}
|
|
91
|
+
catch (error) {
|
|
92
|
+
if (!(error instanceof SecureStoreUnavailableError)) {
|
|
93
|
+
throw error;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
const config = await getConfig();
|
|
97
|
+
config.token = trimmedToken;
|
|
98
|
+
delete config.pendingSecureStoreClear;
|
|
99
|
+
config.authMode = options.authMode ?? 'unknown';
|
|
100
|
+
config.authScope = options.authScope;
|
|
101
|
+
await writeConfig(config);
|
|
102
|
+
return {
|
|
103
|
+
storage: 'config-file',
|
|
104
|
+
warning: buildFallbackWarning('token saved as plaintext in'),
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
export async function clearApiToken() {
|
|
108
|
+
const config = await getConfig();
|
|
109
|
+
const secureStore = createSecureStore();
|
|
110
|
+
// Clear auth metadata from the in-memory config object so all subsequent
|
|
111
|
+
// writes (cleanupAuthFallbackState, withPendingSecureStoreClear) persist
|
|
112
|
+
// the removal atomically alongside other state changes.
|
|
113
|
+
delete config.authMode;
|
|
114
|
+
delete config.authScope;
|
|
115
|
+
try {
|
|
116
|
+
await secureStore.deleteSecret();
|
|
117
|
+
const warning = await cleanupAuthFallbackState(config, 'Secure-store token was removed,');
|
|
118
|
+
return warning ? { storage: 'secure-store', warning } : { storage: 'secure-store' };
|
|
119
|
+
}
|
|
120
|
+
catch (error) {
|
|
121
|
+
if (!(error instanceof SecureStoreUnavailableError)) {
|
|
122
|
+
throw error;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
await writeConfig(withPendingSecureStoreClear(config));
|
|
126
|
+
return {
|
|
127
|
+
storage: 'config-file',
|
|
128
|
+
warning: buildFallbackWarning('local auth state cleared in'),
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
async function saveAuthMetadata(options) {
|
|
132
|
+
const config = await getConfig();
|
|
133
|
+
config.authMode = options.authMode ?? 'unknown';
|
|
134
|
+
config.authScope = options.authScope;
|
|
135
|
+
await setConfig(config);
|
|
136
|
+
}
|
|
137
|
+
async function writeConfig(config) {
|
|
138
|
+
if (Object.keys(config).length === 0) {
|
|
139
|
+
try {
|
|
140
|
+
await unlink(getConfigPath());
|
|
141
|
+
}
|
|
142
|
+
catch (error) {
|
|
143
|
+
if (!isMissingFileError(error)) {
|
|
144
|
+
throw error;
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
return;
|
|
148
|
+
}
|
|
149
|
+
await setConfig(config);
|
|
150
|
+
}
|
|
151
|
+
async function cleanupAuthFallbackState(config, warningPrefix) {
|
|
152
|
+
try {
|
|
153
|
+
await writeConfig(withoutAuthFallbackState(config));
|
|
154
|
+
return undefined;
|
|
155
|
+
}
|
|
156
|
+
catch (error) {
|
|
157
|
+
return buildConfigCleanupWarning(warningPrefix, error);
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
function getConfigToken(config) {
|
|
161
|
+
return typeof config.token === 'string' && config.token.trim() ? config.token.trim() : null;
|
|
162
|
+
}
|
|
163
|
+
function withoutAuthFallbackState(config) {
|
|
164
|
+
const { token: _token, pendingSecureStoreClear: _pending, ...rest } = config;
|
|
165
|
+
return rest;
|
|
166
|
+
}
|
|
167
|
+
function withPendingSecureStoreClear(config) {
|
|
168
|
+
return { ...withoutAuthFallbackState(config), pendingSecureStoreClear: true };
|
|
169
|
+
}
|
|
170
|
+
function buildFallbackWarning(action) {
|
|
171
|
+
return `${SECURE_STORE_DESCRIPTION} unavailable; ${action} ${getConfigPath()}`;
|
|
172
|
+
}
|
|
173
|
+
function buildConfigCleanupWarning(prefix, error) {
|
|
174
|
+
const detail = error instanceof Error && error.message ? ` (${error.message})` : '';
|
|
175
|
+
return `${prefix} but could not remove legacy plaintext token from ${getConfigPath()}${detail}`;
|
|
176
|
+
}
|
|
177
|
+
function isMissingFileError(error) {
|
|
178
|
+
return error instanceof Error && 'code' in error && error.code === 'ENOENT';
|
|
179
|
+
}
|
|
180
|
+
function warn(message) {
|
|
181
|
+
console.error(`Warning: ${message}`);
|
|
182
|
+
}
|
|
183
|
+
//# sourceMappingURL=auth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/lib/auth.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { Command, Option } from 'commander';
|
|
2
|
+
/**
|
|
3
|
+
* Set argChoices on an option without enabling Commander's built-in
|
|
4
|
+
* validation. The choices are surfaced for shell completions but the
|
|
5
|
+
* option still accepts any value at parse time.
|
|
6
|
+
*/
|
|
7
|
+
export declare function withUnvalidatedChoices(opt: Option, values: string[]): Option;
|
|
8
|
+
export declare function withCaseInsensitiveChoices(opt: Option, values: string[]): Option;
|
|
9
|
+
/**
|
|
10
|
+
* Parse COMP_LINE into words, stripping the binary name and the
|
|
11
|
+
* 'completion-server' token that tabtab injects.
|
|
12
|
+
*
|
|
13
|
+
* FIXME: This splits on whitespace and does not handle quoted arguments.
|
|
14
|
+
* This is acceptable for command/flag traversal. It can be improved once
|
|
15
|
+
* tabtab exposes shell-provided tokenized words.
|
|
16
|
+
*/
|
|
17
|
+
export declare function parseCompLine(compLine: string): string[];
|
|
18
|
+
export interface CompletionItem {
|
|
19
|
+
name: string;
|
|
20
|
+
description?: string;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Get completions for the current command line context.
|
|
24
|
+
*
|
|
25
|
+
* @param program - The root Commander program with all commands registered
|
|
26
|
+
* @param words - The words on the command line (excluding the binary name)
|
|
27
|
+
* @param current - The current word being typed (may be empty string)
|
|
28
|
+
* @returns Array of completion items
|
|
29
|
+
*/
|
|
30
|
+
export declare function getCompletions(program: Command, words: string[], current: string): CompletionItem[];
|
|
31
|
+
//# sourceMappingURL=completion.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"completion.d.ts","sourceRoot":"","sources":["../../src/lib/completion.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAA;AAEhD;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,CAG5E;AAED,wBAAgB,0BAA0B,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,CAWhF;AAED;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE,CAIxD;AAED,MAAM,WAAW,cAAc;IAC3B,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,CAAC,EAAE,MAAM,CAAA;CACvB;AAoBD;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAC1B,OAAO,EAAE,OAAO,EAChB,KAAK,EAAE,MAAM,EAAE,EACf,OAAO,EAAE,MAAM,GAChB,cAAc,EAAE,CAsGlB"}
|