@mo7yw4ng/openape 1.0.5 → 2.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (152) hide show
  1. package/bin/openape +29 -0
  2. package/bin/openape.js +29 -0
  3. package/package.json +22 -28
  4. package/LICENSE +0 -21
  5. package/README.md +0 -135
  6. package/esm/_dnt.polyfills.d.ts +0 -101
  7. package/esm/_dnt.polyfills.d.ts.map +0 -1
  8. package/esm/_dnt.polyfills.js +0 -127
  9. package/esm/_dnt.shims.d.ts +0 -6
  10. package/esm/_dnt.shims.d.ts.map +0 -1
  11. package/esm/_dnt.shims.js +0 -61
  12. package/esm/deno.d.ts +0 -25
  13. package/esm/deno.d.ts.map +0 -1
  14. package/esm/deno.js +0 -23
  15. package/esm/package.json +0 -3
  16. package/esm/src/commands/announcements.d.ts +0 -3
  17. package/esm/src/commands/announcements.d.ts.map +0 -1
  18. package/esm/src/commands/announcements.js +0 -134
  19. package/esm/src/commands/assignments.d.ts +0 -3
  20. package/esm/src/commands/assignments.d.ts.map +0 -1
  21. package/esm/src/commands/assignments.js +0 -230
  22. package/esm/src/commands/auth.d.ts +0 -3
  23. package/esm/src/commands/auth.d.ts.map +0 -1
  24. package/esm/src/commands/auth.js +0 -290
  25. package/esm/src/commands/calendar.d.ts +0 -3
  26. package/esm/src/commands/calendar.d.ts.map +0 -1
  27. package/esm/src/commands/calendar.js +0 -179
  28. package/esm/src/commands/courses.d.ts +0 -3
  29. package/esm/src/commands/courses.d.ts.map +0 -1
  30. package/esm/src/commands/courses.js +0 -348
  31. package/esm/src/commands/forums.d.ts +0 -3
  32. package/esm/src/commands/forums.d.ts.map +0 -1
  33. package/esm/src/commands/forums.js +0 -318
  34. package/esm/src/commands/grades.d.ts +0 -3
  35. package/esm/src/commands/grades.d.ts.map +0 -1
  36. package/esm/src/commands/grades.js +0 -121
  37. package/esm/src/commands/materials.d.ts +0 -3
  38. package/esm/src/commands/materials.d.ts.map +0 -1
  39. package/esm/src/commands/materials.js +0 -413
  40. package/esm/src/commands/quizzes.d.ts +0 -3
  41. package/esm/src/commands/quizzes.d.ts.map +0 -1
  42. package/esm/src/commands/quizzes.js +0 -271
  43. package/esm/src/commands/skills.d.ts +0 -3
  44. package/esm/src/commands/skills.d.ts.map +0 -1
  45. package/esm/src/commands/skills.js +0 -106
  46. package/esm/src/commands/upload.d.ts +0 -3
  47. package/esm/src/commands/upload.d.ts.map +0 -1
  48. package/esm/src/commands/upload.js +0 -58
  49. package/esm/src/commands/videos.d.ts +0 -3
  50. package/esm/src/commands/videos.d.ts.map +0 -1
  51. package/esm/src/commands/videos.js +0 -336
  52. package/esm/src/index.d.ts +0 -27
  53. package/esm/src/index.d.ts.map +0 -1
  54. package/esm/src/index.js +0 -160
  55. package/esm/src/lib/auth.d.ts +0 -47
  56. package/esm/src/lib/auth.d.ts.map +0 -1
  57. package/esm/src/lib/auth.js +0 -227
  58. package/esm/src/lib/config.d.ts +0 -6
  59. package/esm/src/lib/config.d.ts.map +0 -1
  60. package/esm/src/lib/config.js +0 -36
  61. package/esm/src/lib/logger.d.ts +0 -3
  62. package/esm/src/lib/logger.d.ts.map +0 -1
  63. package/esm/src/lib/logger.js +0 -27
  64. package/esm/src/lib/moodle.d.ts +0 -433
  65. package/esm/src/lib/moodle.d.ts.map +0 -1
  66. package/esm/src/lib/moodle.js +0 -1318
  67. package/esm/src/lib/session.d.ts +0 -8
  68. package/esm/src/lib/session.d.ts.map +0 -1
  69. package/esm/src/lib/session.js +0 -42
  70. package/esm/src/lib/token.d.ts +0 -38
  71. package/esm/src/lib/token.d.ts.map +0 -1
  72. package/esm/src/lib/token.js +0 -178
  73. package/esm/src/lib/types.d.ts +0 -189
  74. package/esm/src/lib/types.d.ts.map +0 -1
  75. package/esm/src/lib/types.js +0 -2
  76. package/esm/src/lib/utils.d.ts +0 -57
  77. package/esm/src/lib/utils.d.ts.map +0 -1
  78. package/esm/src/lib/utils.js +0 -129
  79. package/script/_dnt.polyfills.d.ts +0 -101
  80. package/script/_dnt.polyfills.d.ts.map +0 -1
  81. package/script/_dnt.polyfills.js +0 -130
  82. package/script/_dnt.shims.d.ts +0 -6
  83. package/script/_dnt.shims.d.ts.map +0 -1
  84. package/script/_dnt.shims.js +0 -65
  85. package/script/deno.d.ts +0 -25
  86. package/script/deno.d.ts.map +0 -1
  87. package/script/deno.js +0 -25
  88. package/script/package.json +0 -3
  89. package/script/src/commands/announcements.d.ts +0 -3
  90. package/script/src/commands/announcements.d.ts.map +0 -1
  91. package/script/src/commands/announcements.js +0 -140
  92. package/script/src/commands/assignments.d.ts +0 -3
  93. package/script/src/commands/assignments.d.ts.map +0 -1
  94. package/script/src/commands/assignments.js +0 -269
  95. package/script/src/commands/auth.d.ts +0 -3
  96. package/script/src/commands/auth.d.ts.map +0 -1
  97. package/script/src/commands/auth.js +0 -296
  98. package/script/src/commands/calendar.d.ts +0 -3
  99. package/script/src/commands/calendar.d.ts.map +0 -1
  100. package/script/src/commands/calendar.js +0 -185
  101. package/script/src/commands/courses.d.ts +0 -3
  102. package/script/src/commands/courses.d.ts.map +0 -1
  103. package/script/src/commands/courses.js +0 -354
  104. package/script/src/commands/forums.d.ts +0 -3
  105. package/script/src/commands/forums.d.ts.map +0 -1
  106. package/script/src/commands/forums.js +0 -324
  107. package/script/src/commands/grades.d.ts +0 -3
  108. package/script/src/commands/grades.d.ts.map +0 -1
  109. package/script/src/commands/grades.js +0 -127
  110. package/script/src/commands/materials.d.ts +0 -3
  111. package/script/src/commands/materials.d.ts.map +0 -1
  112. package/script/src/commands/materials.js +0 -419
  113. package/script/src/commands/quizzes.d.ts +0 -3
  114. package/script/src/commands/quizzes.d.ts.map +0 -1
  115. package/script/src/commands/quizzes.js +0 -277
  116. package/script/src/commands/skills.d.ts +0 -3
  117. package/script/src/commands/skills.d.ts.map +0 -1
  118. package/script/src/commands/skills.js +0 -112
  119. package/script/src/commands/upload.d.ts +0 -3
  120. package/script/src/commands/upload.d.ts.map +0 -1
  121. package/script/src/commands/upload.js +0 -64
  122. package/script/src/commands/videos.d.ts +0 -3
  123. package/script/src/commands/videos.d.ts.map +0 -1
  124. package/script/src/commands/videos.js +0 -342
  125. package/script/src/index.d.ts +0 -27
  126. package/script/src/index.d.ts.map +0 -1
  127. package/script/src/index.js +0 -167
  128. package/script/src/lib/auth.d.ts +0 -47
  129. package/script/src/lib/auth.d.ts.map +0 -1
  130. package/script/src/lib/auth.js +0 -269
  131. package/script/src/lib/config.d.ts +0 -6
  132. package/script/src/lib/config.d.ts.map +0 -1
  133. package/script/src/lib/config.js +0 -42
  134. package/script/src/lib/logger.d.ts +0 -3
  135. package/script/src/lib/logger.d.ts.map +0 -1
  136. package/script/src/lib/logger.js +0 -30
  137. package/script/src/lib/moodle.d.ts +0 -433
  138. package/script/src/lib/moodle.d.ts.map +0 -1
  139. package/script/src/lib/moodle.js +0 -1389
  140. package/script/src/lib/session.d.ts +0 -8
  141. package/script/src/lib/session.d.ts.map +0 -1
  142. package/script/src/lib/session.js +0 -45
  143. package/script/src/lib/token.d.ts +0 -38
  144. package/script/src/lib/token.d.ts.map +0 -1
  145. package/script/src/lib/token.js +0 -189
  146. package/script/src/lib/types.d.ts +0 -189
  147. package/script/src/lib/types.d.ts.map +0 -1
  148. package/script/src/lib/types.js +0 -3
  149. package/script/src/lib/utils.d.ts +0 -57
  150. package/script/src/lib/utils.d.ts.map +0 -1
  151. package/script/src/lib/utils.js +0 -175
  152. package/skills/openape/SKILL.md +0 -115
