canvaslms-cli 1.4.5 → 1.4.7

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 +1 -9
  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 +87 -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 +128 -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 +69 -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 +756 -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 +89 -0
  62. package/dist/src/index.js.map +1 -0
  63. package/dist/types/index.d.ts +146 -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 +76 -71
  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,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,CAsEZ"}
@@ -0,0 +1,69 @@
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
+ return response.data;
54
+ }
55
+ catch (error) {
56
+ if (axios.isAxiosError(error) && error.response) {
57
+ console.error(`HTTP ${error.response.status}: ${error.response.statusText}`);
58
+ if (error.response.data) {
59
+ console.error(JSON.stringify(error.response.data, null, 2));
60
+ }
61
+ }
62
+ else {
63
+ const errorMessage = error instanceof Error ? error.message : String(error);
64
+ console.error(`Request failed: ${errorMessage}`);
65
+ }
66
+ process.exit(1);
67
+ }
68
+ }
69
+ //# 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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../lib/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export declare function uploadSingleFileToCanvas(courseId: number, assignmentId: number, filePath: string): Promise<number>;
2
+ export declare function submitAssignmentWithFiles(courseId: number, assignmentId: number, fileIds: number[]): Promise<any>;
3
+ //# sourceMappingURL=file-upload.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-upload.d.ts","sourceRoot":"","sources":["../../lib/file-upload.ts"],"names":[],"mappings":"AAcA,wBAAsB,wBAAwB,CAC5C,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,MAAM,EACpB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,MAAM,CAAC,CAuDjB;AAKD,wBAAsB,yBAAyB,CAC7C,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE,MAAM,EAAE,GAChB,OAAO,CAAC,GAAG,CAAC,CAcd"}
@@ -0,0 +1,52 @@
1
+ import fs from 'fs';
2
+ import path from 'path';
3
+ import axios from 'axios';
4
+ import FormData from 'form-data';
5
+ import { makeCanvasRequest } from './api-client.js';
6
+ export async function uploadSingleFileToCanvas(courseId, assignmentId, filePath) {
7
+ try {
8
+ if (!fs.existsSync(filePath)) {
9
+ throw new Error(`File not found: ${filePath}`);
10
+ }
11
+ const fileName = path.basename(filePath);
12
+ const fileContent = fs.readFileSync(filePath);
13
+ const uploadParams = [
14
+ `name=${fileName}`,
15
+ `size=${fileContent.length}`,
16
+ 'parent_folder_path=/assignments'
17
+ ];
18
+ const uploadData = await makeCanvasRequest('post', `courses/${courseId}/assignments/${assignmentId}/submissions/self/files`, uploadParams);
19
+ if (!uploadData.upload_url) {
20
+ throw new Error('Failed to get upload URL from Canvas');
21
+ }
22
+ const form = new FormData();
23
+ Object.keys(uploadData.upload_params).forEach(key => {
24
+ form.append(key, uploadData.upload_params[key]);
25
+ });
26
+ form.append('file', fileContent, fileName);
27
+ const uploadResponse = await axios.post(uploadData.upload_url, form, {
28
+ headers: form.getHeaders(),
29
+ maxRedirects: 0,
30
+ validateStatus: (status) => status < 400
31
+ });
32
+ const fileId = uploadData.id || uploadResponse.data.id;
33
+ if (typeof fileId !== 'number') {
34
+ throw new Error('Failed to get file ID from upload response');
35
+ }
36
+ return fileId;
37
+ }
38
+ catch (error) {
39
+ const errorMessage = error instanceof Error ? error.message : String(error);
40
+ throw new Error(`Failed to upload file ${filePath}: ${errorMessage}`);
41
+ }
42
+ }
43
+ export async function submitAssignmentWithFiles(courseId, assignmentId, fileIds) {
44
+ const submissionData = {
45
+ submission: {
46
+ submission_type: 'online_upload',
47
+ file_ids: fileIds
48
+ }
49
+ };
50
+ return await makeCanvasRequest('post', `courses/${courseId}/assignments/${assignmentId}/submissions`, [], JSON.stringify(submissionData));
51
+ }
52
+ //# sourceMappingURL=file-upload.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-upload.js","sourceRoot":"","sources":["../../lib/file-upload.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,QAAQ,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAMpD,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAC5C,QAAgB,EAChB,YAAoB,EACpB,QAAgB;IAEhB,IAAI,CAAC;QAEH,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC7B,MAAM,IAAI,KAAK,CAAC,mBAAmB,QAAQ,EAAE,CAAC,CAAC;QACjD,CAAC;QAED,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QACzC,MAAM,WAAW,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;QAG9C,MAAM,YAAY,GAAG;YACnB,QAAQ,QAAQ,EAAE;YAClB,QAAQ,WAAW,CAAC,MAAM,EAAE;YAC5B,iCAAiC;SAClC,CAAC;QAEF,MAAM,UAAU,GAAG,MAAM,iBAAiB,CACxC,MAAM,EACN,WAAW,QAAQ,gBAAgB,YAAY,yBAAyB,EACxE,YAAY,CACb,CAAC;QAEF,IAAI,CAAC,UAAU,CAAC,UAAU,EAAE,CAAC;YAC3B,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;QAC1D,CAAC;QAGD,MAAM,IAAI,GAAG,IAAI,QAAQ,EAAE,CAAC;QAG5B,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;YAClD,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,UAAU,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC;QAClD,CAAC,CAAC,CAAC;QAGH,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAC;QAE3C,MAAM,cAAc,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,UAAU,EAAE,IAAI,EAAE;YACnE,OAAO,EAAE,IAAI,CAAC,UAAU,EAAE;YAC1B,YAAY,EAAE,CAAC;YACf,cAAc,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,GAAG,GAAG;SACzC,CAAC,CAAC;QAGH,MAAM,MAAM,GAAI,UAAkB,CAAC,EAAE,IAAI,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC;QAChE,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;YAC/B,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;QAChE,CAAC;QACD,OAAO,MAAM,CAAC;IAEhB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,YAAY,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC5E,MAAM,IAAI,KAAK,CAAC,yBAAyB,QAAQ,KAAK,YAAY,EAAE,CAAC,CAAC;IACxE,CAAC;AACH,CAAC;AAKD,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAC7C,QAAgB,EAChB,YAAoB,EACpB,OAAiB;IAEjB,MAAM,cAAc,GAAG;QACrB,UAAU,EAAE;YACV,eAAe,EAAE,eAAe;YAChC,QAAQ,EAAE,OAAO;SAClB;KACF,CAAC;IAEF,OAAO,MAAM,iBAAiB,CAC5B,MAAM,EACN,WAAW,QAAQ,gBAAgB,YAAY,cAAc,EAC7D,EAAE,EACF,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC,CAC/B,CAAC;AACJ,CAAC"}
@@ -0,0 +1,16 @@
1
+ import readline from 'readline';
2
+ interface AskConfirmationOptions {
3
+ requireExplicit?: boolean;
4
+ }
5
+ export declare function createReadlineInterface(): readline.Interface;
6
+ export declare function askQuestion(rl: readline.Interface, question: string): Promise<string>;
7
+ export declare function askQuestionWithValidation(rl: readline.Interface, question: string, validator: (input: string) => boolean, errorMessage?: string): Promise<string>;
8
+ export declare function askConfirmation(rl: readline.Interface, question: string, defaultYes?: boolean, options?: AskConfirmationOptions): Promise<boolean>;
9
+ export declare function selectFromList<T>(rl: readline.Interface, items: T[], displayProperty?: keyof T | null, allowCancel?: boolean): Promise<T | null>;
10
+ export declare function getSubfoldersRecursive(startDir?: string): string[];
11
+ export declare function getFilesMatchingWildcard(pattern: string, currentDir?: string): string[];
12
+ export declare function pad(str: string, len: number): string;
13
+ export declare function selectFilesImproved(rl: readline.Interface, currentDir?: string): Promise<string[]>;
14
+ export declare function selectFilesKeyboard(_rl: readline.Interface, currentDir?: string, allowedExtensions?: string[]): Promise<string[]>;
15
+ export {};
16
+ //# sourceMappingURL=interactive.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interactive.d.ts","sourceRoot":"","sources":["../../lib/interactive.ts"],"names":[],"mappings":"AAIA,OAAO,QAAQ,MAAM,UAAU,CAAC;AA2BhC,UAAU,sBAAsB;IAC9B,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,wBAAgB,uBAAuB,IAAI,QAAQ,CAAC,SAAS,CAK5D;AAED,wBAAgB,WAAW,CAAC,EAAE,EAAE,QAAQ,CAAC,SAAS,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAMrF;AAED,wBAAgB,yBAAyB,CACvC,EAAE,EAAE,QAAQ,CAAC,SAAS,EACtB,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,EACrC,YAAY,CAAC,EAAE,MAAM,GACpB,OAAO,CAAC,MAAM,CAAC,CAajB;AAKD,wBAAsB,eAAe,CACnC,EAAE,EAAE,QAAQ,CAAC,SAAS,EACtB,QAAQ,EAAE,MAAM,EAChB,UAAU,GAAE,OAAc,EAC1B,OAAO,GAAE,sBAA2B,GACnC,OAAO,CAAC,OAAO,CAAC,CAgClB;AAKD,wBAAsB,cAAc,CAAC,CAAC,EACpC,EAAE,EAAE,QAAQ,CAAC,SAAS,EACtB,KAAK,EAAE,CAAC,EAAE,EACV,eAAe,GAAE,MAAM,CAAC,GAAG,IAAW,EACtC,WAAW,GAAE,OAAc,GAC1B,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,CAoCnB;AAED,wBAAgB,sBAAsB,CAAC,QAAQ,GAAE,MAAsB,GAAG,MAAM,EAAE,CAqBjF;AAKD,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,GAAE,MAAsB,GAAG,MAAM,EAAE,CA2CtG;AAED,wBAAgB,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAEpD;AAKD,wBAAsB,mBAAmB,CAAC,EAAE,EAAE,QAAQ,CAAC,SAAS,EAAE,UAAU,GAAE,MAAsB,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAsLvH;AAKD,wBAAsB,mBAAmB,CACvC,GAAG,EAAE,QAAQ,CAAC,SAAS,EACvB,UAAU,GAAE,MAAsB,EAClC,iBAAiB,CAAC,EAAE,MAAM,EAAE,GAC3B,OAAO,CAAC,MAAM,EAAE,CAAC,CAycnB"}