@falkenslab/moodle-driver 0.0.0-stage → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +131 -2
- package/dist/areas/activities/build.d.ts +98 -0
- package/dist/areas/activities/build.js +248 -0
- package/dist/areas/activities/build.js.map +1 -0
- package/dist/areas/activities/content.d.ts +53 -0
- package/dist/areas/activities/content.js +113 -0
- package/dist/areas/activities/content.js.map +1 -0
- package/dist/areas/assignments/grader.d.ts +68 -0
- package/dist/areas/assignments/grader.js +169 -0
- package/dist/areas/assignments/grader.js.map +1 -0
- package/dist/areas/assignments/grading.d.ts +86 -0
- package/dist/areas/assignments/grading.js +162 -0
- package/dist/areas/assignments/grading.js.map +1 -0
- package/dist/areas/assignments/student.d.ts +57 -0
- package/dist/areas/assignments/student.js +115 -0
- package/dist/areas/assignments/student.js.map +1 -0
- package/dist/areas/calendar/calendar.d.ts +43 -0
- package/dist/areas/calendar/calendar.js +84 -0
- package/dist/areas/calendar/calendar.js.map +1 -0
- package/dist/areas/completion/completion.d.ts +50 -0
- package/dist/areas/completion/completion.js +112 -0
- package/dist/areas/completion/completion.js.map +1 -0
- package/dist/areas/courses/list.d.ts +59 -0
- package/dist/areas/courses/list.js +74 -0
- package/dist/areas/courses/list.js.map +1 -0
- package/dist/areas/courses/overview.d.ts +83 -0
- package/dist/areas/courses/overview.js +137 -0
- package/dist/areas/courses/overview.js.map +1 -0
- package/dist/areas/courses/state.d.ts +51 -0
- package/dist/areas/courses/state.js +45 -0
- package/dist/areas/courses/state.js.map +1 -0
- package/dist/areas/courses/structure.d.ts +89 -0
- package/dist/areas/courses/structure.js +104 -0
- package/dist/areas/courses/structure.js.map +1 -0
- package/dist/areas/forums/discussions.d.ts +57 -0
- package/dist/areas/forums/discussions.js +119 -0
- package/dist/areas/forums/discussions.js.map +1 -0
- package/dist/areas/forums/posts.d.ts +83 -0
- package/dist/areas/forums/posts.js +114 -0
- package/dist/areas/forums/posts.js.map +1 -0
- package/dist/areas/grades/gradebook.d.ts +104 -0
- package/dist/areas/grades/gradebook.js +250 -0
- package/dist/areas/grades/gradebook.js.map +1 -0
- package/dist/areas/grades/user-report.d.ts +26 -0
- package/dist/areas/grades/user-report.js +71 -0
- package/dist/areas/grades/user-report.js.map +1 -0
- package/dist/areas/h5p/h5p.d.ts +33 -0
- package/dist/areas/h5p/h5p.js +104 -0
- package/dist/areas/h5p/h5p.js.map +1 -0
- package/dist/areas/lessons/lessons.d.ts +60 -0
- package/dist/areas/lessons/lessons.js +145 -0
- package/dist/areas/lessons/lessons.js.map +1 -0
- package/dist/areas/messages/messages.d.ts +68 -0
- package/dist/areas/messages/messages.js +84 -0
- package/dist/areas/messages/messages.js.map +1 -0
- package/dist/areas/participants/participants.d.ts +57 -0
- package/dist/areas/participants/participants.js +135 -0
- package/dist/areas/participants/participants.js.map +1 -0
- package/dist/areas/questions/banks.d.ts +83 -0
- package/dist/areas/questions/banks.js +239 -0
- package/dist/areas/questions/banks.js.map +1 -0
- package/dist/areas/quizzes/attempts.d.ts +123 -0
- package/dist/areas/quizzes/attempts.js +300 -0
- package/dist/areas/quizzes/attempts.js.map +1 -0
- package/dist/areas/quizzes/results.d.ts +36 -0
- package/dist/areas/quizzes/results.js +93 -0
- package/dist/areas/quizzes/results.js.map +1 -0
- package/dist/areas/quizzes/structure.d.ts +42 -0
- package/dist/areas/quizzes/structure.js +100 -0
- package/dist/areas/quizzes/structure.js.map +1 -0
- package/dist/areas/scorm/scorm.d.ts +60 -0
- package/dist/areas/scorm/scorm.js +171 -0
- package/dist/areas/scorm/scorm.js.map +1 -0
- package/dist/areas/site/info.d.ts +25 -0
- package/dist/areas/site/info.js +45 -0
- package/dist/areas/site/info.js.map +1 -0
- package/dist/areas/site/users.d.ts +56 -0
- package/dist/areas/site/users.js +89 -0
- package/dist/areas/site/users.js.map +1 -0
- package/dist/areas/surveys/choice.d.ts +38 -0
- package/dist/areas/surveys/choice.js +105 -0
- package/dist/areas/surveys/choice.js.map +1 -0
- package/dist/areas/surveys/surveys.d.ts +51 -0
- package/dist/areas/surveys/surveys.js +201 -0
- package/dist/areas/surveys/surveys.js.map +1 -0
- package/dist/browser/chromium.d.ts +15 -0
- package/dist/browser/chromium.js +53 -0
- package/dist/browser/chromium.js.map +1 -0
- package/dist/browser/cookies.d.ts +11 -0
- package/dist/browser/cookies.js +31 -0
- package/dist/browser/cookies.js.map +1 -0
- package/dist/browser/manager.d.ts +57 -0
- package/dist/browser/manager.js +177 -0
- package/dist/browser/manager.js.map +1 -0
- package/dist/browser.d.ts +53 -0
- package/dist/browser.js +167 -0
- package/dist/browser.js.map +1 -0
- package/dist/categories.d.ts +28 -0
- package/dist/categories.js +225 -0
- package/dist/categories.js.map +1 -0
- package/dist/chromiumInstaller.d.ts +15 -0
- package/dist/chromiumInstaller.js +52 -0
- package/dist/chromiumInstaller.js.map +1 -0
- package/dist/cli/args.d.ts +33 -0
- package/dist/cli/args.js +194 -0
- package/dist/cli/args.js.map +1 -0
- package/dist/cli/commands.generated.d.ts +4 -0
- package/dist/cli/commands.generated.js +2217 -0
- package/dist/cli/commands.generated.js.map +1 -0
- package/dist/cli/config.d.ts +46 -0
- package/dist/cli/config.js +107 -0
- package/dist/cli/config.js.map +1 -0
- package/dist/cli/main.d.ts +2 -0
- package/dist/cli/main.js +19 -0
- package/dist/cli/main.js.map +1 -0
- package/dist/cli/output.d.ts +4 -0
- package/dist/cli/output.js +71 -0
- package/dist/cli/output.js.map +1 -0
- package/dist/cli/run.d.ts +15 -0
- package/dist/cli/run.js +194 -0
- package/dist/cli/run.js.map +1 -0
- package/dist/cli/spec.d.ts +42 -0
- package/dist/cli/spec.js +4 -0
- package/dist/cli/spec.js.map +1 -0
- package/dist/client.d.ts +224 -0
- package/dist/client.js +182 -0
- package/dist/client.js.map +1 -0
- package/dist/core/ajax.d.ts +25 -0
- package/dist/core/ajax.js +85 -0
- package/dist/core/ajax.js.map +1 -0
- package/dist/core/editor.d.ts +18 -0
- package/dist/core/editor.js +51 -0
- package/dist/core/editor.js.map +1 -0
- package/dist/core/errors.d.ts +12 -0
- package/dist/core/errors.js +10 -0
- package/dist/core/errors.js.map +1 -0
- package/dist/core/files.d.ts +16 -0
- package/dist/core/files.js +58 -0
- package/dist/core/files.js.map +1 -0
- package/dist/core/forms.d.ts +45 -0
- package/dist/core/forms.js +200 -0
- package/dist/core/forms.js.map +1 -0
- package/dist/core/http.d.ts +18 -0
- package/dist/core/http.js +22 -0
- package/dist/core/http.js.map +1 -0
- package/dist/core/inPage.d.ts +8 -0
- package/dist/core/inPage.js +10 -0
- package/dist/core/inPage.js.map +1 -0
- package/dist/core/login.d.ts +40 -0
- package/dist/core/login.js +83 -0
- package/dist/core/login.js.map +1 -0
- package/dist/core/pace.d.ts +4 -0
- package/dist/core/pace.js +21 -0
- package/dist/core/pace.js.map +1 -0
- package/dist/core/session.d.ts +55 -0
- package/dist/core/session.js +157 -0
- package/dist/core/session.js.map +1 -0
- package/dist/core/site.d.ts +8 -0
- package/dist/core/site.js +36 -0
- package/dist/core/site.js.map +1 -0
- package/dist/core/text.d.ts +21 -0
- package/dist/core/text.js +113 -0
- package/dist/core/text.js.map +1 -0
- package/dist/home.d.ts +19 -0
- package/dist/home.js +54 -0
- package/dist/home.js.map +1 -0
- package/dist/index.d.ts +41 -0
- package/dist/index.js +52 -0
- package/dist/index.js.map +1 -0
- package/dist/internals.d.ts +11 -0
- package/dist/internals.js +15 -0
- package/dist/internals.js.map +1 -0
- package/dist/moodle/activities.d.ts +94 -0
- package/dist/moodle/activities.js +240 -0
- package/dist/moodle/activities.js.map +1 -0
- package/dist/moodle/ajax.d.ts +22 -0
- package/dist/moodle/ajax.js +91 -0
- package/dist/moodle/ajax.js.map +1 -0
- package/dist/moodle/assign.d.ts +65 -0
- package/dist/moodle/assign.js +162 -0
- package/dist/moodle/assign.js.map +1 -0
- package/dist/moodle/calendar.d.ts +41 -0
- package/dist/moodle/calendar.js +80 -0
- package/dist/moodle/calendar.js.map +1 -0
- package/dist/moodle/choice.d.ts +33 -0
- package/dist/moodle/choice.js +100 -0
- package/dist/moodle/choice.js.map +1 -0
- package/dist/moodle/completion.d.ts +48 -0
- package/dist/moodle/completion.js +108 -0
- package/dist/moodle/completion.js.map +1 -0
- package/dist/moodle/content.d.ts +43 -0
- package/dist/moodle/content.js +105 -0
- package/dist/moodle/content.js.map +1 -0
- package/dist/moodle/course.d.ts +51 -0
- package/dist/moodle/course.js +45 -0
- package/dist/moodle/course.js.map +1 -0
- package/dist/moodle/courses.d.ts +57 -0
- package/dist/moodle/courses.js +70 -0
- package/dist/moodle/courses.js.map +1 -0
- package/dist/moodle/editor.d.ts +18 -0
- package/dist/moodle/editor.js +50 -0
- package/dist/moodle/editor.js.map +1 -0
- package/dist/moodle/files.d.ts +16 -0
- package/dist/moodle/files.js +57 -0
- package/dist/moodle/files.js.map +1 -0
- package/dist/moodle/forms.d.ts +44 -0
- package/dist/moodle/forms.js +199 -0
- package/dist/moodle/forms.js.map +1 -0
- package/dist/moodle/forum.d.ts +55 -0
- package/dist/moodle/forum.js +115 -0
- package/dist/moodle/forum.js.map +1 -0
- package/dist/moodle/forumPosts.d.ts +83 -0
- package/dist/moodle/forumPosts.js +113 -0
- package/dist/moodle/forumPosts.js.map +1 -0
- package/dist/moodle/gradebook.d.ts +102 -0
- package/dist/moodle/gradebook.js +246 -0
- package/dist/moodle/gradebook.js.map +1 -0
- package/dist/moodle/grades.d.ts +24 -0
- package/dist/moodle/grades.js +67 -0
- package/dist/moodle/grades.js.map +1 -0
- package/dist/moodle/grading.d.ts +92 -0
- package/dist/moodle/grading.js +161 -0
- package/dist/moodle/grading.js.map +1 -0
- package/dist/moodle/h5p.d.ts +31 -0
- package/dist/moodle/h5p.js +100 -0
- package/dist/moodle/h5p.js.map +1 -0
- package/dist/moodle/inPage.d.ts +8 -0
- package/dist/moodle/inPage.js +10 -0
- package/dist/moodle/inPage.js.map +1 -0
- package/dist/moodle/lesson.d.ts +57 -0
- package/dist/moodle/lesson.js +140 -0
- package/dist/moodle/lesson.js.map +1 -0
- package/dist/moodle/login.d.ts +37 -0
- package/dist/moodle/login.js +77 -0
- package/dist/moodle/login.js.map +1 -0
- package/dist/moodle/messages.d.ts +66 -0
- package/dist/moodle/messages.js +80 -0
- package/dist/moodle/messages.js.map +1 -0
- package/dist/moodle/overview.d.ts +83 -0
- package/dist/moodle/overview.js +137 -0
- package/dist/moodle/overview.js.map +1 -0
- package/dist/moodle/pace.d.ts +4 -0
- package/dist/moodle/pace.js +19 -0
- package/dist/moodle/pace.js.map +1 -0
- package/dist/moodle/participants.d.ts +55 -0
- package/dist/moodle/participants.js +131 -0
- package/dist/moodle/participants.js.map +1 -0
- package/dist/moodle/questionBank.d.ts +81 -0
- package/dist/moodle/questionBank.js +235 -0
- package/dist/moodle/questionBank.js.map +1 -0
- package/dist/moodle/quiz.d.ts +117 -0
- package/dist/moodle/quiz.js +291 -0
- package/dist/moodle/quiz.js.map +1 -0
- package/dist/moodle/quizResults.d.ts +36 -0
- package/dist/moodle/quizResults.js +93 -0
- package/dist/moodle/quizResults.js.map +1 -0
- package/dist/moodle/quizStructure.d.ts +42 -0
- package/dist/moodle/quizStructure.js +100 -0
- package/dist/moodle/quizStructure.js.map +1 -0
- package/dist/moodle/session.d.ts +39 -0
- package/dist/moodle/session.js +99 -0
- package/dist/moodle/session.js.map +1 -0
- package/dist/moodle/site.d.ts +8 -0
- package/dist/moodle/site.js +36 -0
- package/dist/moodle/site.js.map +1 -0
- package/dist/moodle/siteInfo.d.ts +25 -0
- package/dist/moodle/siteInfo.js +45 -0
- package/dist/moodle/siteInfo.js.map +1 -0
- package/dist/moodle/structure.d.ts +94 -0
- package/dist/moodle/structure.js +103 -0
- package/dist/moodle/structure.js.map +1 -0
- package/dist/moodle/submission.d.ts +48 -0
- package/dist/moodle/submission.js +109 -0
- package/dist/moodle/submission.js.map +1 -0
- package/dist/moodle/survey.d.ts +47 -0
- package/dist/moodle/survey.js +197 -0
- package/dist/moodle/survey.js.map +1 -0
- package/dist/moodle/text.d.ts +21 -0
- package/dist/moodle/text.js +113 -0
- package/dist/moodle/text.js.map +1 -0
- package/dist/moodle/user.d.ts +54 -0
- package/dist/moodle/user.js +78 -0
- package/dist/moodle/user.js.map +1 -0
- package/dist/options.d.ts +30 -0
- package/dist/options.js +35 -0
- package/dist/options.js.map +1 -0
- package/dist/sessionCookies.d.ts +11 -0
- package/dist/sessionCookies.js +31 -0
- package/dist/sessionCookies.js.map +1 -0
- package/dist/testing/fakeMoodle.d.ts +55 -0
- package/dist/testing/fakeMoodle.js +103 -0
- package/dist/testing/fakeMoodle.js.map +1 -0
- package/dist/testing/gradingPanel.d.ts +6 -0
- package/dist/testing/gradingPanel.js +22 -0
- package/dist/testing/gradingPanel.js.map +1 -0
- package/dist/testing/index.d.ts +5 -0
- package/dist/testing/index.js +18 -0
- package/dist/testing/index.js.map +1 -0
- package/package.json +78 -4
|
@@ -0,0 +1,225 @@
|
|
|
1
|
+
// What data each public function reads or writes, so a program can decide what to allow (an agent
|
|
2
|
+
// that builds content but never reads students' work) without classifying the driver by hand.
|
|
3
|
+
/**
|
|
4
|
+
* A kind of data a function reads or writes:
|
|
5
|
+
* - `none`: the session or the site, nothing of anyone's; also functions that only parse what the
|
|
6
|
+
* caller already fetched (a page, HTML, JSON), whose data belongs to whatever fetched it.
|
|
7
|
+
* - `own`: the person's own data and actions (their courses, attempts, submissions, grades).
|
|
8
|
+
* - `course-content`: what teachers make (structure, activities' content and settings, rubrics' definitions, questions).
|
|
9
|
+
* - `others-aggregate`: counts about others that identify no one ("2 of 4 submitted").
|
|
10
|
+
* - `others-personal`: others' data or work (names, roles, submissions, posts, attempts, responses, grades).
|
|
11
|
+
* - `others-write`: deciding about others (grades, feedback, extensions, overrides, completion).
|
|
12
|
+
* - `communication`: writing to or before others (forum posts, messages).
|
|
13
|
+
* - `any`: generic primitives that reach whatever they're pointed at (services, pages, forms).
|
|
14
|
+
*/
|
|
15
|
+
export const ALL_DATA_CATEGORIES = ["none", "own", "course-content", "others-aggregate", "others-personal", "others-write", "communication", "any"];
|
|
16
|
+
const NONE = ["none"];
|
|
17
|
+
const OWN = ["own"];
|
|
18
|
+
const CONTENT = ["course-content"];
|
|
19
|
+
const PERSONAL = ["others-personal"];
|
|
20
|
+
const ANY = ["any"];
|
|
21
|
+
/**
|
|
22
|
+
* The data categories of every function exported from the package, and of the browser manager's
|
|
23
|
+
* methods (`BrowserManager.<method>`) and the Moodle object's own (`Moodle.<method>`; its other methods are
|
|
24
|
+
* the functions of the same name). A function that may touch several kinds lists them all; a
|
|
25
|
+
* program takes the strictest. Functions that read activities of any module answer per module
|
|
26
|
+
* through `moduleCategories()`.
|
|
27
|
+
*/
|
|
28
|
+
export const DATA_CATEGORIES = {
|
|
29
|
+
// The browser and the session.
|
|
30
|
+
createBrowserManager: NONE,
|
|
31
|
+
// The Moodle object: its bound methods are classified as their functions, of the same name.
|
|
32
|
+
createMoodle: NONE,
|
|
33
|
+
"Moodle.context": NONE,
|
|
34
|
+
"Moodle.logIn": NONE,
|
|
35
|
+
"Moodle.publicSiteInfo": NONE,
|
|
36
|
+
"Moodle.callService": ANY,
|
|
37
|
+
"Moodle.openScorm": OWN,
|
|
38
|
+
"Moodle.tab": ANY,
|
|
39
|
+
"Moodle.visible": NONE,
|
|
40
|
+
"Moodle.setVisible": NONE,
|
|
41
|
+
"Moodle.saveSession": NONE,
|
|
42
|
+
"Moodle.close": NONE,
|
|
43
|
+
// The context is what every function takes: what's done with it is classified by those functions.
|
|
44
|
+
"BrowserManager.context": NONE,
|
|
45
|
+
"BrowserManager.openChannel": NONE,
|
|
46
|
+
"BrowserManager.chromiumDownload": NONE,
|
|
47
|
+
"BrowserManager.visible": NONE,
|
|
48
|
+
"BrowserManager.setVisible": NONE,
|
|
49
|
+
"BrowserManager.show": NONE,
|
|
50
|
+
"BrowserManager.tab": ANY,
|
|
51
|
+
"BrowserManager.saveSession": NONE,
|
|
52
|
+
"BrowserManager.close": NONE,
|
|
53
|
+
canShowWindow: NONE,
|
|
54
|
+
parseSiteUrl: NONE,
|
|
55
|
+
siteProfileDir: NONE,
|
|
56
|
+
findMoodleSite: NONE,
|
|
57
|
+
readWwwroot: NONE,
|
|
58
|
+
publicSiteInfo: NONE,
|
|
59
|
+
siteName: NONE,
|
|
60
|
+
logIn: NONE,
|
|
61
|
+
logOut: NONE,
|
|
62
|
+
readSessionFacts: NONE,
|
|
63
|
+
htmlSessionFacts: NONE,
|
|
64
|
+
readMoodleConfig: NONE,
|
|
65
|
+
isLoggedIn: NONE,
|
|
66
|
+
pageIsLoggedIn: NONE,
|
|
67
|
+
dateSelectorValues: NONE,
|
|
68
|
+
dateSelectorDate: NONE,
|
|
69
|
+
moodleErrorMessage: NONE,
|
|
70
|
+
moduleCategories: NONE,
|
|
71
|
+
// Generic primitives.
|
|
72
|
+
callService: ANY,
|
|
73
|
+
openSitePage: ANY,
|
|
74
|
+
fetchSitePage: ANY,
|
|
75
|
+
inPage: ANY,
|
|
76
|
+
openForm: ANY,
|
|
77
|
+
formValue: ANY,
|
|
78
|
+
setFields: ANY,
|
|
79
|
+
uploadToDraft: ANY,
|
|
80
|
+
submitForm: ANY,
|
|
81
|
+
editCourse: ANY,
|
|
82
|
+
// Parsing and pacing helpers: nothing fetched.
|
|
83
|
+
decodeEntities: NONE,
|
|
84
|
+
readTexts: NONE,
|
|
85
|
+
readMedia: NONE,
|
|
86
|
+
readingSeconds: NONE,
|
|
87
|
+
pause: NONE,
|
|
88
|
+
checkLocalFiles: NONE,
|
|
89
|
+
fileNameFor: NONE,
|
|
90
|
+
// The person.
|
|
91
|
+
readOwnProfile: OWN,
|
|
92
|
+
readPageConfig: OWN,
|
|
93
|
+
whoAmI: OWN,
|
|
94
|
+
courseAbilities: OWN,
|
|
95
|
+
listCourses: OWN,
|
|
96
|
+
updateCourse: CONTENT,
|
|
97
|
+
myGrades: OWN,
|
|
98
|
+
deadlines: OWN,
|
|
99
|
+
pendingActivities: OWN,
|
|
100
|
+
userById: PERSONAL,
|
|
101
|
+
courseRoles: PERSONAL,
|
|
102
|
+
// Courses and their content. The course's state carries the person's own completion.
|
|
103
|
+
courseState: ["course-content", "own"],
|
|
104
|
+
courseStructure: ["course-content", "own"],
|
|
105
|
+
activityDetails: CONTENT,
|
|
106
|
+
courseActivityTypes: CONTENT,
|
|
107
|
+
listAssignments: CONTENT,
|
|
108
|
+
activityContent: CONTENT,
|
|
109
|
+
createActivity: CONTENT,
|
|
110
|
+
activitySettings: CONTENT,
|
|
111
|
+
updateActivity: CONTENT,
|
|
112
|
+
editActivity: CONTENT,
|
|
113
|
+
duplicateActivity: CONTENT,
|
|
114
|
+
deleteActivity: CONTENT,
|
|
115
|
+
addSection: CONTENT,
|
|
116
|
+
editSection: CONTENT,
|
|
117
|
+
deleteSection: CONTENT,
|
|
118
|
+
renameActivity: CONTENT,
|
|
119
|
+
renameSection: CONTENT,
|
|
120
|
+
activitiesOverview: ["course-content", "own", "others-aggregate"],
|
|
121
|
+
courseUpdates: ["course-content", "others-aggregate"],
|
|
122
|
+
// Course files, or others' (a submission's, a post's attachment): a program checks the URL.
|
|
123
|
+
downloadFile: ["course-content", "others-personal"],
|
|
124
|
+
// Assignments.
|
|
125
|
+
studentAssignment: ["course-content", "own"],
|
|
126
|
+
saveSubmission: OWN,
|
|
127
|
+
submitForGrading: OWN,
|
|
128
|
+
assignmentSubmissions: PERSONAL,
|
|
129
|
+
gradeSubmission: ["others-personal", "others-write"],
|
|
130
|
+
rubric: CONTENT,
|
|
131
|
+
grantExtension: ["others-write"],
|
|
132
|
+
// Quizzes: a teacher may review someone else's attempt.
|
|
133
|
+
quizInfo: ["course-content", "own"],
|
|
134
|
+
startQuizAttempt: OWN,
|
|
135
|
+
readAttempt: OWN,
|
|
136
|
+
answerQuizQuestions: OWN,
|
|
137
|
+
finishQuizAttempt: OWN,
|
|
138
|
+
readReview: ["own", "others-personal"],
|
|
139
|
+
setQuizOverride: ["others-write"],
|
|
140
|
+
quizResults: PERSONAL,
|
|
141
|
+
quizStructure: CONTENT,
|
|
142
|
+
addQuestionsToQuiz: CONTENT,
|
|
143
|
+
// Forums.
|
|
144
|
+
forumDiscussions: PERSONAL,
|
|
145
|
+
discussion: PERSONAL,
|
|
146
|
+
replyToPost: ["communication"],
|
|
147
|
+
startDiscussion: ["communication"],
|
|
148
|
+
setDiscussionState: ["others-personal", "communication"],
|
|
149
|
+
// Surveys.
|
|
150
|
+
getSurvey: ["course-content", "own"],
|
|
151
|
+
submitSurvey: OWN,
|
|
152
|
+
// Participants and groups.
|
|
153
|
+
participants: PERSONAL,
|
|
154
|
+
groups: PERSONAL,
|
|
155
|
+
participantFilters: ["course-content"],
|
|
156
|
+
// Completion: the person's own, deciding someone else's, everyone's report.
|
|
157
|
+
setCompletion: OWN,
|
|
158
|
+
overrideCompletion: ["others-write"],
|
|
159
|
+
completionReport: PERSONAL,
|
|
160
|
+
// The gradebook: everyone's grades, and its setup (course content).
|
|
161
|
+
graderReport: PERSONAL,
|
|
162
|
+
gradebookSetup: CONTENT,
|
|
163
|
+
updateGradeItem: CONTENT,
|
|
164
|
+
addGradeCategory: CONTENT,
|
|
165
|
+
// Question banks: what teachers write.
|
|
166
|
+
questionBanks: CONTENT,
|
|
167
|
+
questions: CONTENT,
|
|
168
|
+
importQuestions: CONTENT,
|
|
169
|
+
createQuestion: CONTENT,
|
|
170
|
+
// Messaging: the person's own notifications; conversations hold others' messages; sending is communication.
|
|
171
|
+
notifications: OWN,
|
|
172
|
+
markNotificationsRead: OWN,
|
|
173
|
+
conversations: PERSONAL,
|
|
174
|
+
conversation: PERSONAL,
|
|
175
|
+
sendMessage: ["communication"],
|
|
176
|
+
// The calendar: the person's upcoming events; course events are what teachers set.
|
|
177
|
+
upcomingEvents: ["own", "course-content"],
|
|
178
|
+
createEvent: CONTENT,
|
|
179
|
+
deleteEvent: CONTENT,
|
|
180
|
+
// H5P: the content (course content) and the person's own attempts.
|
|
181
|
+
h5pActivity: ["course-content", "own"],
|
|
182
|
+
scorm: ["course-content", "own"],
|
|
183
|
+
openScorm: OWN,
|
|
184
|
+
// Lessons: the person going through one.
|
|
185
|
+
lessonPage: ["course-content", "own"],
|
|
186
|
+
answerLessonPage: OWN,
|
|
187
|
+
// Choices: the person's own answer.
|
|
188
|
+
getChoice: ["course-content", "own"],
|
|
189
|
+
answerChoice: OWN,
|
|
190
|
+
};
|
|
191
|
+
// Modules whose activities hold only what teachers made: nobody else's work or responses.
|
|
192
|
+
const CONTENT_MODULES = new Set(["page", "book", "label", "url", "resource", "folder", "imscp", "subsection", "qbank"]);
|
|
193
|
+
// Modules that also hold participants' work or responses (forum posts, glossary entries, attempts…).
|
|
194
|
+
const PARTICIPANT_MODULES = new Set([
|
|
195
|
+
"assign",
|
|
196
|
+
"quiz",
|
|
197
|
+
"feedback",
|
|
198
|
+
"questionnaire",
|
|
199
|
+
"choice",
|
|
200
|
+
"lesson",
|
|
201
|
+
"h5pactivity",
|
|
202
|
+
"scorm",
|
|
203
|
+
"survey",
|
|
204
|
+
"lti",
|
|
205
|
+
"bigbluebuttonbn",
|
|
206
|
+
"forum",
|
|
207
|
+
"glossary",
|
|
208
|
+
"wiki",
|
|
209
|
+
"data",
|
|
210
|
+
"workshop",
|
|
211
|
+
"chat",
|
|
212
|
+
]);
|
|
213
|
+
/**
|
|
214
|
+
* The data a teacher reads when reading an activity of `module` with everything in it: course
|
|
215
|
+
* content alone for what teachers make (pages, books, files…), also others' personal data where
|
|
216
|
+
* participants leave work or responses. An unknown module (a plugin) could hold anything: `any`.
|
|
217
|
+
*/
|
|
218
|
+
export function moduleCategories(module) {
|
|
219
|
+
if (CONTENT_MODULES.has(module))
|
|
220
|
+
return CONTENT;
|
|
221
|
+
if (PARTICIPANT_MODULES.has(module))
|
|
222
|
+
return ["course-content", "others-personal"];
|
|
223
|
+
return ANY;
|
|
224
|
+
}
|
|
225
|
+
//# sourceMappingURL=categories.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"categories.js","sourceRoot":"","sources":["../src/categories.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { type ChildProcess } from "node:child_process";
|
|
2
|
+
export type InstallChromium = () => Promise<void>;
|
|
3
|
+
/**
|
|
4
|
+
* Starts a process that `killTree` can end with everything it starts: on Linux and macOS as the
|
|
5
|
+
* leader of its own process group; on Windows `taskkill /T` walks the tree, and no console opens.
|
|
6
|
+
*/
|
|
7
|
+
export declare function spawnTree(command: string, args: string[]): ChildProcess;
|
|
8
|
+
/** Ends a process started by `spawnTree` and its children, at once; nothing if it's gone. */
|
|
9
|
+
export declare function killTree(pid: number): void;
|
|
10
|
+
/**
|
|
11
|
+
* Downloads the Chromium this `playwright-core` expects with its own CLI (ADR-001), into
|
|
12
|
+
* `PLAYWRIGHT_BROWSERS_PATH` when set, else the user's `ms-playwright` cache. The CLI is in
|
|
13
|
+
* `node_modules`, where `playwright-core` is (a peer dependency).
|
|
14
|
+
*/
|
|
15
|
+
export declare const installChromium: InstallChromium;
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { spawn, spawnSync } from "node:child_process";
|
|
2
|
+
import { createRequire } from "node:module";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
/**
|
|
5
|
+
* Starts a process that `killTree` can end with everything it starts: on Linux and macOS as the
|
|
6
|
+
* leader of its own process group; on Windows `taskkill /T` walks the tree, and no console opens.
|
|
7
|
+
*/
|
|
8
|
+
export function spawnTree(command, args) {
|
|
9
|
+
return spawn(command, args, { stdio: ["ignore", "pipe", "pipe"], detached: process.platform !== "win32", windowsHide: true });
|
|
10
|
+
}
|
|
11
|
+
/** Ends a process started by `spawnTree` and its children, at once; nothing if it's gone. */
|
|
12
|
+
export function killTree(pid) {
|
|
13
|
+
try {
|
|
14
|
+
if (process.platform === "win32")
|
|
15
|
+
spawnSync("taskkill", ["/PID", String(pid), "/T", "/F"], { stdio: "ignore", windowsHide: true });
|
|
16
|
+
else
|
|
17
|
+
process.kill(-pid, "SIGKILL");
|
|
18
|
+
}
|
|
19
|
+
catch {
|
|
20
|
+
// Already gone.
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Downloads the Chromium this `playwright-core` expects with its own CLI (ADR-001), into
|
|
25
|
+
* `PLAYWRIGHT_BROWSERS_PATH` when set, else the user's `ms-playwright` cache. The CLI is in
|
|
26
|
+
* `node_modules`, where `playwright-core` is (a peer dependency).
|
|
27
|
+
*/
|
|
28
|
+
export const installChromium = () => new Promise((resolve, reject) => {
|
|
29
|
+
const cli = path.join(path.dirname(createRequire(import.meta.url).resolve("playwright-core/package.json")), "cli.js");
|
|
30
|
+
// --no-shell: the driver launches full Chromium headless too (channel "chromium").
|
|
31
|
+
// --no-remove: the cache is shared, and other installations' browsers aren't ours to remove.
|
|
32
|
+
const child = spawnTree(process.execPath, [cli, "install", "chromium", "--no-shell", "--no-remove", "--no-progress"]);
|
|
33
|
+
// The CLI downloads from a child of its own: when the program exits, the whole tree goes with it,
|
|
34
|
+
// instead of downloading on with nobody to use it (a partial download is started over next time).
|
|
35
|
+
const stop = () => killTree(child.pid);
|
|
36
|
+
process.on("exit", stop);
|
|
37
|
+
// A program's stdout may be a protocol (an MCP server's): whatever the installer prints goes to stderr.
|
|
38
|
+
child.stdout.pipe(process.stderr, { end: false });
|
|
39
|
+
child.stderr.pipe(process.stderr, { end: false });
|
|
40
|
+
child.on("error", (error) => {
|
|
41
|
+
process.off("exit", stop);
|
|
42
|
+
reject(error);
|
|
43
|
+
});
|
|
44
|
+
child.on("exit", (code) => {
|
|
45
|
+
process.off("exit", stop);
|
|
46
|
+
if (code === 0)
|
|
47
|
+
resolve();
|
|
48
|
+
else
|
|
49
|
+
reject(new Error(`Chromium's installer exited with code ${code}`));
|
|
50
|
+
});
|
|
51
|
+
});
|
|
52
|
+
//# sourceMappingURL=chromiumInstaller.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chromiumInstaller.js","sourceRoot":"","sources":["../src/chromiumInstaller.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,SAAS,EAAqB,MAAM,oBAAoB,CAAC;AACzE,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,IAAI,MAAM,WAAW,CAAC;AAI7B;;;GAGG;AACH,MAAM,UAAU,SAAS,CAAC,OAAe,EAAE,IAAc;IACvD,OAAO,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC;AAChI,CAAC;AAED,6FAA6F;AAC7F,MAAM,UAAU,QAAQ,CAAC,GAAW;IAClC,IAAI,CAAC;QACH,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO;YAAE,SAAS,CAAC,UAAU,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC;;YAC9H,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;IACrC,CAAC;IAAC,MAAM,CAAC;QACP,gBAAgB;IAClB,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,MAAM,eAAe,GAAoB,GAAG,EAAE,CACnD,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;IAC9B,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,8BAA8B,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;IACtH,mFAAmF;IACnF,6FAA6F;IAC7F,MAAM,KAAK,GAAG,SAAS,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,GAAG,EAAE,SAAS,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,eAAe,CAAC,CAAC,CAAC;IACtH,kGAAkG;IAClG,kGAAkG;IAClG,MAAM,IAAI,GAAG,GAAG,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAI,CAAC,CAAC;IACxC,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IACzB,wGAAwG;IACxG,KAAK,CAAC,MAAO,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC;IACnD,KAAK,CAAC,MAAO,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC;IACnD,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;QAC1B,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QAC1B,MAAM,CAAC,KAAK,CAAC,CAAC;IAChB,CAAC,CAAC,CAAC;IACH,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;QACxB,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QAC1B,IAAI,IAAI,KAAK,CAAC;YAAE,OAAO,EAAE,CAAC;;YACrB,MAAM,CAAC,IAAI,KAAK,CAAC,yCAAyC,IAAI,EAAE,CAAC,CAAC,CAAC;IAC1E,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { CommandSpec, ParamSpec } from "./spec.js";
|
|
2
|
+
/** A command line that doesn't fit the command: printed with how to get help, exit status 2. */
|
|
3
|
+
export declare class UsageError extends Error {
|
|
4
|
+
name: string;
|
|
5
|
+
}
|
|
6
|
+
/** The command's own flags, set apart from the arguments. */
|
|
7
|
+
export interface GlobalFlags {
|
|
8
|
+
site?: string;
|
|
9
|
+
profile?: string;
|
|
10
|
+
/** A named profile on the site (another account). */
|
|
11
|
+
as?: string;
|
|
12
|
+
allow?: string;
|
|
13
|
+
json: boolean;
|
|
14
|
+
show: boolean;
|
|
15
|
+
help: boolean;
|
|
16
|
+
version: boolean;
|
|
17
|
+
}
|
|
18
|
+
export declare const camel: (name: string) => string;
|
|
19
|
+
export declare const kebab: (name: string) => string;
|
|
20
|
+
/** The command named on the line, before any flags are read (they depend on it). */
|
|
21
|
+
export declare function commandName(argv: string[]): string | undefined;
|
|
22
|
+
/** The command for a name as typed: camelCase, kebab-case or any case (`login` is `logIn`). */
|
|
23
|
+
export declare function findCommand(commands: readonly CommandSpec[], typed: string): CommandSpec | undefined;
|
|
24
|
+
/** Splits the line into the global flags, the positional arguments and the command's flags. */
|
|
25
|
+
export declare function splitLine(argv: string[], command: CommandSpec | undefined): {
|
|
26
|
+
global: GlobalFlags;
|
|
27
|
+
positionals: string[];
|
|
28
|
+
flags: Map<string, string[]>;
|
|
29
|
+
};
|
|
30
|
+
/** One value typed on the line, as its parameter takes it. */
|
|
31
|
+
export declare function convert(raw: string[], spec: ParamSpec, cwd: string): unknown;
|
|
32
|
+
/** The arguments the method is called with, from the positional values and the flags. */
|
|
33
|
+
export declare function methodArguments(command: CommandSpec, positionals: string[], flags: Map<string, string[]>, cwd: string): unknown[];
|
package/dist/cli/args.js
ADDED
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
// The command line, read: the command, its positional arguments and `--flags`, each turned into the
|
|
2
|
+
// value its parameter takes, by the command table.
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
/** A command line that doesn't fit the command: printed with how to get help, exit status 2. */
|
|
5
|
+
export class UsageError extends Error {
|
|
6
|
+
name = "UsageError";
|
|
7
|
+
}
|
|
8
|
+
const GLOBAL_VALUES = new Set(["site", "profile", "as", "allow"]);
|
|
9
|
+
const GLOBAL_SWITCHES = new Set(["json", "show", "help", "version"]);
|
|
10
|
+
// Fields that name local files or folders: relative paths are taken from the current folder.
|
|
11
|
+
const PATH_FIELDS = new Set(["files", "file", "destDir"]);
|
|
12
|
+
export const camel = (name) => name.replace(/-([a-z])/g, (_, c) => c.toUpperCase());
|
|
13
|
+
export const kebab = (name) => name.replace(/[A-Z]/g, (c) => `-${c.toLowerCase()}`);
|
|
14
|
+
/** The command named on the line, before any flags are read (they depend on it). */
|
|
15
|
+
export function commandName(argv) {
|
|
16
|
+
for (let i = 0; i < argv.length; i++) {
|
|
17
|
+
const token = argv[i];
|
|
18
|
+
if (token === "-h")
|
|
19
|
+
continue;
|
|
20
|
+
if (token.startsWith("--")) {
|
|
21
|
+
const name = camel(token.slice(2).split("=")[0]);
|
|
22
|
+
if (GLOBAL_VALUES.has(name) && !token.includes("="))
|
|
23
|
+
i++;
|
|
24
|
+
continue;
|
|
25
|
+
}
|
|
26
|
+
return token;
|
|
27
|
+
}
|
|
28
|
+
return undefined;
|
|
29
|
+
}
|
|
30
|
+
/** The command for a name as typed: camelCase, kebab-case or any case (`login` is `logIn`). */
|
|
31
|
+
export function findCommand(commands, typed) {
|
|
32
|
+
const key = typed.replace(/-/g, "").toLowerCase();
|
|
33
|
+
return commands.find((c) => c.name.toLowerCase() === key);
|
|
34
|
+
}
|
|
35
|
+
/** Splits the line into the global flags, the positional arguments and the command's flags. */
|
|
36
|
+
export function splitLine(argv, command) {
|
|
37
|
+
const switches = new Set([...GLOBAL_SWITCHES, ...(command?.options?.fields ?? []).filter((f) => f.value.kind === "boolean").map((f) => f.name)]);
|
|
38
|
+
const global = { json: false, show: false, help: false, version: false };
|
|
39
|
+
const positionals = [];
|
|
40
|
+
const flags = new Map();
|
|
41
|
+
let commandSeen = false;
|
|
42
|
+
for (let i = 0; i < argv.length; i++) {
|
|
43
|
+
const token = argv[i];
|
|
44
|
+
if (token === "-h") {
|
|
45
|
+
global.help = true;
|
|
46
|
+
continue;
|
|
47
|
+
}
|
|
48
|
+
if (!token.startsWith("--") || token === "--") {
|
|
49
|
+
if (!commandSeen)
|
|
50
|
+
commandSeen = true;
|
|
51
|
+
else
|
|
52
|
+
positionals.push(token);
|
|
53
|
+
continue;
|
|
54
|
+
}
|
|
55
|
+
const [rawName, inline] = splitOnce(token.slice(2), "=");
|
|
56
|
+
let name = camel(rawName);
|
|
57
|
+
let value = inline;
|
|
58
|
+
if (name.startsWith("no") && /^no[A-Z]/.test(name) && switches.has(name[2].toLowerCase() + name.slice(3))) {
|
|
59
|
+
name = name[2].toLowerCase() + name.slice(3);
|
|
60
|
+
value = "false";
|
|
61
|
+
}
|
|
62
|
+
if (value === undefined) {
|
|
63
|
+
if (switches.has(name))
|
|
64
|
+
value = "true";
|
|
65
|
+
else {
|
|
66
|
+
const next = argv[i + 1];
|
|
67
|
+
if (next === undefined)
|
|
68
|
+
throw new UsageError(`--${kebab(name)} needs a value.`);
|
|
69
|
+
value = next;
|
|
70
|
+
i++;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
if (GLOBAL_VALUES.has(name))
|
|
74
|
+
global[name] = value;
|
|
75
|
+
else if (GLOBAL_SWITCHES.has(name))
|
|
76
|
+
global[name] = value !== "false";
|
|
77
|
+
else
|
|
78
|
+
flags.set(name, [...(flags.get(name) ?? []), value]);
|
|
79
|
+
}
|
|
80
|
+
return { global, positionals, flags };
|
|
81
|
+
}
|
|
82
|
+
function splitOnce(text, separator) {
|
|
83
|
+
const at = text.indexOf(separator);
|
|
84
|
+
return at < 0 ? [text, undefined] : [text.slice(0, at), text.slice(at + 1)];
|
|
85
|
+
}
|
|
86
|
+
/** One value typed on the line, as its parameter takes it. */
|
|
87
|
+
export function convert(raw, spec, cwd) {
|
|
88
|
+
const label = spec.name;
|
|
89
|
+
const one = raw[raw.length - 1];
|
|
90
|
+
const local = (p) => (PATH_FIELDS.has(spec.name) ? path.resolve(cwd, p) : p);
|
|
91
|
+
switch (spec.value.kind) {
|
|
92
|
+
case "number": {
|
|
93
|
+
const n = Number(one);
|
|
94
|
+
if (one.trim() === "" || !Number.isFinite(n))
|
|
95
|
+
throw new UsageError(`${label} must be a number, not "${one}".`);
|
|
96
|
+
return n;
|
|
97
|
+
}
|
|
98
|
+
case "boolean":
|
|
99
|
+
if (["true", "1", "yes"].includes(one))
|
|
100
|
+
return true;
|
|
101
|
+
if (["false", "0", "no"].includes(one))
|
|
102
|
+
return false;
|
|
103
|
+
throw new UsageError(`${label} must be true or false, not "${one}".`);
|
|
104
|
+
case "date": {
|
|
105
|
+
const date = new Date(one);
|
|
106
|
+
if (Number.isNaN(date.getTime()))
|
|
107
|
+
throw new UsageError(`${label} must be a date (2026-11-30, or 2026-11-30T18:00:00Z), not "${one}".`);
|
|
108
|
+
return date;
|
|
109
|
+
}
|
|
110
|
+
case "enum":
|
|
111
|
+
if (!spec.value.values.includes(one))
|
|
112
|
+
throw new UsageError(`${label} must be one of ${spec.value.values.join(", ")}, not "${one}".`);
|
|
113
|
+
return one;
|
|
114
|
+
case "numbers":
|
|
115
|
+
return raw.flatMap((r) => r.split(",")).map((r) => convert([r], { ...spec, value: { kind: "number" } }, cwd));
|
|
116
|
+
case "strings":
|
|
117
|
+
return raw.flatMap((r) => r.split(",")).map((r) => local(r.trim()));
|
|
118
|
+
case "json":
|
|
119
|
+
try {
|
|
120
|
+
return JSON.parse(one);
|
|
121
|
+
}
|
|
122
|
+
catch {
|
|
123
|
+
throw new UsageError(`${label} must be JSON (for example '{"a":1}' or '[1,2]'), not ${one}.`);
|
|
124
|
+
}
|
|
125
|
+
default:
|
|
126
|
+
return local(one);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
// A field of an open options object (a service's arguments): JSON when it reads as JSON, else text.
|
|
130
|
+
function loose(raw) {
|
|
131
|
+
try {
|
|
132
|
+
return JSON.parse(raw);
|
|
133
|
+
}
|
|
134
|
+
catch {
|
|
135
|
+
return raw;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
/** The arguments the method is called with, from the positional values and the flags. */
|
|
139
|
+
export function methodArguments(command, positionals, flags, cwd) {
|
|
140
|
+
const args = [];
|
|
141
|
+
command.params.forEach((param, i) => {
|
|
142
|
+
const raw = positionals[i];
|
|
143
|
+
if (raw === undefined) {
|
|
144
|
+
if (!param.optional)
|
|
145
|
+
throw new UsageError(`${kebab(command.name)} needs <${param.name}>.`);
|
|
146
|
+
args.push(undefined);
|
|
147
|
+
}
|
|
148
|
+
else
|
|
149
|
+
args.push(convert([raw], param, cwd));
|
|
150
|
+
});
|
|
151
|
+
if (positionals.length > command.params.length) {
|
|
152
|
+
throw new UsageError(`${kebab(command.name)} takes ${command.params.length} argument${command.params.length === 1 ? "" : "s"}, not ${positionals.length}: ${positionals.slice(command.params.length).join(" ")}.`);
|
|
153
|
+
}
|
|
154
|
+
const options = command.options;
|
|
155
|
+
if (!options) {
|
|
156
|
+
if (flags.size > 0)
|
|
157
|
+
throw new UsageError(`${kebab(command.name)} takes no options: --${[...flags.keys()].map(kebab).join(", --")}.`);
|
|
158
|
+
return trimTrailingUndefined(args);
|
|
159
|
+
}
|
|
160
|
+
let object = {};
|
|
161
|
+
const whole = flags.get("json");
|
|
162
|
+
if (whole) {
|
|
163
|
+
const parsed = loose(whole[whole.length - 1]);
|
|
164
|
+
if (typeof parsed !== "object" || parsed === null || Array.isArray(parsed))
|
|
165
|
+
throw new UsageError(`--json must be a JSON object with ${options.name}.`);
|
|
166
|
+
object = { ...parsed };
|
|
167
|
+
}
|
|
168
|
+
for (const [name, raw] of flags) {
|
|
169
|
+
if (name === "json")
|
|
170
|
+
continue;
|
|
171
|
+
const field = options.fields.find((f) => f.name === name);
|
|
172
|
+
if (field)
|
|
173
|
+
object[name] = convert(raw, field, cwd);
|
|
174
|
+
else if (options.open)
|
|
175
|
+
object[name] = loose(raw[raw.length - 1]);
|
|
176
|
+
else {
|
|
177
|
+
const known = options.fields.map((f) => `--${kebab(f.name)}`).join(", ");
|
|
178
|
+
throw new UsageError(`${kebab(command.name)} has no option --${kebab(name)}${known ? `; its options are ${known}` : ""}.`);
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
const missing = options.fields.filter((f) => !f.optional && !(f.name in object));
|
|
182
|
+
if (missing.length > 0 && (!options.optional || Object.keys(object).length > 0)) {
|
|
183
|
+
throw new UsageError(`${kebab(command.name)} needs ${missing.map((f) => `--${kebab(f.name)}`).join(", ")}.`);
|
|
184
|
+
}
|
|
185
|
+
if (Object.keys(object).length > 0 || !options.optional)
|
|
186
|
+
args.push(object);
|
|
187
|
+
return trimTrailingUndefined(args);
|
|
188
|
+
}
|
|
189
|
+
function trimTrailingUndefined(args) {
|
|
190
|
+
while (args.length > 0 && args[args.length - 1] === undefined)
|
|
191
|
+
args.pop();
|
|
192
|
+
return args;
|
|
193
|
+
}
|
|
194
|
+
//# sourceMappingURL=args.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"args.js","sourceRoot":"","sources":["../../src/cli/args.ts"],"names":[],"mappings":"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"}
|