canvaslms-cli 1.4.6 → 1.5.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.
Files changed (81) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/README.md +32 -22
  3. package/dist/commands/announcements.d.ts +3 -0
  4. package/dist/commands/announcements.d.ts.map +1 -0
  5. package/dist/commands/announcements.js +92 -0
  6. package/dist/commands/announcements.js.map +1 -0
  7. package/dist/commands/api.d.ts +3 -0
  8. package/dist/commands/api.d.ts.map +1 -0
  9. package/dist/commands/api.js +8 -0
  10. package/dist/commands/api.js.map +1 -0
  11. package/dist/commands/assignments.d.ts +3 -0
  12. package/dist/commands/assignments.d.ts.map +1 -0
  13. package/dist/commands/assignments.js +100 -0
  14. package/dist/commands/assignments.js.map +1 -0
  15. package/dist/commands/config.d.ts +6 -0
  16. package/dist/commands/config.d.ts.map +1 -0
  17. package/dist/commands/config.js +202 -0
  18. package/dist/commands/config.js.map +1 -0
  19. package/dist/commands/grades.d.ts +3 -0
  20. package/dist/commands/grades.d.ts.map +1 -0
  21. package/dist/commands/grades.js +335 -0
  22. package/dist/commands/grades.js.map +1 -0
  23. package/dist/commands/list.d.ts +3 -0
  24. package/dist/commands/list.d.ts.map +1 -0
  25. package/dist/commands/list.js +61 -0
  26. package/dist/commands/list.js.map +1 -0
  27. package/dist/commands/profile.d.ts +6 -0
  28. package/dist/commands/profile.d.ts.map +1 -0
  29. package/dist/commands/profile.js +30 -0
  30. package/dist/commands/profile.js.map +1 -0
  31. package/dist/commands/submit.d.ts +8 -0
  32. package/dist/commands/submit.d.ts.map +1 -0
  33. package/dist/commands/submit.js +319 -0
  34. package/dist/commands/submit.js.map +1 -0
  35. package/dist/index.d.ts +15 -0
  36. package/dist/index.d.ts.map +1 -0
  37. package/dist/index.js +15 -0
  38. package/dist/index.js.map +1 -0
  39. package/dist/lib/api-client.d.ts +2 -0
  40. package/dist/lib/api-client.d.ts.map +1 -0
  41. package/dist/lib/api-client.js +76 -0
  42. package/dist/lib/api-client.js.map +1 -0
  43. package/dist/lib/config-validator.d.ts +4 -0
  44. package/dist/lib/config-validator.d.ts.map +1 -0
  45. package/dist/lib/config-validator.js +38 -0
  46. package/dist/lib/config-validator.js.map +1 -0
  47. package/dist/lib/config.d.ts +10 -0
  48. package/dist/lib/config.d.ts.map +1 -0
  49. package/dist/lib/config.js +85 -0
  50. package/dist/lib/config.js.map +1 -0
  51. package/dist/lib/file-upload.d.ts +3 -0
  52. package/dist/lib/file-upload.d.ts.map +1 -0
  53. package/dist/lib/file-upload.js +52 -0
  54. package/dist/lib/file-upload.js.map +1 -0
  55. package/dist/lib/interactive.d.ts +16 -0
  56. package/dist/lib/interactive.d.ts.map +1 -0
  57. package/dist/lib/interactive.js +758 -0
  58. package/dist/lib/interactive.js.map +1 -0
  59. package/dist/src/index.d.ts +3 -0
  60. package/dist/src/index.d.ts.map +1 -0
  61. package/dist/src/index.js +90 -0
  62. package/dist/src/index.js.map +1 -0
  63. package/dist/types/index.d.ts +147 -0
  64. package/dist/types/index.d.ts.map +1 -0
  65. package/dist/types/index.js +2 -0
  66. package/dist/types/index.js.map +1 -0
  67. package/package.json +15 -15
  68. package/commands/announcements.js +0 -102
  69. package/commands/api.js +0 -19
  70. package/commands/assignments.js +0 -100
  71. package/commands/config.js +0 -239
  72. package/commands/grades.js +0 -201
  73. package/commands/list.js +0 -68
  74. package/commands/profile.js +0 -35
  75. package/commands/submit.js +0 -603
  76. package/lib/api-client.js +0 -75
  77. package/lib/config-validator.js +0 -60
  78. package/lib/config.js +0 -103
  79. package/lib/file-upload.js +0 -74
  80. package/lib/interactive.js +0 -889
  81. package/src/index.js +0 -120
