@learnpack/learnpack 5.0.275 → 5.0.276

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 (71) hide show
  1. package/README.md +409 -409
  2. package/lib/commands/audit.js +15 -15
  3. package/lib/commands/breakToken.js +19 -19
  4. package/lib/commands/clean.js +3 -3
  5. package/lib/commands/init.js +41 -41
  6. package/lib/commands/logout.js +3 -3
  7. package/lib/commands/publish.js +5 -10
  8. package/lib/commands/serve.js +3 -2
  9. package/lib/creatorDist/assets/index-BfLyIQVh.js +10343 -10224
  10. package/lib/managers/config/index.js +77 -77
  11. package/lib/utils/api.d.ts +1 -1
  12. package/lib/utils/api.js +12 -9
  13. package/lib/utils/creatorUtilities.js +14 -14
  14. package/package.json +1 -1
  15. package/src/commands/audit.ts +487 -487
  16. package/src/commands/breakToken.ts +67 -67
  17. package/src/commands/clean.ts +30 -30
  18. package/src/commands/init.ts +650 -650
  19. package/src/commands/logout.ts +38 -38
  20. package/src/commands/publish.ts +20 -25
  21. package/src/commands/serve.ts +8 -3
  22. package/src/commands/start.ts +333 -333
  23. package/src/commands/translate.ts +123 -123
  24. package/src/creator/README.md +54 -54
  25. package/src/creator/eslint.config.js +28 -28
  26. package/src/creator/src/components/syllabus/ContentIndex.tsx +312 -312
  27. package/src/creator/src/i18n.ts +28 -28
  28. package/src/creator/src/index.css +217 -217
  29. package/src/creator/src/locales/en.json +126 -126
  30. package/src/creator/src/locales/es.json +126 -126
  31. package/src/creator/src/utils/configTypes.ts +122 -122
  32. package/src/creator/src/utils/constants.ts +13 -13
  33. package/src/creator/src/utils/creatorUtils.ts +46 -46
  34. package/src/creator/src/utils/eventBus.ts +2 -2
  35. package/src/creator/src/utils/lib.ts +468 -468
  36. package/src/creator/src/utils/socket.ts +61 -61
  37. package/src/creator/src/utils/store.ts +222 -222
  38. package/src/creator/src/vite-env.d.ts +1 -1
  39. package/src/creator/vite.config.ts +13 -13
  40. package/src/creatorDist/assets/index-BfLyIQVh.js +10343 -10224
  41. package/src/managers/config/defaults.ts +49 -49
  42. package/src/managers/config/exercise.ts +364 -364
  43. package/src/managers/config/index.ts +775 -775
  44. package/src/managers/file.ts +236 -236
  45. package/src/managers/server/routes.ts +554 -554
  46. package/src/managers/session.ts +182 -182
  47. package/src/managers/telemetry.ts +188 -188
  48. package/src/models/action.ts +13 -13
  49. package/src/models/config-manager.ts +28 -28
  50. package/src/models/config.ts +106 -106
  51. package/src/models/creator.ts +47 -47
  52. package/src/models/exercise-obj.ts +30 -30
  53. package/src/models/session.ts +39 -39
  54. package/src/models/socket.ts +61 -61
  55. package/src/models/status.ts +16 -16
  56. package/src/ui/_app/app.css +1 -1
  57. package/src/ui/_app/app.js +366 -363
  58. package/src/ui/app.tar.gz +0 -0
  59. package/src/utils/BaseCommand.ts +56 -56
  60. package/src/utils/api.ts +53 -39
  61. package/src/utils/audit.ts +392 -392
  62. package/src/utils/checkNotInstalled.ts +267 -267
  63. package/src/utils/configBuilder.ts +82 -82
  64. package/src/utils/convertCreds.js +34 -34
  65. package/src/utils/creatorUtilities.ts +504 -504
  66. package/src/utils/incrementVersion.js +74 -74
  67. package/src/utils/misc.ts +58 -58
  68. package/src/utils/rigoActions.ts +500 -500
  69. package/src/utils/sidebarGenerator.ts +195 -195
  70. package/src/utils/templates/isolated/exercises/01-hello-world/README.es.md +26 -26
  71. package/src/utils/templates/isolated/exercises/01-hello-world/README.md +26 -26
