@learnpack/learnpack 5.0.270 → 5.0.274
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +409 -409
- package/lib/commands/audit.js +15 -15
- package/lib/commands/breakToken.js +19 -19
- package/lib/commands/clean.js +3 -3
- package/lib/commands/init.js +41 -41
- package/lib/commands/logout.js +3 -3
- package/lib/commands/serve.js +48 -20
- package/lib/creatorDist/assets/{index-CQXTTbaZ.js → index-BfLyIQVh.js} +11535 -11409
- package/lib/creatorDist/assets/{index-B4khtb0r.css → index-C39zeF3W.css} +3 -3
- package/lib/creatorDist/index.html +2 -2
- package/lib/managers/config/index.js +77 -77
- package/lib/models/creator.d.ts +1 -0
- package/lib/utils/api.js +1 -0
- package/lib/utils/creatorUtilities.js +14 -14
- package/package.json +1 -1
- package/src/commands/audit.ts +487 -487
- package/src/commands/breakToken.ts +67 -67
- package/src/commands/clean.ts +30 -30
- package/src/commands/init.ts +650 -650
- package/src/commands/logout.ts +38 -38
- package/src/commands/publish.ts +522 -522
- package/src/commands/serve.ts +64 -33
- package/src/commands/start.ts +333 -333
- package/src/commands/translate.ts +123 -123
- package/src/creator/README.md +54 -54
- package/src/creator/eslint.config.js +28 -28
- package/src/creator/src/components/syllabus/ContentIndex.tsx +1 -1
- package/src/creator/src/components/syllabus/SyllabusEditor.tsx +3 -1
- package/src/creator/src/i18n.ts +28 -28
- package/src/creator/src/index.css +217 -217
- package/src/creator/src/locales/en.json +1 -0
- package/src/creator/src/locales/es.json +1 -0
- package/src/creator/src/utils/configTypes.ts +122 -122
- package/src/creator/src/utils/constants.ts +13 -13
- package/src/creator/src/utils/creatorUtils.ts +46 -46
- package/src/creator/src/utils/eventBus.ts +2 -2
- package/src/creator/src/utils/lib.ts +468 -468
- package/src/creator/src/utils/rigo.ts +26 -26
- package/src/creator/src/utils/socket.ts +61 -61
- package/src/creator/src/utils/store.ts +222 -222
- package/src/creator/src/vite-env.d.ts +1 -1
- package/src/creator/vite.config.ts +13 -13
- package/src/creatorDist/assets/{index-CQXTTbaZ.js → index-BfLyIQVh.js} +11535 -11409
- package/src/creatorDist/assets/{index-B4khtb0r.css → index-C39zeF3W.css} +3 -3
- package/src/creatorDist/index.html +2 -2
- package/src/managers/config/defaults.ts +49 -49
- package/src/managers/config/exercise.ts +364 -364
- package/src/managers/config/index.ts +775 -775
- package/src/managers/file.ts +236 -236
- package/src/managers/server/routes.ts +554 -554
- package/src/managers/session.ts +182 -182
- package/src/managers/telemetry.ts +188 -188
- package/src/models/action.ts +13 -13
- package/src/models/config-manager.ts +28 -28
- package/src/models/config.ts +106 -106
- package/src/models/creator.ts +40 -39
- package/src/models/exercise-obj.ts +30 -30
- package/src/models/session.ts +39 -39
- package/src/models/socket.ts +61 -61
- package/src/models/status.ts +16 -16
- package/src/ui/_app/app.css +1 -1
- package/src/ui/_app/app.js +435 -414
- package/src/ui/_app/learnpack.svg +7 -7
- package/src/ui/app.tar.gz +0 -0
- package/src/utils/BaseCommand.ts +56 -56
- package/src/utils/api.ts +31 -30
- package/src/utils/audit.ts +392 -392
- package/src/utils/checkNotInstalled.ts +267 -267
- package/src/utils/configBuilder.ts +82 -82
- package/src/utils/convertCreds.js +34 -34
- package/src/utils/creatorUtilities.ts +504 -504
- package/src/utils/incrementVersion.js +74 -74
- package/src/utils/misc.ts +58 -58
- package/src/utils/rigoActions.ts +500 -500
- package/src/utils/sidebarGenerator.ts +195 -195
- package/src/utils/templates/isolated/exercises/01-hello-world/README.es.md +26 -26
- package/src/utils/templates/isolated/exercises/01-hello-world/README.md +26 -26
package/src/commands/serve.ts
CHANGED
@@ -45,7 +45,10 @@ import {
|
|
45
45
|
import axios from "axios"
|
46
46
|
import * as FormData from "form-data"
|
47
47
|
import api, { RIGOBOT_HOST } from "../utils/api"
|
48
|
-
import {
|
48
|
+
import {
|
49
|
+
createUploadMiddleware,
|
50
|
+
minutesToISO8601Duration,
|
51
|
+
} from "../utils/misc"
|
49
52
|
import { buildConfig, ConfigResponse } from "../utils/configBuilder"
|
50
53
|
import { checkReadability, slugify } from "../utils/creatorUtilities"
|
51
54
|
import { checkAndFixSidebarPure } from "../utils/sidebarGenerator"
|
@@ -157,11 +160,9 @@ const uploadInitialReadme = async (
|
|
157
160
|
:rigo
|
158
161
|
\`\`\`
|
159
162
|
`
|
160
|
-
const readmeFilename = `README
|
161
|
-
packageContext.language
|
162
|
-
|
163
|
-
""
|
164
|
-
}md`
|
163
|
+
const readmeFilename = `README${getReadmeExtension(
|
164
|
+
packageContext.language || "en"
|
165
|
+
)}`
|
165
166
|
|
166
167
|
await uploadFileToBucket(
|
167
168
|
bucket,
|
@@ -229,12 +230,10 @@ const createMultiLangAsset = async (
|
|
229
230
|
}
|
230
231
|
|
231
232
|
async function startExerciseGeneration(
|
232
|
-
bucket: Bucket,
|
233
233
|
rigoToken: string,
|
234
234
|
steps: Lesson[],
|
235
235
|
packageContext: FormState,
|
236
236
|
exercise: Lesson,
|
237
|
-
tutorialDir: string,
|
238
237
|
courseSlug: string,
|
239
238
|
purposeSlug: string,
|
240
239
|
lastLesson = ""
|
@@ -246,7 +245,7 @@ async function startExerciseGeneration(
|
|
246
245
|
|
247
246
|
console.log("WEBHOOK URL", webhookUrl)
|
248
247
|
|
249
|
-
await readmeCreator(
|
248
|
+
const res = await readmeCreator(
|
250
249
|
rigoToken,
|
251
250
|
{
|
252
251
|
title: `${exercise.id} - ${exercise.title}`,
|
@@ -262,6 +261,8 @@ async function startExerciseGeneration(
|
|
262
261
|
purposeSlug,
|
263
262
|
webhookUrl
|
264
263
|
)
|
264
|
+
|
265
|
+
console.log("README CREATOR RES", res)
|
265
266
|
}
|
266
267
|
|
267
268
|
async function createInitialReadme(
|
@@ -558,8 +559,6 @@ export default class ServeCommand extends SessionCommand {
|
|
558
559
|
return res.json({ status: "ERROR" })
|
559
560
|
}
|
560
561
|
|
561
|
-
fs.writeFileSync(`image-${imageId}.json`, JSON.stringify(body, null, 2))
|
562
|
-
|
563
562
|
const imageUrl = body.image_url
|
564
563
|
const format = body.format
|
565
564
|
const imagePath = `courses/${courseSlug}/.learn/assets/${imageId}`
|
@@ -651,18 +650,34 @@ export default class ServeCommand extends SessionCommand {
|
|
651
650
|
}
|
652
651
|
|
653
652
|
await startExerciseGeneration(
|
654
|
-
bucket,
|
655
653
|
rigoToken,
|
656
654
|
syllabusJson.lessons,
|
657
655
|
syllabusJson.courseInfo,
|
658
656
|
exercise,
|
659
|
-
`courses/${courseSlug}`,
|
660
657
|
courseSlug,
|
661
658
|
syllabusJson.courseInfo.purpose,
|
662
659
|
previousReadme +
|
663
660
|
"\n\nThe user provided the following feedback related to the content of the course so far: \n\n" +
|
664
661
|
feedback
|
665
662
|
)
|
663
|
+
|
664
|
+
syllabusJson.lessons[parseInt(position)].status = "GENERATING"
|
665
|
+
if (
|
666
|
+
syllabusJson.feedback &&
|
667
|
+
typeof syllabusJson.feedback === "string"
|
668
|
+
) {
|
669
|
+
syllabusJson.feedback += "\n\n" + feedback
|
670
|
+
} else {
|
671
|
+
syllabusJson.feedback = feedback
|
672
|
+
}
|
673
|
+
|
674
|
+
await uploadFileToBucket(
|
675
|
+
bucket,
|
676
|
+
JSON.stringify(syllabusJson),
|
677
|
+
`courses/${courseSlug}/.learn/initialSyllabus.json`
|
678
|
+
)
|
679
|
+
|
680
|
+
res.json({ status: "SUCCESS" })
|
666
681
|
}
|
667
682
|
)
|
668
683
|
|
@@ -762,16 +777,19 @@ export default class ServeCommand extends SessionCommand {
|
|
762
777
|
nextExercise &&
|
763
778
|
(exerciseIndex === 0 || !(exerciseIndex % 3 === 0))
|
764
779
|
) {
|
780
|
+
let feedback = ""
|
781
|
+
if (syllabusJson.feedback) {
|
782
|
+
feedback = `\n\nThe user added the following feedback with relation to the previous generations: ${syllabusJson.feedback}`
|
783
|
+
}
|
784
|
+
|
765
785
|
startExerciseGeneration(
|
766
|
-
bucket,
|
767
786
|
rigoToken,
|
768
787
|
syllabusJson.lessons,
|
769
788
|
syllabusJson.courseInfo,
|
770
789
|
nextExercise,
|
771
|
-
`courses/${courseSlug}`,
|
772
790
|
courseSlug,
|
773
791
|
syllabusJson.courseInfo.purpose,
|
774
|
-
readme.parsed.content
|
792
|
+
readme.parsed.content + "\n\n" + feedback
|
775
793
|
)
|
776
794
|
nextStarted = true
|
777
795
|
} else {
|
@@ -801,8 +819,8 @@ export default class ServeCommand extends SessionCommand {
|
|
801
819
|
|
802
820
|
const newSyllabus = {
|
803
821
|
...syllabusJson,
|
804
|
-
lessons: syllabusJson.lessons.map(lesson => {
|
805
|
-
if (
|
822
|
+
lessons: syllabusJson.lessons.map((lesson, index) => {
|
823
|
+
if (index === exerciseIndex) {
|
806
824
|
return { ...lesson, generated: true, status: "DONE" }
|
807
825
|
}
|
808
826
|
|
@@ -1424,12 +1442,10 @@ export default class ServeCommand extends SessionCommand {
|
|
1424
1442
|
const lastResult = "---"
|
1425
1443
|
|
1426
1444
|
await startExerciseGeneration(
|
1427
|
-
bucket,
|
1428
1445
|
rigoToken,
|
1429
1446
|
syllabus.lessons,
|
1430
1447
|
syllabus.courseInfo,
|
1431
1448
|
firstLesson,
|
1432
|
-
tutorialDir,
|
1433
1449
|
courseSlug,
|
1434
1450
|
syllabus.courseInfo.purpose,
|
1435
1451
|
lastResult
|
@@ -1494,12 +1510,10 @@ export default class ServeCommand extends SessionCommand {
|
|
1494
1510
|
const firstLessonToGenerate = notGeneratedLessons[0]
|
1495
1511
|
|
1496
1512
|
await startExerciseGeneration(
|
1497
|
-
bucket,
|
1498
1513
|
rigoToken,
|
1499
1514
|
syllabusJson.lessons,
|
1500
1515
|
syllabusJson.courseInfo,
|
1501
1516
|
firstLessonToGenerate,
|
1502
|
-
`courses/${courseSlug}`,
|
1503
1517
|
courseSlug,
|
1504
1518
|
syllabusJson.courseInfo.purpose,
|
1505
1519
|
JSON.stringify(lastGeneratedLesson) +
|
@@ -1734,7 +1748,9 @@ export default class ServeCommand extends SessionCommand {
|
|
1734
1748
|
console.error("❌ Error fetching file:", error)
|
1735
1749
|
return res
|
1736
1750
|
.status(500)
|
1737
|
-
.json({
|
1751
|
+
.json({
|
1752
|
+
error: (error as Error).message || "Unable to fetch file",
|
1753
|
+
})
|
1738
1754
|
}
|
1739
1755
|
}
|
1740
1756
|
)
|
@@ -1750,25 +1766,38 @@ export default class ServeCommand extends SessionCommand {
|
|
1750
1766
|
|
1751
1767
|
if (ytMatch) {
|
1752
1768
|
const videoId = ytMatch[1]
|
1769
|
+
console.log("VIDEO ID", videoId)
|
1753
1770
|
// fetch metadata
|
1754
1771
|
const items = await YoutubeTranscript.fetchTranscript(videoId)
|
1772
|
+
console.log("ITEMS FROM YOUTUBE TRANSCRIPT", items)
|
1755
1773
|
const transcript = items.map(i => i.text).join(" ")
|
1756
1774
|
|
1757
|
-
|
1758
|
-
|
1759
|
-
{
|
1760
|
-
|
1761
|
-
|
1762
|
-
|
1775
|
+
let meta: any = null
|
1776
|
+
try {
|
1777
|
+
const { data: meta } = await axios.get(
|
1778
|
+
"https://www.youtube.com/oembed",
|
1779
|
+
{
|
1780
|
+
params: { url: decoded, format: "json" },
|
1781
|
+
}
|
1782
|
+
)
|
1783
|
+
console.log("META", meta)
|
1784
|
+
} catch (error) {
|
1785
|
+
console.error("ERROR FETCHING META", error)
|
1786
|
+
meta = null
|
1787
|
+
}
|
1788
|
+
|
1789
|
+
throw new Error("test")
|
1763
1790
|
|
1764
1791
|
return res.json({
|
1765
1792
|
url: decoded,
|
1766
|
-
title: meta
|
1767
|
-
author: meta
|
1768
|
-
thumbnail: meta
|
1793
|
+
title: meta?.title || null,
|
1794
|
+
author: meta?.author_name || null,
|
1795
|
+
thumbnail: meta?.thumbnail_url || null,
|
1769
1796
|
transcript,
|
1770
1797
|
})
|
1771
1798
|
}
|
1799
|
+
|
1800
|
+
console.log("NOT A YOUTUBE LINK", decoded)
|
1772
1801
|
|
1773
1802
|
const response = await axios.get(decoded, { responseType: "text" })
|
1774
1803
|
const html = response.data as string
|
@@ -1783,7 +1812,9 @@ export default class ServeCommand extends SessionCommand {
|
|
1783
1812
|
})
|
1784
1813
|
} catch (error: any) {
|
1785
1814
|
console.error("❌ /actions/fetch error:", error.message || error)
|
1786
|
-
res
|
1815
|
+
res
|
1816
|
+
.status(500)
|
1817
|
+
.json({ error: error.message || "Failed to fetch link" })
|
1787
1818
|
}
|
1788
1819
|
})
|
1789
1820
|
app.delete("/packages/:slug", async (req, res) => {
|