canvaslms-cli 1.6.2 → 1.6.4
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 +221 -195
- package/README.md +131 -129
- package/dist/commands/announcements.d.ts +2 -2
- package/dist/commands/announcements.d.ts.map +1 -1
- package/dist/commands/announcements.js +29 -20
- package/dist/commands/announcements.js.map +1 -1
- package/dist/commands/api.d.ts +1 -1
- package/dist/commands/api.d.ts.map +1 -1
- package/dist/commands/api.js +1 -1
- package/dist/commands/api.js.map +1 -1
- package/dist/commands/assignments.d.ts +2 -2
- package/dist/commands/assignments.d.ts.map +1 -1
- package/dist/commands/assignments.js +24 -19
- package/dist/commands/assignments.js.map +1 -1
- package/dist/commands/config.d.ts.map +1 -1
- package/dist/commands/config.js +102 -85
- package/dist/commands/config.js.map +1 -1
- package/dist/commands/grades.d.ts +2 -2
- package/dist/commands/grades.d.ts.map +1 -1
- package/dist/commands/grades.js +183 -228
- package/dist/commands/grades.js.map +1 -1
- package/dist/commands/list.d.ts +1 -1
- package/dist/commands/list.d.ts.map +1 -1
- package/dist/commands/list.js +22 -20
- package/dist/commands/list.js.map +1 -1
- package/dist/commands/profile.d.ts.map +1 -1
- package/dist/commands/profile.js +57 -32
- package/dist/commands/profile.js.map +1 -1
- package/dist/commands/submit.d.ts +1 -2
- package/dist/commands/submit.d.ts.map +1 -1
- package/dist/commands/submit.js +88 -79
- package/dist/commands/submit.js.map +1 -1
- package/dist/index.d.ts +14 -14
- package/dist/index.js +14 -14
- package/dist/lib/api-client.d.ts +3 -0
- package/dist/lib/api-client.d.ts.map +1 -1
- package/dist/lib/api-client.js +31 -16
- package/dist/lib/api-client.js.map +1 -1
- package/dist/lib/config-validator.d.ts.map +1 -1
- package/dist/lib/config-validator.js +12 -12
- package/dist/lib/config-validator.js.map +1 -1
- package/dist/lib/config.d.ts +1 -1
- package/dist/lib/config.d.ts.map +1 -1
- package/dist/lib/config.js +16 -14
- package/dist/lib/config.js.map +1 -1
- package/dist/lib/display.d.ts +11 -5
- package/dist/lib/display.d.ts.map +1 -1
- package/dist/lib/display.js +261 -169
- package/dist/lib/display.js.map +1 -1
- package/dist/lib/file-upload.d.ts.map +1 -1
- package/dist/lib/file-upload.js +17 -17
- package/dist/lib/file-upload.js.map +1 -1
- package/dist/lib/interactive.d.ts +1 -1
- package/dist/lib/interactive.d.ts.map +1 -1
- package/dist/lib/interactive.js +194 -144
- package/dist/lib/interactive.js.map +1 -1
- package/dist/src/index.d.ts +0 -1
- package/dist/src/index.js +62 -63
- package/dist/src/index.js.map +1 -1
- package/dist/types/index.d.ts +1 -1
- package/package.json +10 -3
- package/dist/commands/coursenames.d.ts +0 -15
- package/dist/commands/coursenames.d.ts.map +0 -1
- package/dist/commands/coursenames.js +0 -150
- package/dist/commands/coursenames.js.map +0 -1
- package/dist/lib/course-utils.d.ts +0 -6
- package/dist/lib/course-utils.d.ts.map +0 -1
- package/dist/lib/course-utils.js +0 -17
- package/dist/lib/course-utils.js.map +0 -1
package/README.md
CHANGED
|
@@ -1,129 +1,131 @@
|
|
|
1
|
-
# Canvas CLI Tool
|
|
2
|
-
|
|
3
|
-
A modern, user-friendly command-line interface for Canvas LMS. Manage courses, assignments, submissions, grades, and more directly from your terminal.
|
|
4
|
-
|
|
5
|
-
## Features
|
|
6
|
-
|
|
7
|
-
- List and filter enrolled/starred courses
|
|
8
|
-
- View assignments, grades, and submission status
|
|
9
|
-
- Interactive file upload for assignments
|
|
10
|
-
- View course announcements
|
|
11
|
-
- Display user profile information
|
|
12
|
-
- Direct access to Canvas API endpoints
|
|
13
|
-
|
|
14
|
-
## Installation
|
|
15
|
-
|
|
16
|
-
### Global (Recommended)
|
|
17
|
-
|
|
18
|
-
```bash
|
|
19
|
-
npm install -g canvaslms-cli
|
|
20
|
-
```
|
|
21
|
-
|
|
22
|
-
## Setup
|
|
23
|
-
|
|
24
|
-
1. **Get your Canvas API Token**
|
|
25
|
-
- Log in to Canvas
|
|
26
|
-
- Go to Account → Settings
|
|
27
|
-
- Under Approved Integrations, click + New Access Token
|
|
28
|
-
- Copy the generated token
|
|
29
|
-
|
|
30
|
-
2. **Configure the CLI**
|
|
31
|
-
|
|
32
|
-
```bash
|
|
33
|
-
canvas config
|
|
34
|
-
```
|
|
35
|
-
|
|
36
|
-
3. **Environment Variables**
|
|
37
|
-
|
|
38
|
-
Create a `.env` file in your project root:
|
|
39
|
-
|
|
40
|
-
```env
|
|
41
|
-
CANVAS_DOMAIN=your-canvas-domain.instructure.com
|
|
42
|
-
CANVAS_API_TOKEN=your-api-token
|
|
43
|
-
```
|
|
44
|
-
|
|
45
|
-
## Usage
|
|
46
|
-
|
|
47
|
-
### Common Commands
|
|
48
|
-
|
|
49
|
-
```bash
|
|
50
|
-
canvas config # Configure domain and API token
|
|
51
|
-
canvas list # List starred courses
|
|
52
|
-
canvas list -a # List all enrolled courses
|
|
53
|
-
canvas assignments <course> # List assignments for a course
|
|
54
|
-
canvas grades # Interactive course selection + detailed grades
|
|
55
|
-
canvas grades <course-id> # Show detailed grades for specific course
|
|
56
|
-
canvas announcements # Show recent announcements
|
|
57
|
-
canvas profile # Show user profile
|
|
58
|
-
canvas submit # Interactive assignment submission
|
|
59
|
-
```
|
|
60
|
-
|
|
61
|
-
### Assignment Submission
|
|
62
|
-
|
|
63
|
-
```bash
|
|
64
|
-
canvas submit # Interactive mode
|
|
65
|
-
canvas submit -c <courseId> # Specify course
|
|
66
|
-
canvas submit -a <assignmentId> # Specify assignment
|
|
67
|
-
canvas submit -f <file> # Submit specific file
|
|
68
|
-
```
|
|
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
|
-
|
|
84
|
-
-
|
|
85
|
-
-
|
|
86
|
-
-
|
|
87
|
-
-
|
|
88
|
-
-
|
|
89
|
-
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
|
104
|
-
|
|
|
105
|
-
| `
|
|
106
|
-
| `
|
|
107
|
-
| `
|
|
108
|
-
| `
|
|
109
|
-
| `
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
1
|
+
# Canvas CLI Tool
|
|
2
|
+
|
|
3
|
+
A modern, user-friendly command-line interface for Canvas LMS. Manage courses, assignments, submissions, grades, and more directly from your terminal.
|
|
4
|
+
|
|
5
|
+
## Features
|
|
6
|
+
|
|
7
|
+
- List and filter enrolled/starred courses
|
|
8
|
+
- View assignments, grades, and submission status
|
|
9
|
+
- Interactive file upload for assignments
|
|
10
|
+
- View course announcements
|
|
11
|
+
- Display user profile information
|
|
12
|
+
- Direct access to Canvas API endpoints
|
|
13
|
+
|
|
14
|
+
## Installation
|
|
15
|
+
|
|
16
|
+
### Global (Recommended)
|
|
17
|
+
|
|
18
|
+
```bash
|
|
19
|
+
npm install -g canvaslms-cli
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
## Setup
|
|
23
|
+
|
|
24
|
+
1. **Get your Canvas API Token**
|
|
25
|
+
- Log in to Canvas
|
|
26
|
+
- Go to Account → Settings
|
|
27
|
+
- Under Approved Integrations, click + New Access Token
|
|
28
|
+
- Copy the generated token
|
|
29
|
+
|
|
30
|
+
2. **Configure the CLI**
|
|
31
|
+
|
|
32
|
+
```bash
|
|
33
|
+
canvas config
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
3. **Environment Variables**
|
|
37
|
+
|
|
38
|
+
Create a `.env` file in your project root:
|
|
39
|
+
|
|
40
|
+
```env
|
|
41
|
+
CANVAS_DOMAIN=your-canvas-domain.instructure.com
|
|
42
|
+
CANVAS_API_TOKEN=your-api-token
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
## Usage
|
|
46
|
+
|
|
47
|
+
### Common Commands
|
|
48
|
+
|
|
49
|
+
```bash
|
|
50
|
+
canvas config # Configure domain and API token
|
|
51
|
+
canvas list # List starred courses
|
|
52
|
+
canvas list -a # List all enrolled courses
|
|
53
|
+
canvas assignments <course> # List assignments for a course
|
|
54
|
+
canvas grades # Interactive course selection + detailed grades
|
|
55
|
+
canvas grades <course-id> # Show detailed grades for specific course
|
|
56
|
+
canvas announcements # Show recent announcements
|
|
57
|
+
canvas profile # Show user profile
|
|
58
|
+
canvas submit # Interactive assignment submission
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
### Assignment Submission
|
|
62
|
+
|
|
63
|
+
```bash
|
|
64
|
+
canvas submit # Interactive mode
|
|
65
|
+
canvas submit -c <courseId> # Specify course
|
|
66
|
+
canvas submit -a <assignmentId> # Specify assignment
|
|
67
|
+
canvas submit -f <file> # Submit specific file
|
|
68
|
+
```
|
|
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
|
+
|
|
84
|
+
- 📊 Interactive course selection with grade summary table
|
|
85
|
+
- 📝 Detailed assignment breakdown with scores
|
|
86
|
+
- ✓ Color-coded status indicators (graded, pending, not done)
|
|
87
|
+
- 📈 Calculated totals based on graded assignments
|
|
88
|
+
- 📋 Table-formatted overall grades
|
|
89
|
+
- 🔍 Option to view all courses including inactive ones
|
|
90
|
+
- 🎯 Visual progress tracking with emojis
|
|
91
|
+
|
|
92
|
+
**What you'll see:**
|
|
93
|
+
|
|
94
|
+
1. List of all courses with current/final scores
|
|
95
|
+
2. Select a course to view detailed breakdown
|
|
96
|
+
3. Overall grades (Canvas official + calculated average)
|
|
97
|
+
4. Complete assignment list with individual scores
|
|
98
|
+
5. Points earned vs points possible
|
|
99
|
+
6. Assignment submission status
|
|
100
|
+
|
|
101
|
+
## Command Reference
|
|
102
|
+
|
|
103
|
+
| Command | Alias | Description |
|
|
104
|
+
| --------------- | ---------- | ----------------------- |
|
|
105
|
+
| `list` | `l` | List courses |
|
|
106
|
+
| `assignments` | `assign` | List assignments |
|
|
107
|
+
| `submit` | `sub` | Submit assignment files |
|
|
108
|
+
| `grades` | `grade` | Show grades |
|
|
109
|
+
| `announcements` | `announce` | Show announcements |
|
|
110
|
+
| `profile` | `me` | Show user profile |
|
|
111
|
+
| `config` | - | Show configuration |
|
|
112
|
+
|
|
113
|
+
## Requirements
|
|
114
|
+
|
|
115
|
+
- Node.js >= 14.x
|
|
116
|
+
- npm >= 6.x
|
|
117
|
+
- Valid Canvas LMS API token
|
|
118
|
+
|
|
119
|
+
## Contributing
|
|
120
|
+
|
|
121
|
+
1. Fork the repository
|
|
122
|
+
2. Create a feature branch: `git checkout -b feature-name`
|
|
123
|
+
3. Make your changes
|
|
124
|
+
4. Run tests: `npm test`
|
|
125
|
+
5. Commit: `git commit -am 'Add feature'`
|
|
126
|
+
6. Push: `git push origin feature-name`
|
|
127
|
+
7. Submit a pull request
|
|
128
|
+
|
|
129
|
+
## License
|
|
130
|
+
|
|
131
|
+
MIT License - see [LICENSE](LICENSE) for details.
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import type { ShowAnnouncementsOptions } from
|
|
2
|
-
export declare function showAnnouncements(
|
|
1
|
+
import type { ShowAnnouncementsOptions } from "../types/index.js";
|
|
2
|
+
export declare function showAnnouncements(courseName?: string, options?: ShowAnnouncementsOptions): Promise<void>;
|
|
3
3
|
//# sourceMappingURL=announcements.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"announcements.d.ts","sourceRoot":"","sources":["../../commands/announcements.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"announcements.d.ts","sourceRoot":"","sources":["../../commands/announcements.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAEV,wBAAwB,EACzB,MAAM,mBAAmB,CAAC;AAE3B,wBAAsB,iBAAiB,CACrC,UAAU,CAAC,EAAE,MAAM,EACnB,OAAO,GAAE,wBAA6B,GACrC,OAAO,CAAC,IAAI,CAAC,CAiFf"}
|
|
@@ -1,55 +1,64 @@
|
|
|
1
|
-
import { makeCanvasRequest } from
|
|
2
|
-
import { createReadlineInterface, askQuestion } from
|
|
3
|
-
import { pickCourse, displayAnnouncements, displayAnnouncementDetail, printInfo, printError, printSuccess, printWarning } from
|
|
4
|
-
import chalk from
|
|
5
|
-
export async function showAnnouncements(
|
|
1
|
+
import { makeCanvasRequest, getCanvasCourse } from "../lib/api-client.js";
|
|
2
|
+
import { createReadlineInterface, askQuestion } from "../lib/interactive.js";
|
|
3
|
+
import { pickCourse, displayAnnouncements, displayAnnouncementDetail, printInfo, printError, printSuccess, printWarning, } from "../lib/display.js";
|
|
4
|
+
import chalk from "chalk";
|
|
5
|
+
export async function showAnnouncements(courseName, options = {}) {
|
|
6
6
|
let rl = null;
|
|
7
7
|
try {
|
|
8
|
-
let selectedCourseId
|
|
9
|
-
if (!
|
|
10
|
-
const result = await pickCourse({
|
|
8
|
+
let selectedCourseId;
|
|
9
|
+
if (!courseName) {
|
|
10
|
+
const result = await pickCourse({
|
|
11
|
+
title: "\nLoading your courses, please wait...",
|
|
12
|
+
});
|
|
11
13
|
if (!result)
|
|
12
14
|
return;
|
|
13
15
|
selectedCourseId = result.course.id.toString();
|
|
14
16
|
rl = result.rl;
|
|
15
17
|
}
|
|
16
18
|
else {
|
|
19
|
+
const course = await getCanvasCourse(courseName);
|
|
20
|
+
if (!course) {
|
|
21
|
+
printError(`Course "${courseName}" not found.`);
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
selectedCourseId = course.id.toString();
|
|
25
|
+
printSuccess(`✓ Using course: ${course.name}`);
|
|
17
26
|
rl = createReadlineInterface();
|
|
18
27
|
}
|
|
19
|
-
const limit = parseInt(options.limit ||
|
|
20
|
-
printInfo(
|
|
21
|
-
const announcements = await makeCanvasRequest(
|
|
28
|
+
const limit = parseInt(options.limit || "5") || 5;
|
|
29
|
+
printInfo("Loading announcements...");
|
|
30
|
+
const announcements = await makeCanvasRequest("get", `courses/${selectedCourseId}/discussion_topics`, [`only_announcements=true`, `per_page=${limit}`]);
|
|
22
31
|
if (!announcements || announcements.length === 0) {
|
|
23
|
-
printWarning(
|
|
32
|
+
printWarning("No announcements found for this course.");
|
|
24
33
|
rl?.close();
|
|
25
34
|
return;
|
|
26
35
|
}
|
|
27
36
|
printSuccess(`Found ${announcements.length} announcement(s).`);
|
|
28
37
|
const announcementTable = displayAnnouncements(announcements);
|
|
29
|
-
const annChoice = await askQuestion(rl, chalk.bold.cyan(
|
|
38
|
+
const annChoice = await askQuestion(rl, chalk.bold.cyan("\nEnter announcement number to view details (0 to exit): "));
|
|
30
39
|
announcementTable.stopWatching();
|
|
31
|
-
if (!annChoice.trim() || annChoice ===
|
|
32
|
-
printWarning(
|
|
40
|
+
if (!annChoice.trim() || annChoice === "0") {
|
|
41
|
+
printWarning("Exiting announcements viewer.");
|
|
33
42
|
rl?.close();
|
|
34
43
|
return;
|
|
35
44
|
}
|
|
36
45
|
const annIndex = parseInt(annChoice) - 1;
|
|
37
46
|
if (annIndex < 0 || annIndex >= announcements.length) {
|
|
38
|
-
printError(
|
|
47
|
+
printError("Invalid announcement selection.");
|
|
39
48
|
rl?.close();
|
|
40
49
|
return;
|
|
41
50
|
}
|
|
42
51
|
const ann = announcements[annIndex];
|
|
43
52
|
displayAnnouncementDetail({
|
|
44
|
-
title: ann?.title ||
|
|
53
|
+
title: ann?.title || "Untitled",
|
|
45
54
|
postedAt: ann?.posted_at || null,
|
|
46
|
-
author: ann?.author?.display_name ||
|
|
47
|
-
message: ann?.message ||
|
|
55
|
+
author: ann?.author?.display_name || "Unknown",
|
|
56
|
+
message: ann?.message || "No content",
|
|
48
57
|
});
|
|
49
58
|
}
|
|
50
59
|
catch (error) {
|
|
51
60
|
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
52
|
-
console.error(chalk.red(
|
|
61
|
+
console.error(chalk.red("Error: Failed to fetch announcements: ") + errorMessage);
|
|
53
62
|
}
|
|
54
63
|
finally {
|
|
55
64
|
rl?.close();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"announcements.js","sourceRoot":"","sources":["../../commands/announcements.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"announcements.js","sourceRoot":"","sources":["../../commands/announcements.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/api.d.ts
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import type { ApiQueryOptions } from
|
|
1
|
+
import type { ApiQueryOptions } from "../types/index.js";
|
|
2
2
|
export declare function createQueryHandler(method: string): (endpoint: string, options: ApiQueryOptions) => Promise<void>;
|
|
3
3
|
//# sourceMappingURL=api.d.ts.map
|
|
@@ -1 +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,
|
|
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,IAE7C,UAAU,MAAM,EAChB,SAAS,eAAe,KACvB,OAAO,CAAC,IAAI,CAAC,CASjB"}
|
package/dist/commands/api.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { makeCanvasRequest } from
|
|
1
|
+
import { makeCanvasRequest } from "../lib/api-client.js";
|
|
2
2
|
export function createQueryHandler(method) {
|
|
3
3
|
return async function (endpoint, options) {
|
|
4
4
|
const data = await makeCanvasRequest(method, endpoint, options.query || [], options.body || null);
|
package/dist/commands/api.js.map
CHANGED
|
@@ -1 +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,
|
|
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,WACV,QAAgB,EAChB,OAAwB;QAExB,MAAM,IAAI,GAAG,MAAM,iBAAiB,CAClC,MAAM,EACN,QAAQ,EACR,OAAO,CAAC,KAAK,IAAI,EAAE,EACnB,OAAO,CAAC,IAAI,IAAI,IAAI,CACrB,CAAC;QACF,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAC7C,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import type { ListAssignmentsOptions } from
|
|
2
|
-
export declare function listAssignments(
|
|
1
|
+
import type { ListAssignmentsOptions } from "../types/index.js";
|
|
2
|
+
export declare function listAssignments(courseName?: string, options?: ListAssignmentsOptions): Promise<void>;
|
|
3
3
|
//# sourceMappingURL=assignments.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"assignments.d.ts","sourceRoot":"","sources":["../../commands/assignments.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"assignments.d.ts","sourceRoot":"","sources":["../../commands/assignments.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAGV,sBAAsB,EACvB,MAAM,mBAAmB,CAAC;AAE3B,wBAAsB,eAAe,CACnC,UAAU,CAAC,EAAE,MAAM,EACnB,OAAO,GAAE,sBAA2B,GACnC,OAAO,CAAC,IAAI,CAAC,CAmEf"}
|
|
@@ -1,12 +1,14 @@
|
|
|
1
|
-
import { makeCanvasRequest } from
|
|
2
|
-
import { pickCourse, displayAssignments, printInfo, printError, printSuccess, printSeparator } from
|
|
3
|
-
import chalk from
|
|
4
|
-
export async function listAssignments(
|
|
1
|
+
import { makeCanvasRequest, getCanvasCourse } from "../lib/api-client.js";
|
|
2
|
+
import { pickCourse, displayAssignments, printInfo, printError, printSuccess, printSeparator, } from "../lib/display.js";
|
|
3
|
+
import chalk from "chalk";
|
|
4
|
+
export async function listAssignments(courseName, options = {}) {
|
|
5
5
|
try {
|
|
6
6
|
let course;
|
|
7
|
-
let selectedCourseId
|
|
8
|
-
if (!
|
|
9
|
-
const result = await pickCourse({
|
|
7
|
+
let selectedCourseId;
|
|
8
|
+
if (!courseName) {
|
|
9
|
+
const result = await pickCourse({
|
|
10
|
+
title: "\nLoading your courses, please wait...",
|
|
11
|
+
});
|
|
10
12
|
if (!result)
|
|
11
13
|
return;
|
|
12
14
|
course = result.course;
|
|
@@ -14,25 +16,28 @@ export async function listAssignments(courseId, options = {}) {
|
|
|
14
16
|
result.rl.close();
|
|
15
17
|
}
|
|
16
18
|
else {
|
|
17
|
-
course = await
|
|
19
|
+
course = await getCanvasCourse(courseName);
|
|
20
|
+
if (!course) {
|
|
21
|
+
printError(`Course "${courseName}" not found.`);
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
selectedCourseId = course.id.toString();
|
|
25
|
+
printSuccess(`✓ Using course: ${course.name}`);
|
|
18
26
|
}
|
|
19
|
-
printSeparator(
|
|
20
|
-
const assignmentParams = [
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
];
|
|
24
|
-
printInfo('Loading assignments, please wait...');
|
|
25
|
-
const assignments = await makeCanvasRequest('get', `courses/${selectedCourseId}/assignments`, assignmentParams);
|
|
27
|
+
printSeparator("─", 60);
|
|
28
|
+
const assignmentParams = ["include[]=submission", "per_page=100"];
|
|
29
|
+
printInfo("Loading assignments, please wait...");
|
|
30
|
+
const assignments = await makeCanvasRequest("get", `courses/${selectedCourseId}/assignments`, assignmentParams);
|
|
26
31
|
if (!assignments || assignments.length === 0) {
|
|
27
32
|
printError(`No assignments found for course: ${course?.name || selectedCourseId}`);
|
|
28
33
|
return;
|
|
29
34
|
}
|
|
30
35
|
let filteredAssignments = assignments;
|
|
31
36
|
if (options.submitted) {
|
|
32
|
-
filteredAssignments = assignments.filter(a => a.submission && a.submission.submitted_at);
|
|
37
|
+
filteredAssignments = assignments.filter((a) => a.submission && a.submission.submitted_at);
|
|
33
38
|
}
|
|
34
39
|
else if (options.pending) {
|
|
35
|
-
filteredAssignments = assignments.filter(a => !a.submission || !a.submission.submitted_at);
|
|
40
|
+
filteredAssignments = assignments.filter((a) => !a.submission || !a.submission.submitted_at);
|
|
36
41
|
}
|
|
37
42
|
printInfo(`\nAssignments for: ${course?.name || selectedCourseId}`);
|
|
38
43
|
printSuccess(`Found ${filteredAssignments.length} assignment(s).`);
|
|
@@ -40,12 +45,12 @@ export async function listAssignments(courseId, options = {}) {
|
|
|
40
45
|
showId: true,
|
|
41
46
|
showGrade: true,
|
|
42
47
|
showDueDate: true,
|
|
43
|
-
showStatus: options.verbose
|
|
48
|
+
showStatus: options.verbose,
|
|
44
49
|
});
|
|
45
50
|
}
|
|
46
51
|
catch (error) {
|
|
47
52
|
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
48
|
-
console.error(chalk.red(
|
|
53
|
+
console.error(chalk.red("Error fetching assignments:"), errorMessage);
|
|
49
54
|
process.exit(1);
|
|
50
55
|
}
|
|
51
56
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"assignments.js","sourceRoot":"","sources":["../../commands/assignments.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"assignments.js","sourceRoot":"","sources":["../../commands/assignments.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../commands/config.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../commands/config.ts"],"names":[],"mappings":"AAeA,wBAAsB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAmDhD;AAED,wBAAsB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CA+GjD;AAED,wBAAsB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAsEhD;AAED,wBAAgB,cAAc,IAAI,IAAI,CAMrC;AAED,wBAAgB,gBAAgB,IAAI,IAAI,CA0CvC"}
|