@ueu/ueu-canvas 0.0.4 → 0.0.6
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/README.md +44 -0
- package/dist/Account.js +60 -0
- package/dist/Account.js.map +1 -0
- package/dist/NotImplementedException.js +8 -0
- package/dist/NotImplementedException.js.map +1 -0
- package/dist/__mocks__/Account.d.ts +3 -3
- package/dist/__mocks__/Account.js +51 -0
- package/dist/__mocks__/Account.js.map +1 -0
- package/dist/__mocks__/index.js +25 -0
- package/dist/__mocks__/index.js.map +1 -0
- package/dist/__mocks__/mockAccountData.js +45 -0
- package/dist/__mocks__/mockAccountData.js.map +1 -0
- package/dist/__mocks__/mockEnrollment.d.ts +1 -1
- package/dist/__mocks__/mockEnrollment.js +24 -0
- package/dist/__mocks__/mockEnrollment.js.map +1 -0
- package/dist/__mocks__/mockRubricData.d.ts +1 -1
- package/dist/__mocks__/mockRubricData.js +56 -0
- package/dist/__mocks__/mockRubricData.js.map +1 -0
- package/dist/__mocks__/mockTabData.d.ts +1 -1
- package/dist/__mocks__/mockTabData.js +14 -0
- package/dist/__mocks__/mockTabData.js.map +1 -0
- package/dist/__mocks__/mockTermData.d.ts +1 -1
- package/dist/__mocks__/mockTermData.js +8 -0
- package/dist/__mocks__/mockTermData.js.map +1 -0
- package/dist/__mocks__/mockUserData.js +15 -0
- package/dist/__mocks__/mockUserData.js.map +1 -0
- package/dist/__mocks__/utils.js +14 -0
- package/dist/__mocks__/utils.js.map +1 -0
- package/dist/__tests__/canvasUtils.test.js +431 -0
- package/dist/__tests__/canvasUtils.test.js.map +1 -0
- package/dist/__tests__/fetch.test.js +236 -0
- package/dist/__tests__/fetch.test.js.map +1 -0
- package/dist/__tests__/profile.test.js +17 -0
- package/dist/__tests__/profile.test.js.map +1 -0
- package/dist/__tests__/rubrics.test.js +136 -0
- package/dist/__tests__/rubrics.test.js.map +1 -0
- package/dist/baseCanvasObject.js +115 -0
- package/dist/baseCanvasObject.js.map +1 -0
- package/dist/canvasDataDefs.d.ts +4 -0
- package/dist/canvasDataDefs.d.ts.map +1 -1
- package/dist/canvasDataDefs.js +3 -0
- package/dist/canvasDataDefs.js.map +1 -0
- package/dist/canvasUtils.d.ts +1 -1
- package/dist/canvasUtils.js +358 -0
- package/dist/canvasUtils.js.map +1 -0
- package/dist/consts.js +6 -0
- package/dist/consts.js.map +1 -0
- package/dist/content/BaseContentItem.d.ts +6 -6
- package/dist/content/BaseContentItem.js +182 -0
- package/dist/content/BaseContentItem.js.map +1 -0
- package/dist/content/ContentKind.d.ts +3 -3
- package/dist/content/ContentKind.js +45 -0
- package/dist/content/ContentKind.js.map +1 -0
- package/dist/content/__mocks__/determineContent.d.ts +14 -14
- package/dist/content/__mocks__/determineContent.js +27 -0
- package/dist/content/__mocks__/determineContent.js.map +1 -0
- package/dist/content/__mocks__/mockAssignmentSubmission.d.ts +1 -1
- package/dist/content/__mocks__/mockAssignmentSubmission.js +38 -0
- package/dist/content/__mocks__/mockAssignmentSubmission.js.map +1 -0
- package/dist/content/__mocks__/mockContentData.d.ts +3 -3
- package/dist/content/__mocks__/mockContentData.js +92 -0
- package/dist/content/__mocks__/mockContentData.js.map +1 -0
- package/dist/content/__mocks__/openThisContentInTarget.js +6 -0
- package/dist/content/__mocks__/openThisContentInTarget.js.map +1 -0
- package/dist/content/__testingUtils__/utils.d.ts +1 -1
- package/dist/content/__testingUtils__/utils.js +43 -0
- package/dist/content/__testingUtils__/utils.js.map +1 -0
- package/dist/content/__tests__/determineContent.test.js +115 -0
- package/dist/content/__tests__/determineContent.test.js.map +1 -0
- package/dist/content/__tests__/getContentFuncs.test.js +66 -0
- package/dist/content/__tests__/getContentFuncs.test.js.map +1 -0
- package/dist/content/assignments/Assignment.d.ts +4 -4
- package/dist/content/assignments/Assignment.js +61 -0
- package/dist/content/assignments/Assignment.js.map +1 -0
- package/dist/content/assignments/AssignmentKind.d.ts +3 -3
- package/dist/content/assignments/AssignmentKind.js +24 -0
- package/dist/content/assignments/AssignmentKind.js.map +1 -0
- package/dist/content/assignments/__tests__/AssignmentKind.test.js +56 -0
- package/dist/content/assignments/__tests__/AssignmentKind.test.js.map +1 -0
- package/dist/content/assignments/__tests__/assignments.test.js +95 -0
- package/dist/content/assignments/__tests__/assignments.test.js.map +1 -0
- package/dist/content/assignments/deleteAssignmentGroup.js +17 -0
- package/dist/content/assignments/deleteAssignmentGroup.js.map +1 -0
- package/dist/content/assignments/genAssignmentGroups.d.ts +1 -1
- package/dist/content/assignments/genAssignmentGroups.js +14 -0
- package/dist/content/assignments/genAssignmentGroups.js.map +1 -0
- package/dist/content/assignments/index.d.ts +4 -4
- package/dist/content/assignments/index.js +28 -0
- package/dist/content/assignments/index.js.map +1 -0
- package/dist/content/assignments/legacy.js +12 -0
- package/dist/content/assignments/legacy.js.map +1 -0
- package/dist/content/assignments/updateAssignmentDueDates.d.ts +2 -2
- package/dist/content/assignments/updateAssignmentDueDates.js +22 -0
- package/dist/content/assignments/updateAssignmentDueDates.js.map +1 -0
- package/dist/content/determineContent.d.ts +8 -8
- package/dist/content/determineContent.js +70 -0
- package/dist/content/determineContent.js.map +1 -0
- package/dist/content/discussions/Discussion.d.ts +4 -4
- package/dist/content/discussions/Discussion.js +32 -0
- package/dist/content/discussions/Discussion.js.map +1 -0
- package/dist/content/discussions/DiscussionKind.d.ts +2 -2
- package/dist/content/discussions/DiscussionKind.js +23 -0
- package/dist/content/discussions/DiscussionKind.js.map +1 -0
- package/dist/content/discussions/__tests__/DiscussionKind.test.js +56 -0
- package/dist/content/discussions/__tests__/DiscussionKind.test.js.map +1 -0
- package/dist/content/discussions/genEquivalentDiscussionData.js +97 -0
- package/dist/content/discussions/genEquivalentDiscussionData.js.map +1 -0
- package/dist/content/discussions/index.js +19 -0
- package/dist/content/discussions/index.js.map +1 -0
- package/dist/content/getContentFuncs.js +25 -0
- package/dist/content/getContentFuncs.js.map +1 -0
- package/dist/content/index.js +27 -0
- package/dist/content/index.js.map +1 -0
- package/dist/content/openThisContentInTarget.d.ts +1 -1
- package/dist/content/openThisContentInTarget.js +35 -0
- package/dist/content/openThisContentInTarget.js.map +1 -0
- package/dist/content/pages/Page.d.ts +5 -4
- package/dist/content/pages/Page.d.ts.map +1 -1
- package/dist/content/pages/Page.js +39 -0
- package/dist/content/pages/Page.js.map +1 -0
- package/dist/content/pages/PageKind.d.ts +3 -2
- package/dist/content/pages/PageKind.d.ts.map +1 -1
- package/dist/content/pages/PageKind.js +24 -0
- package/dist/content/pages/PageKind.js.map +1 -0
- package/dist/content/pages/__tests__/PageKind.test.js +69 -0
- package/dist/content/pages/__tests__/PageKind.test.js.map +1 -0
- package/dist/content/pages/__tests__/learningMaterialsForModule.js +82 -0
- package/dist/content/pages/__tests__/learningMaterialsForModule.js.map +1 -0
- package/dist/content/pages/index.js +56 -0
- package/dist/content/pages/index.js.map +1 -0
- package/dist/content/pages/learningMaterialsForModule.d.ts +2 -2
- package/dist/content/pages/learningMaterialsForModule.js +16 -0
- package/dist/content/pages/learningMaterialsForModule.js.map +1 -0
- package/dist/content/pages/types.d.ts +2 -1
- package/dist/content/pages/types.d.ts.map +1 -1
- package/dist/content/pages/types.js +3 -0
- package/dist/content/pages/types.js.map +1 -0
- package/dist/content/quizzes/Quiz.d.ts +1 -1
- package/dist/content/quizzes/Quiz.js +27 -0
- package/dist/content/quizzes/Quiz.js.map +1 -0
- package/dist/content/quizzes/QuizKind.d.ts +2 -2
- package/dist/content/quizzes/QuizKind.js +22 -0
- package/dist/content/quizzes/QuizKind.js.map +1 -0
- package/dist/content/quizzes/__tests__/QuizKind.test.js +56 -0
- package/dist/content/quizzes/__tests__/QuizKind.test.js.map +1 -0
- package/dist/content/quizzes/index.js +3 -0
- package/dist/content/quizzes/index.js.map +1 -0
- package/dist/content/quizzes/types.js +3 -0
- package/dist/content/quizzes/types.js.map +1 -0
- package/dist/content/types.d.ts +6 -6
- package/dist/content/types.js +3 -0
- package/dist/content/types.js.map +1 -0
- package/dist/course/Course.d.ts +15 -11
- package/dist/course/Course.d.ts.map +1 -1
- package/dist/course/Course.js +472 -0
- package/dist/course/Course.js.map +1 -0
- package/dist/course/IBlueprintCourse.d.ts +2 -2
- package/dist/course/IBlueprintCourse.js +3 -0
- package/dist/course/IBlueprintCourse.js.map +1 -0
- package/dist/course/__mocks__/blueprint.d.ts +1 -1
- package/dist/course/__mocks__/blueprint.js +28 -0
- package/dist/course/__mocks__/blueprint.js.map +1 -0
- package/dist/course/__mocks__/mockCourseData.d.ts +1 -1
- package/dist/course/__mocks__/mockCourseData.js +50 -0
- package/dist/course/__mocks__/mockCourseData.js.map +1 -0
- package/dist/course/__mocks__/mockLatePolicy.js +15 -0
- package/dist/course/__mocks__/mockLatePolicy.js.map +1 -0
- package/dist/course/__mocks__/mockModuleData.js +55 -0
- package/dist/course/__mocks__/mockModuleData.js.map +1 -0
- package/dist/course/__mocks__/mockProgressData.js +29 -0
- package/dist/course/__mocks__/mockProgressData.js.map +1 -0
- package/dist/course/__tests__/Course.test.js +75 -0
- package/dist/course/__tests__/Course.test.js.map +1 -0
- package/dist/course/__tests__/blueprint.test.js +273 -0
- package/dist/course/__tests__/blueprint.test.js.map +1 -0
- package/dist/course/__tests__/changeStartDate.test.js +240 -0
- package/dist/course/__tests__/changeStartDate.test.js.map +1 -0
- package/dist/course/__tests__/index.test.js +77 -0
- package/dist/course/__tests__/index.test.js.map +1 -0
- package/dist/course/blueprint.d.ts +1 -1
- package/dist/course/blueprint.js +108 -0
- package/dist/course/blueprint.js.map +1 -0
- package/dist/course/cachedGetAssociatedCoursesFunc.d.ts +2 -2
- package/dist/course/cachedGetAssociatedCoursesFunc.js +14 -0
- package/dist/course/cachedGetAssociatedCoursesFunc.js.map +1 -0
- package/dist/course/changeStartDate.d.ts +7 -6
- package/dist/course/changeStartDate.d.ts.map +1 -1
- package/dist/course/changeStartDate.js +182 -0
- package/dist/course/changeStartDate.js.map +1 -0
- package/dist/course/code.js +39 -0
- package/dist/course/code.js.map +1 -0
- package/dist/course/courseTypes.d.ts +5 -5
- package/dist/course/courseTypes.js +3 -0
- package/dist/course/courseTypes.js.map +1 -0
- package/dist/course/getCourseIdFromUrl.js +12 -0
- package/dist/course/getCourseIdFromUrl.js.map +1 -0
- package/dist/course/getSections.d.ts +3 -3
- package/dist/course/getSections.js +10 -0
- package/dist/course/getSections.js.map +1 -0
- package/dist/course/getTermNameFromSections.d.ts +1 -1
- package/dist/course/getTermNameFromSections.js +13 -0
- package/dist/course/getTermNameFromSections.js.map +1 -0
- package/dist/course/index.js +28 -0
- package/dist/course/index.js.map +1 -0
- package/dist/course/migration/__mocks__/mockMigrationData.js +41 -0
- package/dist/course/migration/__mocks__/mockMigrationData.js.map +1 -0
- package/dist/course/migration/__tests__/migration.test.js +141 -0
- package/dist/course/migration/__tests__/migration.test.js.map +1 -0
- package/dist/course/migration/__tests__/migrationCache.test.js +42 -0
- package/dist/course/migration/__tests__/migrationCache.test.js.map +1 -0
- package/dist/course/migration/index.d.ts +2 -2
- package/dist/course/migration/index.js +74 -0
- package/dist/course/migration/index.js.map +1 -0
- package/dist/course/migration/migrationCache.js +44 -0
- package/dist/course/migration/migrationCache.js.map +1 -0
- package/dist/course/modules.d.ts +1 -1
- package/dist/course/modules.js +82 -0
- package/dist/course/modules.js.map +1 -0
- package/dist/course/notABlueprintError.js +8 -0
- package/dist/course/notABlueprintError.js.map +1 -0
- package/dist/course/references/getReferencesForText.d.ts +1 -1
- package/dist/course/references/getReferencesForText.js +14 -0
- package/dist/course/references/getReferencesForText.js.map +1 -0
- package/dist/course/references/getReferencesForText.test.js +21 -0
- package/dist/course/references/getReferencesForText.test.js.map +1 -0
- package/dist/course/references/getReferencesTemplate.d.ts +2 -2
- package/dist/course/references/getReferencesTemplate.js +30 -0
- package/dist/course/references/getReferencesTemplate.js.map +1 -0
- package/dist/course/references/mockCiteAsResponse.js +323 -0
- package/dist/course/references/mockCiteAsResponse.js.map +1 -0
- package/dist/course/retireBlueprint.d.ts +2 -2
- package/dist/course/retireBlueprint.js +21 -0
- package/dist/course/retireBlueprint.js.map +1 -0
- package/dist/course/toolbox.d.ts +3 -3
- package/dist/course/toolbox.js +96 -0
- package/dist/course/toolbox.js.map +1 -0
- package/dist/date.js +119 -0
- package/dist/date.js.map +1 -0
- package/dist/enrollments/EnrollmentTypes.d.ts +2 -2
- package/dist/enrollments/EnrollmentTypes.js +3 -0
- package/dist/enrollments/EnrollmentTypes.js.map +1 -0
- package/dist/enrollments/enrollmentRole.js +7 -0
- package/dist/enrollments/enrollmentRole.js.map +1 -0
- package/dist/enrollments/getEnrollmentGenerator.d.ts +2 -2
- package/dist/enrollments/getEnrollmentGenerator.js +25 -0
- package/dist/enrollments/getEnrollmentGenerator.js.map +1 -0
- package/dist/enrollments/index.js +20 -0
- package/dist/enrollments/index.js.map +1 -0
- package/dist/fetch/__mocks__/fetchJson.js +5 -0
- package/dist/fetch/__mocks__/fetchJson.js.map +1 -0
- package/dist/fetch/__mocks__/getPagedDataGenerator.js +10 -0
- package/dist/fetch/__mocks__/getPagedDataGenerator.js.map +1 -0
- package/dist/fetch/__mocks__/index.js +8 -0
- package/dist/fetch/__mocks__/index.js.map +1 -0
- package/dist/fetch/apiGetConfig.d.ts +1 -1
- package/dist/fetch/apiGetConfig.js +11 -0
- package/dist/fetch/apiGetConfig.js.map +1 -0
- package/dist/fetch/apiWriteConfig.d.ts +2 -2
- package/dist/fetch/apiWriteConfig.js +16 -0
- package/dist/fetch/apiWriteConfig.js.map +1 -0
- package/dist/fetch/canvasDataFetchGenFunc.d.ts +2 -2
- package/dist/fetch/canvasDataFetchGenFunc.js +13 -0
- package/dist/fetch/canvasDataFetchGenFunc.js.map +1 -0
- package/dist/fetch/fetchJson.d.ts +1 -1
- package/dist/fetch/fetchJson.js +19 -0
- package/dist/fetch/fetchJson.js.map +1 -0
- package/dist/fetch/getPagedDataGenerator.d.ts +2 -2
- package/dist/fetch/getPagedDataGenerator.js +145 -0
- package/dist/fetch/getPagedDataGenerator.js.map +1 -0
- package/dist/fetch/index.js +22 -0
- package/dist/fetch/index.js.map +1 -0
- package/dist/fetch/utils.d.ts +1 -1
- package/dist/fetch/utils.js +14 -0
- package/dist/fetch/utils.js.map +1 -0
- package/dist/files.js +33 -0
- package/dist/files.js.map +1 -0
- package/dist/fixes/annotations.d.ts +1 -1
- package/dist/fixes/annotations.js +95 -0
- package/dist/fixes/annotations.js.map +1 -0
- package/dist/fixes/index.js +87 -0
- package/dist/fixes/index.js.map +1 -0
- package/dist/index.d.ts +3 -3
- package/dist/index.js +60 -8960
- package/dist/index.js.map +1 -0
- package/dist/profile.d.ts +2 -2
- package/dist/profile.js +230 -0
- package/dist/profile.js.map +1 -0
- package/dist/rubricTypes.d.ts +14 -0
- package/dist/rubricTypes.d.ts.map +1 -1
- package/dist/rubricTypes.js +3 -0
- package/dist/rubricTypes.js.map +1 -0
- package/dist/rubrics.d.ts +1 -1
- package/dist/rubrics.js +46 -0
- package/dist/rubrics.js.map +1 -0
- package/dist/term/Term.d.ts +3 -3
- package/dist/term/Term.js +64 -0
- package/dist/term/Term.js.map +1 -0
- package/dist/term/__tests__/dateFromTermName.test.js +26 -0
- package/dist/term/__tests__/dateFromTermName.test.js.map +1 -0
- package/dist/term/__tests__/getTermsGenerator.test.js +19 -0
- package/dist/term/__tests__/getTermsGenerator.test.js.map +1 -0
- package/dist/term/dateFromTermName.js +17 -0
- package/dist/term/dateFromTermName.js.map +1 -0
- package/dist/term/getTermsGenerator.js +15 -0
- package/dist/term/getTermsGenerator.js.map +1 -0
- package/dist/term/index.js +20 -0
- package/dist/term/index.js.map +1 -0
- package/dist/toolbox.js +25 -0
- package/dist/toolbox.js.map +1 -0
- package/dist/types.d.ts +4 -3
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/dist/users/getUserGenerator.d.ts +1 -1
- package/dist/users/getUserGenerator.js +21 -0
- package/dist/users/getUserGenerator.js.map +1 -0
- package/dist/users/index.js +18 -0
- package/dist/users/index.js.map +1 -0
- package/package.json +59 -51
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.NoAssignmentsWithDueDatesError = exports.MalformedSyllabusError = exports.NoOverviewModuleFoundError = void 0;
|
|
4
|
+
exports.getModuleUnlockStartDate = getModuleUnlockStartDate;
|
|
5
|
+
exports.sortAssignmentsByDueDate = sortAssignmentsByDueDate;
|
|
6
|
+
exports.getStartDateAssignments = getStartDateAssignments;
|
|
7
|
+
exports.getStartDateFromSyllabus = getStartDateFromSyllabus;
|
|
8
|
+
exports.getUpdatedStyleTermName = getUpdatedStyleTermName;
|
|
9
|
+
exports.getOldUgTermName = getOldUgTermName;
|
|
10
|
+
exports.getNewTermName = getNewTermName;
|
|
11
|
+
exports.updatedDateSyllabusHtml = updatedDateSyllabusHtml;
|
|
12
|
+
exports.syllabusHeaderName = syllabusHeaderName;
|
|
13
|
+
const temporal_polyfill_1 = require("temporal-polyfill");
|
|
14
|
+
const date_1 = require("../date");
|
|
15
|
+
const Assignment_1 = require("../content/assignments/Assignment");
|
|
16
|
+
const content_1 = require("../content");
|
|
17
|
+
const DEFAULT_LOCALE = "en-US";
|
|
18
|
+
function getModuleUnlockStartDate(modules) {
|
|
19
|
+
if (modules.length == 0)
|
|
20
|
+
throw new NoOverviewModuleFoundError();
|
|
21
|
+
const overviewModule = modules[0];
|
|
22
|
+
const unlockDateString = overviewModule.unlock_at;
|
|
23
|
+
if (!unlockDateString)
|
|
24
|
+
return null;
|
|
25
|
+
const oldDate = new Date(unlockDateString);
|
|
26
|
+
return (0, date_1.oldDateToPlainDate)(oldDate);
|
|
27
|
+
}
|
|
28
|
+
//This may be unnecessary, as the API call is now pulling by due_at date.
|
|
29
|
+
function sortAssignmentsByDueDate(assignments) {
|
|
30
|
+
return assignments.toSorted((a, b) => {
|
|
31
|
+
a = a instanceof Assignment_1.Assignment ? a.rawData : a;
|
|
32
|
+
b = b instanceof Assignment_1.Assignment ? b.rawData : b;
|
|
33
|
+
if (a.due_at && b.due_at) {
|
|
34
|
+
return (0, date_1.oldDateToPlainDate)(new Date(b.due_at)).until((0, date_1.oldDateToPlainDate)(new Date(a.due_at))).days;
|
|
35
|
+
}
|
|
36
|
+
if (a.due_at)
|
|
37
|
+
return -1;
|
|
38
|
+
if (b.due_at)
|
|
39
|
+
return 1;
|
|
40
|
+
return 0;
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
async function getStartDateAssignments(courseId) {
|
|
44
|
+
const assignmentGen = (0, content_1.assignmentDataGen)(courseId, {
|
|
45
|
+
queryParams: {
|
|
46
|
+
order_by: "due_at",
|
|
47
|
+
per_page: 2,
|
|
48
|
+
},
|
|
49
|
+
});
|
|
50
|
+
let assignmentDueAt;
|
|
51
|
+
for await (const assignment of assignmentGen) {
|
|
52
|
+
if (assignment.due_at) {
|
|
53
|
+
assignmentDueAt = assignment.due_at;
|
|
54
|
+
break;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
if (!assignmentDueAt)
|
|
58
|
+
throw new NoAssignmentsWithDueDatesError();
|
|
59
|
+
//Set to monday of that week.
|
|
60
|
+
const firstAssignmentDue = new Date(assignmentDueAt);
|
|
61
|
+
const plainDateDue = (0, date_1.oldDateToPlainDate)(firstAssignmentDue);
|
|
62
|
+
const dayOfWeekOffset = 1 - plainDateDue.dayOfWeek;
|
|
63
|
+
return plainDateDue.add({ days: dayOfWeekOffset });
|
|
64
|
+
}
|
|
65
|
+
function getStartDateFromSyllabus(syllabusHtml, locale = DEFAULT_LOCALE) {
|
|
66
|
+
const syllabusBody = document.createElement("div");
|
|
67
|
+
syllabusBody.innerHTML = syllabusHtml;
|
|
68
|
+
const syllabusCalloutBox = syllabusBody.querySelector("div.cbt-callout-box");
|
|
69
|
+
if (!syllabusCalloutBox)
|
|
70
|
+
throw new MalformedSyllabusError("Can't find syllabus callout box");
|
|
71
|
+
const paras = Array.from(syllabusCalloutBox.querySelectorAll("p"));
|
|
72
|
+
const strongParas = paras.filter((para) => para.querySelector("strong"));
|
|
73
|
+
if (strongParas.length < 5)
|
|
74
|
+
throw new MalformedSyllabusError(`Missing syllabus headers\n${strongParas}`);
|
|
75
|
+
const termNameEl = strongParas[1];
|
|
76
|
+
const datesEl = strongParas[2];
|
|
77
|
+
let dateRange = (0, date_1.findDateRange)(datesEl.innerHTML, locale);
|
|
78
|
+
if (!dateRange)
|
|
79
|
+
throw new MalformedSyllabusError("Date range not found in syllabus");
|
|
80
|
+
const termName = termNameEl.textContent || "";
|
|
81
|
+
let yearToUse;
|
|
82
|
+
const yearMatchNew = termName.match(/\.(\d{2})$/);
|
|
83
|
+
if (yearMatchNew) {
|
|
84
|
+
yearToUse = 2000 + parseInt(yearMatchNew[1]);
|
|
85
|
+
}
|
|
86
|
+
else {
|
|
87
|
+
const yearMatchOld = termName.match(/DE-(\d{2})-/);
|
|
88
|
+
if (yearMatchOld) {
|
|
89
|
+
yearToUse = 2000 + parseInt(yearMatchOld[1]);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
if (yearToUse) {
|
|
93
|
+
dateRange = {
|
|
94
|
+
start: temporal_polyfill_1.Temporal.PlainDate.from({
|
|
95
|
+
year: yearToUse,
|
|
96
|
+
month: dateRange.start.month,
|
|
97
|
+
day: dateRange.start.day,
|
|
98
|
+
}),
|
|
99
|
+
end: temporal_polyfill_1.Temporal.PlainDate.from({
|
|
100
|
+
year: yearToUse,
|
|
101
|
+
month: dateRange.end.month,
|
|
102
|
+
day: dateRange.end.day,
|
|
103
|
+
}),
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
return dateRange.start;
|
|
107
|
+
}
|
|
108
|
+
function getUpdatedStyleTermName(termStart, weekCount, locale = DEFAULT_LOCALE) {
|
|
109
|
+
const month = termStart.toLocaleString(locale, { month: "2-digit" });
|
|
110
|
+
const day = termStart.toLocaleString(locale, { day: "2-digit" });
|
|
111
|
+
const year = termStart.toLocaleString(locale, { year: "2-digit" });
|
|
112
|
+
return `DE${weekCount}W${month}.${day}.${year}`;
|
|
113
|
+
}
|
|
114
|
+
function getOldUgTermName(termStart) {
|
|
115
|
+
const year = termStart.toLocaleString(DEFAULT_LOCALE, { year: "2-digit" });
|
|
116
|
+
const month = termStart.toLocaleString(DEFAULT_LOCALE, { month: "short" });
|
|
117
|
+
return `DE-${year}-${month}`;
|
|
118
|
+
}
|
|
119
|
+
function getNewTermName(oldTermName, newTermStart, isGrad = undefined) {
|
|
120
|
+
const [termName, weekCount] = oldTermName.match(/DE(\d)W\d\d\.\d\d\.\d\d/) || [];
|
|
121
|
+
if (termName)
|
|
122
|
+
return getUpdatedStyleTermName(newTermStart, weekCount);
|
|
123
|
+
const termNameUg = oldTermName.match(/(DE(?:.HL|)-\d\d)-(\w+)\w{2}?/i);
|
|
124
|
+
const newWeekCount = isGrad ? 8 : 5;
|
|
125
|
+
if (termNameUg)
|
|
126
|
+
return getUpdatedStyleTermName(newTermStart, newWeekCount);
|
|
127
|
+
throw new MalformedSyllabusError(`Can't Recognize Term Name ${oldTermName}`);
|
|
128
|
+
}
|
|
129
|
+
function updatedDateSyllabusHtml(html, newStartDate, isGrad = undefined, locale = DEFAULT_LOCALE) {
|
|
130
|
+
const syllabusBody = document.createElement("div");
|
|
131
|
+
syllabusBody.innerHTML = html;
|
|
132
|
+
const syllabusCalloutBox = syllabusBody.querySelector("div.cbt-callout-box");
|
|
133
|
+
if (!syllabusCalloutBox)
|
|
134
|
+
throw new MalformedSyllabusError("Can't find syllabus callout box");
|
|
135
|
+
const paras = Array.from(syllabusCalloutBox.querySelectorAll("p"));
|
|
136
|
+
const strongParas = paras.filter((para) => para.querySelector("strong"));
|
|
137
|
+
if (strongParas.length < 5)
|
|
138
|
+
throw new MalformedSyllabusError(`Missing syllabus headers\n${strongParas}`);
|
|
139
|
+
const [_courseNameEl, termNameEl, datesEl, _instructorNameEl, _instructorContactInfoEl, _creditsEl] = strongParas;
|
|
140
|
+
const changedText = [];
|
|
141
|
+
const oldTermName = termNameEl.textContent || "";
|
|
142
|
+
const oldDates = datesEl.textContent || "";
|
|
143
|
+
const dateRange = (0, date_1.findDateRange)(datesEl.innerHTML, locale);
|
|
144
|
+
if (!dateRange)
|
|
145
|
+
throw new MalformedSyllabusError("Date range not found in syllabus");
|
|
146
|
+
const courseDuration = dateRange.start.until(dateRange.end);
|
|
147
|
+
const newEndDate = newStartDate.add(courseDuration);
|
|
148
|
+
const newTermName = getNewTermName(oldTermName, newStartDate, isGrad);
|
|
149
|
+
const dateRangeText = `${dateToSyllabusString(newStartDate)} - ${dateToSyllabusString(newEndDate)}`;
|
|
150
|
+
termNameEl.innerHTML = `<strong>${syllabusHeaderName(termNameEl)}:</strong><span> ${newTermName}</span>`;
|
|
151
|
+
datesEl.innerHTML = `<strong>${syllabusHeaderName(datesEl)}:</strong><span> ${dateRangeText}</span>`;
|
|
152
|
+
changedText.push(`${oldTermName} -> ${termNameEl.textContent}`);
|
|
153
|
+
changedText.push(`${oldDates} -> ${datesEl.textContent}`);
|
|
154
|
+
const output = {
|
|
155
|
+
html: syllabusBody.innerHTML.replaceAll(/<p>\s*( )?<\/p>/gi, ""),
|
|
156
|
+
changedText,
|
|
157
|
+
};
|
|
158
|
+
syllabusBody.remove();
|
|
159
|
+
return output;
|
|
160
|
+
}
|
|
161
|
+
function dateToSyllabusString(date) {
|
|
162
|
+
return `${date.toLocaleString(DEFAULT_LOCALE, { month: "long", day: "numeric" })}`;
|
|
163
|
+
}
|
|
164
|
+
function syllabusHeaderName(el) {
|
|
165
|
+
// eslint-disable-next-line prefer-const
|
|
166
|
+
let [_, head] = /([^:]*):/.exec(el.innerHTML) ?? [];
|
|
167
|
+
head = head?.replaceAll(/<[^>]*>/g, "");
|
|
168
|
+
return head;
|
|
169
|
+
}
|
|
170
|
+
class NoOverviewModuleFoundError extends Error {
|
|
171
|
+
name = "NoOverviewModuleFoundError";
|
|
172
|
+
}
|
|
173
|
+
exports.NoOverviewModuleFoundError = NoOverviewModuleFoundError;
|
|
174
|
+
class MalformedSyllabusError extends Error {
|
|
175
|
+
name = "MalformedSyllabusError";
|
|
176
|
+
}
|
|
177
|
+
exports.MalformedSyllabusError = MalformedSyllabusError;
|
|
178
|
+
class NoAssignmentsWithDueDatesError extends Error {
|
|
179
|
+
name = "NoAssignmentsWithDueDatesError";
|
|
180
|
+
}
|
|
181
|
+
exports.NoAssignmentsWithDueDatesError = NoAssignmentsWithDueDatesError;
|
|
182
|
+
//# sourceMappingURL=changeStartDate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"changeStartDate.js","sourceRoot":"","sources":["../../src/course/changeStartDate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.MalformedCourseCodeError = void 0;
|
|
4
|
+
exports.parseCourseCode = parseCourseCode;
|
|
5
|
+
exports.baseCourseCode = baseCourseCode;
|
|
6
|
+
exports.stringIsCourseCode = stringIsCourseCode;
|
|
7
|
+
const Course_1 = require("../course/Course");
|
|
8
|
+
function parseCourseCode(code) {
|
|
9
|
+
const match = Course_1.COURSE_CODE_REGEX.exec(code);
|
|
10
|
+
if (!match)
|
|
11
|
+
return null;
|
|
12
|
+
const prefix = match[1] || "";
|
|
13
|
+
const courseCode = match[2] || "";
|
|
14
|
+
if (prefix.length > 0) {
|
|
15
|
+
return `${prefix}_${courseCode}`;
|
|
16
|
+
}
|
|
17
|
+
return courseCode;
|
|
18
|
+
}
|
|
19
|
+
function baseCourseCode(code) {
|
|
20
|
+
const match = Course_1.COURSE_CODE_REGEX.exec(code);
|
|
21
|
+
if (!match)
|
|
22
|
+
return null;
|
|
23
|
+
return match[2];
|
|
24
|
+
}
|
|
25
|
+
function stringIsCourseCode(code) {
|
|
26
|
+
return Course_1.COURSE_CODE_REGEX.exec(code);
|
|
27
|
+
}
|
|
28
|
+
class MalformedCourseCodeError extends Error {
|
|
29
|
+
name = "MalformedCourseCodeError";
|
|
30
|
+
courseCode;
|
|
31
|
+
constructor(courseCode, message, options) {
|
|
32
|
+
if (!message)
|
|
33
|
+
message = `${courseCode} is not a valid course code`;
|
|
34
|
+
super(message, options);
|
|
35
|
+
this.courseCode = courseCode;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
exports.MalformedCourseCodeError = MalformedCourseCodeError;
|
|
39
|
+
//# sourceMappingURL=code.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"code.js","sourceRoot":"","sources":["../../src/course/code.ts"],"names":[],"mappings":";;;AAEA,0CASC;AAED,wCAIC;AAED,gDAEC;AArBD,4CAAkD;AAElD,SAAgB,eAAe,CAAC,IAAY;IACxC,MAAM,KAAK,GAAG,0BAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC3C,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IACxB,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAC9B,MAAM,UAAU,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAClC,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACpB,OAAO,GAAG,MAAM,IAAI,UAAU,EAAE,CAAC;IACrC,CAAC;IACD,OAAO,UAAU,CAAC;AACtB,CAAC;AAED,SAAgB,cAAc,CAAC,IAAY;IACvC,MAAM,KAAK,GAAG,0BAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC3C,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IACxB,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC;AACpB,CAAC;AAED,SAAgB,kBAAkB,CAAC,IAAY;IAC3C,OAAO,0BAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACxC,CAAC;AAED,MAAa,wBAAyB,SAAQ,KAAK;IAC/C,IAAI,GAAG,0BAA0B,CAAC;IAClC,UAAU,CAAa;IACvB,YAAY,UAAsB,EAAE,OAAgB,EAAE,OAAqB;QACvE,IAAG,CAAC,OAAO;YAAE,OAAO,GAAG,GAAG,UAAU,6BAA6B,CAAC;QAClE,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACxB,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;IACjC,CAAC;CACJ;AARD,4DAQC"}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { ICanvasCallConfig } from "../canvasUtils";
|
|
2
2
|
import { ILatePolicyData, IModuleData } from "../canvasDataDefs";
|
|
3
|
-
import { ICourseData, ICourseSettings } from "
|
|
4
|
-
import { Quiz } from "
|
|
5
|
-
import { Page } from "
|
|
6
|
-
import { Discussion } from "
|
|
7
|
-
import { Assignment } from "
|
|
3
|
+
import { ICourseData, ICourseSettings } from "../types";
|
|
4
|
+
import { Quiz } from "../content/quizzes/Quiz";
|
|
5
|
+
import { Page } from "../content/pages/Page";
|
|
6
|
+
import { Discussion } from "../content/discussions/Discussion";
|
|
7
|
+
import { Assignment } from "../content/assignments/Assignment";
|
|
8
8
|
export interface IIdHaver<IdType = number> {
|
|
9
9
|
id: IdType;
|
|
10
10
|
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"courseTypes.js","sourceRoot":"","sources":["../../src/course/courseTypes.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getCourseIdFromUrl = getCourseIdFromUrl;
|
|
4
|
+
function getCourseIdFromUrl(url) {
|
|
5
|
+
const match = /courses\/(\d+)/.exec(url);
|
|
6
|
+
if (match) {
|
|
7
|
+
return parseInt(match[1]);
|
|
8
|
+
}
|
|
9
|
+
return null;
|
|
10
|
+
}
|
|
11
|
+
exports.default = getCourseIdFromUrl;
|
|
12
|
+
//# sourceMappingURL=getCourseIdFromUrl.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getCourseIdFromUrl.js","sourceRoot":"","sources":["../../src/course/getCourseIdFromUrl.ts"],"names":[],"mappings":";;AAAA,gDAMC;AAND,SAAgB,kBAAkB,CAAC,GAAW;IAC1C,MAAM,KAAK,GAAG,gBAAgB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACzC,IAAI,KAAK,EAAE,CAAC;QACR,OAAO,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9B,CAAC;IACD,OAAO,IAAI,CAAC;AAChB,CAAC;AAED,kBAAe,kBAAkB,CAAC"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { ICanvasCallConfig } from "
|
|
2
|
-
import { GetCoursesFromAccountOptions } from "
|
|
3
|
-
import { Course } from "
|
|
1
|
+
import { ICanvasCallConfig } from "../canvasUtils";
|
|
2
|
+
import { GetCoursesFromAccountOptions } from "../course/courseTypes";
|
|
3
|
+
import { Course } from "../course/Course";
|
|
4
4
|
export declare function getSections(courseId: number, config?: ICanvasCallConfig<GetCoursesFromAccountOptions>): Promise<Course[]>;
|
|
5
5
|
//# sourceMappingURL=getSections.d.ts.map
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getSections = getSections;
|
|
4
|
+
const canvasUtils_1 = require("../canvasUtils");
|
|
5
|
+
const Course_1 = require("../course/Course");
|
|
6
|
+
const blueprint_1 = require("../course/blueprint");
|
|
7
|
+
async function getSections(courseId, config) {
|
|
8
|
+
return (await (0, canvasUtils_1.renderAsyncGen)((0, blueprint_1.sectionDataGenerator)(courseId, config))).map(section => new Course_1.Course(section));
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=getSections.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getSections.js","sourceRoot":"","sources":["../../src/course/getSections.ts"],"names":[],"mappings":";;AAMA,kCAEC;AARD,qDAAsE;AAEtE,kDAA6C;AAE7C,wDAA8D;AAEvD,KAAK,UAAU,WAAW,CAAC,QAAgB,EAAE,MAAwD;IACxG,OAAO,CAAC,MAAM,IAAA,4BAAc,EAAC,IAAA,gCAAoB,EAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,eAAM,CAAC,OAAsB,CAAC,CAAC,CAAC;AAC7H,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getTermNameFromSections = getTermNameFromSections;
|
|
4
|
+
async function getTermNameFromSections(sections) {
|
|
5
|
+
const [section] = sections;
|
|
6
|
+
if (!section)
|
|
7
|
+
throw new Error("Cannot determine term name by sections; there are no sections.");
|
|
8
|
+
const sectionTerm = await section.getTerm();
|
|
9
|
+
if (!sectionTerm)
|
|
10
|
+
throw new Error("Section does not have associated term: " + section.name);
|
|
11
|
+
return sectionTerm.name;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=getTermNameFromSections.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getTermNameFromSections.js","sourceRoot":"","sources":["../../src/course/getTermNameFromSections.ts"],"names":[],"mappings":";;AAEA,0DAMC;AANM,KAAK,UAAU,uBAAuB,CAAC,QAAkB;IAC5D,MAAM,CAAC,OAAO,CAAC,GAAG,QAAQ,CAAC;IAC3B,IAAI,CAAC,OAAO;QAAE,MAAM,IAAI,KAAK,CAAC,gEAAgE,CAAC,CAAA;IAC/F,MAAM,WAAW,GAAG,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;IAC5C,IAAI,CAAC,WAAW;QAAE,MAAM,IAAI,KAAK,CAAC,yCAAyC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5F,OAAO,WAAW,CAAC,IAAI,CAAC;AAC5B,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./blueprint"), exports);
|
|
18
|
+
__exportStar(require("./toolbox"), exports);
|
|
19
|
+
__exportStar(require("./Course"), exports);
|
|
20
|
+
__exportStar(require("./courseTypes"), exports);
|
|
21
|
+
__exportStar(require("./getCourseIdFromUrl"), exports);
|
|
22
|
+
__exportStar(require("./getSections"), exports);
|
|
23
|
+
__exportStar(require("./getTermNameFromSections"), exports);
|
|
24
|
+
__exportStar(require("./IBlueprintCourse"), exports);
|
|
25
|
+
__exportStar(require("./modules"), exports);
|
|
26
|
+
__exportStar(require("./notABlueprintError"), exports);
|
|
27
|
+
__exportStar(require("./retireBlueprint"), exports);
|
|
28
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/course/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,8CAA2B;AAC3B,4CAAyB;AACzB,2CAAwB;AAExB,gDAA6B;AAC7B,uDAAoC;AACpC,gDAA6B;AAC7B,4DAAyC;AACzC,qDAAkC;AAClC,4CAAyB;AACzB,uDAAoC;AACpC,oDAAiC"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.mockMigrationData = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* From canvas api docs
|
|
6
|
+
*/
|
|
7
|
+
exports.mockMigrationData = {
|
|
8
|
+
// the unique identifier for the migration
|
|
9
|
+
"id": 370663,
|
|
10
|
+
// the type of content migration
|
|
11
|
+
"migration_type": "course_copy_importer",
|
|
12
|
+
// the name of the content migration type
|
|
13
|
+
"migration_type_title": "Canvas Cartridge Importer",
|
|
14
|
+
// API url to the content migration's issues
|
|
15
|
+
"migration_issues_url": "https://example.com/api/v1/courses/1/content_migrations/1/migration_issues",
|
|
16
|
+
// attachment api object for the uploaded file may not be present for all
|
|
17
|
+
// migrations
|
|
18
|
+
"attachment": { "url": "https://example.com/api/v1/courses/1/content_migrations/1/download_archive" },
|
|
19
|
+
// The api endpoint for polling the current progress
|
|
20
|
+
"progress_url": "https://example.com/api/v1/progress/4",
|
|
21
|
+
// The user who started the migration
|
|
22
|
+
"user_id": 4,
|
|
23
|
+
// Current state of the content migration: pre_processing, pre_processed,
|
|
24
|
+
// running, waiting_for_select, completed, failed
|
|
25
|
+
"workflow_state": "running",
|
|
26
|
+
// timestamp
|
|
27
|
+
"started_at": "2012-06-01T00:00:00-06:00",
|
|
28
|
+
// timestamp
|
|
29
|
+
"finished_at": "2012-06-01T00:00:00-06:00",
|
|
30
|
+
// file uploading data, see {file:file_uploads.html File Upload Documentation}
|
|
31
|
+
// for file upload workflow This works a little differently in that all the file
|
|
32
|
+
// data is in the pre_attachment hash if there is no upload_url then there was
|
|
33
|
+
// an attachment pre-processing error, the error message will be in the message
|
|
34
|
+
// key This data will only be here after a create or update call
|
|
35
|
+
"pre_attachment": {
|
|
36
|
+
upload_url: '',
|
|
37
|
+
"message": "file exceeded quota",
|
|
38
|
+
"upload_params": {}
|
|
39
|
+
}
|
|
40
|
+
};
|
|
41
|
+
//# sourceMappingURL=mockMigrationData.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mockMigrationData.js","sourceRoot":"","sources":["../../../../src/course/migration/__mocks__/mockMigrationData.ts"],"names":[],"mappings":";;;AAEA;;GAEG;AACU,QAAA,iBAAiB,GAAmB;IAC7C,0CAA0C;IAC1C,IAAI,EAAE,MAAM;IACZ,gCAAgC;IAChC,gBAAgB,EAAE,sBAAsB;IACxC,yCAAyC;IACzC,sBAAsB,EAAE,2BAA2B;IACnD,4CAA4C;IAC5C,sBAAsB,EAAE,4EAA4E;IACpG,yEAAyE;IACzE,aAAa;IACb,YAAY,EAAE,EAAC,KAAK,EAAE,4EAA4E,EAAC;IACnG,oDAAoD;IACpD,cAAc,EAAE,uCAAuC;IACvD,qCAAqC;IACrC,SAAS,EAAE,CAAC;IACZ,yEAAyE;IACzE,iDAAiD;IACjD,gBAAgB,EAAE,SAAS;IAC3B,YAAY;IACZ,YAAY,EAAE,2BAA2B;IACzC,YAAY;IACZ,aAAa,EAAE,2BAA2B;IAC1C,8EAA8E;IAC9E,gFAAgF;IAChF,8EAA8E;IAC9E,+EAA+E;IAC/E,gEAAgE;IAChE,gBAAgB,EAAE;QACd,UAAU,EAAE,EAAE;QACd,SAAS,EAAE,qBAAqB;QAChC,eAAe,EAAE,EAAE;KACtB;CACJ,CAAA"}
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const jest_fetch_mock_1 = __importDefault(require("jest-fetch-mock"));
|
|
7
|
+
const mockCourseData_1 = require("../../__mocks__/mockCourseData");
|
|
8
|
+
const index_1 = require("../index");
|
|
9
|
+
const canvasUtils_1 = require("../../../canvasUtils");
|
|
10
|
+
const mockMigrationData_1 = require("../../../course/migration/__mocks__/mockMigrationData");
|
|
11
|
+
const Course_1 = require("../../../course/Course");
|
|
12
|
+
const mockProgressData_1 = require("../../../course/__mocks__/mockProgressData");
|
|
13
|
+
beforeEach(() => {
|
|
14
|
+
jest.clearAllMocks();
|
|
15
|
+
});
|
|
16
|
+
describe('Getting migrations', () => {
|
|
17
|
+
it('gets migrations from course', async () => {
|
|
18
|
+
const id = 123;
|
|
19
|
+
const config = { fetchInit: {} };
|
|
20
|
+
jest_fetch_mock_1.default.once(JSON.stringify([mockMigrationData_1.mockMigrationData, { ...mockMigrationData_1.mockMigrationData, id: 321 }]));
|
|
21
|
+
const generator = (0, index_1.migrationsForCourseGen)(id, config);
|
|
22
|
+
let result = await generator.next();
|
|
23
|
+
let migration = result.done ? null : result.value;
|
|
24
|
+
expect(jest_fetch_mock_1.default).toHaveBeenCalledTimes(1);
|
|
25
|
+
expect(jest_fetch_mock_1.default).toHaveBeenCalledWith(`/api/v1/courses/${id}/content_migrations`, config.fetchInit);
|
|
26
|
+
expect(migration).toEqual(mockMigrationData_1.mockMigrationData);
|
|
27
|
+
result = await generator.next();
|
|
28
|
+
migration = result.done ? null : result.value;
|
|
29
|
+
expect(migration?.id).toEqual(321);
|
|
30
|
+
});
|
|
31
|
+
it('gets a single mock by id', async () => {
|
|
32
|
+
const courseId = 123;
|
|
33
|
+
const migrationId = 321;
|
|
34
|
+
const config = { fetchInit: {} };
|
|
35
|
+
jest_fetch_mock_1.default.once(JSON.stringify(mockMigrationData_1.mockMigrationData));
|
|
36
|
+
const migration = await (0, index_1.getMigration)(courseId, migrationId, config);
|
|
37
|
+
expect(jest_fetch_mock_1.default).toHaveBeenCalledTimes(1);
|
|
38
|
+
expect(jest_fetch_mock_1.default).toHaveBeenCalledWith(`/api/v1/courses/${courseId}/content_migrations/${migrationId}`, config.fetchInit);
|
|
39
|
+
expect(migration).toEqual(expect.objectContaining(mockMigrationData_1.mockMigrationData));
|
|
40
|
+
});
|
|
41
|
+
it('returns null if no migrations are found', async () => {
|
|
42
|
+
jest_fetch_mock_1.default.once('null');
|
|
43
|
+
const migration = await (0, index_1.getMigration)(1, 2, {});
|
|
44
|
+
expect(migration).toBeNull();
|
|
45
|
+
});
|
|
46
|
+
});
|
|
47
|
+
describe('Course migration', () => {
|
|
48
|
+
jest_fetch_mock_1.default.enableMocks();
|
|
49
|
+
afterEach(() => {
|
|
50
|
+
jest.clearAllMocks();
|
|
51
|
+
});
|
|
52
|
+
it('Yields values while still polling', async () => {
|
|
53
|
+
const workflowStates = [
|
|
54
|
+
...[...(0, canvasUtils_1.range)(0, 2)].map(_ => 'queued'),
|
|
55
|
+
...[...(0, canvasUtils_1.range)(0, 2)].map(_ => 'running'),
|
|
56
|
+
'completed'
|
|
57
|
+
];
|
|
58
|
+
jest_fetch_mock_1.default.mockResponseOnce(JSON.stringify({
|
|
59
|
+
...mockMigrationData_1.mockMigrationData, workflow_state: 'queued'
|
|
60
|
+
}));
|
|
61
|
+
const migrationGenerator = (0, index_1.courseMigrationGenerator)(0, 1, 20);
|
|
62
|
+
for (const state of workflowStates) {
|
|
63
|
+
jest_fetch_mock_1.default.mockResponseOnce(JSON.stringify({
|
|
64
|
+
...mockProgressData_1.mockProgressData, workflow_state: state
|
|
65
|
+
}));
|
|
66
|
+
}
|
|
67
|
+
const workflowIterator = workflowStates.values();
|
|
68
|
+
for await (const progress of migrationGenerator) {
|
|
69
|
+
expect(progress?.workflow_state).toBe(workflowIterator.next().value);
|
|
70
|
+
}
|
|
71
|
+
});
|
|
72
|
+
it('Throws an error on a failed migration', async () => {
|
|
73
|
+
const workflowStates = [
|
|
74
|
+
'queued',
|
|
75
|
+
'running',
|
|
76
|
+
'failed'
|
|
77
|
+
];
|
|
78
|
+
jest_fetch_mock_1.default.mockResponseOnce(JSON.stringify({
|
|
79
|
+
...mockMigrationData_1.mockMigrationData, workflow_state: 'queued'
|
|
80
|
+
}));
|
|
81
|
+
for (const state of workflowStates) {
|
|
82
|
+
jest_fetch_mock_1.default.mockResponseOnce(JSON.stringify({
|
|
83
|
+
...mockProgressData_1.mockProgressData, workflow_state: state
|
|
84
|
+
}));
|
|
85
|
+
}
|
|
86
|
+
const migrationGenerator = (0, index_1.courseMigrationGenerator)(0, 1, 0);
|
|
87
|
+
await expect(async () => {
|
|
88
|
+
for await (const progress of migrationGenerator) {
|
|
89
|
+
expect(progress?.id).toBe(mockProgressData_1.mockProgressData.id);
|
|
90
|
+
}
|
|
91
|
+
}).rejects.toThrow(/Migration Error/);
|
|
92
|
+
});
|
|
93
|
+
});
|
|
94
|
+
describe('Course Copying', () => {
|
|
95
|
+
test('Copy course wholesale', async () => {
|
|
96
|
+
jest_fetch_mock_1.default.enableMocks();
|
|
97
|
+
const fetch = global.fetch;
|
|
98
|
+
const courseName = 'Test course the testing course';
|
|
99
|
+
const courseCode = "TEST000";
|
|
100
|
+
const sourceCourseData = {
|
|
101
|
+
...mockCourseData_1.mockCourseData,
|
|
102
|
+
name: `DEV_${courseCode}: ${courseName}`,
|
|
103
|
+
course_code: `DEV_${courseCode}`
|
|
104
|
+
};
|
|
105
|
+
const sourceCourse = new Course_1.Course(sourceCourseData);
|
|
106
|
+
const newCode = 'BP_TEST000';
|
|
107
|
+
const newName = `BP_TEST000: ${courseName}`;
|
|
108
|
+
const workflowStates = [
|
|
109
|
+
...[...(0, canvasUtils_1.range)(0, 2)].map(_ => 'queued'),
|
|
110
|
+
...[...(0, canvasUtils_1.range)(0, 2)].map(_ => 'running'),
|
|
111
|
+
'completed',
|
|
112
|
+
];
|
|
113
|
+
const workflowIterator = workflowStates.values();
|
|
114
|
+
jest_fetch_mock_1.default.mockClear();
|
|
115
|
+
jest_fetch_mock_1.default.mockResponses(...[
|
|
116
|
+
sourceCourseData,
|
|
117
|
+
{ ...mockMigrationData_1.mockMigrationData, workflow_state: 'queued' },
|
|
118
|
+
...workflowStates.map((state, i) => ({
|
|
119
|
+
...mockProgressData_1.mockProgressData,
|
|
120
|
+
workflow_state: state,
|
|
121
|
+
message: i.toString(),
|
|
122
|
+
})),
|
|
123
|
+
{ ...sourceCourse.rawData, name: newName, course_code: newCode },
|
|
124
|
+
].map(value => JSON.stringify(value)));
|
|
125
|
+
const migrationGenerator = (0, index_1.copyToNewCourseGenerator)(sourceCourse, newCode, 20);
|
|
126
|
+
async function testCourseMigration() {
|
|
127
|
+
let result;
|
|
128
|
+
while (true) {
|
|
129
|
+
result = await migrationGenerator.next();
|
|
130
|
+
const { value } = workflowIterator.next();
|
|
131
|
+
if (result.done)
|
|
132
|
+
return result.value;
|
|
133
|
+
expect(result.value.workflow_state).toBe(value);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
const course = await testCourseMigration();
|
|
137
|
+
expect(course.name).toBe(newName);
|
|
138
|
+
expect(course.course_code).toBe(newCode);
|
|
139
|
+
});
|
|
140
|
+
});
|
|
141
|
+
//# sourceMappingURL=migration.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migration.test.js","sourceRoot":"","sources":["../../../../src/course/migration/__tests__/migration.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const migrationCache_1 = require("../migrationCache");
|
|
4
|
+
const mockMigrationData_1 = require("../../../course/migration/__mocks__/mockMigrationData");
|
|
5
|
+
const canvasUtils_1 = require("../../../canvasUtils");
|
|
6
|
+
describe('Saving and loading migration states', () => {
|
|
7
|
+
beforeEach(() => {
|
|
8
|
+
localStorage.clear();
|
|
9
|
+
});
|
|
10
|
+
afterEach(() => {
|
|
11
|
+
localStorage.clear();
|
|
12
|
+
});
|
|
13
|
+
it('has base functions that save and load migration data', () => {
|
|
14
|
+
const migrations = (0, migrationCache_1.loadCachedCourseMigrations)(0);
|
|
15
|
+
expect(migrations).toHaveLength(0);
|
|
16
|
+
const cachedKeys = {};
|
|
17
|
+
for (const i of [...(0, canvasUtils_1.range)(0, 5)]) {
|
|
18
|
+
const key = i * 2;
|
|
19
|
+
const migrationsToCache = [...(0, canvasUtils_1.range)(1, i)].map(_ => mockMigrationData_1.mockMigrationData);
|
|
20
|
+
(0, migrationCache_1.cacheCourseMigrations)(i * 2, migrationsToCache);
|
|
21
|
+
expect(Object.entries((0, migrationCache_1.loadCachedMigrations)())).toHaveLength(i + 1);
|
|
22
|
+
cachedKeys[key] = i;
|
|
23
|
+
//Make sure all previous cached migrations have the same value going on.
|
|
24
|
+
for (const [key, value] of Object.entries(cachedKeys)) {
|
|
25
|
+
expect((0, migrationCache_1.loadCachedCourseMigrations)(key)).toHaveLength(value);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
});
|
|
29
|
+
it('adds new migrations to cached migration list', () => {
|
|
30
|
+
(0, migrationCache_1.cacheCourseMigrations)(1, [{ ...mockMigrationData_1.mockMigrationData, id: 1 }]);
|
|
31
|
+
expect((0, migrationCache_1.loadCachedCourseMigrations)(1)).toHaveLength(1);
|
|
32
|
+
(0, migrationCache_1.cacheCourseMigrations)(1, [{ ...mockMigrationData_1.mockMigrationData, id: 2 }]);
|
|
33
|
+
expect((0, migrationCache_1.loadCachedCourseMigrations)(1)).toHaveLength(2);
|
|
34
|
+
});
|
|
35
|
+
it('adds new migrations to cached migration list', () => {
|
|
36
|
+
(0, migrationCache_1.cacheCourseMigrations)(1, [{ ...mockMigrationData_1.mockMigrationData, id: 1, workflow_state: 'queued' }]);
|
|
37
|
+
expect((0, migrationCache_1.loadCachedCourseMigrations)(1)).toHaveLength(1);
|
|
38
|
+
(0, migrationCache_1.cacheCourseMigrations)(1, [{ ...mockMigrationData_1.mockMigrationData, id: 1, workflow_state: 'completed', cleanedUp: false }]);
|
|
39
|
+
expect((0, migrationCache_1.loadCachedCourseMigrations)(1)).toHaveLength(1);
|
|
40
|
+
});
|
|
41
|
+
});
|
|
42
|
+
//# sourceMappingURL=migrationCache.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migrationCache.test.js","sourceRoot":"","sources":["../../../../src/course/migration/__tests__/migrationCache.test.ts"],"names":[],"mappings":";;AAAA,sDAA0G;AAC1G,sFAAiF;AACjF,sDAA2C;AAE3C,QAAQ,CAAC,qCAAqC,EAAE,GAAG,EAAE;IACjD,UAAU,CAAC,GAAG,EAAE;QACZ,YAAY,CAAC,KAAK,EAAE,CAAC;IACzB,CAAC,CAAC,CAAA;IACF,SAAS,CAAC,GAAG,EAAE;QACX,YAAY,CAAC,KAAK,EAAE,CAAC;IACzB,CAAC,CAAC,CAAA;IACF,EAAE,CAAC,sDAAsD,EAAE,GAAG,EAAE;QAC5D,MAAM,UAAU,GAAG,IAAA,2CAA0B,EAAC,CAAC,CAAC,CAAC;QACjD,MAAM,CAAC,UAAU,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAEnC,MAAM,UAAU,GAA2B,EAAE,CAAC;QAC9C,KAAI,MAAM,CAAC,IAAI,CAAC,GAAG,IAAA,mBAAK,EAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC9B,MAAM,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;YAClB,MAAM,iBAAiB,GAAG,CAAC,GAAG,IAAA,mBAAK,EAAC,CAAC,EAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAE,CAAC,CAAC,EAAE,CAAC,qCAAiB,CAAC,CAAA;YACtE,IAAA,sCAAqB,EAAC,CAAC,GAAG,CAAC,EAAG,iBAAiB,CAAC,CAAC;YACjD,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,IAAA,qCAAoB,GAAE,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,GAAG,CAAC,CAAC,CAAA;YAClE,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACpB,wEAAwE;YACxE,KAAI,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;gBACnD,MAAM,CAAC,IAAA,2CAA0B,EAAC,GAAG,CAAC,CAAC,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;YAChE,CAAC;QACL,CAAC;IACL,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;QACpD,IAAA,sCAAqB,EAAC,CAAC,EAAE,CAAC,EAAC,GAAG,qCAAiB,EAAE,EAAE,EAAE,CAAC,EAAC,CAAC,CAAC,CAAA;QACzD,MAAM,CAAC,IAAA,2CAA0B,EAAC,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QACtD,IAAA,sCAAqB,EAAC,CAAC,EAAE,CAAC,EAAC,GAAG,qCAAiB,EAAE,EAAE,EAAE,CAAC,EAAC,CAAC,CAAC,CAAA;QACzD,MAAM,CAAC,IAAA,2CAA0B,EAAC,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IACzD,CAAC,CAAC,CAAA;IAEH,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;QACpD,IAAA,sCAAqB,EAAC,CAAC,EAAE,CAAC,EAAC,GAAG,qCAAiB,EAAE,EAAE,EAAE,CAAC,EAAE,cAAc,EAAE,QAAQ,EAAC,CAAC,CAAC,CAAA;QACnF,MAAM,CAAC,IAAA,2CAA0B,EAAC,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QACtD,IAAA,sCAAqB,EAAC,CAAC,EAAE,CAAC,EAAC,GAAG,qCAAiB,EAAE,EAAE,EAAE,CAAC,EAAE,cAAc,EAAE,WAAW,EAAE,SAAS,EAAE,KAAK,EAAC,CAAC,CAAC,CAAC;QACzG,MAAM,CAAC,IAAA,2CAA0B,EAAC,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IACzD,CAAC,CAAC,CAAA;AAGP,CAAC,CAAC,CAAA"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { ICanvasCallConfig } from "
|
|
1
|
+
import { ICanvasCallConfig } from "../../canvasUtils";
|
|
2
2
|
import { Course } from "../Course";
|
|
3
|
-
import { GetCourseOptions } from "
|
|
3
|
+
import { GetCourseOptions } from "../../course/courseTypes";
|
|
4
4
|
export type WorkflowState = 'queued' | 'running' | 'completed' | 'failed';
|
|
5
5
|
export interface IMigrationData {
|
|
6
6
|
migration_type: string;
|