;
+
+ beforeEach(waitForAsync(() => {
+ void TestBed.configureTestingModule({
+ declarations: [HomeComponent],
+ imports: [TranslateModule.forRoot(), RouterTestingModule]
+ }).compileComponents();
+
+ fixture = TestBed.createComponent(HomeComponent);
+ component = fixture.componentInstance;
+ fixture.detectChanges();
+ }));
+
+ it('should create', () => {
+ expect(component).toBeTruthy();
+ });
+
+ it('should render title in a h1 tag', waitForAsync(() => {
+ const compiled = fixture.debugElement.nativeElement;
+ expect(compiled.querySelector('h1').textContent).toContain(
+ 'PAGES.HOME.TITLE'
+ );
+ }));
+});
diff --git a/src/app/home/home.component.ts b/src/app/home/home.component.ts
new file mode 100644
index 0000000..9fe61cd
--- /dev/null
+++ b/src/app/home/home.component.ts
@@ -0,0 +1,17 @@
+import { Component, OnInit } from '@angular/core';
+import { Router } from '@angular/router';
+
+@Component({
+ selector: 'app-home',
+ templateUrl: './home.component.html',
+ styleUrls: ['./home.component.scss']
+})
+export class HomeComponent implements OnInit {
+
+ constructor(private router: Router) { }
+
+ ngOnInit(): void {
+ console.log('HomeComponent INIT');
+ }
+
+}
diff --git a/src/app/home/home.module.ts b/src/app/home/home.module.ts
new file mode 100644
index 0000000..3bd43bc
--- /dev/null
+++ b/src/app/home/home.module.ts
@@ -0,0 +1,13 @@
+import { NgModule } from '@angular/core';
+import { CommonModule } from '@angular/common';
+
+import { HomeRoutingModule } from './home-routing.module';
+
+import { HomeComponent } from './home.component';
+import { SharedModule } from '../shared/shared.module';
+
+@NgModule({
+ declarations: [HomeComponent],
+ imports: [CommonModule, SharedModule, HomeRoutingModule]
+})
+export class HomeModule {}
diff --git a/src/app/shared/components/index.ts b/src/app/shared/components/index.ts
new file mode 100644
index 0000000..88746a9
--- /dev/null
+++ b/src/app/shared/components/index.ts
@@ -0,0 +1 @@
+export * from './page-not-found/page-not-found.component';
diff --git a/src/app/shared/components/page-not-found/page-not-found.component.html b/src/app/shared/components/page-not-found/page-not-found.component.html
new file mode 100644
index 0000000..330fbc2
--- /dev/null
+++ b/src/app/shared/components/page-not-found/page-not-found.component.html
@@ -0,0 +1,3 @@
+
+ page-not-found works!
+
diff --git a/src/app/shared/components/page-not-found/page-not-found.component.scss b/src/app/shared/components/page-not-found/page-not-found.component.scss
new file mode 100644
index 0000000..e69de29
diff --git a/src/app/shared/components/page-not-found/page-not-found.component.spec.ts b/src/app/shared/components/page-not-found/page-not-found.component.spec.ts
new file mode 100644
index 0000000..cbf9ace
--- /dev/null
+++ b/src/app/shared/components/page-not-found/page-not-found.component.spec.ts
@@ -0,0 +1,23 @@
+import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing';
+
+import { PageNotFoundComponent } from './page-not-found.component';
+
+describe('PageNotFoundComponent', () => {
+ let component: PageNotFoundComponent;
+ let fixture: ComponentFixture;
+
+ beforeEach(waitForAsync(() => {
+ void TestBed.configureTestingModule({
+ declarations: [PageNotFoundComponent]
+ })
+ .compileComponents();
+
+ fixture = TestBed.createComponent(PageNotFoundComponent);
+ component = fixture.componentInstance;
+ fixture.detectChanges();
+ }));
+
+ it('should create', () => {
+ expect(component).toBeTruthy();
+ });
+});
diff --git a/src/app/shared/components/page-not-found/page-not-found.component.ts b/src/app/shared/components/page-not-found/page-not-found.component.ts
new file mode 100644
index 0000000..7f917c1
--- /dev/null
+++ b/src/app/shared/components/page-not-found/page-not-found.component.ts
@@ -0,0 +1,14 @@
+import { Component, OnInit } from '@angular/core';
+
+@Component({
+ selector: 'app-page-not-found',
+ templateUrl: './page-not-found.component.html',
+ styleUrls: ['./page-not-found.component.scss']
+})
+export class PageNotFoundComponent implements OnInit {
+ constructor() {}
+
+ ngOnInit(): void {
+ console.log('PageNotFoundComponent INIT');
+ }
+}
diff --git a/src/app/shared/directives/index.ts b/src/app/shared/directives/index.ts
new file mode 100644
index 0000000..8493717
--- /dev/null
+++ b/src/app/shared/directives/index.ts
@@ -0,0 +1 @@
+export * from './webview/webview.directive';
diff --git a/src/app/shared/directives/webview/webview.directive.spec.ts b/src/app/shared/directives/webview/webview.directive.spec.ts
new file mode 100644
index 0000000..d157f01
--- /dev/null
+++ b/src/app/shared/directives/webview/webview.directive.spec.ts
@@ -0,0 +1,8 @@
+import { WebviewDirective } from './webview.directive';
+
+describe('WebviewDirective', () => {
+ it('should create an instance', () => {
+ const directive = new WebviewDirective();
+ expect(directive).toBeTruthy();
+ });
+});
diff --git a/src/app/shared/directives/webview/webview.directive.ts b/src/app/shared/directives/webview/webview.directive.ts
new file mode 100644
index 0000000..239fed4
--- /dev/null
+++ b/src/app/shared/directives/webview/webview.directive.ts
@@ -0,0 +1,8 @@
+import { Directive } from '@angular/core';
+
+@Directive({
+ selector: 'webview'
+})
+export class WebviewDirective {
+ constructor() { }
+}
diff --git a/src/app/shared/shared.module.ts b/src/app/shared/shared.module.ts
new file mode 100644
index 0000000..9a66283
--- /dev/null
+++ b/src/app/shared/shared.module.ts
@@ -0,0 +1,15 @@
+import { NgModule } from '@angular/core';
+import { CommonModule } from '@angular/common';
+
+import { TranslateModule } from '@ngx-translate/core';
+
+import { PageNotFoundComponent } from './components/';
+import { WebviewDirective } from './directives/';
+import { FormsModule } from '@angular/forms';
+
+@NgModule({
+ declarations: [PageNotFoundComponent, WebviewDirective],
+ imports: [CommonModule, TranslateModule, FormsModule],
+ exports: [TranslateModule, WebviewDirective, FormsModule]
+})
+export class SharedModule {}
diff --git a/src/assets/.gitkeep b/src/assets/.gitkeep
new file mode 100644
index 0000000..e69de29
diff --git a/src/assets/background.jpg b/src/assets/background.jpg
new file mode 100644
index 0000000..6058e77
Binary files /dev/null and b/src/assets/background.jpg differ
diff --git a/src/assets/i18n/en.json b/src/assets/i18n/en.json
new file mode 100644
index 0000000..95c3bbc
--- /dev/null
+++ b/src/assets/i18n/en.json
@@ -0,0 +1,12 @@
+{
+ "PAGES": {
+ "HOME": {
+ "TITLE": "App works !",
+ "GO_TO_DETAIL": "Go to Detail"
+ },
+ "DETAIL": {
+ "TITLE": "Detail page !",
+ "BACK_TO_HOME": "Back to Home"
+ }
+ }
+}
diff --git a/src/assets/icons/electron.bmp b/src/assets/icons/electron.bmp
new file mode 100644
index 0000000..a848198
Binary files /dev/null and b/src/assets/icons/electron.bmp differ
diff --git a/src/assets/icons/favicon.256x256.png b/src/assets/icons/favicon.256x256.png
new file mode 100644
index 0000000..9823455
Binary files /dev/null and b/src/assets/icons/favicon.256x256.png differ
diff --git a/src/assets/icons/favicon.512x512.png b/src/assets/icons/favicon.512x512.png
new file mode 100644
index 0000000..c513ddc
Binary files /dev/null and b/src/assets/icons/favicon.512x512.png differ
diff --git a/src/assets/icons/favicon.icns b/src/assets/icons/favicon.icns
new file mode 100644
index 0000000..4f8004a
Binary files /dev/null and b/src/assets/icons/favicon.icns differ
diff --git a/src/assets/icons/favicon.ico b/src/assets/icons/favicon.ico
new file mode 100644
index 0000000..ab48270
Binary files /dev/null and b/src/assets/icons/favicon.ico differ
diff --git a/src/assets/icons/favicon.png b/src/assets/icons/favicon.png
new file mode 100644
index 0000000..9823455
Binary files /dev/null and b/src/assets/icons/favicon.png differ
diff --git a/src/environments/environment.dev.ts b/src/environments/environment.dev.ts
new file mode 100644
index 0000000..25c1566
--- /dev/null
+++ b/src/environments/environment.dev.ts
@@ -0,0 +1,4 @@
+export const APP_CONFIG = {
+ production: false,
+ environment: 'DEV'
+};
diff --git a/src/environments/environment.prod.ts b/src/environments/environment.prod.ts
new file mode 100644
index 0000000..21919cf
--- /dev/null
+++ b/src/environments/environment.prod.ts
@@ -0,0 +1,4 @@
+export const APP_CONFIG = {
+ production: true,
+ environment: 'PROD'
+};
diff --git a/src/environments/environment.ts b/src/environments/environment.ts
new file mode 100644
index 0000000..ac0e11c
--- /dev/null
+++ b/src/environments/environment.ts
@@ -0,0 +1,4 @@
+export const APP_CONFIG = {
+ production: false,
+ environment: 'LOCAL'
+};
diff --git a/src/environments/environment.web.prod.ts b/src/environments/environment.web.prod.ts
new file mode 100644
index 0000000..c74e228
--- /dev/null
+++ b/src/environments/environment.web.prod.ts
@@ -0,0 +1,4 @@
+export const APP_CONFIG = {
+ production: true,
+ environment: 'WEB-PROD'
+};
diff --git a/src/environments/environment.web.ts b/src/environments/environment.web.ts
new file mode 100644
index 0000000..a70d721
--- /dev/null
+++ b/src/environments/environment.web.ts
@@ -0,0 +1,4 @@
+export const APP_CONFIG = {
+ production: false,
+ environment: 'WEB'
+};
diff --git a/src/favicon.ico b/src/favicon.ico
new file mode 100644
index 0000000..997406a
Binary files /dev/null and b/src/favicon.ico differ
diff --git a/src/index.html b/src/index.html
new file mode 100644
index 0000000..d5a77cc
--- /dev/null
+++ b/src/index.html
@@ -0,0 +1,14 @@
+
+
+
+
+ Angular Electron
+
+
+
+
+
+
+ Loading...
+
+
diff --git a/src/main.ts b/src/main.ts
new file mode 100644
index 0000000..c487e79
--- /dev/null
+++ b/src/main.ts
@@ -0,0 +1,15 @@
+import { enableProdMode } from '@angular/core';
+import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';
+
+import { AppModule } from './app/app.module';
+import { APP_CONFIG } from './environments/environment';
+
+if (APP_CONFIG.production) {
+ enableProdMode();
+}
+
+platformBrowserDynamic()
+ .bootstrapModule(AppModule, {
+ preserveWhitespaces: false
+ })
+ .catch(err => console.error(err));
diff --git a/src/polyfills-test.ts b/src/polyfills-test.ts
new file mode 100644
index 0000000..e7331e6
--- /dev/null
+++ b/src/polyfills-test.ts
@@ -0,0 +1 @@
+import 'zone.js';
diff --git a/src/polyfills.ts b/src/polyfills.ts
new file mode 100644
index 0000000..813c824
--- /dev/null
+++ b/src/polyfills.ts
@@ -0,0 +1,53 @@
+/**
+ * This file includes polyfills needed by Angular and is loaded before the app.
+ * You can add your own extra polyfills to this file.
+ *
+ * This file is divided into 2 sections:
+ * 1. Browser polyfills. These are applied before loading ZoneJS and are sorted by browsers.
+ * 2. Application imports. Files imported after ZoneJS that should be loaded before your main
+ * file.
+ *
+ * The current setup is for so-called "evergreen" browsers; the last versions of browsers that
+ * automatically update themselves. This includes Safari >= 10, Chrome >= 55 (including Opera),
+ * Edge >= 13 on the desktop, and iOS 10 and Chrome on mobile.
+ *
+ * Learn more in https://angular.io/guide/browser-support
+ */
+
+/***************************************************************************************************
+ * BROWSER POLYFILLS
+ */
+
+/**
+ * By default, zone.js will patch all possible macroTask and DomEvents
+ * user can disable parts of macroTask/DomEvents patch by setting following flags
+ * because those flags need to be set before `zone.js` being loaded, and webpack
+ * will put import in the top of bundle, so user need to create a separate file
+ * in this directory (for example: zone-flags.ts), and put the following flags
+ * into that file, and then add the following code before importing zone.js.
+ * import './zone-flags.ts';
+ *
+ * The flags allowed in zone-flags.ts are listed here.
+ *
+ * The following flags will work for all browsers.
+ *
+ * (window as any).__Zone_disable_requestAnimationFrame = true; // disable patch requestAnimationFrame
+ * (window as any).__Zone_disable_on_property = true; // disable patch onProperty such as onclick
+ * (window as any).__zone_symbol__UNPATCHED_EVENTS = ['scroll', 'mousemove']; // disable patch specified eventNames
+ *
+ * in IE/Edge developer tools, the addEventListener will also be wrapped by zone.js
+ * with the following flag, it will bypass `zone.js` patch for IE/Edge
+ *
+ * (window as any).__Zone_enable_cross_context_check = true;
+ *
+ */
+
+/***************************************************************************************************
+ * Zone JS is required by default for Angular itself.
+ */
+import 'zone.js'; // Included with Angular CLI.
+
+
+/***************************************************************************************************
+ * APPLICATION IMPORTS
+ */
diff --git a/src/styles.scss b/src/styles.scss
new file mode 100644
index 0000000..4c1c4b2
--- /dev/null
+++ b/src/styles.scss
@@ -0,0 +1,50 @@
+/* You can add global styles to this file, and also import other style files */
+html, body {
+ margin: 0;
+ padding: 0;
+
+ height: 100%;
+ font-family: Arial, Helvetica, sans-serif;
+}
+
+/* CAN (MUST) BE REMOVED ! Sample Global style */
+.container {
+ height: 100%;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+
+ background: url(./assets/background.jpg) no-repeat center fixed;
+ -webkit-background-size: cover; /* pour anciens Chrome et Safari */
+ background-size: cover; /* version standardisée */
+
+ .title {
+ color: white;
+ margin: 0;
+ padding: 50px 20px;
+ }
+
+ a {
+ color: #fff !important;
+ text-transform: uppercase;
+ text-decoration: none;
+ background: #ed3330;
+ padding: 20px;
+ border-radius: 5px;
+ display: inline-block;
+ border: none;
+ transition: all 0.4s ease 0s;
+
+ &:hover {
+ background: #fff;
+ color: #ed3330 !important;
+ letter-spacing: 1px;
+ -webkit-box-shadow: 0px 5px 40px -10px rgba(0,0,0,0.57);
+ -moz-box-shadow: 0px 5px 40px -10px rgba(0,0,0,0.57);
+ box-shadow: 5px 40px -10px rgba(0,0,0,0.57);
+ transition: all 0.4s ease 0s;
+ }
+ }
+}
+
diff --git a/src/tsconfig.app.json b/src/tsconfig.app.json
new file mode 100644
index 0000000..3435060
--- /dev/null
+++ b/src/tsconfig.app.json
@@ -0,0 +1,20 @@
+{
+ "extends": "../tsconfig.json",
+ "compilerOptions": {
+ "outDir": "../out-tsc/app",
+ "baseUrl": "",
+ "types": [
+ "node"
+ ]
+ },
+ "files": [
+ "main.ts",
+ "polyfills.ts"
+ ],
+ "include": [
+ "**/*.d.ts"
+ ],
+ "exclude": [
+ "**/*.spec.ts"
+ ]
+}
diff --git a/src/tsconfig.spec.json b/src/tsconfig.spec.json
new file mode 100644
index 0000000..7d17189
--- /dev/null
+++ b/src/tsconfig.spec.json
@@ -0,0 +1,23 @@
+{
+ "extends": "../tsconfig.json",
+ "compilerOptions": {
+ "esModuleInterop": true,
+ "outDir": "../out-tsc/spec",
+ "types": [
+ "jest",
+ "node"
+ ]
+ },
+ "files": [
+ "polyfills-test.ts"
+ ],
+ "include": [
+ "**/*.spec.ts",
+ "**/*.d.ts"
+ ],
+ "exclude": [
+ "dist",
+ "release",
+ "node_modules"
+ ]
+}
diff --git a/src/typings.d.ts b/src/typings.d.ts
new file mode 100644
index 0000000..cf117a1
--- /dev/null
+++ b/src/typings.d.ts
@@ -0,0 +1,9 @@
+/* SystemJS module definition */
+declare const nodeModule: NodeModule;
+interface NodeModule {
+ id: string;
+}
+interface Window {
+ process: any;
+ require: any;
+}
diff --git a/tsconfig.json b/tsconfig.json
new file mode 100644
index 0000000..1de72e9
--- /dev/null
+++ b/tsconfig.json
@@ -0,0 +1,39 @@
+{
+ "compileOnSave": false,
+ "compilerOptions": {
+ "strict": true,
+ "outDir": "./dist/out-tsc",
+ "module": "es2022",
+ "sourceMap": true,
+ "declaration": false,
+ "moduleResolution": "node",
+ "emitDecoratorMetadata": true,
+ "experimentalDecorators": true,
+ "allowJs": true,
+ "target": "ES2022",
+ "typeRoots": [
+ "node_modules/@types"
+ ],
+ "lib": [
+ "es2017",
+ "es2016",
+ "es2015",
+ "es2018",
+ "dom"
+ ],
+ "useDefineForClassFields": false
+ },
+ "exclude": [
+ "node_modules"
+ ],
+ "angularCompilerOptions": {
+ "strictTemplates": true,
+ "fullTemplateTypeCheck": true,
+ "annotateForClosureCompiler": true,
+ "strictInjectionParameters": true,
+ "skipTemplateCodegen": false,
+ "preserveWhitespaces": true,
+ "skipMetadataEmit": false,
+ "disableTypeScriptVersionCheck": true
+ }
+}
diff --git a/tsconfig.serve.json b/tsconfig.serve.json
new file mode 100644
index 0000000..348d70d
--- /dev/null
+++ b/tsconfig.serve.json
@@ -0,0 +1,27 @@
+{
+ "compilerOptions": {
+ "sourceMap": true,
+ "declaration": false,
+ "moduleResolution": "node",
+ "emitDecoratorMetadata": true,
+ "experimentalDecorators": true,
+ "module": "commonjs",
+ "target": "es2015",
+ "types": [
+ "node"
+ ],
+ "lib": [
+ "es2017",
+ "es2016",
+ "es2015",
+ "dom"
+ ]
+ },
+ "files": [
+ "app/main.ts"
+ ],
+ "exclude": [
+ "node_modules",
+ "**/*.spec.ts"
+ ]
+}