@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.
- 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/publish.js +5 -10
- package/lib/commands/serve.js +3 -2
- package/lib/creatorDist/assets/index-BfLyIQVh.js +10343 -10224
- package/lib/managers/config/index.js +77 -77
- package/lib/utils/api.d.ts +1 -1
- package/lib/utils/api.js +12 -9
- 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 +20 -25
- package/src/commands/serve.ts +8 -3
- 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 +312 -312
- package/src/creator/src/i18n.ts +28 -28
- package/src/creator/src/index.css +217 -217
- package/src/creator/src/locales/en.json +126 -126
- package/src/creator/src/locales/es.json +126 -126
- 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/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-BfLyIQVh.js +10343 -10224
- 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 +47 -47
- 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 +366 -363
- package/src/ui/app.tar.gz +0 -0
- package/src/utils/BaseCommand.ts +56 -56
- package/src/utils/api.ts +53 -39
- 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
@@ -1,123 +1,123 @@
|
|
1
|
-
import SessionCommand from "../utils/SessionCommand"
|
2
|
-
import * as fs from "fs"
|
3
|
-
import * as path from "path"
|
4
|
-
import * as prompts from "prompts"
|
5
|
-
import { translateExercise } from "../utils/rigoActions"
|
6
|
-
import SessionManager from "../managers/session"
|
7
|
-
import Console from "../utils/console"
|
8
|
-
import { saveTranslatedReadme } from "../utils/creatorUtilities"
|
9
|
-
|
10
|
-
// This function list the names of the exercise directories inside the ./exercises folder, if the exercises folder doesn't exist, it will look for the ./.learn/exercises folder
|
11
|
-
const listExercises = async () => {
|
12
|
-
const exercisesDir = path.join(process.cwd(), "exercises")
|
13
|
-
const learnExercisesDir = path.join(process.cwd(), ".learn", "exercises")
|
14
|
-
|
15
|
-
const exercises = fs.readdirSync(exercisesDir).filter(file => {
|
16
|
-
return fs.statSync(path.join(exercisesDir, file)).isDirectory()
|
17
|
-
})
|
18
|
-
|
19
|
-
if (exercises.length > 0) {
|
20
|
-
return exercises
|
21
|
-
}
|
22
|
-
|
23
|
-
return fs.readdirSync(learnExercisesDir).filter(file => {
|
24
|
-
return fs.statSync(path.join(learnExercisesDir, file)).isDirectory()
|
25
|
-
})
|
26
|
-
}
|
27
|
-
|
28
|
-
const getReadmeForExercise = async (exercise: string) => {
|
29
|
-
const readmePath = path.join(
|
30
|
-
process.cwd(),
|
31
|
-
"exercises",
|
32
|
-
exercise,
|
33
|
-
"README.md"
|
34
|
-
)
|
35
|
-
return fs.readFileSync(readmePath, "utf8")
|
36
|
-
}
|
37
|
-
|
38
|
-
export default class BuildCommand extends SessionCommand {
|
39
|
-
static description =
|
40
|
-
"List all the lessons, the user is able of select many of them to translate to the given languages"
|
41
|
-
|
42
|
-
async init() {
|
43
|
-
const { flags } = this.parse(BuildCommand)
|
44
|
-
await this.initSession(flags)
|
45
|
-
}
|
46
|
-
|
47
|
-
async run() {
|
48
|
-
const { flags } = this.parse(BuildCommand)
|
49
|
-
|
50
|
-
const exercises = await listExercises()
|
51
|
-
|
52
|
-
const exercisesToTranslate = await prompts([
|
53
|
-
{
|
54
|
-
type: "multiselect",
|
55
|
-
name: "exercises",
|
56
|
-
message: "Select the exercises to translate",
|
57
|
-
choices: exercises.map(exercise => ({
|
58
|
-
title: exercise,
|
59
|
-
value: exercise,
|
60
|
-
})),
|
61
|
-
},
|
62
|
-
{
|
63
|
-
type: "text",
|
64
|
-
name: "output_language",
|
65
|
-
message:
|
66
|
-
"Write the languages to translate to comma separated. Example: English, Spanish, French",
|
67
|
-
initial: "Spanish",
|
68
|
-
},
|
69
|
-
])
|
70
|
-
|
71
|
-
const configObject = this.configManager?.get()
|
72
|
-
|
73
|
-
if (configObject) {
|
74
|
-
// build exerises
|
75
|
-
Console.debug("Building exercises")
|
76
|
-
this.configManager?.buildIndex()
|
77
|
-
}
|
78
|
-
|
79
|
-
let sessionPayload = await SessionManager.getPayload()
|
80
|
-
if (!sessionPayload || !sessionPayload.rigobot) {
|
81
|
-
Console.error("You must be logged in to upload a LearnPack package")
|
82
|
-
try {
|
83
|
-
sessionPayload = await SessionManager.login()
|
84
|
-
} catch (error) {
|
85
|
-
Console.error("Error trying to authenticate")
|
86
|
-
Console.error((error as TypeError).message || (error as string))
|
87
|
-
}
|
88
|
-
}
|
89
|
-
|
90
|
-
const rigoToken = sessionPayload.rigobot.key
|
91
|
-
|
92
|
-
await Promise.all(
|
93
|
-
exercisesToTranslate.exercises.map(async (exercise: string) => {
|
94
|
-
await Promise.all(
|
95
|
-
exercisesToTranslate.output_language
|
96
|
-
.split(",")
|
97
|
-
.map(async (language: string) => {
|
98
|
-
const readme = await getReadmeForExercise(exercise)
|
99
|
-
const response = await translateExercise(
|
100
|
-
rigoToken,
|
101
|
-
{
|
102
|
-
text_to_translate: readme,
|
103
|
-
output_language: language,
|
104
|
-
},
|
105
|
-
`${process.env.HOST}/webhooks/translate-exercise`
|
106
|
-
)
|
107
|
-
|
108
|
-
await saveTranslatedReadme(
|
109
|
-
exercise,
|
110
|
-
response.parsed.output_language_code,
|
111
|
-
response.parsed.translation
|
112
|
-
)
|
113
|
-
Console.success(
|
114
|
-
`Translated ${exercise} to ${language} successfully`
|
115
|
-
)
|
116
|
-
})
|
117
|
-
)
|
118
|
-
})
|
119
|
-
)
|
120
|
-
|
121
|
-
this.exit(0)
|
122
|
-
}
|
123
|
-
}
|
1
|
+
import SessionCommand from "../utils/SessionCommand"
|
2
|
+
import * as fs from "fs"
|
3
|
+
import * as path from "path"
|
4
|
+
import * as prompts from "prompts"
|
5
|
+
import { translateExercise } from "../utils/rigoActions"
|
6
|
+
import SessionManager from "../managers/session"
|
7
|
+
import Console from "../utils/console"
|
8
|
+
import { saveTranslatedReadme } from "../utils/creatorUtilities"
|
9
|
+
|
10
|
+
// This function list the names of the exercise directories inside the ./exercises folder, if the exercises folder doesn't exist, it will look for the ./.learn/exercises folder
|
11
|
+
const listExercises = async () => {
|
12
|
+
const exercisesDir = path.join(process.cwd(), "exercises")
|
13
|
+
const learnExercisesDir = path.join(process.cwd(), ".learn", "exercises")
|
14
|
+
|
15
|
+
const exercises = fs.readdirSync(exercisesDir).filter(file => {
|
16
|
+
return fs.statSync(path.join(exercisesDir, file)).isDirectory()
|
17
|
+
})
|
18
|
+
|
19
|
+
if (exercises.length > 0) {
|
20
|
+
return exercises
|
21
|
+
}
|
22
|
+
|
23
|
+
return fs.readdirSync(learnExercisesDir).filter(file => {
|
24
|
+
return fs.statSync(path.join(learnExercisesDir, file)).isDirectory()
|
25
|
+
})
|
26
|
+
}
|
27
|
+
|
28
|
+
const getReadmeForExercise = async (exercise: string) => {
|
29
|
+
const readmePath = path.join(
|
30
|
+
process.cwd(),
|
31
|
+
"exercises",
|
32
|
+
exercise,
|
33
|
+
"README.md"
|
34
|
+
)
|
35
|
+
return fs.readFileSync(readmePath, "utf8")
|
36
|
+
}
|
37
|
+
|
38
|
+
export default class BuildCommand extends SessionCommand {
|
39
|
+
static description =
|
40
|
+
"List all the lessons, the user is able of select many of them to translate to the given languages"
|
41
|
+
|
42
|
+
async init() {
|
43
|
+
const { flags } = this.parse(BuildCommand)
|
44
|
+
await this.initSession(flags)
|
45
|
+
}
|
46
|
+
|
47
|
+
async run() {
|
48
|
+
const { flags } = this.parse(BuildCommand)
|
49
|
+
|
50
|
+
const exercises = await listExercises()
|
51
|
+
|
52
|
+
const exercisesToTranslate = await prompts([
|
53
|
+
{
|
54
|
+
type: "multiselect",
|
55
|
+
name: "exercises",
|
56
|
+
message: "Select the exercises to translate",
|
57
|
+
choices: exercises.map(exercise => ({
|
58
|
+
title: exercise,
|
59
|
+
value: exercise,
|
60
|
+
})),
|
61
|
+
},
|
62
|
+
{
|
63
|
+
type: "text",
|
64
|
+
name: "output_language",
|
65
|
+
message:
|
66
|
+
"Write the languages to translate to comma separated. Example: English, Spanish, French",
|
67
|
+
initial: "Spanish",
|
68
|
+
},
|
69
|
+
])
|
70
|
+
|
71
|
+
const configObject = this.configManager?.get()
|
72
|
+
|
73
|
+
if (configObject) {
|
74
|
+
// build exerises
|
75
|
+
Console.debug("Building exercises")
|
76
|
+
this.configManager?.buildIndex()
|
77
|
+
}
|
78
|
+
|
79
|
+
let sessionPayload = await SessionManager.getPayload()
|
80
|
+
if (!sessionPayload || !sessionPayload.rigobot) {
|
81
|
+
Console.error("You must be logged in to upload a LearnPack package")
|
82
|
+
try {
|
83
|
+
sessionPayload = await SessionManager.login()
|
84
|
+
} catch (error) {
|
85
|
+
Console.error("Error trying to authenticate")
|
86
|
+
Console.error((error as TypeError).message || (error as string))
|
87
|
+
}
|
88
|
+
}
|
89
|
+
|
90
|
+
const rigoToken = sessionPayload.rigobot.key
|
91
|
+
|
92
|
+
await Promise.all(
|
93
|
+
exercisesToTranslate.exercises.map(async (exercise: string) => {
|
94
|
+
await Promise.all(
|
95
|
+
exercisesToTranslate.output_language
|
96
|
+
.split(",")
|
97
|
+
.map(async (language: string) => {
|
98
|
+
const readme = await getReadmeForExercise(exercise)
|
99
|
+
const response = await translateExercise(
|
100
|
+
rigoToken,
|
101
|
+
{
|
102
|
+
text_to_translate: readme,
|
103
|
+
output_language: language,
|
104
|
+
},
|
105
|
+
`${process.env.HOST}/webhooks/translate-exercise`
|
106
|
+
)
|
107
|
+
|
108
|
+
await saveTranslatedReadme(
|
109
|
+
exercise,
|
110
|
+
response.parsed.output_language_code,
|
111
|
+
response.parsed.translation
|
112
|
+
)
|
113
|
+
Console.success(
|
114
|
+
`Translated ${exercise} to ${language} successfully`
|
115
|
+
)
|
116
|
+
})
|
117
|
+
)
|
118
|
+
})
|
119
|
+
)
|
120
|
+
|
121
|
+
this.exit(0)
|
122
|
+
}
|
123
|
+
}
|
package/src/creator/README.md
CHANGED
@@ -1,54 +1,54 @@
|
|
1
|
-
# React + TypeScript + Vite
|
2
|
-
|
3
|
-
This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules.
|
4
|
-
|
5
|
-
Currently, two official plugins are available:
|
6
|
-
|
7
|
-
- [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react/README.md) uses [Babel](https://babeljs.io/) for Fast Refresh
|
8
|
-
- [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react-swc) uses [SWC](https://swc.rs/) for Fast Refresh
|
9
|
-
|
10
|
-
## Expanding the ESLint configuration
|
11
|
-
|
12
|
-
If you are developing a production application, we recommend updating the configuration to enable type-aware lint rules:
|
13
|
-
|
14
|
-
```js
|
15
|
-
export default tseslint.config({
|
16
|
-
extends: [
|
17
|
-
// Remove ...tseslint.configs.recommended and replace with this
|
18
|
-
...tseslint.configs.recommendedTypeChecked,
|
19
|
-
// Alternatively, use this for stricter rules
|
20
|
-
...tseslint.configs.strictTypeChecked,
|
21
|
-
// Optionally, add this for stylistic rules
|
22
|
-
...tseslint.configs.stylisticTypeChecked,
|
23
|
-
],
|
24
|
-
languageOptions: {
|
25
|
-
// other options...
|
26
|
-
parserOptions: {
|
27
|
-
project: ["./tsconfig.node.json", "./tsconfig.app.json"],
|
28
|
-
tsconfigRootDir: import.meta.dirname,
|
29
|
-
},
|
30
|
-
},
|
31
|
-
})
|
32
|
-
```
|
33
|
-
|
34
|
-
You can also install [eslint-plugin-react-x](https://github.com/Rel1cx/eslint-react/tree/main/packages/plugins/eslint-plugin-react-x) and [eslint-plugin-react-dom](https://github.com/Rel1cx/eslint-react/tree/main/packages/plugins/eslint-plugin-react-dom) for React-specific lint rules:
|
35
|
-
|
36
|
-
```js
|
37
|
-
// eslint.config.js
|
38
|
-
import reactX from "eslint-plugin-react-x"
|
39
|
-
import reactDom from "eslint-plugin-react-dom"
|
40
|
-
|
41
|
-
export default tseslint.config({
|
42
|
-
plugins: {
|
43
|
-
// Add the react-x and react-dom plugins
|
44
|
-
"react-x": reactX,
|
45
|
-
"react-dom": reactDom,
|
46
|
-
},
|
47
|
-
rules: {
|
48
|
-
// other rules...
|
49
|
-
// Enable its recommended typescript rules
|
50
|
-
...reactX.configs["recommended-typescript"].rules,
|
51
|
-
...reactDom.configs.recommended.rules,
|
52
|
-
},
|
53
|
-
})
|
54
|
-
```
|
1
|
+
# React + TypeScript + Vite
|
2
|
+
|
3
|
+
This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules.
|
4
|
+
|
5
|
+
Currently, two official plugins are available:
|
6
|
+
|
7
|
+
- [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react/README.md) uses [Babel](https://babeljs.io/) for Fast Refresh
|
8
|
+
- [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react-swc) uses [SWC](https://swc.rs/) for Fast Refresh
|
9
|
+
|
10
|
+
## Expanding the ESLint configuration
|
11
|
+
|
12
|
+
If you are developing a production application, we recommend updating the configuration to enable type-aware lint rules:
|
13
|
+
|
14
|
+
```js
|
15
|
+
export default tseslint.config({
|
16
|
+
extends: [
|
17
|
+
// Remove ...tseslint.configs.recommended and replace with this
|
18
|
+
...tseslint.configs.recommendedTypeChecked,
|
19
|
+
// Alternatively, use this for stricter rules
|
20
|
+
...tseslint.configs.strictTypeChecked,
|
21
|
+
// Optionally, add this for stylistic rules
|
22
|
+
...tseslint.configs.stylisticTypeChecked,
|
23
|
+
],
|
24
|
+
languageOptions: {
|
25
|
+
// other options...
|
26
|
+
parserOptions: {
|
27
|
+
project: ["./tsconfig.node.json", "./tsconfig.app.json"],
|
28
|
+
tsconfigRootDir: import.meta.dirname,
|
29
|
+
},
|
30
|
+
},
|
31
|
+
})
|
32
|
+
```
|
33
|
+
|
34
|
+
You can also install [eslint-plugin-react-x](https://github.com/Rel1cx/eslint-react/tree/main/packages/plugins/eslint-plugin-react-x) and [eslint-plugin-react-dom](https://github.com/Rel1cx/eslint-react/tree/main/packages/plugins/eslint-plugin-react-dom) for React-specific lint rules:
|
35
|
+
|
36
|
+
```js
|
37
|
+
// eslint.config.js
|
38
|
+
import reactX from "eslint-plugin-react-x"
|
39
|
+
import reactDom from "eslint-plugin-react-dom"
|
40
|
+
|
41
|
+
export default tseslint.config({
|
42
|
+
plugins: {
|
43
|
+
// Add the react-x and react-dom plugins
|
44
|
+
"react-x": reactX,
|
45
|
+
"react-dom": reactDom,
|
46
|
+
},
|
47
|
+
rules: {
|
48
|
+
// other rules...
|
49
|
+
// Enable its recommended typescript rules
|
50
|
+
...reactX.configs["recommended-typescript"].rules,
|
51
|
+
...reactDom.configs.recommended.rules,
|
52
|
+
},
|
53
|
+
})
|
54
|
+
```
|
@@ -1,28 +1,28 @@
|
|
1
|
-
import js from "@eslint/js"
|
2
|
-
import globals from "globals"
|
3
|
-
import reactHooks from "eslint-plugin-react-hooks"
|
4
|
-
import reactRefresh from "eslint-plugin-react-refresh"
|
5
|
-
import tseslint from "typescript-eslint"
|
6
|
-
|
7
|
-
export default tseslint.config(
|
8
|
-
{ ignores: ["dist"] },
|
9
|
-
{
|
10
|
-
extends: [js.configs.recommended, ...tseslint.configs.recommended],
|
11
|
-
files: ["**/*.{ts,tsx}"],
|
12
|
-
languageOptions: {
|
13
|
-
ecmaVersion: 2020,
|
14
|
-
globals: globals.browser,
|
15
|
-
},
|
16
|
-
plugins: {
|
17
|
-
"react-hooks": reactHooks,
|
18
|
-
"react-refresh": reactRefresh,
|
19
|
-
},
|
20
|
-
rules: {
|
21
|
-
...reactHooks.configs.recommended.rules,
|
22
|
-
"react-refresh/only-export-components": [
|
23
|
-
"warn",
|
24
|
-
{ allowConstantExport: true },
|
25
|
-
],
|
26
|
-
},
|
27
|
-
}
|
28
|
-
)
|
1
|
+
import js from "@eslint/js"
|
2
|
+
import globals from "globals"
|
3
|
+
import reactHooks from "eslint-plugin-react-hooks"
|
4
|
+
import reactRefresh from "eslint-plugin-react-refresh"
|
5
|
+
import tseslint from "typescript-eslint"
|
6
|
+
|
7
|
+
export default tseslint.config(
|
8
|
+
{ ignores: ["dist"] },
|
9
|
+
{
|
10
|
+
extends: [js.configs.recommended, ...tseslint.configs.recommended],
|
11
|
+
files: ["**/*.{ts,tsx}"],
|
12
|
+
languageOptions: {
|
13
|
+
ecmaVersion: 2020,
|
14
|
+
globals: globals.browser,
|
15
|
+
},
|
16
|
+
plugins: {
|
17
|
+
"react-hooks": reactHooks,
|
18
|
+
"react-refresh": reactRefresh,
|
19
|
+
},
|
20
|
+
rules: {
|
21
|
+
...reactHooks.configs.recommended.rules,
|
22
|
+
"react-refresh/only-export-components": [
|
23
|
+
"warn",
|
24
|
+
{ allowConstantExport: true },
|
25
|
+
],
|
26
|
+
},
|
27
|
+
}
|
28
|
+
)
|