skool-cli 1.0.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 +179 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +33 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/create-folder.d.ts +3 -0
- package/dist/commands/create-folder.d.ts.map +1 -0
- package/dist/commands/create-folder.js +24 -0
- package/dist/commands/create-folder.js.map +1 -0
- package/dist/commands/create-lesson.d.ts +3 -0
- package/dist/commands/create-lesson.d.ts.map +1 -0
- package/dist/commands/create-lesson.js +35 -0
- package/dist/commands/create-lesson.js.map +1 -0
- package/dist/commands/create-post.d.ts +3 -0
- package/dist/commands/create-post.d.ts.map +1 -0
- package/dist/commands/create-post.js +36 -0
- package/dist/commands/create-post.js.map +1 -0
- package/dist/commands/debug-api.d.ts +3 -0
- package/dist/commands/debug-api.d.ts.map +1 -0
- package/dist/commands/debug-api.js +112 -0
- package/dist/commands/debug-api.js.map +1 -0
- package/dist/commands/debug-manual.d.ts +3 -0
- package/dist/commands/debug-manual.d.ts.map +1 -0
- package/dist/commands/debug-manual.js +66 -0
- package/dist/commands/debug-manual.js.map +1 -0
- package/dist/commands/debug.d.ts +3 -0
- package/dist/commands/debug.d.ts.map +1 -0
- package/dist/commands/debug.js +114 -0
- package/dist/commands/debug.js.map +1 -0
- package/dist/commands/delete-lesson.d.ts +3 -0
- package/dist/commands/delete-lesson.d.ts.map +1 -0
- package/dist/commands/delete-lesson.js +17 -0
- package/dist/commands/delete-lesson.js.map +1 -0
- package/dist/commands/get-categories.d.ts +3 -0
- package/dist/commands/get-categories.d.ts.map +1 -0
- package/dist/commands/get-categories.js +34 -0
- package/dist/commands/get-categories.js.map +1 -0
- package/dist/commands/get-members.d.ts +3 -0
- package/dist/commands/get-members.d.ts.map +1 -0
- package/dist/commands/get-members.js +35 -0
- package/dist/commands/get-members.js.map +1 -0
- package/dist/commands/get-posts.d.ts +3 -0
- package/dist/commands/get-posts.d.ts.map +1 -0
- package/dist/commands/get-posts.js +41 -0
- package/dist/commands/get-posts.js.map +1 -0
- package/dist/commands/list-lessons.d.ts +3 -0
- package/dist/commands/list-lessons.d.ts.map +1 -0
- package/dist/commands/list-lessons.js +45 -0
- package/dist/commands/list-lessons.js.map +1 -0
- package/dist/commands/login.d.ts +3 -0
- package/dist/commands/login.d.ts.map +1 -0
- package/dist/commands/login.js +30 -0
- package/dist/commands/login.js.map +1 -0
- package/dist/commands/test-api.d.ts +3 -0
- package/dist/commands/test-api.d.ts.map +1 -0
- package/dist/commands/test-api.js +143 -0
- package/dist/commands/test-api.js.map +1 -0
- package/dist/commands/whoami.d.ts +3 -0
- package/dist/commands/whoami.d.ts.map +1 -0
- package/dist/commands/whoami.js +17 -0
- package/dist/commands/whoami.js.map +1 -0
- package/dist/core/browser-manager.d.ts +25 -0
- package/dist/core/browser-manager.d.ts.map +1 -0
- package/dist/core/browser-manager.js +104 -0
- package/dist/core/browser-manager.js.map +1 -0
- package/dist/core/config.d.ts +15 -0
- package/dist/core/config.d.ts.map +1 -0
- package/dist/core/config.js +17 -0
- package/dist/core/config.js.map +1 -0
- package/dist/core/html-generator.d.ts +15 -0
- package/dist/core/html-generator.d.ts.map +1 -0
- package/dist/core/html-generator.js +254 -0
- package/dist/core/html-generator.js.map +1 -0
- package/dist/core/page-ops.d.ts +69 -0
- package/dist/core/page-ops.d.ts.map +1 -0
- package/dist/core/page-ops.js +511 -0
- package/dist/core/page-ops.js.map +1 -0
- package/dist/core/skool-api.d.ts +74 -0
- package/dist/core/skool-api.d.ts.map +1 -0
- package/dist/core/skool-api.js +389 -0
- package/dist/core/skool-api.js.map +1 -0
- package/dist/core/skool-client.d.ts +63 -0
- package/dist/core/skool-client.d.ts.map +1 -0
- package/dist/core/skool-client.js +501 -0
- package/dist/core/skool-client.js.map +1 -0
- package/dist/core/types.d.ts +58 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +2 -0
- package/dist/core/types.js.map +1 -0
- package/package.json +51 -0
|
@@ -0,0 +1,389 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Direct HTTP API client for Skool's internal API (api2.skool.com).
|
|
3
|
+
* Discovered via network interception.
|
|
4
|
+
*
|
|
5
|
+
* Uses auth cookies from the browser session for authentication.
|
|
6
|
+
*/
|
|
7
|
+
const API_BASE = "https://api2.skool.com";
|
|
8
|
+
/**
|
|
9
|
+
* Convert HTML to Skool's TipTap JSON desc format.
|
|
10
|
+
* Skool stores content as "[v2]" + JSON array of TipTap nodes.
|
|
11
|
+
*
|
|
12
|
+
* Supported: paragraphs, headings (h1-h4), bullet lists, ordered lists,
|
|
13
|
+
* bold, italic, code, code blocks, links, horizontal rules.
|
|
14
|
+
*/
|
|
15
|
+
function htmlToSkoolDesc(html) {
|
|
16
|
+
const nodes = [];
|
|
17
|
+
// Simple HTML parser — convert HTML tags to TipTap JSON nodes
|
|
18
|
+
// Split by block-level tags
|
|
19
|
+
const blockRegex = /<(h[1-4]|p|ul|ol|pre|hr|blockquote)[^>]*>([\s\S]*?)<\/\1>|<hr\s*\/?>/gi;
|
|
20
|
+
let match;
|
|
21
|
+
let lastIndex = 0;
|
|
22
|
+
while ((match = blockRegex.exec(html)) !== null) {
|
|
23
|
+
// Check for text between blocks
|
|
24
|
+
const between = html.slice(lastIndex, match.index).trim();
|
|
25
|
+
if (between) {
|
|
26
|
+
nodes.push({ type: "paragraph", content: parseInline(between) });
|
|
27
|
+
}
|
|
28
|
+
lastIndex = match.index + match[0].length;
|
|
29
|
+
const tag = (match[1] || "").toLowerCase();
|
|
30
|
+
const inner = match[2] || "";
|
|
31
|
+
if (tag.startsWith("h")) {
|
|
32
|
+
const level = parseInt(tag[1]);
|
|
33
|
+
nodes.push({
|
|
34
|
+
type: "heading",
|
|
35
|
+
attrs: { level },
|
|
36
|
+
content: parseInline(stripTags(inner)),
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
else if (tag === "p") {
|
|
40
|
+
nodes.push({ type: "paragraph", content: parseInline(inner) });
|
|
41
|
+
}
|
|
42
|
+
else if (tag === "ul") {
|
|
43
|
+
nodes.push({ type: "bulletList", content: parseListItems(inner) });
|
|
44
|
+
}
|
|
45
|
+
else if (tag === "ol") {
|
|
46
|
+
nodes.push({ type: "orderedList", content: parseListItems(inner) });
|
|
47
|
+
}
|
|
48
|
+
else if (tag === "pre") {
|
|
49
|
+
const code = stripTags(inner).replace(/</g, "<").replace(/>/g, ">").replace(/&/g, "&");
|
|
50
|
+
nodes.push({
|
|
51
|
+
type: "codeBlock",
|
|
52
|
+
content: [{ type: "text", text: code }],
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
else if (tag === "blockquote") {
|
|
56
|
+
nodes.push({
|
|
57
|
+
type: "blockquote",
|
|
58
|
+
content: [{ type: "paragraph", content: parseInline(stripTags(inner)) }],
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
else if (match[0].startsWith("<hr")) {
|
|
62
|
+
nodes.push({ type: "horizontalRule" });
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
// Remaining text after last block
|
|
66
|
+
const remaining = html.slice(lastIndex).trim();
|
|
67
|
+
if (remaining) {
|
|
68
|
+
nodes.push({ type: "paragraph", content: parseInline(remaining) });
|
|
69
|
+
}
|
|
70
|
+
// If no blocks were found, treat the whole thing as a paragraph
|
|
71
|
+
if (nodes.length === 0 && html.trim()) {
|
|
72
|
+
nodes.push({ type: "paragraph", content: parseInline(html) });
|
|
73
|
+
}
|
|
74
|
+
return "[v2]" + JSON.stringify(nodes);
|
|
75
|
+
}
|
|
76
|
+
/** Parse inline HTML (bold, italic, code, links) into TipTap text nodes with marks */
|
|
77
|
+
function parseInline(html) {
|
|
78
|
+
const nodes = [];
|
|
79
|
+
// Regex to find inline formatting tags
|
|
80
|
+
const inlineRegex = /<(strong|b|em|i|code|s|a)([^>]*)>([\s\S]*?)<\/\1>|([^<]+)/gi;
|
|
81
|
+
let match;
|
|
82
|
+
while ((match = inlineRegex.exec(html)) !== null) {
|
|
83
|
+
if (match[4]) {
|
|
84
|
+
// Plain text (no tag) — preserve spaces for inline continuity
|
|
85
|
+
const text = decodeEntities(match[4]);
|
|
86
|
+
if (text)
|
|
87
|
+
nodes.push({ type: "text", text });
|
|
88
|
+
}
|
|
89
|
+
else {
|
|
90
|
+
const tag = match[1].toLowerCase();
|
|
91
|
+
const attrs = match[2] || "";
|
|
92
|
+
const inner = decodeEntities(stripTags(match[3]));
|
|
93
|
+
if (!inner.trim())
|
|
94
|
+
continue;
|
|
95
|
+
const marks = [];
|
|
96
|
+
if (tag === "strong" || tag === "b")
|
|
97
|
+
marks.push({ type: "bold" });
|
|
98
|
+
if (tag === "em" || tag === "i")
|
|
99
|
+
marks.push({ type: "italic" });
|
|
100
|
+
if (tag === "code")
|
|
101
|
+
marks.push({ type: "code" });
|
|
102
|
+
if (tag === "s")
|
|
103
|
+
marks.push({ type: "strike" });
|
|
104
|
+
if (tag === "a") {
|
|
105
|
+
const hrefMatch = attrs.match(/href="([^"]+)"/);
|
|
106
|
+
if (hrefMatch) {
|
|
107
|
+
marks.push({ type: "link", attrs: { href: hrefMatch[1], target: "_blank" } });
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
if (marks.length > 0) {
|
|
111
|
+
nodes.push({ type: "text", text: inner, marks });
|
|
112
|
+
}
|
|
113
|
+
else {
|
|
114
|
+
nodes.push({ type: "text", text: inner });
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
if (nodes.length === 0) {
|
|
119
|
+
const text = decodeEntities(stripTags(html).trim());
|
|
120
|
+
if (text)
|
|
121
|
+
return [{ type: "text", text }];
|
|
122
|
+
return [{ type: "text", text: " " }];
|
|
123
|
+
}
|
|
124
|
+
return nodes;
|
|
125
|
+
}
|
|
126
|
+
/** Decode HTML entities */
|
|
127
|
+
function decodeEntities(text) {
|
|
128
|
+
return text
|
|
129
|
+
.replace(/</g, "<")
|
|
130
|
+
.replace(/>/g, ">")
|
|
131
|
+
.replace(/&/g, "&")
|
|
132
|
+
.replace(/"/g, '"')
|
|
133
|
+
.replace(/'/g, "'");
|
|
134
|
+
}
|
|
135
|
+
/** Parse <li> items from a list */
|
|
136
|
+
function parseListItems(html) {
|
|
137
|
+
const items = [];
|
|
138
|
+
const liRegex = /<li[^>]*>([\s\S]*?)<\/li>/gi;
|
|
139
|
+
let liMatch;
|
|
140
|
+
while ((liMatch = liRegex.exec(html)) !== null) {
|
|
141
|
+
items.push({
|
|
142
|
+
type: "listItem",
|
|
143
|
+
content: [
|
|
144
|
+
{ type: "paragraph", content: parseInline(liMatch[1]) },
|
|
145
|
+
],
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
return items;
|
|
149
|
+
}
|
|
150
|
+
/** Strip HTML tags */
|
|
151
|
+
function stripTags(html) {
|
|
152
|
+
return html.replace(/<[^>]+>/g, "");
|
|
153
|
+
}
|
|
154
|
+
export class SkoolApi {
|
|
155
|
+
browser;
|
|
156
|
+
constructor(browser) {
|
|
157
|
+
this.browser = browser;
|
|
158
|
+
}
|
|
159
|
+
/** Get auth cookies from the browser session */
|
|
160
|
+
async getCookies() {
|
|
161
|
+
const page = await this.browser.getPage();
|
|
162
|
+
const context = page.context();
|
|
163
|
+
const cookies = await context.cookies();
|
|
164
|
+
return cookies.map((c) => `${c.name}=${c.value}`).join("; ");
|
|
165
|
+
}
|
|
166
|
+
/** Make an authenticated API request */
|
|
167
|
+
async request(method, path, body) {
|
|
168
|
+
const cookies = await this.getCookies();
|
|
169
|
+
const url = `${API_BASE}${path}`;
|
|
170
|
+
const response = await fetch(url, {
|
|
171
|
+
method,
|
|
172
|
+
headers: {
|
|
173
|
+
Cookie: cookies,
|
|
174
|
+
"Content-Type": "application/json",
|
|
175
|
+
Accept: "application/json",
|
|
176
|
+
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36",
|
|
177
|
+
Origin: "https://www.skool.com",
|
|
178
|
+
Referer: "https://www.skool.com/",
|
|
179
|
+
},
|
|
180
|
+
body: body ? JSON.stringify(body) : undefined,
|
|
181
|
+
});
|
|
182
|
+
const text = await response.text();
|
|
183
|
+
let data;
|
|
184
|
+
try {
|
|
185
|
+
data = JSON.parse(text);
|
|
186
|
+
}
|
|
187
|
+
catch {
|
|
188
|
+
data = { error: text };
|
|
189
|
+
}
|
|
190
|
+
return { status: response.status, data };
|
|
191
|
+
}
|
|
192
|
+
/**
|
|
193
|
+
* Create a new page (lesson) in a course.
|
|
194
|
+
*
|
|
195
|
+
* @param groupId - Group ID (from the classroom URL or course data)
|
|
196
|
+
* @param userId - User ID (the logged-in user)
|
|
197
|
+
* @param parentId - Parent folder/module ID
|
|
198
|
+
* @param rootId - Root course ID
|
|
199
|
+
* @param title - Page title
|
|
200
|
+
* @param content - HTML content for the page body
|
|
201
|
+
*/
|
|
202
|
+
async createPage(options) {
|
|
203
|
+
const { groupId, userId, parentId, rootId, title, content } = options;
|
|
204
|
+
// Step 1: Create the page
|
|
205
|
+
const createResult = await this.request("POST", "/courses", {
|
|
206
|
+
group_id: groupId,
|
|
207
|
+
user_id: userId,
|
|
208
|
+
parent_id: parentId,
|
|
209
|
+
root_id: rootId,
|
|
210
|
+
unit_type: "module",
|
|
211
|
+
state: 2,
|
|
212
|
+
metadata: {
|
|
213
|
+
title,
|
|
214
|
+
resources: "[]",
|
|
215
|
+
},
|
|
216
|
+
});
|
|
217
|
+
if (createResult.status !== 200) {
|
|
218
|
+
return {
|
|
219
|
+
success: false,
|
|
220
|
+
pageId: "",
|
|
221
|
+
message: `Create failed with status ${createResult.status}: ${JSON.stringify(createResult.data)}`,
|
|
222
|
+
};
|
|
223
|
+
}
|
|
224
|
+
const pageId = createResult.data.id;
|
|
225
|
+
// Step 2: If content provided, update the page with content
|
|
226
|
+
// Skool uses TipTap JSON format with [v2] prefix for the desc field
|
|
227
|
+
if (content) {
|
|
228
|
+
const desc = htmlToSkoolDesc(content);
|
|
229
|
+
const updateResult = await this.request("PUT", `/courses/${pageId}`, {
|
|
230
|
+
title,
|
|
231
|
+
desc,
|
|
232
|
+
transcript: null,
|
|
233
|
+
video_id: "",
|
|
234
|
+
});
|
|
235
|
+
if (updateResult.status !== 200) {
|
|
236
|
+
return {
|
|
237
|
+
success: true,
|
|
238
|
+
pageId,
|
|
239
|
+
message: `Page created but content update failed (${updateResult.status}): ${JSON.stringify(updateResult.data)}`,
|
|
240
|
+
};
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
return {
|
|
244
|
+
success: true,
|
|
245
|
+
pageId,
|
|
246
|
+
message: `Page "${title}" created successfully. ID: ${pageId}`,
|
|
247
|
+
};
|
|
248
|
+
}
|
|
249
|
+
/**
|
|
250
|
+
* List courses and their modules for a group.
|
|
251
|
+
* This gives us the real root_id and parent_id (folder IDs) needed for API calls.
|
|
252
|
+
*/
|
|
253
|
+
async listCourses(groupId) {
|
|
254
|
+
const result = await this.request("GET", `/courses?group_id=${groupId}`);
|
|
255
|
+
if (result.status === 200 && Array.isArray(result.data)) {
|
|
256
|
+
return result.data;
|
|
257
|
+
}
|
|
258
|
+
// Maybe the response is wrapped
|
|
259
|
+
if (result.data.courses && Array.isArray(result.data.courses)) {
|
|
260
|
+
return result.data.courses;
|
|
261
|
+
}
|
|
262
|
+
// Try with the data directly
|
|
263
|
+
return [result.data];
|
|
264
|
+
}
|
|
265
|
+
/**
|
|
266
|
+
* Create a folder (module) in a course.
|
|
267
|
+
*/
|
|
268
|
+
async createFolder(options) {
|
|
269
|
+
const result = await this.request("POST", "/courses", {
|
|
270
|
+
group_id: options.groupId,
|
|
271
|
+
parent_id: options.parentId,
|
|
272
|
+
root_id: options.rootId,
|
|
273
|
+
unit_type: "set",
|
|
274
|
+
state: 2,
|
|
275
|
+
metadata: { title: options.title },
|
|
276
|
+
});
|
|
277
|
+
if (result.status !== 200) {
|
|
278
|
+
return {
|
|
279
|
+
success: false,
|
|
280
|
+
folderId: "",
|
|
281
|
+
message: `Create folder failed (${result.status}): ${JSON.stringify(result.data)}`,
|
|
282
|
+
};
|
|
283
|
+
}
|
|
284
|
+
return {
|
|
285
|
+
success: true,
|
|
286
|
+
folderId: result.data.id,
|
|
287
|
+
message: `Folder "${options.title}" created. ID: ${result.data.id}`,
|
|
288
|
+
};
|
|
289
|
+
}
|
|
290
|
+
/**
|
|
291
|
+
* List all items (folders + pages) in a course.
|
|
292
|
+
*/
|
|
293
|
+
async listCourseItems(groupId, rootId) {
|
|
294
|
+
// Try different endpoint patterns
|
|
295
|
+
for (const path of [
|
|
296
|
+
`/courses?group_id=${groupId}&root_id=${rootId}`,
|
|
297
|
+
`/courses?group_id=${groupId}`,
|
|
298
|
+
`/courses/${rootId}/children`,
|
|
299
|
+
`/courses/${rootId}`,
|
|
300
|
+
]) {
|
|
301
|
+
const result = await this.request("GET", path);
|
|
302
|
+
if (result.status === 200) {
|
|
303
|
+
if (Array.isArray(result.data))
|
|
304
|
+
return result.data;
|
|
305
|
+
// Single course with children
|
|
306
|
+
if (result.data.children && Array.isArray(result.data.children))
|
|
307
|
+
return result.data.children;
|
|
308
|
+
if (result.data.items && Array.isArray(result.data.items))
|
|
309
|
+
return result.data.items;
|
|
310
|
+
// Single item response - could be the course itself
|
|
311
|
+
if (result.data.id)
|
|
312
|
+
return [result.data];
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
return [];
|
|
316
|
+
}
|
|
317
|
+
/**
|
|
318
|
+
* Delete a page by ID.
|
|
319
|
+
*/
|
|
320
|
+
async deletePage(pageId) {
|
|
321
|
+
const result = await this.request("DELETE", `/courses/${pageId}`);
|
|
322
|
+
return result.status === 200 || result.status === 204;
|
|
323
|
+
}
|
|
324
|
+
/**
|
|
325
|
+
* Extract group_id, user_id, root_id from the classroom page.
|
|
326
|
+
* These IDs are needed for API calls.
|
|
327
|
+
*/
|
|
328
|
+
async getClassroomIds(groupSlug, courseName) {
|
|
329
|
+
const page = await this.browser.getPage();
|
|
330
|
+
// Navigate to classroom
|
|
331
|
+
await page.goto(`https://www.skool.com/${groupSlug}/classroom`, {
|
|
332
|
+
waitUntil: "domcontentloaded",
|
|
333
|
+
});
|
|
334
|
+
await page.waitForTimeout(2000);
|
|
335
|
+
// Click into course if needed
|
|
336
|
+
if (courseName) {
|
|
337
|
+
const courseCard = page.getByText(courseName, { exact: false });
|
|
338
|
+
await courseCard.first().click();
|
|
339
|
+
await page.waitForTimeout(3000);
|
|
340
|
+
}
|
|
341
|
+
else {
|
|
342
|
+
const courseLink = page.locator('a[href*="/classroom/"]').first();
|
|
343
|
+
if ((await courseLink.count()) > 0) {
|
|
344
|
+
await courseLink.click();
|
|
345
|
+
await page.waitForTimeout(3000);
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
const courseUrl = page.url();
|
|
349
|
+
// Intercept the next API call to capture IDs
|
|
350
|
+
// The IDs were visible in the telemetry calls:
|
|
351
|
+
// group_id, member_id from the pv telemetry event
|
|
352
|
+
// We can also extract from the URL and page data
|
|
353
|
+
// Extract from page context using __NEXT_DATA__ or similar
|
|
354
|
+
const ids = await page.evaluate(() => {
|
|
355
|
+
// Try to find IDs from the React state or data attributes
|
|
356
|
+
// The telemetry calls contain: group_id, member_id
|
|
357
|
+
// Check __NEXT_DATA__ (Next.js)
|
|
358
|
+
const nextData = window.__NEXT_DATA__;
|
|
359
|
+
if (nextData?.props?.pageProps) {
|
|
360
|
+
const props = nextData.props.pageProps;
|
|
361
|
+
return {
|
|
362
|
+
groupId: (props.group_id || props.groupId || ""),
|
|
363
|
+
userId: (props.user_id || props.userId || ""),
|
|
364
|
+
};
|
|
365
|
+
}
|
|
366
|
+
return null;
|
|
367
|
+
});
|
|
368
|
+
if (ids?.groupId && ids?.userId) {
|
|
369
|
+
// Extract rootId from URL: /classroom/{rootId}?md=...
|
|
370
|
+
const urlMatch = courseUrl.match(/\/classroom\/([a-f0-9]+)/);
|
|
371
|
+
const rootId = urlMatch ? urlMatch[1] : "";
|
|
372
|
+
return {
|
|
373
|
+
groupId: ids.groupId,
|
|
374
|
+
userId: ids.userId,
|
|
375
|
+
rootId,
|
|
376
|
+
courseUrl,
|
|
377
|
+
};
|
|
378
|
+
}
|
|
379
|
+
// Fallback: extract from known values in the intercepted API calls
|
|
380
|
+
// We know from the debug-api output:
|
|
381
|
+
// group_id: 01fe75d52c50463fbe45d0a34bbcc398
|
|
382
|
+
// user_id: 84e41d162d6a46178e173fce440ea094
|
|
383
|
+
// root_id: fce518d5f6b84a18a4105fc5d353f660 (same as parent_id for top-level)
|
|
384
|
+
// But these are specific to Mario's account, so we need a dynamic way
|
|
385
|
+
// Try intercepting by navigating and capturing
|
|
386
|
+
return null;
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
//# sourceMappingURL=skool-api.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skool-api.js","sourceRoot":"","sources":["../../src/core/skool-api.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,MAAM,QAAQ,GAAG,wBAAwB,CAAC;AAE1C;;;;;;GAMG;AACH,SAAS,eAAe,CAAC,IAAY;IACnC,MAAM,KAAK,GAA8B,EAAE,CAAC;IAE5C,8DAA8D;IAC9D,4BAA4B;IAC5B,MAAM,UAAU,GAAG,wEAAwE,CAAC;IAC5F,IAAI,KAAK,CAAC;IACV,IAAI,SAAS,GAAG,CAAC,CAAC;IAElB,OAAO,CAAC,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QAChD,gCAAgC;QAChC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC;QAC1D,IAAI,OAAO,EAAE,CAAC;YACZ,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,WAAW,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACnE,CAAC;QACD,SAAS,GAAG,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;QAE1C,MAAM,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;QAC3C,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAE7B,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACxB,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;YAC/B,KAAK,CAAC,IAAI,CAAC;gBACT,IAAI,EAAE,SAAS;gBACf,KAAK,EAAE,EAAE,KAAK,EAAE;gBAChB,OAAO,EAAE,WAAW,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;aACvC,CAAC,CAAC;QACL,CAAC;aAAM,IAAI,GAAG,KAAK,GAAG,EAAE,CAAC;YACvB,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACjE,CAAC;aAAM,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;YACxB,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,cAAc,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACrE,CAAC;aAAM,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;YACxB,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,cAAc,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACtE,CAAC;aAAM,IAAI,GAAG,KAAK,KAAK,EAAE,CAAC;YACzB,MAAM,IAAI,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;YACjG,KAAK,CAAC,IAAI,CAAC;gBACT,IAAI,EAAE,WAAW;gBACjB,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;aACxC,CAAC,CAAC;QACL,CAAC;aAAM,IAAI,GAAG,KAAK,YAAY,EAAE,CAAC;YAChC,KAAK,CAAC,IAAI,CAAC;gBACT,IAAI,EAAE,YAAY;gBAClB,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,WAAW,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;aACzE,CAAC,CAAC;QACL,CAAC;aAAM,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;YACtC,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,CAAC,CAAC;QACzC,CAAC;IACH,CAAC;IAED,kCAAkC;IAClC,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,CAAC;IAC/C,IAAI,SAAS,EAAE,CAAC;QACd,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,WAAW,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;IACrE,CAAC;IAED,gEAAgE;IAChE,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;QACtC,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAChE,CAAC;IAED,OAAO,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;AACxC,CAAC;AAED,sFAAsF;AACtF,SAAS,WAAW,CAAC,IAAY;IAC/B,MAAM,KAAK,GAA8B,EAAE,CAAC;IAE5C,uCAAuC;IACvC,MAAM,WAAW,GAAG,6DAA6D,CAAC;IAClF,IAAI,KAAK,CAAC;IAEV,OAAO,CAAC,KAAK,GAAG,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QACjD,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;YACb,8DAA8D;YAC9D,MAAM,IAAI,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;YACtC,IAAI,IAAI;gBAAE,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;QAC/C,CAAC;aAAM,CAAC;YACN,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;YACnC,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YAC7B,MAAM,KAAK,GAAG,cAAc,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAClD,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE;gBAAE,SAAS;YAE5B,MAAM,KAAK,GAA8B,EAAE,CAAC;YAC5C,IAAI,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,GAAG;gBAAE,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;YAClE,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,GAAG;gBAAE,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;YAChE,IAAI,GAAG,KAAK,MAAM;gBAAE,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;YACjD,IAAI,GAAG,KAAK,GAAG;gBAAE,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;YAChD,IAAI,GAAG,KAAK,GAAG,EAAE,CAAC;gBAChB,MAAM,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;gBAChD,IAAI,SAAS,EAAE,CAAC;oBACd,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,CAAC,CAAC;gBAChF,CAAC;YACH,CAAC;YAED,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACrB,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;YACnD,CAAC;iBAAM,CAAC;gBACN,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;YAC5C,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,MAAM,IAAI,GAAG,cAAc,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QACpD,IAAI,IAAI;YAAE,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1C,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC;IACvC,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,2BAA2B;AAC3B,SAAS,cAAc,CAAC,IAAY;IAClC,OAAO,IAAI;SACR,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC;SACrB,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC;SACrB,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC;SACtB,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC;SACvB,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;AAC5B,CAAC;AAED,mCAAmC;AACnC,SAAS,cAAc,CAAC,IAAY;IAClC,MAAM,KAAK,GAA8B,EAAE,CAAC;IAC5C,MAAM,OAAO,GAAG,6BAA6B,CAAC;IAC9C,IAAI,OAAO,CAAC;IACZ,OAAO,CAAC,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QAC/C,KAAK,CAAC,IAAI,CAAC;YACT,IAAI,EAAE,UAAU;YAChB,OAAO,EAAE;gBACP,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE;aACxD;SACF,CAAC,CAAC;IACL,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,sBAAsB;AACtB,SAAS,SAAS,CAAC,IAAY;IAC7B,OAAO,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;AACtC,CAAC;AAED,MAAM,OAAO,QAAQ;IACC;IAApB,YAAoB,OAAuB;QAAvB,YAAO,GAAP,OAAO,CAAgB;IAAG,CAAC;IAE/C,gDAAgD;IACxC,KAAK,CAAC,UAAU;QACtB,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;QAC1C,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;QAC/B,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;QACxC,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC/D,CAAC;IAED,wCAAwC;IAChC,KAAK,CAAC,OAAO,CACnB,MAAc,EACd,IAAY,EACZ,IAA8B;QAE9B,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;QACxC,MAAM,GAAG,GAAG,GAAG,QAAQ,GAAG,IAAI,EAAE,CAAC;QAEjC,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;YAChC,MAAM;YACN,OAAO,EAAE;gBACP,MAAM,EAAE,OAAO;gBACf,cAAc,EAAE,kBAAkB;gBAClC,MAAM,EAAE,kBAAkB;gBAC1B,YAAY,EACV,oEAAoE;gBACtE,MAAM,EAAE,uBAAuB;gBAC/B,OAAO,EAAE,wBAAwB;aAClC;YACD,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS;SAC9C,CAAC,CAAC;QAEH,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QACnC,IAAI,IAA6B,CAAC;QAClC,IAAI,CAAC;YACH,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAA4B,CAAC;QACrD,CAAC;QAAC,MAAM,CAAC;YACP,IAAI,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;QACzB,CAAC;QACD,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC;IAC3C,CAAC;IAED;;;;;;;;;OASG;IACH,KAAK,CAAC,UAAU,CAAC,OAOhB;QACC,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;QAEtE,0BAA0B;QAC1B,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,UAAU,EAAE;YAC1D,QAAQ,EAAE,OAAO;YACjB,OAAO,EAAE,MAAM;YACf,SAAS,EAAE,QAAQ;YACnB,OAAO,EAAE,MAAM;YACf,SAAS,EAAE,QAAQ;YACnB,KAAK,EAAE,CAAC;YACR,QAAQ,EAAE;gBACR,KAAK;gBACL,SAAS,EAAE,IAAI;aAChB;SACF,CAAC,CAAC;QAEH,IAAI,YAAY,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YAChC,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,MAAM,EAAE,EAAE;gBACV,OAAO,EAAE,6BAA6B,YAAY,CAAC,MAAM,KAAK,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE;aAClG,CAAC;QACJ,CAAC;QAED,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI,CAAC,EAAY,CAAC;QAE9C,4DAA4D;QAC5D,oEAAoE;QACpE,IAAI,OAAO,EAAE,CAAC;YACZ,MAAM,IAAI,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;YACtC,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,YAAY,MAAM,EAAE,EAAE;gBACnE,KAAK;gBACL,IAAI;gBACJ,UAAU,EAAE,IAAI;gBAChB,QAAQ,EAAE,EAAE;aACb,CAAC,CAAC;YAEH,IAAI,YAAY,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;gBAChC,OAAO;oBACL,OAAO,EAAE,IAAI;oBACb,MAAM;oBACN,OAAO,EAAE,2CAA2C,YAAY,CAAC,MAAM,MAAM,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE;iBACjH,CAAC;YACJ,CAAC;QACH,CAAC;QAED,OAAO;YACL,OAAO,EAAE,IAAI;YACb,MAAM;YACN,OAAO,EAAE,SAAS,KAAK,+BAA+B,MAAM,EAAE;SAC/D,CAAC;IACJ,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,WAAW,CAAC,OAAe;QAC/B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,qBAAqB,OAAO,EAAE,CAAC,CAAC;QACzE,IAAI,MAAM,CAAC,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;YACxD,OAAO,MAAM,CAAC,IAAiC,CAAC;QAClD,CAAC;QACD,gCAAgC;QAChC,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;YAC9D,OAAO,MAAM,CAAC,IAAI,CAAC,OAAoC,CAAC;QAC1D,CAAC;QACD,6BAA6B;QAC7B,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACvB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,YAAY,CAAC,OAKlB;QACC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,UAAU,EAAE;YACpD,QAAQ,EAAE,OAAO,CAAC,OAAO;YACzB,SAAS,EAAE,OAAO,CAAC,QAAQ;YAC3B,OAAO,EAAE,OAAO,CAAC,MAAM;YACvB,SAAS,EAAE,KAAK;YAChB,KAAK,EAAE,CAAC;YACR,QAAQ,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE;SACnC,CAAC,CAAC;QAEH,IAAI,MAAM,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YAC1B,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,QAAQ,EAAE,EAAE;gBACZ,OAAO,EAAE,yBAAyB,MAAM,CAAC,MAAM,MAAM,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE;aACnF,CAAC;QACJ,CAAC;QAED,OAAO;YACL,OAAO,EAAE,IAAI;YACb,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,EAAY;YAClC,OAAO,EAAE,WAAW,OAAO,CAAC,KAAK,kBAAkB,MAAM,CAAC,IAAI,CAAC,EAAE,EAAE;SACpE,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,eAAe,CACnB,OAAe,EACf,MAAc;QAEd,kCAAkC;QAClC,KAAK,MAAM,IAAI,IAAI;YACjB,qBAAqB,OAAO,YAAY,MAAM,EAAE;YAChD,qBAAqB,OAAO,EAAE;YAC9B,YAAY,MAAM,WAAW;YAC7B,YAAY,MAAM,EAAE;SACrB,EAAE,CAAC;YACF,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;YAC/C,IAAI,MAAM,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;gBAC1B,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC;oBAAE,OAAO,MAAM,CAAC,IAAI,CAAC;gBACnD,8BAA8B;gBAC9B,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC;oBAC7D,OAAO,MAAM,CAAC,IAAI,CAAC,QAAqC,CAAC;gBAC3D,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC;oBACvD,OAAO,MAAM,CAAC,IAAI,CAAC,KAAkC,CAAC;gBACxD,oDAAoD;gBACpD,IAAI,MAAM,CAAC,IAAI,CAAC,EAAE;oBAAE,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YAC3C,CAAC;QACH,CAAC;QACD,OAAO,EAAE,CAAC;IACZ,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,UAAU,CAAC,MAAc;QAC7B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,YAAY,MAAM,EAAE,CAAC,CAAC;QAClE,OAAO,MAAM,CAAC,MAAM,KAAK,GAAG,IAAI,MAAM,CAAC,MAAM,KAAK,GAAG,CAAC;IACxD,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,eAAe,CACnB,SAAiB,EACjB,UAAmB;QAOnB,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;QAE1C,wBAAwB;QACxB,MAAM,IAAI,CAAC,IAAI,CAAC,yBAAyB,SAAS,YAAY,EAAE;YAC9D,SAAS,EAAE,kBAAkB;SAC9B,CAAC,CAAC;QACH,MAAM,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;QAEhC,8BAA8B;QAC9B,IAAI,UAAU,EAAE,CAAC;YACf,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;YAChE,MAAM,UAAU,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,CAAC;YACjC,MAAM,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;QAClC,CAAC;aAAM,CAAC;YACN,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,wBAAwB,CAAC,CAAC,KAAK,EAAE,CAAC;YAClE,IAAI,CAAC,MAAM,UAAU,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC;gBACnC,MAAM,UAAU,CAAC,KAAK,EAAE,CAAC;gBACzB,MAAM,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;YAClC,CAAC;QACH,CAAC;QAED,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAE7B,6CAA6C;QAC7C,+CAA+C;QAC/C,kDAAkD;QAClD,iDAAiD;QAEjD,2DAA2D;QAC3D,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE;YACnC,0DAA0D;YAC1D,mDAAmD;YACnD,gCAAgC;YAChC,MAAM,QAAQ,GAAI,MAA6F,CAAC,aAAa,CAAC;YAC9H,IAAI,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;gBAC/B,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,SAAoC,CAAC;gBAClE,OAAO;oBACL,OAAO,EAAE,CAAC,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,OAAO,IAAI,EAAE,CAAW;oBAC1D,MAAM,EAAE,CAAC,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,MAAM,IAAI,EAAE,CAAW;iBACxD,CAAC;YACJ,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC,CAAC,CAAC;QAEH,IAAI,GAAG,EAAE,OAAO,IAAI,GAAG,EAAE,MAAM,EAAE,CAAC;YAChC,sDAAsD;YACtD,MAAM,QAAQ,GAAG,SAAS,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC;YAC7D,MAAM,MAAM,GAAG,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAE3C,OAAO;gBACL,OAAO,EAAE,GAAG,CAAC,OAAO;gBACpB,MAAM,EAAE,GAAG,CAAC,MAAM;gBAClB,MAAM;gBACN,SAAS;aACV,CAAC;QACJ,CAAC;QAED,mEAAmE;QACnE,qCAAqC;QACrC,6CAA6C;QAC7C,4CAA4C;QAC5C,8EAA8E;QAC9E,sEAAsE;QAEtE,+CAA+C;QAC/C,OAAO,IAAI,CAAC;IACd,CAAC;CACF"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import type { CreateLessonOptions, CreateFolderOptions, CreatePostOptions, OperationResult, SkoolPost, SkoolMember } from "./types.js";
|
|
2
|
+
/**
|
|
3
|
+
* High-level Skool client.
|
|
4
|
+
* This is the main API for both CLI commands and programmatic usage.
|
|
5
|
+
*/
|
|
6
|
+
export declare class SkoolClient {
|
|
7
|
+
private browser;
|
|
8
|
+
private ops;
|
|
9
|
+
private api;
|
|
10
|
+
private cachedGroupId;
|
|
11
|
+
private cachedUserId;
|
|
12
|
+
private cachedRootId;
|
|
13
|
+
constructor();
|
|
14
|
+
/** Discover group_id, user_id, root_id for API calls */
|
|
15
|
+
private discoverIds;
|
|
16
|
+
/** Login to Skool with email and password */
|
|
17
|
+
login(email: string, password: string): Promise<OperationResult>;
|
|
18
|
+
/** Check if the current session is valid */
|
|
19
|
+
checkSession(groupSlug: string): Promise<OperationResult>;
|
|
20
|
+
/** Create a new folder (module) in a Skool classroom course */
|
|
21
|
+
createFolder(options: CreateFolderOptions): Promise<OperationResult>;
|
|
22
|
+
/** Find a folder by name and return its ID.
|
|
23
|
+
* Extracts folder names + IDs from the sidebar DOM via Playwright.
|
|
24
|
+
*/
|
|
25
|
+
private findFolderByName;
|
|
26
|
+
/** Create a new lesson in a Skool classroom module */
|
|
27
|
+
createLesson(options: CreateLessonOptions): Promise<OperationResult>;
|
|
28
|
+
/** List all lessons and folders in a course (from sidebar DOM) */
|
|
29
|
+
listLessons(groupSlug: string, courseName?: string): Promise<{
|
|
30
|
+
success: boolean;
|
|
31
|
+
message: string;
|
|
32
|
+
items: Array<{
|
|
33
|
+
name: string;
|
|
34
|
+
type: "folder" | "lesson";
|
|
35
|
+
children?: Array<{
|
|
36
|
+
name: string;
|
|
37
|
+
}>;
|
|
38
|
+
}>;
|
|
39
|
+
}>;
|
|
40
|
+
/** Delete a lesson or folder by ID */
|
|
41
|
+
deleteLesson(pageId: string): Promise<OperationResult>;
|
|
42
|
+
/** Create a community post */
|
|
43
|
+
createPost(options: CreatePostOptions): Promise<OperationResult>;
|
|
44
|
+
/** Get posts from a community */
|
|
45
|
+
getPosts(groupSlug: string): Promise<{
|
|
46
|
+
success: boolean;
|
|
47
|
+
posts: SkoolPost[];
|
|
48
|
+
}>;
|
|
49
|
+
/** Get categories from a community */
|
|
50
|
+
getCategories(groupSlug: string): Promise<{
|
|
51
|
+
success: boolean;
|
|
52
|
+
categories: string[];
|
|
53
|
+
}>;
|
|
54
|
+
/** Get members from a community */
|
|
55
|
+
getMembers(groupSlug: string, search?: string): Promise<{
|
|
56
|
+
success: boolean;
|
|
57
|
+
members: SkoolMember[];
|
|
58
|
+
}>;
|
|
59
|
+
/** Close the browser and cleanup */
|
|
60
|
+
close(): Promise<void>;
|
|
61
|
+
}
|
|
62
|
+
export type { CreateLessonOptions, CreatePostOptions, OperationResult, SkoolPost, SkoolMember, } from "./types.js";
|
|
63
|
+
//# sourceMappingURL=skool-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skool-client.d.ts","sourceRoot":"","sources":["../../src/core/skool-client.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EACV,mBAAmB,EACnB,mBAAmB,EACnB,iBAAiB,EACjB,eAAe,EACf,SAAS,EACT,WAAW,EACZ,MAAM,YAAY,CAAC;AAEpB;;;GAGG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,OAAO,CAAiB;IAChC,OAAO,CAAC,GAAG,CAAU;IACrB,OAAO,CAAC,GAAG,CAAW;IAGtB,OAAO,CAAC,aAAa,CAAM;IAC3B,OAAO,CAAC,YAAY,CAAM;IAC1B,OAAO,CAAC,YAAY,CAAM;;IAQ1B,wDAAwD;YAC1C,WAAW;IAgIzB,6CAA6C;IACvC,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;IAUtE,4CAA4C;IACtC,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;IAe/D,+DAA+D;IACzD,YAAY,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,eAAe,CAAC;IA2B1E;;OAEG;YACW,gBAAgB;IA0E9B,sDAAsD;IAChD,YAAY,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,eAAe,CAAC;IAkF1E,kEAAkE;IAC5D,WAAW,CACf,SAAS,EAAE,MAAM,EACjB,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC;QACT,OAAO,EAAE,OAAO,CAAC;QACjB,OAAO,EAAE,MAAM,CAAC;QAChB,KAAK,EAAE,KAAK,CAAC;YACX,IAAI,EAAE,MAAM,CAAC;YACb,IAAI,EAAE,QAAQ,GAAG,QAAQ,CAAC;YAC1B,QAAQ,CAAC,EAAE,KAAK,CAAC;gBAAE,IAAI,EAAE,MAAM,CAAA;aAAE,CAAC,CAAC;SACpC,CAAC,CAAC;KACJ,CAAC;IAmGF,sCAAsC;IAChC,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;IAqB5D,8BAA8B;IACxB,UAAU,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,eAAe,CAAC;IA8BtE,iCAAiC;IAC3B,QAAQ,CACZ,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,KAAK,EAAE,SAAS,EAAE,CAAA;KAAE,CAAC;IAkBpD,sCAAsC;IAChC,aAAa,CACjB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,UAAU,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;IAatD,mCAAmC;IAC7B,UAAU,CACd,SAAS,EAAE,MAAM,EACjB,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,OAAO,EAAE,WAAW,EAAE,CAAA;KAAE,CAAC;IAmBxD,oCAAoC;IAC9B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAG7B;AAGD,YAAY,EACV,mBAAmB,EACnB,iBAAiB,EACjB,eAAe,EACf,SAAS,EACT,WAAW,GACZ,MAAM,YAAY,CAAC"}
|