Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feat/otter training #2551

Merged
merged 99 commits into from
Jan 9, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
99 commits
Select commit Hold shift + click to select a range
63b5bc1
feat: otter training - components
sdo-1A Sep 17, 2024
9a62adb
feat: otter training - components (#2173)
sdo-1A Oct 2, 2024
c36820a
feat: otter training - prepare training content
sdo-1A Oct 2, 2024
992f1ff
feat: otter training - prepare training content (#2223)
sdo-1A Oct 9, 2024
f78569f
feat: otter training - training sdk
sdo-1A Oct 10, 2024
e81546d
feat: otter training - training sdk (#2267)
sdo-1A Oct 21, 2024
53be8c0
feat(training): add load indicator on output
fpaul-1A Oct 18, 2024
c973c89
feat: coi-serviceworker to deploy training in GitHub pages
sdo-1A Oct 21, 2024
36e5eb3
feat: coi-serviceworker to deploy training in GitHub pages (#2317)
sdo-1A Oct 22, 2024
988805b
feat(training): add load indicator on output (#2307)
fpaul-1A Nov 6, 2024
88cb842
feat: otter sdk training - sdk with date generation and usage
sdo-1A Oct 23, 2024
2cb7487
feat: otter sdk training - sdk with date generation and usage (#2332)
sdo-1A Nov 6, 2024
372b38c
feat(training): update css of the showcase to reduce the unused space…
fpaul-1A Nov 8, 2024
d86e107
feat(training): update css of the showcase to reduce the unused space…
fpaul-1A Nov 8, 2024
cd14d79
feat(training): use markdown for step instructions
fpaul-1A Nov 6, 2024
0a0cc4d
feat(training): use markdown for step instructions (#2414)
fpaul-1A Nov 12, 2024
2dea1bb
Merge branch 'main' of https://github.com/AmadeusITGroup/otter into f…
fpaul-1A Nov 12, 2024
809b3f1
Merge main into otter-training (#2450)
fpaul-1A Nov 13, 2024
74e2336
feat(training): resizable areas
fpaul-1A Nov 12, 2024
7016849
feat(training): resizable areas (#2454)
fpaul-1A Nov 13, 2024
d50a168
fix(training): markdown alerts not correctly displayed
fpaul-1A Nov 13, 2024
6931d0b
fix(training): wrong training-tools exports
fpaul-1A Nov 13, 2024
90f4825
fix(training): missing files for training-sdk tests
fpaul-1A Nov 13, 2024
2f679ab
fix(training): markdown alerts not correctly displayed (#2463)
fpaul-1A Nov 14, 2024
b277588
fix(training): wrong training-tools exports (#2464)
fpaul-1A Nov 14, 2024
2383cde
feat: otter sdk training - introduction step
sdo-1A Oct 21, 2024
8b3b9f5
fix(training): missing files for training-sdk tests (#2465)
fpaul-1A Nov 14, 2024
e92836c
fix(training): accessibility of tabs in code editor controls
fpaul-1A Nov 14, 2024
7b3c506
fix(training): accessibility of tabs in code editor controls (#2468)
fpaul-1A Nov 14, 2024
701f1d8
feat: otter sdk training - introduction step (#2318)
sdo-1A Nov 15, 2024
4599a3d
feat: otter sdk training - various fixes
sdo-1A Nov 7, 2024
81521ce
feat: otter sdk training - various fixes (#2459)
sdo-1A Nov 18, 2024
d0d4552
feat: otter sdk training - generate your first sdk specs and command
sdo-1A Oct 22, 2024
96522c5
feat: otter sdk training - generate your first sdk specs and command …
sdo-1A Nov 19, 2024
9124168
feat(training): create json schema to validate filesystemtree
fpaul-1A Nov 19, 2024
6cb7e63
feat(training): create json schema to validate filesystemtree (#2485)
fpaul-1A Nov 19, 2024
b504352
feat: otter sdk training - update of visual testing
sdo-1A Nov 19, 2024
8094400
feat: otter sdk training - update of visual testing (#2487)
sdo-1A Nov 20, 2024
8d0ee53
fix(training): unstable transitions between exercises and solutions
fpaul-1A Nov 20, 2024
3fbdf71
fix(training): unstable transitions between exercises and solutions (…
fpaul-1A Nov 20, 2024
96e543d
feat(training): loading progress indicator
fpaul-1A Nov 22, 2024
7b43e4c
feat(training): loading progress indicator (#2499)
fpaul-1A Nov 25, 2024
f6b4b49
feat: otter sdk training - how to use the otter sdk
sdo-1A Nov 20, 2024
7020c59
feat: otter sdk training - how to use the otter sdk (#2493)
sdo-1A Nov 25, 2024
d90ec6f
feat: otter sdk training - plugins
sdo-1A Nov 26, 2024
3d926e8
fix(training): terminal no longer working
fpaul-1A Nov 27, 2024
7b7c3b7
feat: otter sdk training - plugins (#2517)
sdo-1A Nov 27, 2024
5f1b7cf
fix(training): terminal no longer working (#2520)
fpaul-1A Nov 27, 2024
50944d6
fix(training): monaco editor tooltips not fully visible
fpaul-1A Nov 27, 2024
997630b
fix(training): monaco editor tooltips not fully visible (#2523)
fpaul-1A Nov 28, 2024
a0fbccc
feat: otter training sdk - welcome and other small fixes
sdo-1A Nov 28, 2024
b1220ab
feat: otter training sdk - welcome and other small fixes (#2524)
sdo-1A Dec 2, 2024
da50e35
Merge remote-tracking branch 'origin/main' into HEAD
cpaulve-1A Dec 2, 2024
31e5f9f
Feat/training merge main (#2541)
cpaulve-1A Dec 2, 2024
48ff79e
feat: otter sdk training - model extension
sdo-1A Nov 6, 2024
8c140e9
feat: otter sdk training - model extension (#2411)
fpaul-1A Dec 3, 2024
1470330
fix: mock webcontainer api and xterm for unit test
cpaulve-1A Dec 2, 2024
71cdb74
fix: mock webcontainer api and xterm for unit test (#2545)
cpaulve-1A Dec 4, 2024
f4a0022
feat: otter sdk training - integration in angular
sdo-1A Nov 29, 2024
9a8d9e1
feat: otter sdk training - integration in angular (#2531)
sdo-1A Dec 5, 2024
9971769
feat: otter training sdk - small fixes
sdo-1A Dec 5, 2024
f03d9be
feat: otter training sdk - small fixes (#2554)
sdo-1A Dec 5, 2024
077bfce
chore(training): regenerate lock file
fpaul-1A Dec 5, 2024
f6b90a4
fix(training): model extension mocks
fpaul-1A Dec 5, 2024
45842dc
fix(training): model extension mocks (#2557)
fpaul-1A Dec 5, 2024
dc7c3eb
chore(training): regenerate lock file (#2556)
fpaul-1A Dec 5, 2024
0c73921
feat(training): remove df dependencies to speed up the build
fpaul-1A Dec 5, 2024
3545ad4
feat(training): remove df dependencies to speed up the build (#2559)
fpaul-1A Dec 6, 2024
0362b4d
fix(training): model extension solution not loaded
fpaul-1A Dec 6, 2024
1c2aa53
feat(training): stop propagation of save event on the editor
matthieu-crouzet Dec 6, 2024
30a5416
fix(training): model extension solution not loaded (#2560)
fpaul-1A Dec 6, 2024
698b1a6
feat(training): stop propagation of save event on the editor (#2562)
matthieu-crouzet Dec 6, 2024
8cd55ff
Merge remote-tracking branch 'origin/main' into merge/main-to-training
cpaulve-1A Dec 6, 2024
0eb7575
chore: update screenshots
cpaulve-1A Dec 6, 2024
2b3f45f
chore: merge main into training (#2563)
cpaulve-1A Dec 9, 2024
1a4da67
chore: merge main into otter training
cpaulve-1A Dec 9, 2024
a0f9519
Merge main to otter training (#2570)
cpaulve-1A Dec 9, 2024
6516528
fix: repair build and fix design
cpaulve-1A Dec 9, 2024
503f88f
fix: repair build and fix design (#2572)
cpaulve-1A Dec 9, 2024
39fdfea
feat(training): file navigation inside code editor
fpaul-1A Dec 2, 2024
3977369
test(training): visual testing for training steps
fpaul-1A Dec 12, 2024
74e8403
feat(training): file navigation inside code editor (#2544)
fpaul-1A Dec 13, 2024
22ed14a
fix: base code navigation on webcontainer instead of project initial …
cpaulve-1A Dec 13, 2024
846f229
fix: base code navigation on webcontainer instead of project initial …
cpaulve-1A Dec 16, 2024
2e1374e
test(training): visual testing for training steps (#2587)
fpaul-1A Dec 16, 2024
94c77f0
feat(training): persistence of code modifications
matthieu-crouzet Dec 11, 2024
7f58289
feat(training): persistence of code modifications (#2579)
matthieu-crouzet Dec 16, 2024
07016d1
chore: merge main branch into otter training
cpaulve-1A Dec 19, 2024
6f662e5
chore: fix build merge main into training
cpaulve-1A Dec 19, 2024
64d5a42
Merge main to otter training (#2636)
cpaulve-1A Dec 19, 2024
bfa43cb
fix: test and visual testing update for otter training
cpaulve-1A Dec 19, 2024
ac5d4e7
fix: test and visual testing update for otter training (#2638)
cpaulve-1A Dec 20, 2024
c1217e2
Merge remote-tracking branch 'origin/main' into merge-main-to-otter-t…
cpaulve-1A Jan 6, 2025
c86a9f6
chore: yarn.lock update following merge of main
cpaulve-1A Jan 6, 2025
994eea7
Merge main to otter training (#2667)
cpaulve-1A Jan 6, 2025
4565659
chore: add unit test on otter training helpers
cpaulve-1A Jan 7, 2025
6905db3
chore: add unit test on otter training helpers (#2672)
cpaulve-1A Jan 8, 2025
8122ec8
feat(training): set solution as readonly
cpaulve-1A Jan 8, 2025
8b1f644
fneat(training): set solution as readonly (#2679)
cpaulve-1A Jan 8, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .vscode/settings.json
Original file line number Diff line number Diff line change
Expand Up @@ -99,5 +99,6 @@
"**/.pnp.*": true
},
"typescript.enablePromptUseWorkspaceTsdk": true,
"typescript.tsserver.watchOptions": "vscode",
"typescript.tsdk": ".yarn/sdks/typescript/lib"
}
3 changes: 3 additions & 0 deletions apps/showcase/.gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -5,3 +5,6 @@
dist-e2e-playwright
playwright-reports
test-results
training-assets
src/assets/trainings/**/exercise.json
src/assets/trainings/**/solution.json
Original file line number Diff line number Diff line change
Expand Up @@ -133,4 +133,12 @@ test.describe('Lighthouse tests', () => {
await page.waitForURL('**/placeholder');
await performAudit('placeholder', page, testInfo);
});

test('sdk-intro', async ({ page }, testInfo) => {
await page.goto(baseUrl);
const appFixture = new AppFixtureComponent(new O3rElement({ element: page.locator('app-root'), page }));
await appFixture.navigateToSDKIntro();
await page.waitForURL('**/sdk-intro');
await performAudit('sdk-intro', page, testInfo);
});
});
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
22 changes: 22 additions & 0 deletions apps/showcase/e2e-playwright/sanity/visual-sanity.e2e.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,9 @@ import {
import {
AppFixtureComponent,
} from '../../src/app/app.fixture';
import {
TrainingFixtureComponent,
} from '../../src/components/training/training.fixture';

test.describe.serial('Sanity test', () => {
test('Visual comparison for each page', async ({ browserName, page }) => {
Expand Down Expand Up @@ -75,5 +78,24 @@ test.describe.serial('Sanity test', () => {
await page.waitForURL('**/placeholder');
await expect(page).toHaveScreenshot([browserName, 'placeholder.png'], { fullPage: true, mask: [page.locator('.visual-testing-ignore')] });
});

await test.step('sdk-intro', async () => {
await appFixture.navigateToSDKIntro();
await page.waitForURL('**/sdk-intro');
await expect(page).toHaveScreenshot([browserName, 'sdk-intro.png'], { fullPage: true, mask: [page.locator('.visual-testing-ignore')] });
});

await test.step('sdk-training', async () => {
await appFixture.navigateToSDKTraining();
await page.waitForURL('**/sdk-training*');
await expect(page).toHaveScreenshot([browserName, 'sdk-training.png'], { fullPage: true, mask: [page.locator('.visual-testing-ignore')] });

const trainingFixture = new TrainingFixtureComponent(new O3rElement({ element: page.locator('o3r-training'), page }));
for (let i = 1; i < 9; i++) {
await trainingFixture.clickOnNextStep();
await page.waitForURL(`**/sdk-training#${i}`);
await expect(page).toHaveScreenshot([browserName, `sdk-training-step${i + 1}.png`], { fullPage: true, mask: [page.locator('.visual-testing-ignore')] });
}
});
});
});
5 changes: 4 additions & 1 deletion apps/showcase/eslint.local.config.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,10 @@ export default [
'dev-resources/**/*',
'playwright-reports/**/*',
'test-results/**/*',
'*.metadata.json'
'*.metadata.json',
'src/assets/trainings/sdk/**/*',
'src/coi-serviceworker.js',
'training-assets/**/*'
]
},
{
Expand Down
10 changes: 8 additions & 2 deletions apps/showcase/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -14,13 +14,15 @@
"start:no-translation": "ng serve",
"generate:translations:dev": "ng run showcase:generate-translations",
"generate:translations": "ng run showcase:generate-translations:production",
"prepare-training": "node scripts/prepare-training-exercises/index.cjs",
"cms-adapters:localizations": "ng run showcase:extract-translations",
"cms-adapters:metadata": "yarn run cms-adapters:localizations",
"update:otter": "ng update @o3r/core",
"test:playwright": "concurrently -m 1 -P 'yarn run test:playwright:* {*}' --",
"test:playwright:scenario": "USE_MOCKS=true playwright test --config=e2e-playwright/playwright-config.ts",
"test:playwright:sanity": "USE_MOCKS=true playwright test --config=e2e-playwright/playwright-config.sanity.ts",
"update-screenshots": "node scripts/update-screenshots/index.cjs",
"copy-training-assets": "node scripts/copy-training-assets/index.cjs",
"postbuild:patch": "yarn patch:package",
"patch:package": "cpy 'package.json' 'dist' && patch-package-json-main"
},
Expand Down Expand Up @@ -53,6 +55,7 @@
"@nx/jest": "~19.8.0",
"@o3r-training/showcase-sdk": "workspace:^",
"@o3r-training/training-tools": "workspace:^",
"@o3r/apis-manager": "workspace:^",
"@o3r/application": "workspace:^",
"@o3r/components": "workspace:^",
"@o3r/configuration": "workspace:^",
Expand All @@ -62,6 +65,7 @@
"@o3r/logger": "workspace:^",
"@o3r/routing": "workspace:^",
"@o3r/rules-engine": "workspace:^",
"@o3r/store-sync": "workspace:^",
"@o3r/styling": "workspace:^",
"@o3r/testing": "workspace:^",
"@popperjs/core": "^2.11.5",
Expand All @@ -71,14 +75,15 @@
"@xterm/xterm": "^5.0.0",
"ag-grid-angular": "~32.3.0",
"ag-grid-community": "~32.3.0",
"angular-split": "^18.0.0",
"bootstrap": "5.3.3",
"clipboard": "^2.0.11",
"intl-messageformat": "~10.7.0",
"marked": "^12.0.0",
"monaco-editor": "~0.52.0",
"monaco-editor": "~0.50.0",
"ngx-markdown": "^18.1.0",
"ngx-monaco-editor-v2": "^18.0.0",
"ngx-monaco-tree": "^18.1.0",
"ngx-monaco-tree": "^18.4.0",
"pixelmatch": "^5.2.1",
"pngjs": "^7.0.0",
"prism-themes": "^1.9.0",
Expand All @@ -98,6 +103,7 @@
"@angular/compiler-cli": "~18.2.0",
"@eslint-community/eslint-plugin-eslint-comments": "^4.4.0",
"@nx/eslint-plugin": "~19.8.0",
"@o3r-training/training-sdk": "workspace:^",
"@o3r/build-helpers": "workspace:^",
"@o3r/design": "workspace:^",
"@o3r/eslint-config": "workspace:^",
Expand Down
79 changes: 76 additions & 3 deletions apps/showcase/project.json
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,13 @@
},
"compile": {
"executor": "@angular-devkit/build-angular:application",
"inputs": [
"source",
"^structure",
"{projectRoot}/dev-resources",
"{projectRoot}/training-assets",
"{projectRoot}/*.metadata.json"
],
"options": {
"outputPath": "apps/showcase/dist",
"index": "apps/showcase/src/index.html",
Expand All @@ -65,6 +72,7 @@
"assets": [
"apps/showcase/src/favicon.ico",
"apps/showcase/src/favicon.svg",
"apps/showcase/src/coi-serviceworker.js",
"apps/showcase/src/assets",
"apps/showcase/src/custom-assets",
{
Expand All @@ -76,11 +84,33 @@
"glob": "*.metadata.json",
"input": "apps/showcase",
"output": "/metadata"
},
{
"glob": "**/*",
"input": "apps/showcase/training-assets/monaco-editor",
"output": "/assets/monaco/"
},
{
"glob": "**/*",
"input": "apps/showcase/training-assets/ngx-monaco-tree/assets",
"output": "/assets/"
},
{
"glob": "*.json",
"input": "packages/@o3r-training/training-sdk/dist/structure",
"output": "/assets/@o3r-training/training-sdk/structure"
},
{
"glob": "*.json",
"input": "packages/@o3r-training/showcase-sdk/dist/structure",
"output": "/assets/@o3r-training/showcase-sdk/structure"
}
],
"styles": [
"apps/showcase/src/styles.scss",
"prism-themes/themes/prism-vsc-dark-plus.css",
"apps/showcase/training-assets/@vscode/codicons/dist/codicon.css",
"apps/showcase/training-assets/@xterm/xterm/css/xterm.css",
{
"inject": false,
"input": "apps/showcase/src/style/dark-theme/dark-theme.scss",
Expand All @@ -102,7 +132,8 @@
"prismjs/components/prism-markup",
"prismjs/components/prism-regex",
"prismjs/components/prism-typescript",
"prismjs/components/prism-yaml"
"prismjs/components/prism-yaml",
"apps/showcase/src/coi-serviceworker.js"
]
},
"configurations": {
Expand Down Expand Up @@ -131,10 +162,13 @@
"defaultConfiguration": "production",
"dependsOn": [
"^build",
"^extract-folder-structure",
"generate-translations",
"generate-theme",
"generate-dark-theme",
"generate-horizon-theme"
"generate-horizon-theme",
"copy-training-assets",
"prepare-training"
]
},
"serve": {
Expand All @@ -150,11 +184,20 @@
},
"dependsOn": [
"^build-builders",
"^build"
"^build",
"^extract-folder-structure",
"copy-training-assets",
"prepare-training"
]
},
"serve-app": {
"executor": "@angular-devkit/build-angular:dev-server",
"options": {
"headers": {
"Cross-Origin-Opener-Policy": "same-origin",
"Cross-Origin-Embedder-Policy": "require-corp"
}
},
"configurations": {
"production": {
"buildTarget": "showcase:compile:production"
Expand Down Expand Up @@ -359,6 +402,36 @@
]
},
"dependsOn": ["^build-builders"]
},
"prepare-training": {
"cache": true,
"executor": "nx:run-script",
"inputs": [
"{projectRoot}/package.json",
"{projectRoot}/src/assets/**/exercise/**",
"{projectRoot}/src/assets/**/solution/**",
"{projectRoot}/scripts/prepare-training-exercises/*.cjs"
],
"outputs": [
"{projectRoot}/src/assets/**/solution.json",
"{projectRoot}/src/assets/**/exercise.json"
],
"options": {
"script": "prepare-training"
},
"dependsOn": ["^build", "^build-cli"]
},
"copy-training-assets": {
"cache": true,
"executor": "nx:run-script",
"inputs": [
"{projectRoot}/package.json",
"{projectRoot}/scripts/copy-training-assets/*.cjs"
],
"outputs": ["{projectRoot}/training-assets"],
"options": {
"script": "copy-training-assets"
}
}
},
"tags": ["showcase"]
Expand Down
122 changes: 122 additions & 0 deletions apps/showcase/schemas/training-program.schema.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,122 @@
{
"$schema": "http://json-schema.org/schema",
"type": "object",
"$id": "TrainingProgramSchema",
"title": "Training program",
"description": "Training program steps and their descriptions",
"properties": {
"$schema": {
"type": "string"
},
"trainingSteps": {
"type": "array",
"description": "Steps of the training program",
"items": {
"type": "object",
"properties": {
"stepTitle": {
"type": "string",
"description": "Step title"
},
"htmlContentUrl": {
"type": "string",
"description": "URL to step instructions (HTML content)"
},
"filesConfiguration": {
"type": "object",
"description": "Step files configuration",
"properties": {
"exerciseId": {
"type": "string",
"pattern": "^(sdk)-[a-zA-Z0-9-]+",
"description": "Unique identifier of the directory in which files will be put"
},
"startingFile": {
"type": "string",
"description": "Starting file to be displayed in the project"
},
"commands": {
"type": "array",
"description": "Commands to run in the project",
"items": {
"type": "string"
}
},
"urls": {
"type": "array",
"description": "URLs of step project",
"items": {
"type": "object",
"description": "Step project content and its corresponding path",
"properties": {
"path": {
"type": "string",
"description": "Path in step project"
},
"contentUrl": {
"type": "string",
"description": "URL of content"
}
},
"additionalProperties": false,
"required": [
"path",
"contentUrl"
]
}
},
"solutionUrls": {
"type": "array",
"description": "URLs of step solution project",
"items": {
"type": "object",
"description": "Step project content and its corresponding path",
"properties": {
"path": {
"type": "string",
"description": "Path in step project"
},
"contentUrl": {
"type": "string",
"description": "URL of content"
}
},
"additionalProperties": false,
"required": [
"path",
"contentUrl"
]
}
},
"mode": {
"type": "string",
"description": "Mode of the Code Editor",
"enum": [
"readonly",
"interactive"
]
}
},
"additionalProperties": false,
"required": [
"exerciseId",
"startingFile",
"commands",
"urls",
"mode"
]
}
},
"additionalProperties": false,
"required": [
"stepTitle",
"htmlContentUrl"
]
}
}
},
"additionalProperties": false,
"required": [
"trainingSteps"
]
}
Loading
Loading