@@ -369,21 +369,21 @@ class AuditCommand extends SessionCommand_1.default {
369
369
  }
370
370
  }
371
371
  }
372
- AuditCommand.description = `learnpack audit is the command in charge of creating an auditory of the repository
373
- ...
374
- learnpack audit checks for the following information in a repository:
375
- 1. The configuration object has slug, repository and description. (Error)
376
- 2. The command learnpack clean has been run. (Error)
377
- 3. If a markdown or test file doesn't have any content. (Error)
378
- 4. The links are accessing to valid servers. (Error)
379
- 5. The relative images are working (If they have the shortest path to the image or if the images exists in the assets). (Error)
380
- 6. The external images are working (If they are pointing to a valid server). (Error)
381
- 7. The exercises directory names are valid. (Error)
382
- 8. If an exercise doesn't have a README file. (Error)
383
- 9. The exercises array (Of the config file) has content. (Error)
384
- 10. The exercses have the same translations. (Warning)
385
- 11. The .gitignore file exists. (Warning)
386
- 12. If there is a file within the exercises folder but not inside of any particular exercise's folder. (Warning)
372
+ AuditCommand.description = `learnpack audit is the command in charge of creating an auditory of the repository
373
+ ...
374
+ learnpack audit checks for the following information in a repository:
375
+ 1. The configuration object has slug, repository and description. (Error)
376
+ 2. The command learnpack clean has been run. (Error)
377
+ 3. If a markdown or test file doesn't have any content. (Error)
378
+ 4. The links are accessing to valid servers. (Error)
379
+ 5. The relative images are working (If they have the shortest path to the image or if the images exists in the assets). (Error)
380
+ 6. The external images are working (If they are pointing to a valid server). (Error)
381
+ 7. The exercises directory names are valid. (Error)
382
+ 8. If an exercise doesn't have a README file. (Error)
383
+ 9. The exercises array (Of the config file) has content. (Error)
384
+ 10. The exercses have the same translations. (Warning)
385
+ 11. The .gitignore file exists. (Warning)
386
+ 12. If there is a file within the exercises folder but not inside of any particular exercise's folder. (Warning)
387
387
  `;
388
388
  AuditCommand.flags = {
389
389
  strict: command_1.flags.boolean({
@@ -4,25 +4,25 @@ const command_1 = require("@oclif/command");
4
4
  const BaseCommand_1 = require("../utils/BaseCommand");
5
5
  const console_1 = require("../utils/console");
6
6
  const creatorUtilities_1 = require("../utils/creatorUtilities");
7
- const exampleMd = `# How to Install Node.js
8
-
9
- Node.js lets you run JavaScript outside a web browser.
10
-
11
- ## Step 1: Download Node.js
12
-
13
- Get the Node.js installer from the [official site](https://nodejs.org/en/download/).
14
-
15
- ## Step 2: Install Node.js
16
-
17
- Open the installer and follow the steps to finish.
18
-
19
- ## Step 3: Verify the Installation
20
-
21
- Open a terminal and type:
22
-
23
- \`\`\`bash
24
- node -v
25
- \`\`\`
7
+ const exampleMd = `# How to Install Node.js
8
+
9
+ Node.js lets you run JavaScript outside a web browser.
10
+
11
+ ## Step 1: Download Node.js
12
+
13
+ Get the Node.js installer from the [official site](https://nodejs.org/en/download/).
14
+
15
+ ## Step 2: Install Node.js
16
+
17
+ Open the installer and follow the steps to finish.
18
+
19
+ ## Step 3: Verify the Installation
20
+
21
+ Open a terminal and type:
22
+
23
+ \`\`\`bash
24
+ node -v
25
+ \`\`\`
26
26
  `;
27
27
  class BreakTokenCommand extends BaseCommand_1.default {
28
28
  async run() {
@@ -16,9 +16,9 @@ class CleanCommand extends SessionCommand_1.default {
16
16
  console_1.default.success("Package cleaned successfully, ready to publish");
17
17
  }
18
18
  }
19
- CleanCommand.description = `Clean the configuration object
20
- ...
21
- Extra documentation goes here
19
+ CleanCommand.description = `Clean the configuration object
20
+ ...
21
+ Extra documentation goes here
22
22
  `;
23
23
  CleanCommand.flags = {
24
24
  // name: flags.string({char: 'n', description: 'name to print'}),
@@ -107,9 +107,9 @@ const initializeInteractiveCreation = async (rigoToken, courseInfo) => {
107
107
  while (!isReady) {
108
108
  const spinner = (0, ora_1.default)("Thinking...").start();
109
109
  let wholeInfo = courseInfo;
110
- wholeInfo += `
111
- Current title: ${currentTitle}
112
- Current description: ${currentDescription}
110
+ wholeInfo += `
111
+ Current title: ${currentTitle}
112
+ Current description: ${currentDescription}
113
113
  `;
114
114
  // eslint-disable-next-line
115
115
  const res = await (0, rigoActions_1.interactiveCreation)(rigoToken, {
@@ -200,56 +200,56 @@ const handleAILogic = async (tutorialDir, packageInfo) => {
200
200
  fs.mkdirSync(rulesDir, { recursive: true });
201
201
  fs.writeFileSync(path.join(rulesDir, "airules.txt"), airules);
202
202
  }
203
- let packageContext = `
204
- \n
205
- Title: "${packageInfo.title.us}"
206
- Description: "${packageInfo.description.us}"
207
- Target Audience: "${targetAudience}"
208
- Estimated Duration: "${estimatedDuration} minutes"
209
-
203
+ let packageContext = `
204
+ \n
205
+ Title: "${packageInfo.title.us}"
206
+ Description: "${packageInfo.description.us}"
207
+ Target Audience: "${targetAudience}"
208
+ Estimated Duration: "${estimatedDuration} minutes"
209
+
210
210
  ${contentIndex ?
211
- `Content Index submitted by the user, use this to guide your creation. Keep in mind that your tutorial should contain these topics:
212
- ---
213
- ${contentIndex}
214
- ---
211
+ `Content Index submitted by the user, use this to guide your creation. Keep in mind that your tutorial should contain these topics:
212
+ ---
213
+ ${contentIndex}
214
+ ---
215
215
  ` :
216
- ""}
217
-
218
- This is the duration for each type of step, use it to estimate the number of steps to create:
216
+ ""}
217
+
218
+ This is the duration for each type of step, use it to estimate the number of steps to create:
219
219
  ${Object.entries(durationByKind)
220
220
  .map(([key, value]) => `${key}: ${value} minutes`)
221
- .join("\n")}
222
-
223
-
224
- Within the estimated duration, is possible to have the following activities:
225
- Format=
226
- Activity: Maximum number of steps for duration
227
-
228
- Estimated activities:
229
- ${JSON.stringify(estimateActivities(estimatedDuration))}
230
-
231
- You should create a tutorial that is engaging and fun to follow.
232
-
233
-
221
+ .join("\n")}
222
+
223
+
224
+ Within the estimated duration, is possible to have the following activities:
225
+ Format=
226
+ Activity: Maximum number of steps for duration
227
+
228
+ Estimated activities:
229
+ ${JSON.stringify(estimateActivities(estimatedDuration))}
230
+
231
+ You should create a tutorial that is engaging and fun to follow.
232
+
233
+
234
234
  ${airules ?
235
- `
236
- This is a list of rules you need to follow when creating the tutorial:
237
- ${airules}
235
+ `
236
+ This is a list of rules you need to follow when creating the tutorial:
237
+ ${airules}
238
238
  ` :
239
- ""}
239
+ ""}
240
240
  `;
241
241
  const { steps, title, description, duration, difficulty } = await initializeInteractiveCreation(rigoToken, packageContext);
242
242
  packageInfo.title.us = title;
243
243
  packageInfo.description.us = description;
244
244
  packageInfo.duration = duration;
245
245
  packageInfo.difficulty = difficulty;
246
- packageContext = `
247
- Title: "${title}"
248
- Description: "${description}"
249
- Target Audience: "${targetAudience}"
250
- List of exercises: ${steps.join(", ")}
251
-
252
- AI Rules: ${airules}
246
+ packageContext = `
247
+ Title: "${title}"
248
+ Description: "${description}"
249
+ Target Audience: "${targetAudience}"
250
+ List of exercises: ${steps.join(", ")}
251
+
252
+ AI Rules: ${airules}
253
253
  `;
254
254
  const exercisesDir = path.join(tutorialDir, "exercises");
255
255
  fs.ensureDirSync(exercisesDir);
@@ -14,9 +14,9 @@ class LogoutCommand extends SessionCommand_1.default {
14
14
  session_1.default.destroy();
15
15
  }
16
16
  }
17
- LogoutCommand.description = `Describe the command here
18
- ...
19
- Extra documentation goes here
17
+ LogoutCommand.description = `Describe the command here
18
+ ...
19
+ Extra documentation goes here
20
20
  `;
21
21
  LogoutCommand.flags = {
22
22
  // name: flags.string({char: 'n', description: 'name to print'}),
@@ -21,15 +21,7 @@ const misc_1 = require("../utils/misc");
21
21
  const creatorUtilities_1 = require("../utils/creatorUtilities");
22
22
  const uploadZipEndpont = api_1.RIGOBOT_HOST + "/v1/learnpack/upload";
23
23
  const handleAssetCreation = async (sessionPayload, learnJson, selectedLang, learnpackDeployUrl, b64IndexReadme, all_translations = []) => {
24
- const categories = {
25
- en: 9,
26
- us: 9,
27
- es: 10,
28
- };
29
- let category = categories[selectedLang];
30
- if (!category) {
31
- category = 91;
32
- }
24
+ const category = "uncategorized";
33
25
  try {
34
26
  const user = await api_1.default.validateToken(sessionPayload.token);
35
27
  const slug = (0, creatorUtilities_1.slugify)(learnJson.title[selectedLang]).slice(0, 50);
@@ -59,6 +51,7 @@ const handleAssetCreation = async (sessionPayload, learnJson, selectedLang, lear
59
51
  const asset = await api_1.default.updateAsset(sessionPayload.token, slug, {
60
52
  learnpack_deploy_url: learnpackDeployUrl,
61
53
  title: learnJson.title[selectedLang],
54
+ category: category,
62
55
  description: learnJson.description[selectedLang],
63
56
  all_translations,
64
57
  });
@@ -216,7 +209,9 @@ class BuildCommand extends SessionCommand_1.default {
216
209
  this.copyDirectory(assetsDir, path.join(buildDir, ".learn", "assets"));
217
210
  }
218
211
  else {
219
- fs.mkdirSync(path.join(buildDir, ".learn", "assets"), { recursive: true });
212
+ fs.mkdirSync(path.join(buildDir, ".learn", "assets"), {
213
+ recursive: true,
214
+ });
220
215
  }
221
216
  // Copy .learn/_app directory files to the same level as config.json
222
217
  const appDir = path.join(process.cwd(), ".learn", "_app");
@@ -1212,7 +1212,6 @@ class ServeCommand extends SessionCommand_1.default {
1212
1212
  if (ytMatch) {
1213
1213
  const videoId = ytMatch[1];
1214
1214
  const resFromRigo = await axios_1.default.get(`${api_1.RIGOBOT_REALTIME_HOST}/actions/youtube-transcript/${videoId}`);
1215
- console.log("RES FROM RIGO", resFromRigo.data);
1216
1215
  const transcript = resFromRigo.data.transcript;
1217
1216
  // let meta: any = null
1218
1217
  // try {
@@ -1248,7 +1247,9 @@ class ServeCommand extends SessionCommand_1.default {
1248
1247
  }
1249
1248
  catch (error) {
1250
1249
  console.error("❌ /actions/fetch error:", error.message || error);
1251
- res.status(500).json({ error: error.message || "Failed to fetch link" });
1250
+ res
1251
+ .status(500)
1252
+ .json({ error: error.message || "Failed to fetch link" });
1252
1253
  }
1253
1254
  });
1254
1255
  app.delete("/packages/:slug", async (req, res) => {