@@ -0,0 +1,319 @@
1
+ import { makeCanvasRequest } from '../lib/api-client.js';
2
+ import { uploadSingleFileToCanvas, submitAssignmentWithFiles } from '../lib/file-upload.js';
3
+ import { createReadlineInterface, selectFilesKeyboard, askQuestion, askConfirmation } from '../lib/interactive.js';
4
+ import chalk from 'chalk';
5
+ import path from 'path';
6
+ function pad(str, len) {
7
+ return str + ' '.repeat(Math.max(0, len - str.length));
8
+ }
9
+ function clearLines(count = 1) {
10
+ if (!process.stdout.isTTY)
11
+ return;
12
+ for (let i = 0; i < count; i++) {
13
+ process.stdout.moveCursor(0, -1);
14
+ process.stdout.clearLine(1);
15
+ }
16
+ }
17
+ export async function submitAssignment(options) {
18
+ let rl = createReadlineInterface();
19
+ let rlForConfirm = rl;
20
+ process.on('SIGINT', () => {
21
+ console.log(chalk.yellow('\n\nSubmission cancelled by user.'));
22
+ if (rl)
23
+ rl.close();
24
+ if (rlForConfirm && rlForConfirm !== rl)
25
+ rlForConfirm.close();
26
+ process.exit(0);
27
+ });
28
+ try {
29
+ console.log(chalk.cyan.bold('\n' + '='.repeat(60)));
30
+ console.log(chalk.cyan.bold('Canvas Assignment Submission'));
31
+ console.log(chalk.cyan.bold('='.repeat(60)));
32
+ let courseId;
33
+ if (options.course) {
34
+ courseId = parseInt(options.course);
35
+ console.log(chalk.green(`✓ Using specified course ID: ${courseId}`));
36
+ }
37
+ else {
38
+ console.log(chalk.cyan('\n' + '-'.repeat(60)));
39
+ console.log(chalk.cyan.bold('Step 1: Select Course'));
40
+ console.log(chalk.cyan('-'.repeat(60)));
41
+ const queryParams = options.all
42
+ ? ['enrollment_state=active', 'per_page=100', 'include[]=term', 'include[]=favorites']
43
+ : ['enrollment_state=active', 'per_page=100', 'include[]=term', 'include[]=favorites'];
44
+ const courses = await makeCanvasRequest('get', 'courses', queryParams);
45
+ if (!courses || courses.length === 0) {
46
+ console.log(chalk.red('Error: No courses found.'));
47
+ rl.close();
48
+ return;
49
+ }
50
+ let displayCourses = courses;
51
+ if (!options.all) {
52
+ displayCourses = courses.filter(c => c.is_favorite);
53
+ if (displayCourses.length === 0) {
54
+ console.log(chalk.yellow('No starred courses found. Showing all courses instead.'));
55
+ displayCourses = courses;
56
+ }
57
+ }
58
+ displayCourses.sort((a, b) => a.name.localeCompare(b.name));
59
+ console.log(chalk.cyan.bold('Select a course:'));
60
+ displayCourses.forEach((course, index) => {
61
+ console.log(chalk.white(`${index + 1}.`) + ' ' + course.name);
62
+ });
63
+ const courseChoice = await askQuestion(rl, chalk.white('\nEnter course number (or ".."/"back" to cancel): '));
64
+ if (!courseChoice.trim() || courseChoice === '..' || courseChoice.toLowerCase() === 'back') {
65
+ console.log(chalk.yellow('Submission cancelled.'));
66
+ rl.close();
67
+ return;
68
+ }
69
+ const courseIndex = parseInt(courseChoice) - 1;
70
+ if (courseIndex < 0 || courseIndex >= displayCourses.length) {
71
+ console.log(chalk.red('Invalid course selection.'));
72
+ rl.close();
73
+ return;
74
+ }
75
+ const selectedCourse = displayCourses[courseIndex];
76
+ courseId = selectedCourse.id;
77
+ clearLines(1);
78
+ console.log(chalk.green(`✓ Selected course: ${selectedCourse.name}`));
79
+ }
80
+ console.log(chalk.cyan('\n' + '-'.repeat(60)));
81
+ console.log(chalk.cyan.bold('Step 2: Select Assignment'));
82
+ console.log(chalk.cyan('-'.repeat(60)));
83
+ console.log(chalk.white('Loading assignments...'));
84
+ const assignmentParams = [
85
+ 'include[]=submission',
86
+ 'per_page=100'
87
+ ];
88
+ const assignments = await makeCanvasRequest('get', `courses/${courseId}/assignments`, assignmentParams);
89
+ if (!assignments || assignments.length === 0) {
90
+ console.log(chalk.red('Error: No assignments found for this course.'));
91
+ rl.close();
92
+ return;
93
+ }
94
+ const uploadableAssignments = assignments.filter(a => a.submission_types && a.submission_types.includes('online_upload'));
95
+ if (uploadableAssignments.length === 0) {
96
+ console.log(chalk.red('Error: No assignments accept file uploads in this course.'));
97
+ rl.close();
98
+ return;
99
+ }
100
+ uploadableAssignments.sort((a, b) => {
101
+ if (!a.due_at)
102
+ return 1;
103
+ if (!b.due_at)
104
+ return -1;
105
+ return new Date(a.due_at).getTime() - new Date(b.due_at).getTime();
106
+ });
107
+ console.log(chalk.white(`\nFound ${uploadableAssignments.length} assignment(s) that accept file uploads:`));
108
+ console.log();
109
+ const colNo = 5;
110
+ const colName = 40;
111
+ const colType = 18;
112
+ const colDate = 26;
113
+ const colStatus = 15;
114
+ console.log(chalk.gray('┌─') + chalk.gray('─'.repeat(colNo)) + chalk.gray('┬─') +
115
+ chalk.gray('─'.repeat(colName)) + chalk.gray('┬─') +
116
+ chalk.gray('─'.repeat(colType)) + chalk.gray('┬─') +
117
+ chalk.gray('─'.repeat(colDate)) + chalk.gray('┬─') +
118
+ chalk.gray('─'.repeat(colStatus)) + chalk.gray('┐'));
119
+ console.log(chalk.gray('│ ') + chalk.cyan.bold(pad('No', colNo)) + chalk.gray('│ ') +
120
+ chalk.cyan.bold(pad('Assignment Name', colName)) + chalk.gray('│ ') +
121
+ chalk.cyan.bold(pad('Type', colType)) + chalk.gray('│ ') +
122
+ chalk.cyan.bold(pad('Due Date', colDate)) + chalk.gray('│ ') +
123
+ chalk.cyan.bold(pad('Status', colStatus)) + chalk.gray('│'));
124
+ console.log(chalk.gray('├─') + chalk.gray('─'.repeat(colNo)) + chalk.gray('┼─') +
125
+ chalk.gray('─'.repeat(colName)) + chalk.gray('┼─') +
126
+ chalk.gray('─'.repeat(colType)) + chalk.gray('┼─') +
127
+ chalk.gray('─'.repeat(colDate)) + chalk.gray('┼─') +
128
+ chalk.gray('─'.repeat(colStatus)) + chalk.gray('┤'));
129
+ uploadableAssignments.forEach((assignment, index) => {
130
+ const submission = assignment.submission;
131
+ const isSubmitted = submission && submission.submitted_at;
132
+ const statusPlainText = isSubmitted ? '✓ Submitted' : 'Not submitted';
133
+ const statusColored = isSubmitted
134
+ ? chalk.green(statusPlainText)
135
+ : chalk.yellow(statusPlainText);
136
+ const dueDateText = assignment.due_at
137
+ ? new Date(assignment.due_at).toLocaleString()
138
+ : 'No due date';
139
+ let typeText = 'Unknown';
140
+ if (assignment.submission_types && assignment.submission_types.length > 0) {
141
+ const types = assignment.submission_types;
142
+ if (types.includes('online_quiz')) {
143
+ typeText = 'Quiz';
144
+ }
145
+ else if (types.includes('online_upload')) {
146
+ if (assignment.allowed_extensions && assignment.allowed_extensions.length > 0) {
147
+ const exts = assignment.allowed_extensions.slice(0, 3);
148
+ const extList = exts.join(', ');
149
+ const suffix = assignment.allowed_extensions.length > 3 ? '...' : '';
150
+ typeText = `${extList}${suffix}`;
151
+ }
152
+ else {
153
+ typeText = 'Any file';
154
+ }
155
+ }
156
+ else if (types.includes('online_text_entry')) {
157
+ typeText = 'Text Entry';
158
+ }
159
+ else if (types.includes('online_url')) {
160
+ typeText = 'URL';
161
+ }
162
+ else if (types.includes('external_tool')) {
163
+ typeText = 'External Tool';
164
+ }
165
+ else if (types.includes('media_recording')) {
166
+ typeText = 'Media';
167
+ }
168
+ else if (types[0]) {
169
+ typeText = types[0].replace(/_/g, ' ');
170
+ }
171
+ }
172
+ let displayName = assignment.name;
173
+ if (displayName.length > colName) {
174
+ displayName = displayName.substring(0, colName - 3) + '...';
175
+ }
176
+ console.log(chalk.gray('│ ') + chalk.white(pad(`${index + 1}`, colNo)) + chalk.gray('│ ') +
177
+ chalk.white(pad(displayName, colName)) + chalk.gray('│ ') +
178
+ chalk.blue(pad(typeText, colType)) + chalk.gray('│ ') +
179
+ chalk.gray(pad(dueDateText, colDate)) + chalk.gray('│ ') +
180
+ statusColored + ' '.repeat(Math.max(0, colStatus - statusPlainText.length)) + chalk.gray('│'));
181
+ });
182
+ console.log(chalk.gray('└─') + chalk.gray('─'.repeat(colNo)) + chalk.gray('┴─') +
183
+ chalk.gray('─'.repeat(colName)) + chalk.gray('┴─') +
184
+ chalk.gray('─'.repeat(colType)) + chalk.gray('┴─') +
185
+ chalk.gray('─'.repeat(colDate)) + chalk.gray('┴─') +
186
+ chalk.gray('─'.repeat(colStatus)) + chalk.gray('┘'));
187
+ let selectedAssignment;
188
+ while (true) {
189
+ const assignmentChoice = await askQuestion(rl, chalk.white('\nEnter assignment number (or ".."/"back" to cancel): '));
190
+ if (!assignmentChoice.trim() || assignmentChoice === '..' || assignmentChoice.toLowerCase() === 'back') {
191
+ console.log(chalk.yellow('Submission cancelled.'));
192
+ rl.close();
193
+ return;
194
+ }
195
+ const assignmentIndex = parseInt(assignmentChoice) - 1;
196
+ if (assignmentIndex < 0 || assignmentIndex >= uploadableAssignments.length || isNaN(assignmentIndex)) {
197
+ console.log(chalk.red('Invalid assignment selection. Please try again.'));
198
+ continue;
199
+ }
200
+ selectedAssignment = uploadableAssignments[assignmentIndex];
201
+ clearLines(1);
202
+ console.log(chalk.green(`✓ Selected assignment: ${selectedAssignment.name}`));
203
+ break;
204
+ }
205
+ console.log(chalk.cyan('\n' + '-'.repeat(60)));
206
+ console.log(chalk.cyan.bold('Step 3: Select Files to Submit'));
207
+ console.log(chalk.cyan('-'.repeat(60)));
208
+ let filesToSubmit = [];
209
+ if (options.file) {
210
+ const filePath = path.isAbsolute(options.file)
211
+ ? options.file
212
+ : path.join(process.cwd(), options.file);
213
+ filesToSubmit = [filePath];
214
+ console.log(chalk.green(`✓ Using specified file: ${path.basename(filePath)}`));
215
+ }
216
+ else {
217
+ console.log(chalk.yellow('\n📂 Opening interactive file browser...'));
218
+ rl.close();
219
+ try {
220
+ const allowed = (selectedAssignment && selectedAssignment.allowed_extensions) || undefined;
221
+ filesToSubmit = await selectFilesKeyboard(rl, process.cwd(), allowed);
222
+ if (!filesToSubmit || filesToSubmit.length === 0) {
223
+ console.log(chalk.yellow('No files selected. Submission cancelled.'));
224
+ return;
225
+ }
226
+ }
227
+ catch (error) {
228
+ console.error(chalk.red('Error during file selection:'), error);
229
+ if (process.stdin.isTTY) {
230
+ process.stdin.setRawMode(false);
231
+ }
232
+ return;
233
+ }
234
+ if (process.stdin.isTTY) {
235
+ process.stdin.setRawMode(false);
236
+ }
237
+ process.stdin.resume();
238
+ await new Promise(resolve => setTimeout(resolve, 150));
239
+ rlForConfirm = createReadlineInterface();
240
+ }
241
+ console.log(chalk.cyan('\n' + '-'.repeat(60)));
242
+ console.log(chalk.cyan.bold('Step 4: Confirm Submission'));
243
+ console.log(chalk.cyan('-'.repeat(60)));
244
+ console.log(chalk.white(`Course: ${courseId}`));
245
+ console.log(chalk.white(`Assignment: ${selectedAssignment.name}`));
246
+ console.log(chalk.white(`Files to submit (${filesToSubmit.length}):`));
247
+ filesToSubmit.forEach((file, index) => {
248
+ console.log(chalk.white(` ${index + 1}. ${path.basename(file)}`));
249
+ });
250
+ const confirmed = await askConfirmation(rlForConfirm, chalk.bold.yellow('\nProceed with submission?'), true);
251
+ if (!confirmed) {
252
+ console.log(chalk.yellow('Submission cancelled.'));
253
+ rlForConfirm.close();
254
+ return;
255
+ }
256
+ console.log(chalk.cyan('\n' + '-'.repeat(60)));
257
+ console.log(chalk.cyan.bold('Step 5: Uploading Files'));
258
+ console.log(chalk.cyan('-'.repeat(60)));
259
+ const fileIds = [];
260
+ for (let i = 0; i < filesToSubmit.length; i++) {
261
+ const file = filesToSubmit[i];
262
+ if (!file)
263
+ continue;
264
+ try {
265
+ console.log(chalk.white(`Uploading ${i + 1}/${filesToSubmit.length}: ${path.basename(file)}...`));
266
+ const fileId = await uploadSingleFileToCanvas(courseId, selectedAssignment.id, file);
267
+ fileIds.push(fileId);
268
+ console.log(chalk.green(`✓ Uploaded successfully (File ID: ${fileId})`));
269
+ }
270
+ catch (error) {
271
+ const errorMessage = error instanceof Error ? error.message : String(error);
272
+ console.log(chalk.red(`✗ Failed to upload ${path.basename(file)}: ${errorMessage}`));
273
+ const continueUpload = await askConfirmation(rlForConfirm, chalk.yellow('Continue with remaining files?'), false);
274
+ if (!continueUpload) {
275
+ console.log(chalk.yellow('Upload cancelled.'));
276
+ rlForConfirm.close();
277
+ return;
278
+ }
279
+ }
280
+ }
281
+ if (fileIds.length === 0) {
282
+ console.log(chalk.red('Error: No files were successfully uploaded.'));
283
+ rlForConfirm.close();
284
+ return;
285
+ }
286
+ console.log(chalk.cyan('\n' + '-'.repeat(60)));
287
+ console.log(chalk.cyan.bold('Submitting Assignment'));
288
+ console.log(chalk.cyan('-'.repeat(60)));
289
+ console.log(chalk.white('Finalizing submission...'));
290
+ try {
291
+ await submitAssignmentWithFiles(courseId, selectedAssignment.id, fileIds);
292
+ console.log(chalk.cyan('\n' + '='.repeat(60)));
293
+ console.log(chalk.green.bold('Assignment submitted successfully!'));
294
+ console.log(chalk.cyan('='.repeat(60)));
295
+ console.log(chalk.white(`Course ID: ${courseId}`));
296
+ console.log(chalk.white(`Assignment: ${selectedAssignment.name}`));
297
+ console.log(chalk.white(`Files submitted: ${fileIds.length}`));
298
+ console.log(chalk.cyan('='.repeat(60)));
299
+ }
300
+ catch (error) {
301
+ const errorMessage = error instanceof Error ? error.message : String(error);
302
+ console.log(chalk.red('\n❌ Error submitting assignment: ' + errorMessage));
303
+ console.log(chalk.yellow('Files were uploaded but submission failed. You may need to complete the submission manually in Canvas.'));
304
+ }
305
+ }
306
+ catch (error) {
307
+ const errorMessage = error instanceof Error ? error.message : String(error);
308
+ console.error(chalk.red('\n❌ Error during submission process:'), errorMessage);
309
+ process.exit(1);
310
+ }
311
+ finally {
312
+ try {
313
+ rlForConfirm.close();
314
+ }
315
+ catch {
316
+ }
317
+ }
318
+ }
319
+ //# sourceMappingURL=submit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"submit.js","sourceRoot":"","sources":["../../commands/submit.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ export * from './lib/api-client.js';
2
+ export * from './lib/config.js';
3
+ export * from './lib/config-validator.js';
4
+ export * from './lib/file-upload.js';
5
+ export * from './lib/interactive.js';
6
+ export * from './commands/list.js';
7
+ export * from './commands/config.js';
8
+ export * from './commands/assignments.js';
9
+ export * from './commands/grades.js';
10
+ export * from './commands/announcements.js';
11
+ export * from './commands/profile.js';
12
+ export * from './commands/submit.js';
13
+ export * from './commands/api.js';
14
+ export * from './types/index.js';
15
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAOA,cAAc,qBAAqB,CAAC;AACpC,cAAc,iBAAiB,CAAC;AAChC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,sBAAsB,CAAC;AACrC,cAAc,sBAAsB,CAAC;AACrC,cAAc,oBAAoB,CAAC;AACnC,cAAc,sBAAsB,CAAC;AACrC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,sBAAsB,CAAC;AACrC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,uBAAuB,CAAC;AACtC,cAAc,sBAAsB,CAAC;AACrC,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,15 @@
1
+ export * from './lib/api-client.js';
2
+ export * from './lib/config.js';
3
+ export * from './lib/config-validator.js';
4
+ export * from './lib/file-upload.js';
5
+ export * from './lib/interactive.js';
6
+ export * from './commands/list.js';
7
+ export * from './commands/config.js';
8
+ export * from './commands/assignments.js';
9
+ export * from './commands/grades.js';
10
+ export * from './commands/announcements.js';
11
+ export * from './commands/profile.js';
12
+ export * from './commands/submit.js';
13
+ export * from './commands/api.js';
14
+ export * from './types/index.js';
15
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAOA,cAAc,qBAAqB,CAAC;AACpC,cAAc,iBAAiB,CAAC;AAChC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,sBAAsB,CAAC;AACrC,cAAc,sBAAsB,CAAC;AACrC,cAAc,oBAAoB,CAAC;AACnC,cAAc,sBAAsB,CAAC;AACrC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,sBAAsB,CAAC;AACrC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,uBAAuB,CAAC;AACtC,cAAc,sBAAsB,CAAC;AACrC,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function makeCanvasRequest<T = any>(method: string, endpoint: string, queryParams?: string[], requestBody?: string | null): Promise<T>;
2
+ //# sourceMappingURL=api-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-client.d.ts","sourceRoot":"","sources":["../../lib/api-client.ts"],"names":[],"mappings":"AAWA,wBAAsB,iBAAiB,CAAC,CAAC,GAAG,GAAG,EAC7C,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,WAAW,GAAE,MAAM,EAAO,EAC1B,WAAW,GAAE,MAAM,GAAG,IAAW,GAChC,OAAO,CAAC,CAAC,CAAC,CAgFZ"}
@@ -0,0 +1,76 @@
1
+ import axios from 'axios';
2
+ import fs from 'fs';
3
+ import { getInstanceConfig } from './config.js';
4
+ export async function makeCanvasRequest(method, endpoint, queryParams = [], requestBody = null) {
5
+ const instanceConfig = getInstanceConfig();
6
+ const baseUrl = `https://${instanceConfig.domain}/api/v1`;
7
+ const url = `${baseUrl}/${endpoint.replace(/^\//, '')}`;
8
+ const config = {
9
+ method: method.toLowerCase(),
10
+ url: url,
11
+ headers: {
12
+ 'Authorization': `Bearer ${instanceConfig.token}`,
13
+ 'Content-Type': 'application/json'
14
+ }
15
+ };
16
+ if (queryParams.length > 0) {
17
+ const params = new URLSearchParams();
18
+ queryParams.forEach(param => {
19
+ const parts = param.split('=', 2);
20
+ const key = parts[0];
21
+ const value = parts[1] ?? '';
22
+ if (key) {
23
+ params.append(key, value);
24
+ }
25
+ });
26
+ config.params = params;
27
+ }
28
+ if (requestBody && (method.toLowerCase() === 'post' || method.toLowerCase() === 'put')) {
29
+ if (requestBody.startsWith('@')) {
30
+ const filename = requestBody.substring(1);
31
+ try {
32
+ config.data = JSON.parse(fs.readFileSync(filename, 'utf8'));
33
+ }
34
+ catch (error) {
35
+ const errorMessage = error instanceof Error ? error.message : String(error);
36
+ console.error(`Error reading file ${filename}: ${errorMessage}`);
37
+ process.exit(1);
38
+ }
39
+ }
40
+ else {
41
+ try {
42
+ config.data = JSON.parse(requestBody);
43
+ }
44
+ catch (error) {
45
+ const errorMessage = error instanceof Error ? error.message : String(error);
46
+ console.error(`Error parsing JSON: ${errorMessage}`);
47
+ process.exit(1);
48
+ }
49
+ }
50
+ }
51
+ try {
52
+ const response = await axios(config);
53
+ if (instanceConfig.domain === 'swinburne.instructure.com' &&
54
+ endpoint === 'courses' &&
55
+ Array.isArray(response.data)) {
56
+ const data = response.data;
57
+ const filteredData = data.filter((item) => !item.name || !item.name.startsWith('ORG-'));
58
+ return filteredData;
59
+ }
60
+ return response.data;
61
+ }
62
+ catch (error) {
63
+ if (axios.isAxiosError(error) && error.response) {
64
+ console.error(`HTTP ${error.response.status}: ${error.response.statusText}`);
65
+ if (error.response.data) {
66
+ console.error(JSON.stringify(error.response.data, null, 2));
67
+ }
68
+ }
69
+ else {
70
+ const errorMessage = error instanceof Error ? error.message : String(error);
71
+ console.error(`Request failed: ${errorMessage}`);
72
+ }
73
+ process.exit(1);
74
+ }
75
+ }
76
+ //# sourceMappingURL=api-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-client.js","sourceRoot":"","sources":["../../lib/api-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ declare function ensureConfig(): Promise<boolean>;
2
+ export declare function requireConfig<T extends (...args: any[]) => any>(fn: T): T;
3
+ export { ensureConfig };
4
+ //# sourceMappingURL=config-validator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-validator.d.ts","sourceRoot":"","sources":["../../lib/config-validator.ts"],"names":[],"mappings":"AAWA,iBAAe,YAAY,IAAI,OAAO,CAAC,OAAO,CAAC,CAmC9C;AAKD,wBAAgB,aAAa,CAAC,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,EAAE,EAAE,EAAE,CAAC,GAAG,CAAC,CAKzE;AAED,OAAO,EAAE,YAAY,EAAE,CAAC"}
@@ -0,0 +1,38 @@
1
+ import { configExists, readConfig } from './config.js';
2
+ import { createReadlineInterface, askQuestion } from './interactive.js';
3
+ async function ensureConfig() {
4
+ if (!configExists()) {
5
+ console.log('No Canvas configuration found!');
6
+ console.log('\nLet\'s set up your Canvas CLI configuration...\n');
7
+ const rl = createReadlineInterface();
8
+ const setup = await askQuestion(rl, 'Would you like to set up your configuration now? (Y/n): ');
9
+ rl.close();
10
+ if (setup.toLowerCase() === 'n' || setup.toLowerCase() === 'no') {
11
+ console.log('\nTo set up later, run: canvas config setup');
12
+ console.log('Or set environment variables: CANVAS_DOMAIN and CANVAS_API_TOKEN');
13
+ process.exit(1);
14
+ }
15
+ const { setupConfig } = await import('../commands/config.js');
16
+ await setupConfig();
17
+ if (!configExists()) {
18
+ console.log('\nConfiguration setup was not completed. Please run "canvas config setup" to try again.');
19
+ process.exit(1);
20
+ }
21
+ console.log('\nConfiguration complete! You can now use Canvas CLI commands.');
22
+ return true;
23
+ }
24
+ const config = readConfig();
25
+ if (!config || !config.domain || !config.token) {
26
+ console.log('Invalid configuration found. Please run "canvas config setup" to reconfigure.');
27
+ process.exit(1);
28
+ }
29
+ return true;
30
+ }
31
+ export function requireConfig(fn) {
32
+ return (async function (...args) {
33
+ await ensureConfig();
34
+ return fn(...args);
35
+ });
36
+ }
37
+ export { ensureConfig };
38
+ //# sourceMappingURL=config-validator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-validator.js","sourceRoot":"","sources":["../../lib/config-validator.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACvD,OAAO,EAAE,uBAAuB,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAMxE,KAAK,UAAU,YAAY;IACzB,IAAI,CAAC,YAAY,EAAE,EAAE,CAAC;QACpB,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC;QAC9C,OAAO,CAAC,GAAG,CAAC,oDAAoD,CAAC,CAAC;QAElE,MAAM,EAAE,GAAG,uBAAuB,EAAE,CAAC;QACrC,MAAM,KAAK,GAAG,MAAM,WAAW,CAAC,EAAE,EAAE,0DAA0D,CAAC,CAAC;QAChG,EAAE,CAAC,KAAK,EAAE,CAAC;QAEX,IAAI,KAAK,CAAC,WAAW,EAAE,KAAK,GAAG,IAAI,KAAK,CAAC,WAAW,EAAE,KAAK,IAAI,EAAE,CAAC;YAChE,OAAO,CAAC,GAAG,CAAC,6CAA6C,CAAC,CAAC;YAC3D,OAAO,CAAC,GAAG,CAAC,kEAAkE,CAAC,CAAC;YAChF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,MAAM,CAAC,uBAAuB,CAAC,CAAC;QAC9D,MAAM,WAAW,EAAE,CAAC;QAEpB,IAAI,CAAC,YAAY,EAAE,EAAE,CAAC;YACpB,OAAO,CAAC,GAAG,CAAC,yFAAyF,CAAC,CAAC;YACvG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,gEAAgE,CAAC,CAAC;QAC9E,OAAO,IAAI,CAAC;IACd,CAAC;IAGD,MAAM,MAAM,GAAwB,UAAU,EAAE,CAAC;IACjD,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QAC/C,OAAO,CAAC,GAAG,CAAC,+EAA+E,CAAC,CAAC;QAC7F,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAKD,MAAM,UAAU,aAAa,CAAoC,EAAK;IACpE,OAAO,CAAC,KAAK,WAAU,GAAG,IAAmB;QAC3C,MAAM,YAAY,EAAE,CAAC;QACrB,OAAO,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC;IACrB,CAAC,CAAM,CAAC;AACV,CAAC;AAED,OAAO,EAAE,YAAY,EAAE,CAAC"}
@@ -0,0 +1,10 @@
1
+ import type { CanvasConfig, InstanceConfig } from '../types/index.js';
2
+ export declare function getDefaultConfig(): CanvasConfig;
3
+ export declare function loadConfig(): InstanceConfig;
4
+ export declare function saveConfig(domain: string, token: string): boolean;
5
+ export declare function configExists(): boolean;
6
+ export declare function getConfigPath(): string;
7
+ export declare function deleteConfig(): boolean;
8
+ export declare function readConfig(): CanvasConfig | null;
9
+ export declare function getInstanceConfig(): InstanceConfig;
10
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../lib/config.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAMtE,wBAAgB,gBAAgB,IAAI,YAAY,CAO/C;AAGD,wBAAgB,UAAU,IAAI,cAAc,CAoB3C;AAGD,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAejE;AAGD,wBAAgB,YAAY,IAAI,OAAO,CAEtC;AAGD,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAGD,wBAAgB,YAAY,IAAI,OAAO,CAYtC;AAGD,wBAAgB,UAAU,IAAI,YAAY,GAAG,IAAI,CAWhD;AAKD,wBAAgB,iBAAiB,IAAI,cAAc,CAElD"}
@@ -0,0 +1,85 @@
1
+ import fs from 'fs';
2
+ import path from 'path';
3
+ import os from 'os';
4
+ const CONFIG_FILE = path.join(os.homedir(), '.canvaslms-cli-config.json');
5
+ export function getDefaultConfig() {
6
+ return {
7
+ domain: '',
8
+ token: '',
9
+ createdAt: new Date().toISOString(),
10
+ lastUpdated: new Date().toISOString()
11
+ };
12
+ }
13
+ export function loadConfig() {
14
+ try {
15
+ if (fs.existsSync(CONFIG_FILE)) {
16
+ const configData = JSON.parse(fs.readFileSync(CONFIG_FILE, 'utf8'));
17
+ if (configData.domain && configData.token) {
18
+ const domain = configData.domain.replace(/^https?:\/\//, '').replace(/\/$/, '');
19
+ return { domain, token: configData.token };
20
+ }
21
+ }
22
+ console.error('No Canvas configuration found!');
23
+ console.error('\nPlease run "canvas config setup" to configure your Canvas credentials.');
24
+ process.exit(1);
25
+ }
26
+ catch (error) {
27
+ const errorMessage = error instanceof Error ? error.message : String(error);
28
+ console.error(`Error loading configuration: ${errorMessage}`);
29
+ process.exit(1);
30
+ }
31
+ }
32
+ export function saveConfig(domain, token) {
33
+ try {
34
+ const config = {
35
+ domain: domain.replace(/^https?:\/\//, '').replace(/\/$/, ''),
36
+ token,
37
+ createdAt: new Date().toISOString(),
38
+ lastUpdated: new Date().toISOString()
39
+ };
40
+ fs.writeFileSync(CONFIG_FILE, JSON.stringify(config, null, 2), 'utf8');
41
+ return true;
42
+ }
43
+ catch (error) {
44
+ const errorMessage = error instanceof Error ? error.message : String(error);
45
+ console.error(`Error saving configuration: ${errorMessage}`);
46
+ return false;
47
+ }
48
+ }
49
+ export function configExists() {
50
+ return fs.existsSync(CONFIG_FILE);
51
+ }
52
+ export function getConfigPath() {
53
+ return CONFIG_FILE;
54
+ }
55
+ export function deleteConfig() {
56
+ try {
57
+ if (fs.existsSync(CONFIG_FILE)) {
58
+ fs.unlinkSync(CONFIG_FILE);
59
+ return true;
60
+ }
61
+ return false;
62
+ }
63
+ catch (error) {
64
+ const errorMessage = error instanceof Error ? error.message : String(error);
65
+ console.error(`Error deleting configuration: ${errorMessage}`);
66
+ return false;
67
+ }
68
+ }
69
+ export function readConfig() {
70
+ try {
71
+ if (fs.existsSync(CONFIG_FILE)) {
72
+ return JSON.parse(fs.readFileSync(CONFIG_FILE, 'utf8'));
73
+ }
74
+ return null;
75
+ }
76
+ catch (error) {
77
+ const errorMessage = error instanceof Error ? error.message : String(error);
78
+ console.error(`Error reading configuration: ${errorMessage}`);
79
+ return null;
80
+ }
81
+ }
82
+ export function getInstanceConfig() {
83
+ return loadConfig();
84
+ }
85
+ //# sourceMappingURL=config.js.map