offcourse 1.0.1 → 1.2.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.
Files changed (41) hide show
  1. package/README.md +107 -8
  2. package/dist/cli/commands/sync.js +4 -1
  3. package/dist/cli/commands/sync.js.map +1 -1
  4. package/dist/cli/commands/syncHighLevel.d.ts.map +1 -1
  5. package/dist/cli/commands/syncHighLevel.js +4 -1
  6. package/dist/cli/commands/syncHighLevel.js.map +1 -1
  7. package/dist/cli/commands/syncLearningSuite.d.ts +35 -0
  8. package/dist/cli/commands/syncLearningSuite.d.ts.map +1 -0
  9. package/dist/cli/commands/syncLearningSuite.js +765 -0
  10. package/dist/cli/commands/syncLearningSuite.js.map +1 -0
  11. package/dist/cli/index.js +38 -0
  12. package/dist/cli/index.js.map +1 -1
  13. package/dist/downloader/hlsDownloader.d.ts +10 -4
  14. package/dist/downloader/hlsDownloader.d.ts.map +1 -1
  15. package/dist/downloader/hlsDownloader.js +88 -18
  16. package/dist/downloader/hlsDownloader.js.map +1 -1
  17. package/dist/downloader/index.d.ts +4 -0
  18. package/dist/downloader/index.d.ts.map +1 -1
  19. package/dist/downloader/index.js +6 -6
  20. package/dist/downloader/index.js.map +1 -1
  21. package/dist/downloader/loomDownloader.d.ts +1 -1
  22. package/dist/downloader/loomDownloader.d.ts.map +1 -1
  23. package/dist/downloader/loomDownloader.js +9 -7
  24. package/dist/downloader/loomDownloader.js.map +1 -1
  25. package/dist/scraper/learningsuite/extractor.d.ts +50 -0
  26. package/dist/scraper/learningsuite/extractor.d.ts.map +1 -0
  27. package/dist/scraper/learningsuite/extractor.js +438 -0
  28. package/dist/scraper/learningsuite/extractor.js.map +1 -0
  29. package/dist/scraper/learningsuite/index.d.ts +4 -0
  30. package/dist/scraper/learningsuite/index.d.ts.map +1 -0
  31. package/dist/scraper/learningsuite/index.js +4 -0
  32. package/dist/scraper/learningsuite/index.js.map +1 -0
  33. package/dist/scraper/learningsuite/navigator.d.ts +122 -0
  34. package/dist/scraper/learningsuite/navigator.d.ts.map +1 -0
  35. package/dist/scraper/learningsuite/navigator.js +736 -0
  36. package/dist/scraper/learningsuite/navigator.js.map +1 -0
  37. package/dist/scraper/learningsuite/schemas.d.ts +270 -0
  38. package/dist/scraper/learningsuite/schemas.d.ts.map +1 -0
  39. package/dist/scraper/learningsuite/schemas.js +147 -0
  40. package/dist/scraper/learningsuite/schemas.js.map +1 -0
  41. package/package.json +1 -1
