diff --git a/.drone.yml b/.drone.yml
index 55ccbca..d28f2b0 100644
--- a/.drone.yml
+++ b/.drone.yml
@@ -9,6 +9,13 @@ steps:
- npm install
- npm run build
+ - name: test-chrome
+ image: timbru31/node-chrome:20-slim
+ commands:
+ - npm run test -- --browsers=ChromeHeadlessCI --watch=false
+ depends_on:
+ - build
+
- name: sonar
image: sonarsource/sonar-scanner-cli:5
commands:
diff --git a/.gitignore b/.gitignore
index 5ce3ff8..1db23d0 100644
--- a/.gitignore
+++ b/.gitignore
@@ -19,6 +19,7 @@ yarn-error.log
*.launch
.settings/
*.sublime-workspace
+.nx
# Visual Studio Code
.vscode/*
diff --git a/angular.json b/angular.json
index 7d84a59..2eeb758 100644
--- a/angular.json
+++ b/angular.json
@@ -16,9 +16,14 @@
"outputPath": "dist/sandkasten",
"index": "src/index.html",
"browser": "src/main.ts",
- "polyfills": ["zone.js"],
+ "polyfills": [
+ "zone.js"
+ ],
"tsConfig": "tsconfig.app.json",
- "assets": ["src/favicon.ico", "src/assets"],
+ "assets": [
+ "src/favicon.ico",
+ "src/assets"
+ ],
"styles": [
"@angular/material/prebuilt-themes/indigo-pink.css",
"src/styles.scss"
@@ -27,6 +32,12 @@
},
"configurations": {
"production": {
+ "fileReplacements": [
+ {
+ "replace": "src/environments/environment.ts",
+ "with": "src/environments/environment.prod.ts"
+ }
+ ],
"budgets": [
{
"type": "initial",
@@ -42,6 +53,7 @@
"outputHashing": "all"
},
"development": {
+ "fileReplacements": [],
"optimization": false,
"extractLicenses": false,
"sourceMap": true
@@ -70,20 +82,30 @@
"test": {
"builder": "@angular-devkit/build-angular:karma",
"options": {
- "polyfills": ["zone.js", "zone.js/testing"],
+ "polyfills": [
+ "zone.js",
+ "zone.js/testing"
+ ],
"tsConfig": "tsconfig.spec.json",
- "assets": ["src/favicon.ico", "src/assets"],
+ "assets": [
+ "src/favicon.ico",
+ "src/assets"
+ ],
"styles": [
"@angular/material/prebuilt-themes/indigo-pink.css",
"src/styles.scss"
],
- "scripts": []
+ "scripts": [],
+ "karmaConfig": "karma.conf.js"
}
},
"lint": {
"builder": "@angular-eslint/builder:lint",
"options": {
- "lintFilePatterns": ["src/**/*.ts", "src/**/*.html"]
+ "lintFilePatterns": [
+ "src/**/*.ts",
+ "src/**/*.html"
+ ]
}
}
}
@@ -91,6 +113,8 @@
},
"cli": {
"analytics": false,
- "schematicCollections": ["@angular-eslint/schematics"]
+ "schematicCollections": [
+ "@angular-eslint/schematics"
+ ]
}
}
diff --git a/karma.conf.js b/karma.conf.js
new file mode 100644
index 0000000..1896ccd
--- /dev/null
+++ b/karma.conf.js
@@ -0,0 +1,46 @@
+// Karma configuration file, see link for more information
+// https://karma-runner.github.io/1.0/config/configuration-file.html
+
+module.exports = function (config) {
+ config.set({
+ basePath: '',
+ frameworks: ['jasmine', '@angular-devkit/build-angular'],
+ plugins: [
+ require('karma-jasmine'),
+ require('karma-chrome-launcher'),
+ require('karma-firefox-launcher'),
+ require('karma-jasmine-html-reporter'),
+ require('karma-coverage'),
+ require('@angular-devkit/build-angular/plugins/karma')
+ ],
+ client: {
+ jasmine: {
+ // you can add configuration options for Jasmine here
+ // the possible options are listed at https://jasmine.github.io/api/edge/Configuration.html
+ // for example, you can disable the random execution with `random: false`
+ // or set a specific seed with `seed: 4321`
+ },
+ clearContext: false // leave Jasmine Spec Runner output visible in browser
+ },
+ jasmineHtmlReporter: {
+ suppressAll: true // removes the duplicated traces
+ },
+ coverageReporter: {
+ dir: require('path').join(__dirname, './coverage/sandkasten'),
+ subdir: '.',
+ reporters: [
+ { type: 'html' },
+ { type: 'text-summary' }
+ ]
+ },
+ reporters: ['progress', 'kjhtml'],
+ browsers: ['Chrome', 'Firefox'],
+ restartOnFileChange: true,
+ customLaunchers: {
+ ChromeHeadlessCI: {
+ base: 'ChromeHeadless',
+ flags: ['--no-sandbox']
+ }
+ }
+ });
+};
diff --git a/package-lock.json b/package-lock.json
index 328bd14..bf8f6ac 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -18,8 +18,11 @@
"@angular/platform-browser": "^17.3.7",
"@angular/platform-browser-dynamic": "^17.3.7",
"@angular/router": "^17.3.7",
+ "@codemirror/collab": "^6.1.1",
"@codemirror/lang-cpp": "^6.0.2",
"@codemirror/lang-javascript": "^6.2.2",
+ "@codemirror/language": "^6.10.2",
+ "@codemirror/legacy-modes": "^6.4.0",
"@codemirror/state": "^6.4.1",
"@codemirror/view": "^6.26.3",
"@emailjs/browser": "^4.3.3",
@@ -50,6 +53,7 @@
"karma": "~6.4.2",
"karma-chrome-launcher": "~3.2.0",
"karma-coverage": "~2.2.1",
+ "karma-firefox-launcher": "^2.1.3",
"karma-jasmine": "~5.1.0",
"karma-jasmine-html-reporter": "~2.1.0",
"prettier": "^3.2.5",
@@ -2512,6 +2516,15 @@
"@lezer/common": "^1.0.0"
}
},
+ "node_modules/@codemirror/collab": {
+ "version": "6.1.1",
+ "resolved": "https://registry.npmjs.org/@codemirror/collab/-/collab-6.1.1.tgz",
+ "integrity": "sha512-tkIn9Jguh98ie12dbBuba3lE8LHUkaMrIFuCVeVGhncSczFdKmX25vC12+58+yqQW5AXi3py6jWY0W+jelyglA==",
+ "license": "MIT",
+ "dependencies": {
+ "@codemirror/state": "^6.0.0"
+ }
+ },
"node_modules/@codemirror/commands": {
"version": "6.5.0",
"resolved": "https://registry.npmjs.org/@codemirror/commands/-/commands-6.5.0.tgz",
@@ -2547,9 +2560,9 @@
}
},
"node_modules/@codemirror/language": {
- "version": "6.10.1",
- "resolved": "https://registry.npmjs.org/@codemirror/language/-/language-6.10.1.tgz",
- "integrity": "sha512-5GrXzrhq6k+gL5fjkAwt90nYDmjlzTIJV8THnxNFtNKWotMIlzzN+CpqxqwXOECnUdOndmSeWntVrVcv5axWRQ==",
+ "version": "6.10.2",
+ "resolved": "https://registry.npmjs.org/@codemirror/language/-/language-6.10.2.tgz",
+ "integrity": "sha512-kgbTYTo0Au6dCSc/TFy7fK3fpJmgHDv1sG1KNQKJXVi+xBTEeBPY/M30YXiU6mMXeH+YIDLsbrT4ZwNRdtF+SA==",
"dependencies": {
"@codemirror/state": "^6.0.0",
"@codemirror/view": "^6.23.0",
@@ -2559,6 +2572,14 @@
"style-mod": "^4.0.0"
}
},
+ "node_modules/@codemirror/legacy-modes": {
+ "version": "6.4.0",
+ "resolved": "https://registry.npmjs.org/@codemirror/legacy-modes/-/legacy-modes-6.4.0.tgz",
+ "integrity": "sha512-5m/K+1A6gYR0e+h/dEde7LoGimMjRtWXZFg4Lo70cc8HzjSdHe3fLwjWMR0VRl5KFT1SxalSap7uMgPKF28wBA==",
+ "dependencies": {
+ "@codemirror/language": "^6.0.0"
+ }
+ },
"node_modules/@codemirror/lint": {
"version": "6.7.0",
"resolved": "https://registry.npmjs.org/@codemirror/lint/-/lint-6.7.0.tgz",
@@ -10467,6 +10488,33 @@
"node": "*"
}
},
+ "node_modules/karma-firefox-launcher": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/karma-firefox-launcher/-/karma-firefox-launcher-2.1.3.tgz",
+ "integrity": "sha512-LMM2bseebLbYjODBOVt7TCPP9OI2vZIXCavIXhkO9m+10Uj5l7u/SKoeRmYx8FYHTVGZSpk6peX+3BMHC1WwNw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-wsl": "^2.2.0",
+ "which": "^3.0.0"
+ }
+ },
+ "node_modules/karma-firefox-launcher/node_modules/which": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/which/-/which-3.0.1.tgz",
+ "integrity": "sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "isexe": "^2.0.0"
+ },
+ "bin": {
+ "node-which": "bin/which.js"
+ },
+ "engines": {
+ "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+ }
+ },
"node_modules/karma-jasmine": {
"version": "5.1.0",
"resolved": "https://registry.npmjs.org/karma-jasmine/-/karma-jasmine-5.1.0.tgz",
diff --git a/package.json b/package.json
index 56f2d90..64b00d8 100644
--- a/package.json
+++ b/package.json
@@ -22,8 +22,11 @@
"@angular/platform-browser": "^17.3.7",
"@angular/platform-browser-dynamic": "^17.3.7",
"@angular/router": "^17.3.7",
+ "@codemirror/collab": "^6.1.1",
"@codemirror/lang-cpp": "^6.0.2",
"@codemirror/lang-javascript": "^6.2.2",
+ "@codemirror/language": "^6.10.2",
+ "@codemirror/legacy-modes": "^6.4.0",
"@codemirror/state": "^6.4.1",
"@codemirror/view": "^6.26.3",
"@emailjs/browser": "^4.3.3",
@@ -54,6 +57,7 @@
"karma": "~6.4.2",
"karma-chrome-launcher": "~3.2.0",
"karma-coverage": "~2.2.1",
+ "karma-firefox-launcher": "^2.1.3",
"karma-jasmine": "~5.1.0",
"karma-jasmine-html-reporter": "~2.1.0",
"prettier": "^3.2.5",
diff --git a/src/app/app.component.spec.ts b/src/app/app.component.spec.ts
index 7467ecf..db6e3d5 100644
--- a/src/app/app.component.spec.ts
+++ b/src/app/app.component.spec.ts
@@ -1,11 +1,16 @@
import { TestBed } from '@angular/core/testing';
-import { RouterTestingModule } from '@angular/router/testing';
import { AppComponent } from './app.component';
+import { TranslateModule } from '@ngx-translate/core';
+import { RouterModule } from '@angular/router';
describe('AppComponent', () => {
beforeEach(() =>
TestBed.configureTestingModule({
- imports: [RouterTestingModule, AppComponent],
+ imports: [
+ RouterModule.forRoot([]),
+ AppComponent,
+ TranslateModule.forRoot(),
+ ],
})
);
@@ -19,8 +24,6 @@ describe('AppComponent', () => {
const fixture = TestBed.createComponent(AppComponent);
fixture.detectChanges();
const compiled = fixture.nativeElement as HTMLElement;
- expect(compiled.querySelector('.content span')?.textContent).toContain(
- 'sandkasten app is running!'
- );
+ expect(compiled.textContent).toContain('HeaderPage.Editor');
});
});
diff --git a/src/app/app-routing.module.ts b/src/app/app.routes.ts
similarity index 84%
rename from src/app/app-routing.module.ts
rename to src/app/app.routes.ts
index fa2e4dd..1360b5f 100644
--- a/src/app/app-routing.module.ts
+++ b/src/app/app.routes.ts
@@ -1,5 +1,4 @@
-import { NgModule } from '@angular/core';
-import { RouterModule, Routes } from '@angular/router';
+import { Routes } from '@angular/router';
import { EditorComponent } from './components/editor/editor.component';
import { LandingPageComponent } from './components/landing-page/landing-page.component';
import { DocumentationComponent } from './components/documentation/documentation.component';
@@ -11,9 +10,10 @@ import { RegisterComponent } from './components/register/register.component';
import { LoginComponent } from './components/login/login.component';
// Toutes les routes de l'application sont définies ici
-const routes: Routes = [
+export const routes: Routes = [
{ path: '', component: LandingPageComponent },
{ path: 'editor', component: EditorComponent },
+ { path: 'editor-live/:idRoom', component: EditorComponent },
{ path: 'documentation', component: DocumentationComponent },
{ path: 'contact', component: FormComponent },
{ path: 'our-story', component: OurStoryComponent },
@@ -22,9 +22,3 @@ const routes: Routes = [
{ path: 'register', component: RegisterComponent },
{ path: 'login', component: LoginComponent },
];
-
-@NgModule({
- imports: [RouterModule.forRoot(routes)],
- exports: [RouterModule],
-})
-export class AppRoutingModule {}
diff --git a/src/app/components/editor/editor.component.html b/src/app/components/editor/editor.component.html
index df54939..d54dec5 100644
--- a/src/app/components/editor/editor.component.html
+++ b/src/app/components/editor/editor.component.html
@@ -59,6 +59,10 @@
}
+
+