@learnpack/learnpack 5.0.309 → 5.0.310
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/logout.js +3 -3
- package/lib/commands/serve.js +16 -16
- package/lib/creatorDist/assets/{index-B37w_ZhT.js → index-BI7U47zy.js} +13186 -13013
- package/lib/creatorDist/index.html +1 -1
- package/lib/managers/config/index.js +77 -77
- package/lib/utils/creatorUtilities.js +14 -14
- package/lib/utils/templates/isolated/exercises/01-hello-world/README.es.md +26 -26
- package/lib/utils/templates/isolated/exercises/01-hello-world/README.md +26 -26
- package/lib/utils/templates/scorm/adlcp_rootv1p2.xsd +110 -110
- package/lib/utils/templates/scorm/config/index.html +209 -209
- package/lib/utils/templates/scorm/ims_xml.xsd +1 -1
- package/lib/utils/templates/scorm/imscp_rootv1p1p2.xsd +345 -345
- package/lib/utils/templates/scorm/imsmanifest.xml +38 -38
- package/lib/utils/templates/scorm/imsmd_rootv1p2p1.xsd +573 -573
- 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/logout.ts +38 -38
- package/src/commands/publish.ts +517 -517
- package/src/commands/serve.ts +3179 -3179
- package/src/commands/start.ts +333 -333
- package/src/commands/translate.ts +123 -123
- package/src/creator/README.md +54 -54
- package/src/creator/package-lock.json +6621 -6621
- package/src/creator/package.json +55 -55
- package/src/creator/src/App.tsx +611 -608
- package/src/creator/src/components/FileUploader.tsx +340 -302
- package/src/creator/src/components/Icon.tsx +18 -18
- package/src/creator/src/components/LessonItem.tsx +152 -152
- package/src/creator/src/components/Login.tsx +259 -259
- package/src/creator/src/components/ParamsChecker.tsx +25 -25
- package/src/creator/src/components/Uploader.tsx +3 -6
- package/src/creator/src/components/syllabus/ContentIndex.tsx +323 -323
- package/src/creator/src/components/syllabus/SyllabusEditor.tsx +341 -337
- package/src/creator/src/i18n.ts +28 -28
- package/src/creator/src/locales/en.json +139 -138
- package/src/creator/src/locales/es.json +139 -138
- 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/rigo.ts +1 -1
- 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-B37w_ZhT.js → index-BI7U47zy.js} +13186 -13013
- package/src/creatorDist/index.html +1 -1
- 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/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/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 +477 -407
- package/src/ui/app.tar.gz +0 -0
- package/src/utils/BaseCommand.ts +56 -56
- package/src/utils/api.ts +665 -665
- package/src/utils/audit.ts +392 -392
- package/src/utils/checkNotInstalled.ts +267 -267
- package/src/utils/convertCreds.js +34 -34
- package/src/utils/creatorUtilities.ts +504 -504
- package/src/utils/export/README.md +178 -178
- package/src/utils/incrementVersion.js +74 -74
- package/src/utils/misc.ts +58 -58
- 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/utils/templates/scorm/adlcp_rootv1p2.xsd +110 -110
- package/src/utils/templates/scorm/config/index.html +209 -209
- package/src/utils/templates/scorm/ims_xml.xsd +1 -1
- package/src/utils/templates/scorm/imscp_rootv1p1p2.xsd +345 -345
- package/src/utils/templates/scorm/imsmanifest.xml +38 -38
- 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,
|
|
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": "
|
|
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
|
-
|
|
69
|
-
|
|
70
|
-
"
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
"
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
"
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
"
|
|
85
|
-
"
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
"
|
|
89
|
-
"
|
|
90
|
-
"
|
|
91
|
-
"
|
|
92
|
-
"
|
|
93
|
-
"
|
|
94
|
-
"
|
|
95
|
-
"
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
"
|
|
100
|
-
"
|
|
101
|
-
"
|
|
102
|
-
"
|
|
103
|
-
"
|
|
104
|
-
|
|
105
|
-
"
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
"
|
|
111
|
-
"
|
|
112
|
-
"
|
|
113
|
-
"
|
|
114
|
-
"
|
|
115
|
-
"
|
|
116
|
-
"
|
|
117
|
-
"
|
|
118
|
-
"
|
|
119
|
-
"
|
|
120
|
-
"
|
|
121
|
-
"
|
|
122
|
-
"
|
|
123
|
-
"
|
|
124
|
-
"
|
|
125
|
-
"
|
|
126
|
-
"
|
|
127
|
-
"
|
|
128
|
-
"
|
|
129
|
-
"
|
|
130
|
-
"
|
|
131
|
-
"
|
|
132
|
-
"
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
"
|
|
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
|
+
}
|