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
package/CHANGELOG.md CHANGED
@@ -7,6 +7,24 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [1.2.0] - 2025-07-05
9
9
 
10
+ ## [1.4.7] - 2025-11-05
11
+
12
+ ### Added
13
+
14
+ - Show allowed file extensions hint in the interactive file browser when an assignment restricts uploads (e.g. "Allowed: .pdf, .docx").
15
+ - Add `r` keybinding to the file browser to reload the current directory listing without exiting the browser.
16
+
17
+ ### Fixed
18
+
19
+ - Prevent the interactive file browser from permanently removing other stdin listeners: save and restore `process.stdin` 'data' listeners so `readline` and SIGINT (Ctrl+C) continue to work after browser exit.
20
+ - Filter file browser listings by `allowed_extensions` when provided by the assignment so disallowed file types cannot be selected (prevents HTTP 400 "filetype not allowed").
21
+ - Allow pressing Enter at the final "Proceed with submission? (Y/n)" prompt to accept the default (Yes) to match the shown prompt.
22
+
23
+ ### Notes
24
+
25
+ - Bumped package version to 1.4.7.
26
+
27
+
10
28
  ### Added
11
29
 
12
30
  - **Enhanced File Selection UX**: Implemented continuous file selection until empty input
package/README.md CHANGED
@@ -2,8 +2,6 @@
2
2
 
3
3
  A modern, user-friendly command-line interface for Canvas LMS. Manage courses, assignments, submissions, grades, and more directly from your terminal.
4
4
 
5
- ---
6
-
7
5
  ## Features
8
6
 
9
7
  - List and filter enrolled/starred courses
@@ -13,24 +11,14 @@ A modern, user-friendly command-line interface for Canvas LMS. Manage courses, a
13
11
  - Display user profile information
14
12
  - Direct access to Canvas API endpoints
15
13
 
16
- ---
17
-
18
14
  ## Installation
19
15
 
20
16
  ### Global (Recommended)
21
17
 
22
18
  ```bash
23
- npm install -g canvas-cli-tool
19
+ npm install -g canvaslms-cli
24
20
  ```
25
21
 
26
- ### Local (Project)
27
-
28
- ```bash
29
- npm install canvas-cli-tool
30
- ```
31
-
32
- ---
33
-
34
22
  ## Setup
35
23
 
36
24
  1. **Get your Canvas API Token**
@@ -54,8 +42,6 @@ npm install canvas-cli-tool
54
42
  CANVAS_API_TOKEN=your-api-token
55
43
  ```
56
44
 
57
- ---
58
-
59
45
  ## Usage
60
46
 
61
47
  ### Common Commands
@@ -65,7 +51,8 @@ canvas config # Configure domain and API token
65
51
  canvas list # List starred courses
66
52
  canvas list -a # List all enrolled courses
67
53
  canvas assignments <course> # List assignments for a course
68
- canvas grades # Show grades for all courses
54
+ canvas grades # Interactive course selection + detailed grades
55
+ canvas grades <course-id> # Show detailed grades for specific course
69
56
  canvas announcements # Show recent announcements
70
57
  canvas profile # Show user profile
71
58
  canvas submit # Interactive assignment submission
@@ -80,6 +67,35 @@ canvas submit -a <assignmentId> # Specify assignment
80
67
  canvas submit -f <file> # Submit specific file
81
68
  ```
82
69
 
70
+ ### Viewing Grades
71
+
72
+ The grades command provides an enhanced, interactive experience:
73
+
74
+ ```bash
75
+ canvas grades # Interactive course selection (active courses)
76
+ canvas grades --all # Include inactive/completed courses
77
+ canvas grades <course-id> # Direct course grade view
78
+ canvas grades --verbose # Include enrollment details
79
+ canvas grades -a -v # All courses with verbose details
80
+ ```
81
+
82
+ **Features:**
83
+ - 📊 Interactive course selection with grade summary table
84
+ - 📝 Detailed assignment breakdown with scores
85
+ - ✓ Color-coded status indicators (graded, pending, not done)
86
+ - 📈 Calculated totals based on graded assignments
87
+ - 📋 Table-formatted overall grades
88
+ - 🔍 Option to view all courses including inactive ones
89
+ - 🎯 Visual progress tracking with emojis
90
+
91
+ **What you'll see:**
92
+ 1. List of all courses with current/final scores
93
+ 2. Select a course to view detailed breakdown
94
+ 3. Overall grades (Canvas official + calculated average)
95
+ 4. Complete assignment list with individual scores
96
+ 5. Points earned vs points possible
97
+ 6. Assignment submission status
98
+
83
99
  ## Command Reference
