@learnpack/learnpack 5.0.309 → 5.0.311

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 (88) 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/logout.js +3 -3
  6. package/lib/commands/publish.js +16 -6
  7. package/lib/commands/serve.js +16 -16
  8. package/lib/creatorDist/assets/{index-B37w_ZhT.js → index-BI7U47zy.js} +13186 -13013
  9. package/lib/creatorDist/index.html +1 -1
  10. package/lib/managers/config/index.js +77 -77
  11. package/lib/utils/creatorUtilities.js +14 -14
  12. package/lib/utils/templates/isolated/exercises/01-hello-world/README.es.md +26 -26
  13. package/lib/utils/templates/isolated/exercises/01-hello-world/README.md +26 -26
  14. package/lib/utils/templates/scorm/adlcp_rootv1p2.xsd +110 -110
  15. package/lib/utils/templates/scorm/config/index.html +209 -209
  16. package/lib/utils/templates/scorm/ims_xml.xsd +1 -1
  17. package/lib/utils/templates/scorm/imscp_rootv1p1p2.xsd +345 -345
  18. package/lib/utils/templates/scorm/imsmanifest.xml +38 -38
  19. package/lib/utils/templates/scorm/imsmd_rootv1p2p1.xsd +573 -573
  20. package/package.json +1 -1
  21. package/src/commands/audit.ts +487 -487
  22. package/src/commands/breakToken.ts +67 -67
  23. package/src/commands/clean.ts +30 -30
  24. package/src/commands/logout.ts +38 -38
  25. package/src/commands/publish.ts +39 -23
  26. package/src/commands/serve.ts +3179 -3179
  27. package/src/commands/start.ts +333 -333
  28. package/src/commands/translate.ts +123 -123
  29. package/src/creator/README.md +54 -54
  30. package/src/creator/package-lock.json +6621 -6621
  31. package/src/creator/package.json +55 -55
  32. package/src/creator/src/App.tsx +611 -608
  33. package/src/creator/src/components/FileUploader.tsx +340 -302
  34. package/src/creator/src/components/Icon.tsx +18 -18
  35. package/src/creator/src/components/LessonItem.tsx +152 -152
  36. package/src/creator/src/components/Login.tsx +259 -259
  37. package/src/creator/src/components/ParamsChecker.tsx +25 -25
  38. package/src/creator/src/components/Uploader.tsx +3 -6
  39. package/src/creator/src/components/syllabus/ContentIndex.tsx +323 -323
  40. package/src/creator/src/components/syllabus/SyllabusEditor.tsx +341 -337
  41. package/src/creator/src/i18n.ts +28 -28
  42. package/src/creator/src/locales/en.json +139 -138
  43. package/src/creator/src/locales/es.json +139 -138
  44. package/src/creator/src/utils/configTypes.ts +122 -122
  45. package/src/creator/src/utils/constants.ts +13 -13
  46. package/src/creator/src/utils/creatorUtils.ts +46 -46
  47. package/src/creator/src/utils/eventBus.ts +2 -2
  48. package/src/creator/src/utils/rigo.ts +1 -1
  49. package/src/creator/src/utils/socket.ts +61 -61
  50. package/src/creator/src/utils/store.ts +222 -222
  51. package/src/creator/src/vite-env.d.ts +1 -1
  52. package/src/creator/vite.config.ts +13 -13
  53. package/src/creatorDist/assets/{index-B37w_ZhT.js → index-BI7U47zy.js} +13186 -13013
  54. package/src/creatorDist/index.html +1 -1
  55. package/src/managers/config/defaults.ts +49 -49
  56. package/src/managers/config/exercise.ts +364 -364
  57. package/src/managers/config/index.ts +775 -775
  58. package/src/managers/file.ts +236 -236
  59. package/src/managers/server/routes.ts +554 -554
  60. package/src/managers/telemetry.ts +188 -188
  61. package/src/models/action.ts +13 -13
  62. package/src/models/config-manager.ts +28 -28
  63. package/src/models/config.ts +106 -106
  64. package/src/models/exercise-obj.ts +30 -30
  65. package/src/models/session.ts +39 -39
  66. package/src/models/socket.ts +61 -61
  67. package/src/models/status.ts +16 -16
  68. package/src/ui/_app/app.css +1 -1
  69. package/src/ui/_app/app.js +477 -407
  70. package/src/ui/app.tar.gz +0 -0
  71. package/src/utils/BaseCommand.ts +56 -56
  72. package/src/utils/api.ts +665 -665
  73. package/src/utils/audit.ts +392 -392
  74. package/src/utils/checkNotInstalled.ts +267 -267
  75. package/src/utils/convertCreds.js +34 -34
  76. package/src/utils/creatorUtilities.ts +504 -504
  77. package/src/utils/export/README.md +178 -178
  78. package/src/utils/incrementVersion.js +74 -74
  79. package/src/utils/misc.ts +58 -58
  80. package/src/utils/sidebarGenerator.ts +195 -195
  81. package/src/utils/templates/isolated/exercises/01-hello-world/README.es.md +26 -26
  82. package/src/utils/templates/isolated/exercises/01-hello-world/README.md +26 -26
  83. package/src/utils/templates/scorm/adlcp_rootv1p2.xsd +110 -110
  84. package/src/utils/templates/scorm/config/index.html +209 -209
  85. package/src/utils/templates/scorm/ims_xml.xsd +1 -1
  86. package/src/utils/templates/scorm/imscp_rootv1p1p2.xsd +345 -345
  87. package/src/utils/templates/scorm/imsmanifest.xml +38 -38
  88. package/src/utils/templates/scorm/imsmd_rootv1p2p1.xsd +573 -573