@@ -0,0 +1,122 @@
1
+ import type { Page } from "playwright";
2
+ import { type Course, type Module, type Lesson } from "./schemas.js";
3
+ export interface LearningSuiteCourse {
4
+ id: string;
5
+ title: string;
6
+ description: string | null;
7
+ thumbnailUrl: string | null;
8
+ moduleCount: number;
9
+ lessonCount: number;
10
+ }
11
+ export interface LearningSuiteModule {
12
+ id: string;
13
+ title: string;
14
+ description: string | null;
15
+ position: number;
16
+ isLocked: boolean;
17
+ }
18
+ export interface LearningSuiteLesson {
19
+ id: string;
20
+ title: string;
21
+ position: number;
22
+ moduleId: string;
23
+ isLocked: boolean;
24
+ isCompleted: boolean;
25
+ }
26
+ export interface LearningSuiteCourseStructure {
27
+ course: LearningSuiteCourse;
28
+ modules: (LearningSuiteModule & {
29
+ lessons: LearningSuiteLesson[];
30
+ })[];
31
+ tenantId: string;
32
+ domain: string;
33
+ courseSlug?: string;
34
+ }
35
+ export interface LearningSuiteScanProgress {
36
+ phase: "init" | "course" | "modules" | "lessons" | "done";
37
+ courseName?: string;
38
+ totalModules?: number;
39
+ currentModule?: string;
40
+ currentModuleIndex?: number;
41
+ lessonsFound?: number;
42
+ skippedLocked?: boolean;
43
+ }
44
+ /**
45
+ * Extracts the tenant ID from a LearningSuite URL.
46
+ * URL format: https://{subdomain}.learningsuite.io/...
47
+ */
48
+ export declare function extractTenantFromUrl(url: string): {
49
+ subdomain: string;
50
+ tenantId: string | null;
51
+ };
52
+ /**
53
+ * Extracts the tenant ID from the page by inspecting network requests or localStorage.
54
+ */
55
+ export declare function extractTenantId(page: Page): Promise<string | null>;
56
+ /**
57
+ * Gets the auth token from localStorage.
58
+ */
59
+ export declare function getAuthToken(page: Page): Promise<string | null>;
60
+ /**
61
+ * Makes a GraphQL request to the LearningSuite API.
62
+ */
63
+ export declare function graphqlRequest<T>(page: Page, tenantId: string, query: string, variables?: Record<string, unknown>): Promise<T | null>;
64
+ /**
65
+ * Fetches all courses available to the user.
66
+ */
67
+ export declare function fetchCourses(page: Page, tenantId: string): Promise<Course[]>;
68
+ /**
69
+ * Fetches modules for a course.
70
+ */
71
+ export declare function fetchModules(page: Page, tenantId: string, courseId: string): Promise<Module[]>;
72
+ /**
73
+ * Fetches lessons for a module.
74
+ */
75
+ export declare function fetchLessons(page: Page, tenantId: string, courseId: string, moduleId: string): Promise<Lesson[]>;
76
+ /**
77
+ * Extracts courses from the page DOM (fallback method).
78
+ */
79
+ export declare function extractCoursesFromPage(page: Page): Promise<LearningSuiteCourse[]>;
80
+ /**
81
+ * Builds the complete course structure for a LearningSuite course using DOM extraction.
82
+ * This is more reliable than GraphQL as the API structure may vary between instances.
83
+ */
84
+ export declare function buildLearningSuiteCourseStructure(page: Page, courseUrl: string, onProgress?: (progress: LearningSuiteScanProgress) => void): Promise<LearningSuiteCourseStructure | null>;
85
+ /**
86
+ * Constructs the URL for a LearningSuite course.
87
+ */
88
+ export declare function getLearningSuiteCourseUrl(domain: string, courseSlug: string, courseId: string): string;
89
+ /**
90
+ * Constructs the URL for a LearningSuite lesson.
91
+ * URL format: /student/course/{slug}/{courseId}/{topicId}
92
+ * Note: The topicId (lessonId from module page) is enough - the server redirects to the full URL.
93
+ */
94
+ export declare function getLearningSuiteLessonUrl(domain: string, courseSlug: string, courseId: string, _moduleId: string, // Unused - kept for API compatibility
95
+ lessonId: string): string;
96
+ /**
97
+ * Marks a lesson as completed by clicking the "Abschließen" button.
98
+ * This unlocks the next lesson in sequence.
99
+ *
100
+ * @returns true if successfully completed, false otherwise
101
+ */
102
+ export declare function markLessonComplete(page: Page, lessonUrl: string): Promise<boolean>;
103
+ /**
104
+ * Auto-completes all accessible lessons in sequence to unlock subsequent content.
105
+ * This is useful when lessons are sequentially locked.
106
+ *
107
+ * @param page - Playwright page
108
+ * @param lessons - List of lessons to complete
109
+ * @param onProgress - Callback for progress updates
110
+ * @returns Number of lessons successfully completed
111
+ */
112
+ export declare function autoCompleteLessons(page: Page, lessons: {
113
+ url: string;
114
+ title: string;
115
+ isLocked: boolean;
116
+ }[], onProgress?: (completed: number, total: number, currentLesson: string) => void): Promise<number>;
117
+ /**
118
+ * Checks if a lesson page shows the lesson as completed.
119
+ */
120
+ export declare function isLessonCompleted(page: Page): Promise<boolean>;
121
+ export { slugify, createFolderName } from "../../shared/slug.js";
122
+ //# sourceMappingURL=navigator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"navigator.d.ts","sourceRoot":"","sources":["../../../src/scraper/learningsuite/navigator.ts"],"names":[],"mappings":"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"}