84
100
 
85
101
  | Command | Alias | Description |
@@ -92,16 +108,12 @@ canvas submit -f <file> # Submit specific file
92
108
  | `profile` | `me` | Show user profile |
93
109
  | `config` | - | Show configuration |
94
110
 
95
- ---
96
-
97
111
  ## Requirements
98
112
 
99
113
  - Node.js >= 14.x
100
114
  - npm >= 6.x
101
115
  - Valid Canvas LMS API token
102
116
 
103
- ---
104
-
105
117
  ## Contributing
106
118
 
107
119
  1. Fork the repository
@@ -112,8 +124,6 @@ canvas submit -f <file> # Submit specific file
112
124
  6. Push: `git push origin feature-name`
113
125
  7. Submit a pull request
114
126
 
115
- ---
116
-
117
127
  ## License
118
128
 
119
129
  MIT License - see [LICENSE](LICENSE) for details.
@@ -0,0 +1,3 @@
1
+ import type { ShowAnnouncementsOptions } from '../types/index.js';
2
+ export declare function showAnnouncements(courseId?: string, options?: ShowAnnouncementsOptions): Promise<void>;
3
+ //# sourceMappingURL=announcements.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"announcements.d.ts","sourceRoot":"","sources":["../../commands/announcements.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAoC,wBAAwB,EAAE,MAAM,mBAAmB,CAAC;AAEpG,wBAAsB,iBAAiB,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,OAAO,GAAE,wBAA6B,GAAG,OAAO,CAAC,IAAI,CAAC,CAwGhH"}
@@ -0,0 +1,92 @@
1
+ import { makeCanvasRequest } from '../lib/api-client.js';
2
+ import { createReadlineInterface, askQuestion } from '../lib/interactive.js';
3
+ import chalk from 'chalk';
4
+ export async function showAnnouncements(courseId, options = {}) {
5
+ const rl = createReadlineInterface();
6
+ try {
7
+ let selectedCourseId = courseId;
8
+ if (!selectedCourseId) {
9
+ console.log(chalk.cyan.bold('Loading your courses, please wait...\n'));
10
+ let courses = await makeCanvasRequest('get', 'courses', [
11
+ 'enrollment_state=active',
12
+ 'include[]=favorites'
13
+ ]);
14
+ if (!courses || courses.length === 0) {
15
+ console.log(chalk.red('Error: No courses found.'));
16
+ rl.close();
17
+ return;
18
+ }
19
+ if (courses.length === 0) {
20
+ console.log(chalk.red('Error: No courses found (after filtering).'));
21
+ rl.close();
22
+ return;
23
+ }
24
+ console.log(chalk.cyan.bold('\n' + '-'.repeat(60)));
25
+ console.log(chalk.cyan.bold('Select a course:'));
26
+ courses.forEach((course, index) => {
27
+ console.log(chalk.white(`${index + 1}.`) + ' ' + course.name);
28
+ });
29
+ const courseChoice = await askQuestion(rl, chalk.white('\nEnter course number: '));
30
+ if (!courseChoice.trim()) {
31
+ console.log(chalk.red('No course selected. Exiting...'));
32
+ rl.close();
33
+ return;
34
+ }
35
+ const courseIndex = parseInt(courseChoice) - 1;
36
+ if (courseIndex < 0 || courseIndex >= courses.length) {
37
+ console.log(chalk.red('Invalid course selection.'));
38
+ rl.close();
39
+ return;
40
+ }
41
+ selectedCourseId = String(courses[courseIndex]?.id);
42
+ console.log(chalk.green(`Success: Selected ${courses[courseIndex]?.name}\n`));
43
+ }
44
+ const limit = parseInt(options.limit || '5') || 5;
45
+ const announcements = await makeCanvasRequest('get', `courses/${selectedCourseId}/discussion_topics`, [`only_announcements=true`, `per_page=${limit}`]);
46
+ if (!announcements || announcements.length === 0) {
47
+ console.log(chalk.yellow('No announcements found for this course.'));
48
+ rl.close();
49
+ return;
50
+ }
51
+ console.log(chalk.green('Success: Announcement loaded.'));
52
+ console.log(chalk.cyan.bold('\n' + '-'.repeat(60)));
53
+ console.log(chalk.cyan.bold('Announcements:'));
54
+ announcements.forEach((a, i) => {
55
+ const date = a.posted_at ? new Date(a.posted_at).toLocaleDateString() : '';
56
+ console.log(chalk.white(`${i + 1}.`) + ' ' + a.title + chalk.gray(date ? ` (${date})` : ''));
57
+ });
58
+ const annChoice = await askQuestion(rl, chalk.white('\nEnter announcement number to view details: '));
59
+ if (!annChoice.trim()) {
60
+ console.log(chalk.red('No announcement selected. Exiting...'));
61
+ rl.close();
62
+ return;
63
+ }
64
+ const annIndex = parseInt(annChoice) - 1;
65
+ if (annIndex < 0 || annIndex >= announcements.length) {
66
+ console.log(chalk.red('Invalid announcement selection.'));
67
+ rl.close();
68
+ return;
69
+ }
70
+ const ann = announcements[annIndex];
71
+ const title = ann?.title || 'Untitled';
72
+ const date = ann?.posted_at ? new Date(ann.posted_at).toLocaleString() : 'N/A';
73
+ const author = ann?.author?.display_name || 'Unknown';
74
+ const message = ann?.message?.replace(/<[^>]+>/g, '').trim() || 'No content';
75
+ console.log('\n' + chalk.cyan('='.repeat(60)));
76
+ console.log(chalk.bold(' ' + title));
77
+ console.log(chalk.cyan('-'.repeat(60)));
78
+ console.log(chalk.gray(' Posted: ') + date);
79
+ console.log(chalk.gray(' Author: ') + author);
80
+ console.log('\n' + chalk.bold(' Message:') + '\n');
81
+ console.log(message);
82
+ console.log(chalk.cyan('='.repeat(60)) + '\n');
83
+ }
84
+ catch (error) {
85
+ const errorMessage = error instanceof Error ? error.message : String(error);
86
+ console.error(chalk.red('Error: Failed to fetch announcements: ') + errorMessage);
87
+ }
88
+ finally {
89
+ rl.close();
90
+ }
91
+ }
92
+ //# sourceMappingURL=announcements.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"announcements.js","sourceRoot":"","sources":["../../commands/announcements.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { ApiQueryOptions } from '../types/index.js';
2
+ export declare function createQueryHandler(method: string): (endpoint: string, options: ApiQueryOptions) => Promise<void>;
3
+ //# sourceMappingURL=api.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../commands/api.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAKzD,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,IACzB,UAAU,MAAM,EAAE,SAAS,eAAe,KAAG,OAAO,CAAC,IAAI,CAAC,CAIjF"}
@@ -0,0 +1,8 @@
1
+ import { makeCanvasRequest } from '../lib/api-client.js';
2
+ export function createQueryHandler(method) {
3
+ return async function (endpoint, options) {
4
+ const data = await makeCanvasRequest(method, endpoint, options.query || [], options.body || null);
5
+ console.log(JSON.stringify(data, null, 2));
6
+ };
7
+ }
8
+ //# sourceMappingURL=api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.js","sourceRoot":"","sources":["../../commands/api.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAMzD,MAAM,UAAU,kBAAkB,CAAC,MAAc;IAC/C,OAAO,KAAK,WAAU,QAAgB,EAAE,OAAwB;QAC9D,MAAM,IAAI,GAAG,MAAM,iBAAiB,CAAC,MAAM,EAAE,QAAQ,EAAE,OAAO,CAAC,KAAK,IAAI,EAAE,EAAE,OAAO,CAAC,IAAI,IAAI,IAAI,CAAC,CAAC;QAClG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAC7C,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { ListAssignmentsOptions } from '../types/index.js';
2
+ export declare function listAssignments(courseId: string, options: ListAssignmentsOptions): Promise<void>;
3
+ //# sourceMappingURL=assignments.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assignments.d.ts","sourceRoot":"","sources":["../../commands/assignments.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAkC,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAMhG,wBAAsB,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,sBAAsB,GAAG,OAAO,CAAC,IAAI,CAAC,CAyFtG"}
@@ -0,0 +1,100 @@
1
+ import { makeCanvasRequest } from '../lib/api-client.js';
2
+ import chalk from 'chalk';
3
+ function pad(str, len) {
4
+ return str + ' '.repeat(Math.max(0, len - str.length));
5
+ }
6
+ export async function listAssignments(courseId, options) {
7
+ try {
8
+ const course = await makeCanvasRequest('get', `courses/${courseId}`);
9
+ const queryParams = ['include[]=submission', 'include[]=score_statistics', 'per_page=100'];
10
+ console.log(chalk.cyan.bold('\n' + '-'.repeat(60)));
11
+ console.log(chalk.cyan.bold('Loading assignments, please wait...'));
12
+ const assignments = await makeCanvasRequest('get', `courses/${courseId}/assignments`, queryParams);
13
+ if (!assignments || assignments.length === 0) {
14
+ console.log(chalk.red(`Error: No assignments found for course: ${course.name}`));
15
+ return;
16
+ }
17
+ let filteredAssignments = assignments;
18
+ if (options.submitted) {
19
+ filteredAssignments = assignments.filter(a => a.submission && a.submission.submitted_at);
20
+ }
21
+ else if (options.pending) {
22
+ filteredAssignments = assignments.filter(a => !a.submission || !a.submission.submitted_at);
23
+ }
24
+ console.log(chalk.cyan.bold('\n' + '-'.repeat(60)));
25
+ console.log(chalk.cyan.bold(`Assignments for: ${course.name}`));
26
+ console.log(chalk.cyan('-'.repeat(60)));
27
+ console.log(chalk.green(`Success: Found ${filteredAssignments.length} assignment(s).`));
28
+ console.log(chalk.cyan('-'.repeat(60)));
29
+ console.log(pad(chalk.bold('No.'), 5) +
30
+ pad(chalk.bold('Assignment Name'), 35) +
31
+ pad(chalk.bold('ID'), 10) +
32
+ pad(chalk.bold('Grade'), 12) +
33
+ pad(chalk.bold('Due'), 22) +
34
+ (options.verbose ? pad(chalk.bold('Status'), 12) : ''));
35
+ console.log(chalk.cyan('-'.repeat(60)));
36
+ filteredAssignments.forEach((assignment, index) => {
37
+ const submission = assignment.submission;
38
+ let gradeDisplay = '';
39
+ if (submission && submission.score !== null && submission.score !== undefined) {
40
+ const score = submission.score % 1 === 0 ? Math.round(submission.score) : submission.score;
41
+ const total = assignment.points_possible || 0;
42
+ gradeDisplay = `${score}/${total}`;
43
+ }
44
+ else if (submission && submission.excused) {
45
+ gradeDisplay = 'Excused';
46
+ }
47
+ else if (submission && submission.missing) {
48
+ gradeDisplay = 'Missing';
49
+ }
50
+ else if (assignment.points_possible) {
51
+ gradeDisplay = `–/${assignment.points_possible}`;
52
+ }
53
+ else {
54
+ gradeDisplay = 'N/A';
55
+ }
56
+ let line = pad(chalk.white((index + 1) + '.'), 5) +
57
+ pad(assignment.name, 35) +
58
+ pad(String(assignment.id), 10) +
59
+ pad(gradeDisplay, 12) +
60
+ pad(assignment.due_at ? new Date(assignment.due_at).toLocaleString() : 'No due date', 22);
61
+ if (options.verbose) {
62
+ let status = 'Not submitted';
63
+ if (submission && submission.submitted_at) {
64
+ status = 'Submitted';
65
+ }
66
+ line += pad(status, 12);
67
+ }
68
+ console.log(line);
69
+ if (options.verbose) {
70
+ if (assignment.description) {
71
+ const cleanDescription = assignment.description
72
+ .replace(/<[^>]*>/g, '')
73
+ .replace(/\s+/g, ' ')
74
+ .trim()
75
+ .substring(0, 150);
76
+ console.log(' ' + chalk.gray('Description: ') + cleanDescription + (cleanDescription.length === 150 ? '...' : ''));
77
+ }
78
+ else {
79
+ console.log(' ' + chalk.gray('Description: N/A'));
80
+ }
81
+ console.log(' ' + chalk.gray('Submission Types: ') + (assignment.submission_types?.join(', ') || 'N/A'));
82
+ console.log(' ' + chalk.gray('Published: ') + (assignment.has_submitted_submissions ? 'Yes' : 'No'));
83
+ if (assignment.points_possible) {
84
+ console.log(' ' + chalk.gray('Points Possible: ') + assignment.points_possible);
85
+ }
86
+ if (submission && submission.attempt) {
87
+ console.log(' ' + chalk.gray('Attempt: ') + submission.attempt);
88
+ }
89
+ }
90
+ console.log('');
91
+ });
92
+ console.log(chalk.cyan('-'.repeat(60)));
93
+ }
94
+ catch (error) {
95
+ const errorMessage = error instanceof Error ? error.message : String(error);
96
+ console.error(chalk.red('Error fetching assignments:'), errorMessage);
97
+ process.exit(1);
98
+ }
99
+ }
100
+ //# sourceMappingURL=assignments.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assignments.js","sourceRoot":"","sources":["../../commands/assignments.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export declare function showConfig(): Promise<void>;
2
+ export declare function setupConfig(): Promise<void>;
3
+ export declare function editConfig(): Promise<void>;
4
+ export declare function showConfigPath(): void;
5
+ export declare function deleteConfigFile(): void;
6
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../commands/config.ts"],"names":[],"mappings":"AASA,wBAAsB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CA+ChD;AAED,wBAAsB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CAgFjD;AAED,wBAAsB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAwDhD;AAED,wBAAgB,cAAc,IAAI,IAAI,CAGrC;AAED,wBAAgB,gBAAgB,IAAI,IAAI,CAkCvC"}
@@ -0,0 +1,202 @@
1
+ import { configExists, readConfig, saveConfig, deleteConfig, getConfigPath } from '../lib/config.js';
2
+ import { createReadlineInterface, askQuestion } from '../lib/interactive.js';
3
+ import chalk from 'chalk';
4
+ import readline from 'readline';
5
+ export async function showConfig() {
6
+ console.log(chalk.cyan.bold('\n' + '-'.repeat(60)));
7
+ console.log(chalk.cyan.bold('Canvas CLI Configuration'));
8
+ console.log(chalk.cyan('-'.repeat(60)));
9
+ const configPath = getConfigPath();
10
+ const hasConfig = configExists();
11
+ console.log(chalk.white('Configuration file: ') + configPath);
12
+ console.log(chalk.white('Status: ') + (hasConfig ? chalk.green('Found') : chalk.red('Not found')) + '\n');
13
+ if (hasConfig) {
14
+ const config = readConfig();
15
+ if (config) {
16
+ console.log(chalk.cyan('Current configuration:'));
17
+ console.log(chalk.white(' Canvas Domain: ') + (config.domain || 'Not set'));
18
+ console.log(chalk.white(' API Token: ') + (config.token ? config.token.substring(0, 10) + '...' : 'Not set'));
19
+ console.log(chalk.white(' Created: ') + (config.createdAt ? new Date(config.createdAt).toLocaleString() : 'Unknown'));
20
+ console.log(chalk.white(' Last Updated: ') + (config.lastUpdated ? new Date(config.lastUpdated).toLocaleString() : 'Unknown'));
21
+ }
22
+ }
23
+ else {
24
+ console.log(chalk.yellow('No configuration found.'));
25
+ }
26
+ console.log(chalk.cyan('\nAvailable commands:'));
27
+ console.log(chalk.white(' canvas config setup # Interactive setup wizard'));
28
+ console.log(chalk.white(' canvas config edit # Edit existing configuration'));
29
+ console.log(chalk.white(' canvas config show # Show current configuration'));
30
+ console.log(chalk.white(' canvas config delete # Delete configuration file'));
31
+ console.log(chalk.white(' canvas config path # Show configuration file path'));
32
+ console.log(chalk.cyan('\nManual setup:'));
33
+ console.log(chalk.white('1. Get your Canvas API token:'));
34
+ console.log(chalk.white(' - Log into your Canvas instance'));
35
+ console.log(chalk.white(' - Go to Account → Settings'));
36
+ console.log(chalk.white(' - Scroll down to "Approved Integrations"'));
37
+ console.log(chalk.white(' - Click "+ New Access Token"'));
38
+ console.log(chalk.white(' - Copy the generated token'));
39
+ console.log(chalk.white('2. Run "canvas config setup" to configure'));
40
+ console.log(chalk.cyan('\nExample usage after setup:'));
41
+ console.log(chalk.white(' canvas list # List starred courses'));
42
+ console.log(chalk.white(' canvas list -a # List all enrolled courses'));
43
+ console.log(chalk.white(' canvas submit # Interactive assignment submission'));
44
+ console.log(chalk.white(' canvas profile # Show user profile'));
45
+ console.log(chalk.white(' canvas assignments 12345 # Show assignments for course'));
46
+ console.log(chalk.white(' canvas grades # Show grades for all courses'));
47
+ }
48
+ export async function setupConfig() {
49
+ const rl = createReadlineInterface();
50
+ try {
51
+ console.log(chalk.cyan.bold('\n' + '-'.repeat(60)));
52
+ console.log(chalk.cyan.bold('Canvas CLI Configuration Setup'));
53
+ console.log(chalk.cyan('-'.repeat(60)));
54
+ if (configExists()) {
55
+ const config = readConfig();
56
+ console.log(chalk.yellow('Existing configuration found:'));
57
+ console.log(chalk.white(' Domain: ') + (config?.domain || 'Not set'));
58
+ console.log(chalk.white(' Token: ') + (config?.token ? 'Set (hidden)' : 'Not set') + '\n');
59
+ const overwrite = await askQuestion(rl, 'Do you want to overwrite the existing configuration? (y/N): ');
60
+ if (overwrite.toLowerCase() !== 'y' && overwrite.toLowerCase() !== 'yes') {
61
+ console.log(chalk.yellow('Setup cancelled.'));
62
+ return;
63
+ }
64
+ console.log('');
65
+ }
66
+ const currentConfig = readConfig();
67
+ let domain = await askQuestion(rl, `Enter your Canvas domain${currentConfig?.domain ? ` (${currentConfig.domain})` : ''}: `);
68
+ if (!domain && currentConfig?.domain) {
69
+ domain = currentConfig.domain;
70
+ }
71
+ if (!domain) {
72
+ console.log(chalk.red('Canvas domain is required.'));
73
+ return;
74
+ }
75
+ domain = domain.replace(/^https?:\/\//, '').replace(/\/$/, '');
76
+ if (!domain.includes('.')) {
77
+ console.log(chalk.red('Invalid domain format. Please enter a valid domain (e.g., school.instructure.com)'));
78
+ return;
79
+ }
80
+ console.log(chalk.green(`Domain set to: ${domain}\n`));
81
+ const defaultToken = currentConfig?.token || '';
82
+ let token = await askQuestion(rl, `Enter your Canvas API token${defaultToken ? ' (press Enter to keep current)' : ''}: `);
83
+ if (!token && defaultToken) {
84
+ token = defaultToken;
85
+ }
86
+ if (!token) {
87
+ console.log(chalk.red('Canvas API token is required.'));
88
+ console.log(chalk.cyan('\nTo get your API token:'));
89
+ console.log(chalk.white('1. Log into your Canvas instance'));
90
+ console.log(chalk.white('2. Go to Account → Settings'));
91
+ console.log(chalk.white('3. Scroll down to "Approved Integrations"'));
92
+ console.log(chalk.white('4. Click "+ New Access Token"'));
93
+ console.log(chalk.white('5. Copy the generated token'));
94
+ return;
95
+ }
96
+ if (token.length < 10) {
97
+ console.log(chalk.red('API token seems too short. Please check your token.'));
98
+ return;
99
+ }
100
+ console.log('Token received\n');
101
+ const saved = saveConfig(domain, token);
102
+ if (saved) {
103
+ console.log(chalk.green('Success: Configuration setup completed successfully!'));
104
+ console.log(chalk.cyan('\nNext steps:'));
105
+ console.log(chalk.white(' canvas list # Test your setup by listing courses'));
106
+ console.log(chalk.white(' canvas profile # View your profile'));
107
+ console.log(chalk.white(' canvas config show # View your configuration'));
108
+ }
109
+ }
110
+ catch (error) {
111
+ const errorMessage = error instanceof Error ? error.message : String(error);
112
+ console.error(chalk.red('Error: Setup failed: ') + errorMessage);
113
+ }
114
+ finally {
115
+ rl.close();
116
+ }
117
+ }
118
+ export async function editConfig() {
119
+ const rl = createReadlineInterface();
120
+ try {
121
+ if (!configExists()) {
122
+ console.log('No configuration file found. Run "canvas config setup" first.');
123
+ return;
124
+ }
125
+ const config = readConfig();
126
+ if (!config) {
127
+ console.log(chalk.red('Error reading configuration.'));
128
+ return;
129
+ }
130
+ console.log(chalk.cyan.bold('\n' + '-'.repeat(60)));
131
+ console.log(chalk.cyan.bold('Edit Canvas CLI Configuration'));
132
+ console.log(chalk.cyan('-'.repeat(60)));
133
+ console.log(chalk.cyan('Current values:'));
134
+ console.log(chalk.white(' Domain: ') + config.domain);
135
+ console.log(chalk.white(' Token: ') + (config.token ? config.token.substring(0, 10) + '...' : 'Not set') + '\n');
136
+ const newDomain = await askQuestion(rl, `New Canvas domain (${config.domain}): `);
137
+ const domain = newDomain.trim() || config.domain;
138
+ const changeToken = await askQuestion(rl, 'Change API token? (y/N): ');
139
+ let token = config.token;
140
+ if (changeToken.toLowerCase() === 'y' || changeToken.toLowerCase() === 'yes') {
141
+ const newToken = await askQuestion(rl, 'New API token: ');
142
+ if (newToken.trim()) {
143
+ token = newToken.trim();
144
+ }
145
+ }
146
+ console.log(chalk.cyan('New configuration:'));
147
+ console.log(chalk.white(' Domain: ') + domain);
148
+ console.log(chalk.white(' Token: ') + (token ? token.substring(0, 10) + '...' : 'Not set'));
149
+ const confirm = await askQuestion(rl, '\nSave changes? (Y/n): ');
150
+ if (confirm.toLowerCase() === 'n' || confirm.toLowerCase() === 'no') {
151
+ console.log(chalk.yellow('Changes cancelled.'));
152
+ return;
153
+ }
154
+ const saved = saveConfig(domain, token);
155
+ if (saved) {
156
+ console.log(chalk.green('Success: Configuration updated successfully!'));
157
+ }
158
+ }
159
+ catch (error) {
160
+ const errorMessage = error instanceof Error ? error.message : String(error);
161
+ console.error(chalk.red('Error: Edit failed: ') + errorMessage);
162
+ }
163
+ finally {
164
+ rl.close();
165
+ }
166
+ }
167
+ export function showConfigPath() {
168
+ console.log(chalk.cyan('Configuration file location: ') + getConfigPath());
169
+ console.log(chalk.white('Exists: ') + (configExists() ? chalk.green('Yes') : chalk.red('No')));
170
+ }
171
+ export function deleteConfigFile() {
172
+ console.log(chalk.cyan.bold('\n' + '-'.repeat(60)));
173
+ console.log(chalk.cyan.bold('Delete Configuration'));
174
+ console.log(chalk.cyan('-'.repeat(60)));
175
+ if (!configExists()) {
176
+ console.log(chalk.yellow('No configuration file found.'));
177
+ return;
178
+ }
179
+ const config = readConfig();
180
+ console.log(chalk.cyan('Current configuration:'));
181
+ console.log(chalk.white(' Domain: ') + (config?.domain || 'N/A'));
182
+ console.log(chalk.white(' Token: ') + (config?.token ? 'Set (hidden)' : 'Not set'));
183
+ console.log(chalk.white(' File: ') + getConfigPath() + '\n');
184
+ console.log(chalk.red('This will permanently delete your Canvas CLI configuration.'));
185
+ console.log(chalk.yellow('You will need to run "canvas config setup" again to use the CLI.'));
186
+ console.log(chalk.cyan('\nTo confirm deletion, type: DELETE'));
187
+ const rl = readline.createInterface({
188
+ input: process.stdin,
189
+ output: process.stdout
190
+ });
191
+ rl.question('Confirmation: ', (answer) => {
192
+ if (answer === 'DELETE') {
193
+ deleteConfig();
194
+ console.log(chalk.green('Success: Configuration deleted.'));
195
+ }
196
+ else {
197
+ console.log(chalk.yellow('Deletion cancelled.'));
198
+ }
199
+ rl.close();
200
+ });
201
+ }
202
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../commands/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { ShowGradesOptions } from '../types/index.js';
2
+ export declare function showGrades(courseId?: string, options?: ShowGradesOptions): Promise<void>;
3
+ //# sourceMappingURL=grades.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"grades.d.ts","sourceRoot":"","sources":["../../commands/grades.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAoD,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAuS7G,wBAAsB,UAAU,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,OAAO,GAAE,iBAAsB,GAAG,OAAO,CAAC,IAAI,CAAC,CAqNlG"}