@@ -1,138 +1,139 @@
1
- {
2
- "contentIndexHeader": {
3
- "firstMessage": "He creado una estructura detallada para tu curso: {{title}}",
4
- "secondMessage": "He actualizado la estructura según tu feedback."
5
- },
6
- "stepWizard": {
7
- "requiredFields": "Por favor, completa todos los campos requeridos.",
8
- "invalidFields": "Por favor, completa todos los campos correctamente.",
9
- "subtitle": "Configurando tu tutorial",
10
- "back": "Atrás",
11
- "next": "Siguiente",
12
- "finish": "Finalizar 🚀",
13
- "description": "¿Qué quieres aprender?",
14
- "descriptionPlaceholder": "Describe tu curso",
15
- "duration": "¿Cuál es la duración estimada para este tutorial?",
16
- "durationCard": {
17
- "15": "Alrededor de 15 minutos",
18
- "30": "Alrededor de 30 minutos",
19
- "60": "Alrededor de 1 hora"
20
- },
21
- "purpose": "¿Cómo te gustaría usar learnpack?",
22
- "verifyHuman": "Por favor, verifica que eres un humano",
23
- "humanSuccess": "¡Eres un humano! 👌🏻",
24
- "hasContentIndex": "¿Hay algún material para empezar este curso?",
25
- "hasContentIndexCard": {
26
- "no": "❌ No, ayúdame a crear uno",
27
- "yes": "✅ Sí"
28
- },
29
- "contentIndex": "¿Hay algún material para empezar este curso?",
30
- "contentIndexHelpText": "Puede ser solo texto, pegar una URL o incluso subir un documento."
31
- },
32
- "purposeSelector": {
33
- "learnpack-lesson-writer": {
34
- "label": "Entender un nuevo tema",
35
- "description": "Aprender sobre un nuevo concepto (ej. ISO 27001 o decaimiento exponencial)."
36
- },
37
- "homework-and-exam-preparation-aid": {
38
- "label": "Practicar para un examen o tarea",
39
- "description": "Resolver problemas matemáticos o preguntas de certificación."
40
- },
41
- "skill-building-facilitator": {
42
- "label": "Construir habilidades reales",
43
- "description": "Aplicar conceptos a proyectos, ciencia de datos o auditorías de seguridad."
44
- },
45
- "certification-preparation-specialist": {
46
- "label": "Prepararse para una certificación",
47
- "description": "Prepararse para exámenes como ISO 27001 Lead Auditor."
48
- }
49
- },
50
- "uploader": {
51
- "text": {
52
- "description": "Escribir o pegar una tabla de contenido",
53
- "placeholder": "Agrega tu texto aquí...",
54
- "finish": "Finalizar"
55
- },
56
- "files": {
57
- "description": "Subir archivos",
58
- "descriptionLong": "Subir un archivo PDF o arrastralo aquí",
59
- "processing": "Procesando...",
60
- "drop": "Arrastra el archivo aquí",
61
- "finish": "🚀 Finalizar",
62
- "maxImagesPerPDFWarning": "⚠️ Solo se admiten 15 imágenes por PDF en LearnPack beta. Puedes seleccionar qué hacer si el PDF excede este límite.",
63
- "useOnlyFirstImages": "Usar solo las primeras 15 imágenes",
64
- "cancelAndUploadAnother": "Cancelar y subir otro PDF",
65
- "maxImagesPerPDFError": "❌ Solo se admiten 15 imágenes por PDF en LearnPack beta y este PDF excede el límite.",
66
- "errorProcessingPDF": "❌ Error procesando PDF, por favor intenta de nuevo, si el problema persiste, intenta con un archivo diferente."
67
- },
68
- "youtube": {
69
- "description": "Compartir un enlace de Youtube",
70
- "placeholder": "Pega tu enlace aquí…"
71
- }
72
- },
73
- "loader": {
74
- "text": "Learnpack está configurando tu tutorial. Puede que tarde un momento...",
75
- "thinking": "Pensando..."
76
- },
77
- "sidebar": {
78
- "chatWithMe": "Chatea conmigo para actualizar el contenido del curso",
79
- "howCanLearnPackHelpYou": "¿Cómo puede LearnPack ayudarte?"
80
- },
81
- "contentIndex": {
82
- "subText": {
83
- "first": "Incluye una mezcla de lectura, ejercicios de codificación y cuestionarios. Dále un vistazo y dímelo si coincide con tus expectativas o si hay algún cambio que te gustaría hacer.",
84
- "second": "Basado en tu entrada, aquí está el nuevo plan de estudios, los cambios se resaltan en amarillo",
85
- "noLessons": "El contenido no pudo ser generado, por favor habla con Rigobot para darle más contexto."
86
- },
87
- "revertChanges": "Revertir cambios",
88
- "changesReverted": "Cambios revertidos!",
89
- "readyToCreate": "Estoy listo. ¡Crea el curso por mí!",
90
- "creatingCourseAs": "Creando el curso como {{name}}",
91
- "loginAsSomeoneElse": "Iniciar sesión como alguien más",
92
- "continueScrolling": "Continuar desplazando",
93
- "noLessons": "El contenido no pudo ser generado, por favor habla con Rigobot para darle más contexto.",
94
- "okMessage": "Si estás satisfecho, escribe 'OK' en el chat.",
95
- "instructionsMessage": "Si no, ¿qué te gustaría que cambiara? Puedes decir cosas como:\n - Añadir más ejercicios\n - Hacerlo más difícil\n - Eliminar el paso 1.1 y reemplazarlo con un nuevo paso que explique el concepto de X "
96
- },
97
- "languageDetection": {
98
- "title": "Idioma detectado",
99
- "message": "Hemos detectado {{language}} como el idioma principal para este paquete, ¿te gustaría cambiar a {{language}}?",
100
- "switchTo": "Sí, cambiar a {{language}}",
101
- "stayInen": "Mantenerse en Inglés",
102
- "stayInes": "Mantenerse en Español",
103
- "languages": {
104
- "en": "Inglés",
105
- "es": "Español"
106
- }
107
- },
108
- "login": {
109
- "creatingAccount": "Creando cuenta…",
110
- "loggedInSuccessfully": "Inicio de sesión exitoso",
111
- "invalidCredentials": "Credenciales inválidas",
112
- "pleaseFillAllFields": "Por favor, completa todos los campos",
113
- "loggingIn": "Iniciando sesión…",
114
- "accountCreated": "Cuenta creada! Revisa tu correo.",
115
- "registrationFailed": "Registro fallido. Intenta de nuevo.",
116
- "createYourAccount": "Crear tu cuenta",
117
- "firstName": "Nombre",
118
- "lastName": "Apellido",
119
- "alreadyHaveAnAccount": "¿Ya tienes una cuenta?",
120
- "logInHere": "Iniciar sesión aquí",
121
- "youNeedToHaveAnAccount": "Necesitas tener una cuenta en 4Geeks con un plan de creador para crear un tutorial.",
122
- "loginWithGithub": "INICIAR SESIÓN CON GITHUB",
123
- "loginWithGoogle": "INICIAR SESIÓN CON GOOGLE",
124
- "or": "o",
125
- "password": "Contraseña",
126
- "logIn": "Iniciar sesión",
127
- "skip": "Saltar",
128
- "forgotPassword": "¿Olvidaste tu contraseña?",
129
- "recoverItHere": "Recuperarla aquí",
130
- "loginWithEmail": "Iniciar sesión con Email",
131
- "youDontHaveAnAccount": "¿No tienes una cuenta?",
132
- "registerHere": "Regístrate aquí."
133
- },
134
- "turnstileModal": {
135
- "title": "Necesitamos verificar que eres un humano, espera un momento...",
136
- "error": "Error al verificar que eres un humano, por favor intenta de nuevo, si el problema persiste, usa un navegador diferente."
137
- }
138
- }
1
+ {
2
+ "contentIndexHeader": {
3
+ "firstMessage": "He creado una estructura detallada para tu curso: {{title}}",
4
+ "secondMessage": "He actualizado la estructura según tu feedback."
5
+ },
6
+ "stepWizard": {
7
+ "requiredFields": "Por favor, completa todos los campos requeridos.",
8
+ "invalidFields": "Por favor, completa todos los campos correctamente.",
9
+ "subtitle": "Configurando tu tutorial",
10
+ "back": "Atrás",
11
+ "next": "Siguiente",
12
+ "finish": "Finalizar 🚀",
13
+ "description": "¿Qué quieres aprender?",
14
+ "descriptionPlaceholder": "Describe tu curso",
15
+ "duration": "¿Cuál es la duración estimada para este tutorial?",
16
+ "durationCard": {
17
+ "15": "Alrededor de 15 minutos",
18
+ "30": "Alrededor de 30 minutos",
19
+ "60": "Alrededor de 1 hora"
20
+ },
21
+ "purpose": "¿Cómo te gustaría usar learnpack?",
22
+ "verifyHuman": "Por favor, verifica que eres un humano",
23
+ "humanSuccess": "¡Eres un humano! 👌🏻",
24
+ "hasContentIndex": "¿Hay algún material para empezar este curso?",
25
+ "hasContentIndexCard": {
26
+ "no": "❌ No, ayúdame a crear uno",
27
+ "yes": "✅ Sí"
28
+ },
29
+ "contentIndex": "¿Hay algún material para empezar este curso?",
30
+ "contentIndexHelpText": "Puede ser solo texto, markdown, incluso subir un documento PDF."
31
+ },
32
+ "purposeSelector": {
33
+ "learnpack-lesson-writer": {
34
+ "label": "Entender un nuevo tema",
35
+ "description": "Aprender sobre un nuevo concepto (ej. ISO 27001 o decaimiento exponencial)."
36
+ },
37
+ "homework-and-exam-preparation-aid": {
38
+ "label": "Practicar para un examen o tarea",
39
+ "description": "Resolver problemas matemáticos o preguntas de certificación."
40
+ },
41
+ "skill-building-facilitator": {
42
+ "label": "Construir habilidades reales",
43
+ "description": "Aplicar conceptos a proyectos, ciencia de datos o auditorías de seguridad."
44
+ },
45
+ "certification-preparation-specialist": {
46
+ "label": "Prepararse para una certificación",
47
+ "description": "Prepararse para exámenes como ISO 27001 Lead Auditor."
48
+ }
49
+ },
50
+ "uploader": {
51
+ "text": {
52
+ "description": "Escribir o pegar una tabla de contenido",
53
+ "placeholder": "Agrega tu texto aquí...",
54
+ "finish": "Finalizar"
55
+ },
56
+ "files": {
57
+ "description": "Subir archivos",
58
+ "descriptionLong": "Sube un archivo en cualquiera de los formatos soportados o arrastralo aquí",
59
+ "processing": "Procesando...",
60
+ "drop": "Arrastra el archivo aquí",
61
+ "finish": "🚀 Finalizar",
62
+ "maxImagesPerPDFWarning": "⚠️ Solo se admiten 15 imágenes por PDF en LearnPack beta. Puedes seleccionar qué hacer si el PDF excede este límite.",
63
+ "useOnlyFirstImages": "Usar solo las primeras 15 imágenes",
64
+ "cancelAndUploadAnother": "Cancelar y subir otro PDF",
65
+ "maxImagesPerPDFError": "❌ Solo se admiten 15 imágenes por PDF en LearnPack beta y este PDF excede el límite.",
66
+ "errorProcessingPDF": "❌ Error procesando PDF, por favor intenta de nuevo, si el problema persiste, intenta con un archivo diferente.",
67
+ "supportedFormats": "Formatos soportados: PDF, DOCX, TXT, MD, JSON, HTML, CSS, JS, TS, JSX, TSX, PY, JAVA, C, C++, XML, YAML"
68
+ },
69
+ "youtube": {
70
+ "description": "Compartir un enlace de Youtube",
71
+ "placeholder": "Pega tu enlace aquí…"
72
+ }
73
+ },
74
+ "loader": {
75
+ "text": "Learnpack está configurando tu tutorial. Puede que tarde un momento...",
76
+ "thinking": "Pensando..."
77
+ },
78
+ "sidebar": {
79
+ "chatWithMe": "Chatea conmigo para actualizar el contenido del curso",
80
+ "howCanLearnPackHelpYou": "¿Cómo puede LearnPack ayudarte?"
81
+ },
82
+ "contentIndex": {
83
+ "subText": {
84
+ "first": "Incluye una mezcla de lectura, ejercicios de codificación y cuestionarios. Dále un vistazo y dímelo si coincide con tus expectativas o si hay algún cambio que te gustaría hacer.",
85
+ "second": "Basado en tu entrada, aquí está el nuevo plan de estudios, los cambios se resaltan en amarillo",
86
+ "noLessons": "El contenido no pudo ser generado, por favor habla con Rigobot para darle más contexto."
87
+ },
88
+ "revertChanges": "Revertir cambios",
89
+ "changesReverted": "Cambios revertidos!",
90
+ "readyToCreate": "Estoy listo. ¡Crea el curso por mí!",
91
+ "creatingCourseAs": "Creando el curso como {{name}}",
92
+ "loginAsSomeoneElse": "Iniciar sesión como alguien más",
93
+ "continueScrolling": "Continuar desplazando",
94
+ "noLessons": "El contenido no pudo ser generado, por favor habla con Rigobot para darle más contexto.",
95
+ "okMessage": "Si estás satisfecho, escribe 'OK' en el chat.",
96
+ "instructionsMessage": "Si no, ¿qué te gustaría que cambiara? Puedes decir cosas como:\n - Añadir más ejercicios\n - Hacerlo más difícil\n - Eliminar el paso 1.1 y reemplazarlo con un nuevo paso que explique el concepto de X "
97
+ },
98
+ "languageDetection": {
99
+ "title": "Idioma detectado",
100
+ "message": "Hemos detectado {{language}} como el idioma principal para este paquete, ¿te gustaría cambiar a {{language}}?",
101
+ "switchTo": "Sí, cambiar a {{language}}",
102
+ "stayInen": "Mantenerse en Inglés",
103
+ "stayInes": "Mantenerse en Español",
104
+ "languages": {
105
+ "en": "Inglés",
106
+ "es": "Español"
107
+ }
108
+ },
109
+ "login": {
110
+ "creatingAccount": "Creando cuenta…",
111
+ "loggedInSuccessfully": "Inicio de sesión exitoso",
112
+ "invalidCredentials": "Credenciales inválidas",
113
+ "pleaseFillAllFields": "Por favor, completa todos los campos",
114
+ "loggingIn": "Iniciando sesión…",
115
+ "accountCreated": "Cuenta creada! Revisa tu correo.",
116
+ "registrationFailed": "Registro fallido. Intenta de nuevo.",
117
+ "createYourAccount": "Crear tu cuenta",
118
+ "firstName": "Nombre",
119
+ "lastName": "Apellido",
120
+ "alreadyHaveAnAccount": "¿Ya tienes una cuenta?",
121
+ "logInHere": "Iniciar sesión aquí",
122
+ "youNeedToHaveAnAccount": "Necesitas tener una cuenta en 4Geeks con un plan de creador para crear un tutorial.",
123
+ "loginWithGithub": "INICIAR SESIÓN CON GITHUB",
124
+ "loginWithGoogle": "INICIAR SESIÓN CON GOOGLE",
125
+ "or": "o",
126
+ "password": "Contraseña",
127
+ "logIn": "Iniciar sesión",
128
+ "skip": "Saltar",
129
+ "forgotPassword": "¿Olvidaste tu contraseña?",
130
+ "recoverItHere": "Recuperarla aquí",
131
+ "loginWithEmail": "Iniciar sesión con Email",
132
+ "youDontHaveAnAccount": "¿No tienes una cuenta?",
133
+ "registerHere": "Regístrate aquí."
134
+ },
135
+ "turnstileModal": {
136
+ "title": "Necesitamos verificar que eres un humano, espera un momento...",
137
+ "error": "Error al verificar que eres un humano, por favor intenta de nuevo, si el problema persiste, usa un navegador diferente."
138
+ }
139
+ }
@@ -1,122 +1,122 @@
1
- export interface IFile {
2
- path: string
3
- name: string
4
- hidden: boolean
5
- }
6
-
7
- export interface IExercise {
8
- position?: number
9
- files: Array<IFile>
10
- slug: string
11
- path: string
12
- done: boolean
13
- language?: string | null
14
- entry?: string | null
15
- graded?: boolean
16
- translations?: { [key: string]: string }
17
- title: string
18
- }
19
-
20
- export type TGrading = "isolated" | "incremental" | "no-grading"
21
-
22
- export type TMode = "preview" | "extension"
23
-
24
- export type TConfigAction = "test" | "build" | "tutorial" | "reset" | "generate"
25
-
26
- export type TConfigObjAttributes = "config" | "exercises" | "grading"
27
-
28
- export type TCompiler =
29
- | "webpack"
30
- | "vanillajs"
31
- | "react"
32
- | "html"
33
- | "node"
34
- | "python"
35
- | "css"
36
-
37
- export interface IConfigPath {
38
- base: string
39
- }
40
-
41
- export interface IEditor {
42
- mode?: TMode
43
- version?: string
44
- agent?: TAgent
45
- hideTerminal?: boolean
46
- }
47
-
48
- export interface TEntries {
49
- python3?: string
50
- html?: string
51
- node?: string
52
- react?: string
53
- java?: string
54
- }
55
-
56
- export interface IConfig {
57
- // os: string
58
- // port?: string
59
- // repository?: string
60
- description?: string
61
- slug?: string
62
- // dirPath: string
63
- // preview?: string // Picture thumbnail
64
- // entries: TEntries
65
- grading: TGrading
66
- // configPath: string
67
- translations: Array<string>
68
- // outputPath?: string
69
- // editor: IEditor
70
- language: string
71
- title: string
72
- duration: number
73
- difficulty?: string
74
- exercisesPath: string
75
- disableGrading: boolean // TODO: Deprecate
76
- actions: Array<string> // TODO: Deprecate
77
- autoPlay: boolean
78
- projectType?: string
79
- // TODO: nameExerciseValidation
80
- contact?: string
81
- disabledActions?: Array<TConfigAction>
82
- compiler: TCompiler
83
- compilers: Array<TCompiler>
84
- publicPath: string
85
- publicUrl?: string
86
- bugsLink?: string
87
- videoSolutions?: boolean
88
- skills: Array<string>
89
- // telemetry?: TTelemetryUrls
90
- variables?: TVariables
91
- suggestions: TSuggestions
92
- warnings: TWarnings
93
- runHook: (...agrs: Array<any>) => void
94
- testingFinishedCallback: (arg: any | undefined) => void
95
- }
96
- export type TAgent = "os" | "vscode" | null
97
-
98
- export type TSuggestions = {
99
- agent: TAgent
100
- }
101
-
102
- type TWarnings = {
103
- agent?: string
104
- extension?: string
105
- }
106
-
107
- type TVariable = {
108
- type: "command" | "string"
109
- source: string
110
- }
111
- type TVariables = {
112
- [key: string]: TVariable | string
113
- }
114
-
115
- export interface IConfigObj {
116
- session?: number
117
- currentExercise?: any
118
- config?: IConfig
119
- exercises?: Array<IExercise>
120
- confPath?: IConfigPath
121
- address?: string // Maybe
122
- }
1
+ export interface IFile {
2
+ path: string
3
+ name: string
4
+ hidden: boolean
5
+ }
6
+
7
+ export interface IExercise {
8
+ position?: number
9
+ files: Array<IFile>
10
+ slug: string
11
+ path: string
12
+ done: boolean
13
+ language?: string | null
14
+ entry?: string | null
15
+ graded?: boolean
16
+ translations?: { [key: string]: string }
17
+ title: string
18
+ }
19
+
20
+ export type TGrading = "isolated" | "incremental" | "no-grading"
21
+
22
+ export type TMode = "preview" | "extension"
23
+
24
+ export type TConfigAction = "test" | "build" | "tutorial" | "reset" | "generate"
25
+
26
+ export type TConfigObjAttributes = "config" | "exercises" | "grading"
27
+
28
+ export type TCompiler =
29
+ | "webpack"
30
+ | "vanillajs"
31
+ | "react"
32
+ | "html"
33
+ | "node"
34
+ | "python"
35
+ | "css"
36
+
37
+ export interface IConfigPath {
38
+ base: string
39
+ }
40
+
41
+ export interface IEditor {
42
+ mode?: TMode
43
+ version?: string
44
+ agent?: TAgent
45
+ hideTerminal?: boolean
46
+ }
47
+
48
+ export interface TEntries {
49
+ python3?: string
50
+ html?: string
51
+ node?: string
52
+ react?: string
53
+ java?: string
54
+ }
55
+
56
+ export interface IConfig {
57
+ // os: string
58
+ // port?: string
59
+ // repository?: string
60
+ description?: string
61
+ slug?: string
62
+ // dirPath: string
63
+ // preview?: string // Picture thumbnail
64
+ // entries: TEntries
65
+ grading: TGrading
66
+ // configPath: string
67
+ translations: Array<string>
68
+ // outputPath?: string
69
+ // editor: IEditor
70
+ language: string
71
+ title: string
72
+ duration: number
73
+ difficulty?: string
74
+ exercisesPath: string
75
+ disableGrading: boolean // TODO: Deprecate
76
+ actions: Array<string> // TODO: Deprecate
77
+ autoPlay: boolean
78
+ projectType?: string
79
+ // TODO: nameExerciseValidation
80
+ contact?: string
81
+ disabledActions?: Array<TConfigAction>
82
+ compiler: TCompiler
83
+ compilers: Array<TCompiler>
84
+ publicPath: string
85
+ publicUrl?: string
86
+ bugsLink?: string
87
+ videoSolutions?: boolean
88
+ skills: Array<string>
89
+ // telemetry?: TTelemetryUrls
90
+ variables?: TVariables
91
+ suggestions: TSuggestions
92
+ warnings: TWarnings
93
+ runHook: (...agrs: Array<any>) => void
94
+ testingFinishedCallback: (arg: any | undefined) => void
95
+ }
96
+ export type TAgent = "os" | "vscode" | null
97
+
98
+ export type TSuggestions = {
99
+ agent: TAgent
100
+ }
101
+
102
+ type TWarnings = {
103
+ agent?: string
104
+ extension?: string
105
+ }
106
+
107
+ type TVariable = {
108
+ type: "command" | "string"
109
+ source: string
110
+ }
111
+ type TVariables = {
112
+ [key: string]: TVariable | string
113
+ }
114
+
115
+ export interface IConfigObj {
116
+ session?: number
117
+ currentExercise?: any
118
+ config?: IConfig
119
+ exercises?: Array<IExercise>
120
+ confPath?: IConfigPath
121
+ address?: string // Maybe
122
+ }
@@ -1,13 +1,13 @@
1
- export const DEV_MODE = false
2
-
3
- export const RIGOBOT_HOST = DEV_MODE
4
- ? "https://rigobot-test-cca7d841c9d8.herokuapp.com"
5
- : // "https://8000-charlytoc-rigobot-bmwdeam7cev.ws-us120.gitpod.io"
6
- "https://rigobot.herokuapp.com"
7
-
8
- export const BREATHECODE_HOST = DEV_MODE
9
- ? "https://breathecode-test.herokuapp.com"
10
- : "https://breathecode.herokuapp.com"
11
-
12
- export const RIGO_FLOAT_GIF =
13
- "https://raw.githubusercontent.com/learnpack/ide/20ed3f4c3ead9b33d5d6acb20154dcd93a0ec4af/public/rigo-float.gif"
1
+ export const DEV_MODE = false
2
+
3
+ export const RIGOBOT_HOST = DEV_MODE
4
+ ? "https://rigobot-test-cca7d841c9d8.herokuapp.com"
5
+ : // "https://8000-charlytoc-rigobot-bmwdeam7cev.ws-us120.gitpod.io"
6
+ "https://rigobot.herokuapp.com"
7
+
8
+ export const BREATHECODE_HOST = DEV_MODE
9
+ ? "https://breathecode-test.herokuapp.com"
10
+ : "https://breathecode.herokuapp.com"
11
+
12
+ export const RIGO_FLOAT_GIF =
13
+ "https://raw.githubusercontent.com/learnpack/ide/20ed3f4c3ead9b33d5d6acb20154dcd93a0ec4af/public/rigo-float.gif"
@@ -1,46 +1,46 @@
1
- import { eventBus } from "./eventBus"
2
- import { generateImage, getFilenameFromUrl, uploadImageToBucket } from "./lib"
3
-
4
- export const slugify = (text: string) => {
5
- return text
6
- .toString()
7
- .normalize("NFD") // Remove accents
8
- .replace(/[\u0300-\u036F]/g, "") // Remove diacritics
9
- .toLowerCase()
10
- .trim()
11
- .replace(/[^a-z0-9\s._-]/g, "") // Hyphen at the end, no escape needed
12
- .replace(/\s+/g, "-") // Replace spaces with hyphens
13
- .replace(/-+/g, "-") // Remove duplicate hyphens
14
- .replace(/^-+|-+$/g, "") // Trim hyphens from start/end
15
- }
16
-
17
- export const randomUUID = (length = 15) => {
18
- return Math.random().toString(36).substring(2, length)
19
- }
20
-
21
- export const processImage = async (
22
- tutorialDir: string,
23
- url: string,
24
- description: string,
25
- rigoToken: string
26
- ) => {
27
- try {
28
- const filename = getFilenameFromUrl(url)
29
-
30
- const imagePath = tutorialDir + "/.learn" + "/assets/" + filename
31
-
32
- eventBus.emit("course-generation", {
33
- message: `🖼️ Generating image ${imagePath}`,
34
- })
35
-
36
- const res = await generateImage(rigoToken, { prompt: description })
37
- await uploadImageToBucket(res.image_url, imagePath)
38
-
39
- eventBus.emit("course-generation", {
40
- message: `✅ Image ${imagePath} generated successfully!`,
41
- })
42
- return true
43
- } catch {
44
- return false
45
- }
46
- }
1
+ import { eventBus } from "./eventBus"
2
+ import { generateImage, getFilenameFromUrl, uploadImageToBucket } from "./lib"
3
+
4
+ export const slugify = (text: string) => {
5
+ return text
6
+ .toString()
7
+ .normalize("NFD") // Remove accents
8
+ .replace(/[\u0300-\u036F]/g, "") // Remove diacritics
9
+ .toLowerCase()
10
+ .trim()
11
+ .replace(/[^a-z0-9\s._-]/g, "") // Hyphen at the end, no escape needed
12
+ .replace(/\s+/g, "-") // Replace spaces with hyphens
13
+ .replace(/-+/g, "-") // Remove duplicate hyphens
14
+ .replace(/^-+|-+$/g, "") // Trim hyphens from start/end
15
+ }
16
+
17
+ export const randomUUID = (length = 15) => {
18
+ return Math.random().toString(36).substring(2, length)
19
+ }
20
+
21
+ export const processImage = async (
22
+ tutorialDir: string,
23
+ url: string,
24
+ description: string,
25
+ rigoToken: string
26
+ ) => {
27
+ try {
28
+ const filename = getFilenameFromUrl(url)
29
+
30
+ const imagePath = tutorialDir + "/.learn" + "/assets/" + filename
31
+
32
+ eventBus.emit("course-generation", {
33
+ message: `🖼️ Generating image ${imagePath}`,
34
+ })
35
+
36
+ const res = await generateImage(rigoToken, { prompt: description })
37
+ await uploadImageToBucket(res.image_url, imagePath)
38
+
39
+ eventBus.emit("course-generation", {
40
+ message: `✅ Image ${imagePath} generated successfully!`,
41
+ })
42
+ return true
43
+ } catch {
44
+ return false
45
+ }
46
+ }