@@ -1,8 +0,0 @@
1
- import type { Page } from "playwright-core";
2
- import type { AppConfig, Logger, SessionInfo } from "./types.js";
3
- /**
4
- * Extract Moodle sesskey from the current page.
5
- * The sesskey is required for all AJAX calls.
6
- */
7
- export declare function extractSessionInfo(page: Page, config: AppConfig, log: Logger, wsToken?: string): Promise<SessionInfo>;
8
- //# sourceMappingURL=session.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../../src/src/lib/session.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEjE;;;GAGG;AACH,wBAAsB,kBAAkB,CACtC,IAAI,EAAE,IAAI,EACV,MAAM,EAAE,SAAS,EACjB,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE,MAAM,GACf,OAAO,CAAC,WAAW,CAAC,CA6CtB"}
@@ -1,45 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.extractSessionInfo = extractSessionInfo;
4
- /**
5
- * Extract Moodle sesskey from the current page.
6
- * The sesskey is required for all AJAX calls.
7
- */
8
- async function extractSessionInfo(page, config, log, wsToken) {
9
- // Ensure we're on a Moodle page
10
- const url = page.url();
11
- if (!url.includes(config.moodleBaseUrl.replace("https://", ""))) {
12
- await page.goto(`${config.moodleBaseUrl}/my/`, {
13
- waitUntil: "domcontentloaded",
14
- });
15
- }
16
- // Try extracting sesskey from M.cfg (Moodle's JS config object)
17
- // Use string to avoid dnt transforming globalThis/window to dntShim
18
- let sesskey = await page.evaluate("() => self.M?.cfg?.sesskey ?? null");
19
- // Fallback: extract from a hidden input
20
- if (!sesskey) {
21
- sesskey = await page.evaluate(() => {
22
- const el = document.querySelector('input[name="sesskey"]');
23
- return el?.value ?? null;
24
- });
25
- }
26
- // Fallback: regex on page source
27
- if (!sesskey) {
28
- const content = await page.content();
29
- const match = content.match(/"sesskey"\s*:\s*"([a-zA-Z0-9]+)"/);
30
- sesskey = match?.[1] ?? null;
31
- }
32
- if (!sesskey) {
33
- throw new Error("Failed to extract sesskey from Moodle page.");
34
- }
35
- log.debug(`Extracted sesskey: ${sesskey}`);
36
- const sessionInfo = {
37
- sesskey,
38
- moodleBaseUrl: config.moodleBaseUrl,
39
- };
40
- if (wsToken) {
41
- sessionInfo.wsToken = wsToken;
42
- log.debug("Web Service Token included in session");
43
- }
44
- return sessionInfo;
45
- }
@@ -1,38 +0,0 @@
1
- import type { Page } from "playwright-core";
2
- import type { AppConfig, Logger } from "./types.js";
3
- /**
4
- * Get the session metadata file path from the auth state path.
5
- * E.g., .auth/storage-state.json -> .auth/session-meta.json
6
- */
7
- export declare function getSessionMetaPath(authStatePath: string): string;
8
- /**
9
- * Load sesskey from metadata if it exists and is valid.
10
- * Sesskey is typically valid for 6 hours.
11
- */
12
- export declare function loadSesskey(authStatePath: string): string | null;
13
- /**
14
- * Save sesskey to metadata.
15
- */
16
- export declare function saveSesskey(authStatePath: string, sesskey: string): void;
17
- /**
18
- * Load WS token from metadata if it exists and is valid.
19
- * WS token is valid for 24 hours.
20
- */
21
- export declare function loadWsToken(authStatePath: string): string | null;
22
- /**
23
- * Save WS token to metadata.
24
- */
25
- export declare function saveWsToken(authStatePath: string, token: string): void;
26
- /**
27
- * Acquire Moodle Web Service Token via mobile app launch endpoint.
28
- *
29
- * Process:
30
- * 1. Visit admin/tool/mobile/launch.php with service=moodle_mobile_app
31
- * 2. Server redirects to moodlemobile://token=BASE64_DATA (which causes ERR_ABORTED)
32
- * 3. We catch the redirect from the response and extract the token
33
- *
34
- * @returns The Web Service Token for Moodle API calls
35
- * @throws Error if token acquisition fails
36
- */
37
- export declare function acquireWsToken(page: Page, config: AppConfig, log: Logger): Promise<string>;
38
- //# sourceMappingURL=token.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"token.d.ts","sourceRoot":"","sources":["../../../src/src/lib/token.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAWpD;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM,CAGhE;AA8BD;;;GAGG;AACH,wBAAgB,WAAW,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAShE;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,aAAa,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAKxE;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAShE;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,aAAa,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAKtE;AAuBD;;;;;;;;;;GAUG;AACH,wBAAsB,cAAc,CAClC,IAAI,EAAE,IAAI,EACV,MAAM,EAAE,SAAS,EACjB,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,MAAM,CAAC,CAsEjB"}
@@ -1,189 +0,0 @@
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
- exports.getSessionMetaPath = getSessionMetaPath;
7
- exports.loadSesskey = loadSesskey;
8
- exports.saveSesskey = saveSesskey;
9
- exports.loadWsToken = loadWsToken;
10
- exports.saveWsToken = saveWsToken;
11
- exports.acquireWsToken = acquireWsToken;
12
- const node_fs_1 = __importDefault(require("node:fs"));
13
- const node_path_1 = __importDefault(require("node:path"));
14
- /**
15
- * Get the session metadata file path from the auth state path.
16
- * E.g., .auth/storage-state.json -> .auth/session-meta.json
17
- */
18
- function getSessionMetaPath(authStatePath) {
19
- const dir = node_path_1.default.dirname(authStatePath);
20
- return node_path_1.default.join(dir, "session-meta.json");
21
- }
22
- /**
23
- * Load session metadata from file.
24
- */
25
- function loadSessionMeta(authStatePath) {
26
- const metaPath = getSessionMetaPath(authStatePath);
27
- try {
28
- if (node_fs_1.default.existsSync(metaPath)) {
29
- const content = node_fs_1.default.readFileSync(metaPath, "utf8");
30
- return JSON.parse(content);
31
- }
32
- }
33
- catch {
34
- // Ignore errors, return empty meta
35
- }
36
- return {};
37
- }
38
- /**
39
- * Save session metadata to file.
40
- */
41
- function saveSessionMeta(authStatePath, meta) {
42
- const metaPath = getSessionMetaPath(authStatePath);
43
- try {
44
- node_fs_1.default.writeFileSync(metaPath, JSON.stringify(meta, null, 2));
45
- }
46
- catch {
47
- // Ignore save errors
48
- }
49
- }
50
- /**
51
- * Load sesskey from metadata if it exists and is valid.
52
- * Sesskey is typically valid for 6 hours.
53
- */
54
- function loadSesskey(authStatePath) {
55
- const meta = loadSessionMeta(authStatePath);
56
- if (meta.sesskey && meta.sesskeyTimestamp) {
57
- const age = Date.now() - meta.sesskeyTimestamp;
58
- if (age < 6 * 60 * 60 * 1000) {
59
- return meta.sesskey;
60
- }
61
- }
62
- return null;
63
- }
64
- /**
65
- * Save sesskey to metadata.
66
- */
67
- function saveSesskey(authStatePath, sesskey) {
68
- const meta = loadSessionMeta(authStatePath);
69
- meta.sesskey = sesskey;
70
- meta.sesskeyTimestamp = Date.now();
71
- saveSessionMeta(authStatePath, meta);
72
- }
73
- /**
74
- * Load WS token from metadata if it exists and is valid.
75
- * WS token is valid for 24 hours.
76
- */
77
- function loadWsToken(authStatePath) {
78
- const meta = loadSessionMeta(authStatePath);
79
- if (meta.wsToken && meta.wsTokenTimestamp) {
80
- const age = Date.now() - meta.wsTokenTimestamp;
81
- if (age < 24 * 60 * 60 * 1000) {
82
- return meta.wsToken;
83
- }
84
- }
85
- return null;
86
- }
87
- /**
88
- * Save WS token to metadata.
89
- */
90
- function saveWsToken(authStatePath, token) {
91
- const meta = loadSessionMeta(authStatePath);
92
- meta.wsToken = token;
93
- meta.wsTokenTimestamp = Date.now();
94
- saveSessionMeta(authStatePath, meta);
95
- }
96
- /**
97
- * Extract and decode the Web Service Token from moodlemobile:// URL
98
- * Format: moodlemobile://token=BASE64_DATA
99
- * Decoded: token:::site_url:::other_params
100
- */
101
- function extractTokenFromCustomScheme(url) {
102
- try {
103
- const match = url.match(/token=([A-Za-z0-9+/=]+)/);
104
- if (!match)
105
- return null;
106
- // Base64 decode the token data
107
- const decoded = atob(match[1]);
108
- const parts = decoded.split(":::");
109
- // The second part (index 1) is the actual WS token
110
- return parts.length >= 2 ? parts[1] : null;
111
- }
112
- catch {
113
- return null;
114
- }
115
- }
116
- /**
117
- * Acquire Moodle Web Service Token via mobile app launch endpoint.
118
- *
119
- * Process:
120
- * 1. Visit admin/tool/mobile/launch.php with service=moodle_mobile_app
121
- * 2. Server redirects to moodlemobile://token=BASE64_DATA (which causes ERR_ABORTED)
122
- * 3. We catch the redirect from the response and extract the token
123
- *
124
- * @returns The Web Service Token for Moodle API calls
125
- * @throws Error if token acquisition fails
126
- */
127
- async function acquireWsToken(page, config, log) {
128
- log.info("Acquiring Moodle Web Service Token...");
129
- // Generate random UUID for passport parameter
130
- const passport = crypto.randomUUID();
131
- const launchUrl = `${config.moodleBaseUrl}/admin/tool/mobile/launch.php?service=moodle_mobile_app&passport=${passport}`;
132
- log.debug(`Token acquisition URL: ${launchUrl}`);
133
- // Set up response listener to catch the redirect
134
- let tokenFound = false;
135
- const tokenPromise = new Promise((resolve, reject) => {
136
- const timeout = setTimeout(() => {
137
- if (!tokenFound) {
138
- page.off("response", responseHandler);
139
- reject(new Error("Token acquisition timed out - no redirect received"));
140
- }
141
- }, 15000);
142
- const responseHandler = async (response) => {
143
- try {
144
- const status = response.status();
145
- const headers = response.headers();
146
- // Check for redirect to custom scheme
147
- const location = headers["location"] || headers["Location"];
148
- if (location && location.startsWith("moodlemobile://")) {
149
- clearTimeout(timeout);
150
- tokenFound = true;
151
- page.off("response", responseHandler);
152
- const token = extractTokenFromCustomScheme(location);
153
- if (token) {
154
- resolve(token);
155
- }
156
- else {
157
- reject(new Error("Failed to extract token from custom scheme URL"));
158
- }
159
- }
160
- }
161
- catch (err) {
162
- // Ignore errors in response handler
163
- }
164
- };
165
- page.on("response", responseHandler);
166
- });
167
- try {
168
- // Navigate to the launch endpoint - expect it to fail with ERR_ABORTED
169
- // because the browser can't handle moodlemobile:// scheme
170
- await page.goto(launchUrl, {
171
- waitUntil: "domcontentloaded",
172
- timeout: 10000,
173
- }).catch(() => {
174
- // Expected: navigation will fail due to custom scheme redirect
175
- // The token should have been captured by our response handler
176
- log.debug("Navigation failed as expected (custom scheme redirect)");
177
- });
178
- // Wait for the intercepted token
179
- const token = await tokenPromise;
180
- log.success("Web Service Token acquired successfully");
181
- log.debug(`Token (first 10 chars): ${token.substring(0, 10)}...`);
182
- return token;
183
- }
184
- catch (error) {
185
- const message = error instanceof Error ? error.message : String(error);
186
- log.warn(`Failed to acquire WS Token: ${message}`);
187
- throw error;
188
- }
189
- }
@@ -1,189 +0,0 @@
1
- export interface AppConfig {
2
- courseUrl: string;
3
- moodleBaseUrl: string;
4
- headless: boolean;
5
- slowMo: number;
6
- authStatePath: string;
7
- ollamaModel?: string;
8
- ollamaBaseUrl: string;
9
- }
10
- export interface SessionInfo {
11
- sesskey: string;
12
- moodleBaseUrl: string;
13
- wsToken?: string;
14
- wsTokenExpires?: number;
15
- }
16
- export interface Logger {
17
- info: (msg: string) => void;
18
- success: (msg: string) => void;
19
- warn: (msg: string) => void;
20
- error: (msg: string) => void;
21
- debug: (msg: string) => void;
22
- }
23
- export type OutputFormat = "json" | "csv" | "table" | "silent";
24
- export interface OutputOptions {
25
- format: OutputFormat;
26
- fields?: string[];
27
- pretty?: boolean;
28
- }
29
- export interface EnrolledCourse {
30
- id: number;
31
- fullname: string;
32
- shortname: string;
33
- idnumber?: string;
34
- category?: string;
35
- progress?: number;
36
- startdate?: number;
37
- enddate?: number;
38
- }
39
- export interface SuperVideoModule {
40
- cmid: string;
41
- name: string;
42
- url: string;
43
- instance?: number;
44
- isComplete: boolean;
45
- }
46
- export interface QuizModule {
47
- quizid: string;
48
- name: string;
49
- url: string;
50
- isComplete: boolean;
51
- attemptsUsed: number;
52
- maxAttempts: number;
53
- timeOpen?: number;
54
- timeClose?: number;
55
- }
56
- export interface QuizAttempt {
57
- attempt: number;
58
- attemptid: number;
59
- quizid: number;
60
- userid: number;
61
- attemptnumber: number;
62
- state: string;
63
- timestart: number;
64
- timefinish?: number;
65
- timemodified?: number;
66
- timecheckstate?: number;
67
- sumgrades?: number;
68
- layout?: string;
69
- uniqueid?: number;
70
- preview?: boolean;
71
- }
72
- export interface QuizQuestion {
73
- slot: number;
74
- type: string;
75
- typeid?: number;
76
- id: number;
77
- category?: number;
78
- contextid?: number;
79
- contextlevel?: string;
80
- contextinstanceid?: number;
81
- quizid: number;
82
- maxmark: number;
83
- minmark?: number;
84
- number?: number;
85
- page: number;
86
- html?: string;
87
- status?: string;
88
- stateclass?: string;
89
- sequencecheck?: number;
90
- questionnumber?: string;
91
- }
92
- export interface QuizAttemptData {
93
- attempt: QuizAttempt;
94
- questions: Record<number, QuizQuestion>;
95
- nextpage?: number;
96
- prevpage?: number;
97
- messages?: string[];
98
- quizflags?: Record<number, boolean>;
99
- }
100
- export interface QuizStartResult {
101
- attempt: QuizAttempt;
102
- page?: number;
103
- messages?: string[];
104
- readonly?: boolean;
105
- }
106
- export interface ForumPost {
107
- id: number;
108
- subject: string;
109
- author: string;
110
- authorId?: number;
111
- created: number;
112
- modified: number;
113
- message: string;
114
- discussionId: number;
115
- replies?: ForumPost[];
116
- unread?: boolean;
117
- }
118
- export interface ForumDiscussion {
119
- id: number;
120
- forumId: number;
121
- name: string;
122
- firstPostId: number;
123
- userId: number;
124
- userFullName: string;
125
- groupId?: number;
126
- timedue?: number;
127
- timeModified: number;
128
- timeStart?: number;
129
- timeEnd?: number;
130
- userModified?: number;
131
- userModifiedFullName?: string;
132
- postCount?: number;
133
- unread?: boolean;
134
- subject?: string;
135
- message?: string;
136
- pinned?: boolean;
137
- locked?: boolean;
138
- starred?: boolean;
139
- }
140
- export interface CalendarEvent {
141
- id: number;
142
- name: string;
143
- description?: string;
144
- format: number;
145
- courseid?: number;
146
- categoryid?: number;
147
- groupid?: number;
148
- userid?: number;
149
- moduleid?: number;
150
- modulename?: string;
151
- instance?: number;
152
- eventtype: string;
153
- timestart: number;
154
- timeduration?: number;
155
- timedue?: number;
156
- visible?: number;
157
- location?: string;
158
- }
159
- export interface CourseGrade {
160
- courseId: number;
161
- courseName: string;
162
- grade?: string;
163
- gradeFormatted?: string;
164
- rank?: number;
165
- totalUsers?: number;
166
- items?: GradeItem[];
167
- }
168
- export interface GradeItem {
169
- id: number;
170
- name: string;
171
- grade?: string;
172
- gradeFormatted?: string;
173
- range?: string;
174
- percentage?: number;
175
- weight?: number;
176
- feedback?: string;
177
- graded?: boolean;
178
- }
179
- export interface ResourceModule {
180
- cmid: string;
181
- name: string;
182
- url: string;
183
- courseId: number;
184
- modType: string;
185
- mimetype?: string;
186
- filesize?: number;
187
- modified?: number;
188
- }
189
- //# sourceMappingURL=types.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/src/lib/types.ts"],"names":[],"mappings":"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"}
@@ -1,3 +0,0 @@
1
- "use strict";
2
- // ── Core Infrastructure ────────────────────────────────────────────────
3
- Object.defineProperty(exports, "__esModule", { value: true });
@@ -1,57 +0,0 @@
1
- import type { OutputFormat } from "./types.js";
2
- /**
3
- * Returns the base directory for config/storage resolving.
4
- * Handles both Deno (raw/compiled) and Node.js (npx).
5
- */
6
- export declare function getBaseDir(): string;
7
- /**
8
- * Strip HTML tags from a string.
9
- * Preserves text content while removing all HTML markup.
10
- */
11
- export declare function stripHtmlTags(html: string): string;
12
- /**
13
- * Extract clean course name from Moodle fullname.
14
- * Removes mlang tags, course codes, and instructor info.
15
- * Example: "{mlang zh-tw}1142爵士樂賞析(遠距)-楊曊恩..." -> "爵士樂賞析"
16
- */
17
- export declare function extractCourseName(fullname: string): string;
18
- /**
19
- * Get output format from command options (global or local).
20
- * Defaults to "json" if not specified.
21
- */
22
- export declare function getOutputFormat(command: {
23
- optsWithGlobals(): {
24
- output?: OutputFormat;
25
- };
26
- }): OutputFormat;
27
- /**
28
- * Determine if logs should be silenced based on output format and verbosity.
29
- * JSON output without verbose flag silences logs.
30
- */
31
- export declare function shouldSilenceLogs(outputFormat: OutputFormat, verbose?: boolean): boolean;
32
- /**
33
- * Sanitize filename by removing invalid characters and limiting length.
34
- * Replaces invalid characters with underscores and limits to maxLength.
35
- */
36
- export declare function sanitizeFilename(name: string, maxLength?: number): string;
37
- /**
38
- * Get the session storage file path.
39
- */
40
- export declare function getSessionPath(): string;
41
- /**
42
- * Format file size to KB with specified decimal places.
43
- */
44
- export declare function formatFileSize(bytes: number, decimals?: number): string;
45
- /**
46
- * Format Moodle timestamp to localized string.
47
- */
48
- export declare function formatMoodleDate(timestamp?: number): string;
49
- /**
50
- * 統一時間戳記轉換 (預設:本地時間字串)
51
- */
52
- export declare function formatTimestamp(timestamp: number | undefined | null, format?: "iso" | "local" | "relative"): string;
53
- /**
54
- * 相對時間格式 (e.g., "2 hours ago")
55
- */
56
- export declare function formatRelativeTime(timestamp: number): string;
57
- //# sourceMappingURL=utils.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/src/lib/utils.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/C;;;GAGG;AACH,wBAAgB,UAAU,IAAI,MAAM,CAcnC;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAelD;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAO1D;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE;IAAE,eAAe,IAAI;QAAE,MAAM,CAAC,EAAE,YAAY,CAAA;KAAE,CAAA;CAAE,GAAG,YAAY,CAGvG;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,YAAY,EAAE,YAAY,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,OAAO,CAExF;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,GAAE,MAAY,GAAG,MAAM,CAK9E;AAED;;GAEG;AACH,wBAAgB,cAAc,IAAI,MAAM,CAGvC;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,GAAE,MAAU,GAAG,MAAM,CAE1E;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAG3D;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,EAAE,MAAM,GAAE,KAAK,GAAG,OAAO,GAAG,UAAoB,GAAG,MAAM,CAQ5H;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAM5D"}