This commit is contained in:
Arne
2023-09-28 15:33:05 +02:00
parent 11bdecc6d3
commit 37e6e6d003
20 changed files with 901 additions and 898 deletions

View File

@@ -1,48 +1,46 @@
import { app, shell } from 'electron'; import { app, shell } from 'electron';
import { Window } from './window'; import { Window } from './window';
export class App { export class App {
static launch() { static launch() {
app.on('window-all-closed', App.quit); app.on('window-all-closed', App.quit);
app.on('activate', App.start); app.on('activate', App.start);
app.on('ready', App.start); app.on('ready', App.start);
// Limit navigation and open external links in default browser // Limit navigation and open external links in default browser
app.on('web-contents-created', App.openExternalLinksInDefaultBrowser); app.on('web-contents-created', App.openExternalLinksInDefaultBrowser);
} }
static get electronWindow() { static get electronWindow() {
return this._wrapper ? this._wrapper.electronWindow : undefined; return this._wrapper ? this._wrapper.electronWindow : undefined;
} }
static start() { static start() {
// On MacOS it is common to re-create a window from app even after all windows have been closed // On MacOS it is common to re-create a window from app even after all windows have been closed
if (!App.electronWindow) { if (!App.electronWindow) {
App._wrapper = new Window(); App._wrapper = new Window();
} }
} }
static quit() { static quit() {
// On MacOS it is common for applications to stay open until the user explicitly quits // On MacOS it is common for applications to stay open until the user explicitly quits
// But WebDriverIO Test Runner does handle that behaviour yet // But WebDriverIO Test Runner does handle that behaviour yet
if ( if (process.platform !== 'darwin' ||
process.platform !== 'darwin' || global.appConfig.configId === 'e2e-test') {
global.appConfig.configId === 'e2e-test' app.quit();
) { }
app.quit(); }
}
}
} }
App.openExternalLinksInDefaultBrowser = (event, contents) => { App.openExternalLinksInDefaultBrowser = (event, contents) => {
// Disabling creation of new windows // Disabling creation of new windows
contents.setWindowOpenHandler((handler) => { contents.setWindowOpenHandler((handler) => {
// Telling the user platform to open this event's url in the default browser // Telling the user platform to open this event's url in the default browser
shell.openExternal(handler.url); shell.openExternal(handler.url);
// Blocking this event from loading in current app // Blocking this event from loading in current app
return { action: 'deny' }; return { action: 'deny' };
}); });
// Limiting navigation // Limiting navigation
contents.on('will-navigate', (event, navigationUrl) => { contents.on('will-navigate', (event, navigationUrl) => {
const parsedUrl = new URL(navigationUrl); const parsedUrl = new URL(navigationUrl);
// Allowing local navigation only // Allowing local navigation only
if (parsedUrl.origin !== 'http://localhost:4200') { if (parsedUrl.origin !== 'http://localhost:4200') {
event.preventDefault(); event.preventDefault();
} }
}); });
}; };
//# sourceMappingURL=app.js.map //# sourceMappingURL=app.js.map

View File

@@ -1,141 +1,126 @@
var __awaiter = var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
(this && this.__awaiter) || function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
function (thisArg, _arguments, P, generator) { return new (P || (P = Promise))(function (resolve, reject) {
function adopt(value) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
return value instanceof P function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
? value function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
: new P(function (resolve) { step((generator = generator.apply(thisArg, _arguments || [])).next());
resolve(value); });
}); };
}
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) {
try {
step(generator.next(value));
} catch (e) {
reject(e);
}
}
function rejected(value) {
try {
step(generator['throw'](value));
} catch (e) {
reject(e);
}
}
function step(result) {
result.done
? resolve(result.value)
: adopt(result.value).then(fulfilled, rejected);
}
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
import * as remoteMain from '@electron/remote/main'; import * as remoteMain from '@electron/remote/main';
import { app, BrowserWindow, ipcMain, nativeImage } from 'electron'; import { app, BrowserWindow, ipcMain, nativeImage } from 'electron';
import * as path from 'node:path'; import * as path from 'node:path';
import { FileListService } from '../services/file-list-service'; import { FileListService } from '../services/file-list-service';
import { PrintService } from './../services/print-service';
import { Logger } from '../utils/logger'; import { Logger } from '../utils/logger';
import { DoorService } from '../services/door-service';
import { readFile } from 'node:fs';
export class Window { export class Window {
constructor() { constructor() {
this.createWindow(); this.createWindow();
this.loadRenderer(); this.loadRenderer();
this.registerService(new FileListService()); const fileListService = new FileListService();
} this.registerService(fileListService);
createWindow() { this.registerService(new DoorService());
this._electronWindow = new BrowserWindow({ readFile('./config.json', 'utf8', (error, data) => {
width: 1280, if (error) {
height: 720, console.log(error);
backgroundColor: '#FFFFFF', return;
icon: this.loadIcon(), }
webPreferences: { const config = JSON.parse(data);
// Default behavior in Electron since 5, that fileListService.setPaths(config.filePaths);
// limits the powers granted to remote content });
// except in e2e test when those powers are required }
nodeIntegration: global.appConfig.isNodeIntegration, createWindow() {
// Isolate window context to protect against prototype pollution this._electronWindow = new BrowserWindow({
// except in e2e test when that access is required fullscreen: false,
contextIsolation: global.appConfig.isContextIsolation, backgroundColor: '#FFFFFF',
// Introduced in Electron 20 and enabled by default icon: this.loadIcon(),
// Among others security constraints, it prevents from required webPreferences: {
// CommonJS modules imports into preload script // Default behavior in Electron since 5, that
// which is not bundled yet in dev mode // limits the powers granted to remote content
sandbox: global.appConfig.isSandbox, // except in e2e test when those powers are required
// Use a preload script to enhance security nodeIntegration: global.appConfig.isNodeIntegration,
preload: MAIN_WINDOW_PRELOAD_WEBPACK_ENTRY, // Isolate window context to protect against prototype pollution
}, // except in e2e test when that access is required
}); contextIsolation: global.appConfig.isContextIsolation,
// Disable the remote module to enhance security // Introduced in Electron 20 and enabled by default
// except in e2e test when that access is required // Among others security constraints, it prevents from required
if (global.appConfig.isEnableRemoteModule) { // CommonJS modules imports into preload script
remoteMain.enable(this._electronWindow.webContents); // which is not bundled yet in dev mode
} sandbox: global.appConfig.isSandbox,
} // Use a preload script to enhance security
loadIcon() { preload: MAIN_WINDOW_PRELOAD_WEBPACK_ENTRY,
let iconObject; },
if (global.appConfig.isIconAvailable) { });
const iconPath = path.join(__dirname, 'icons/icon.png'); this._printService = new PrintService();
Logger.debug('Icon Path', iconPath); this._printService.setWindow(this._electronWindow);
iconObject = nativeImage.createFromPath(iconPath); this.registerService(this._printService);
// Change dock icon on MacOS // Disable the remote module to enhance security
if (iconObject && process.platform === 'darwin') { // except in e2e test when that access is required
app.dock.setIcon(iconObject); if (global.appConfig.isEnableRemoteModule) {
} remoteMain.enable(this._electronWindow.webContents);
} }
return iconObject; }
} loadIcon() {
loadRenderer() { let iconObject;
if (global.appConfig.configId === 'development') { if (global.appConfig.isIconAvailable) {
// Dev mode, take advantage of the live reload by loading local URL const iconPath = path.join(__dirname, 'icons/icon.png');
this.electronWindow.loadURL(`http://localhost:4200`); Logger.debug('Icon Path', iconPath);
} else { iconObject = nativeImage.createFromPath(iconPath);
// Else mode, we simply load angular bundle // Change dock icon on MacOS
const indexPath = path.join( if (iconObject && process.platform === 'darwin') {
__dirname, app.dock.setIcon(iconObject);
'../renderer/angular_window/index.html' }
); }
this.electronWindow.loadURL(`file://${indexPath}`); return iconObject;
} }
if (global.appConfig.isOpenDevTools) { loadRenderer() {
this.openDevTools(); if (global.appConfig.configId === 'development') {
} // Dev mode, take advantage of the live reload by loading local URL
// When the window is closed` this.electronWindow.loadURL(`http://localhost:4200`);
this._electronWindow.on('closed', () => { }
// Remove IPC Main listeners else {
ipcMain.removeAllListeners(); // Else mode, we simply load angular bundle
// Delete current reference const indexPath = path.join(__dirname, '../renderer/angular_window/index.html');
delete this._electronWindow; this.electronWindow.loadURL(`file://${indexPath}`);
}); }
} if (global.appConfig.isOpenDevTools) {
openDevTools() { this.openDevTools();
this._electronWindow.webContents.openDevTools(); }
this._electronWindow.webContents.on('devtools-opened', () => { // When the window is closed`
this._electronWindow.focus(); this._electronWindow.on('closed', () => {
setImmediate(() => { // Remove IPC Main listeners
this._electronWindow.focus(); ipcMain.removeAllListeners();
}); // Delete current reference
}); delete this._electronWindow;
} });
registerService(service) { }
ipcMain.on(service.receptionChannel(), (event, ...parameters) => openDevTools() {
__awaiter(this, void 0, void 0, function* () { this._electronWindow.webContents.openDevTools();
// Handling input this._electronWindow.webContents.on('devtools-opened', () => {
const input = parameters[0]; this._electronWindow.focus();
Logger.debug(`[${service.receptionChannel()}] =====> `, input); setImmediate(() => {
const output = service.process(input); this._electronWindow.focus();
// Handling output });
if (service.sendingChannel()) { });
Logger.debug(`[${service.sendingChannel()}] =====> `, output); }
this._electronWindow.webContents.send( registerService(service) {
service.sendingChannel(), ipcMain.on(service.receptionChannel(), (event, ...parameters) => __awaiter(this, void 0, void 0, function* () {
output // Handling input
); const input = parameters[0];
} Logger.debug(`[${service.receptionChannel()}] =====> `, input);
}) service.process(input).then((output) => {
); // Handling output
} if (service.sendingChannel()) {
get electronWindow() { Logger.debug(`[${service.sendingChannel()}] =====> `, output);
return this._electronWindow; this._electronWindow.webContents.send(service.sendingChannel(), output);
} }
});
}));
}
get electronWindow() {
return this._electronWindow;
}
} }
//# sourceMappingURL=window.js.map //# sourceMappingURL=window.js.map

View File

@@ -1 +1 @@
{"version":3,"file":"window.js","sourceRoot":"","sources":["../../../../workspaces/electron-app/main/components/window.ts"],"names":[],"mappings":"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"} {"version":3,"file":"window.js","sourceRoot":"","sources":["../../../../workspaces/electron-app/main/components/window.ts"],"names":[],"mappings":"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"}

View File

@@ -8,9 +8,9 @@ const appConfigs = fs.readJsonSync(path.join(__dirname, 'config.json'));
const defaultConfig = appConfigs.development; const defaultConfig = appConfigs.development;
const currentConfig = appConfigs[currentEnvironment]; const currentConfig = appConfigs[currentEnvironment];
global.appConfig = global.appConfig =
currentEnvironment === 'development' currentEnvironment === 'development'
? defaultConfig ? defaultConfig
: _.merge(defaultConfig, currentConfig); : _.merge(defaultConfig, currentConfig);
// Launch app // Launch app
App.launch(); App.launch();
//# sourceMappingURL=index.js.map //# sourceMappingURL=index.js.map

View File

@@ -1,13 +1,13 @@
const NOT_IMPEMENTED_YET = 'Method not implemented yet.'; const NOT_IMPEMENTED_YET = 'Method not implemented yet.';
export class AbstractService { export class AbstractService {
receptionChannel() { receptionChannel() {
throw new Error(NOT_IMPEMENTED_YET); throw new Error(NOT_IMPEMENTED_YET);
} }
sendingChannel() { sendingChannel() {
throw new Error(NOT_IMPEMENTED_YET); throw new Error(NOT_IMPEMENTED_YET);
} }
process(_input) { process(_input) {
throw new Error(NOT_IMPEMENTED_YET); throw new Error(NOT_IMPEMENTED_YET);
} }
} }
//# sourceMappingURL=abstract-service.js.map //# sourceMappingURL=abstract-service.js.map

View File

@@ -0,0 +1,65 @@
import { WindowApiConst } from 'shared-lib';
import { AbstractService } from './abstract-service';
import { readFile, set_fs } from 'xlsx';
import * as fs from 'node:fs';
set_fs(fs);
export class DoorService extends AbstractService {
receptionChannel() {
return WindowApiConst.PROJECT_INPUT;
}
sendingChannel() {
return WindowApiConst.PROJECT_OUTPUT;
}
process(input) {
return new Promise((resolve) => {
var _a, _b, _c, _d, _e, _f, _g, _h;
const workbook = readFile(`${input.path}/${input.name}`);
const workingSheet = workbook.Sheets['DEURLIJST'];
const doorList = [];
// remove 2 top rows
const headers = {};
// get header values
for (let index = 65; index <= 90; index++) {
const currentValue = (_a = workingSheet[`${index}3`]) === null || _a === void 0 ? void 0 : _a.v;
switch (currentValue) {
case 'L/R':
headers['lr'] = index;
break;
case 'KRUK/SLOT':
headers['krukSlot'] = index;
break;
case 'SCHARNIER':
headers['pivot'] = index;
break;
case 'SOORT DEUR':
headers['type'] = index;
break;
case 'MODEL KRUK':
headers['modelKruk'] = index;
break;
case 'OPMERKING':
headers['remark'] = index;
break;
default: break;
}
}
console.log(headers);
// stop at 19
for (let index = 4; index < 19; index++) {
const door = {};
door.nr = (_b = workingSheet[`A${index}`]) === null || _b === void 0 ? void 0 : _b.v;
if (door.nr) {
door.lr = (_c = workingSheet[`${headers['lr']}${index}`]) === null || _c === void 0 ? void 0 : _c.v;
door.krukSlot = (_d = workingSheet[`${headers['krukSlot']}${index}`]) === null || _d === void 0 ? void 0 : _d.v;
door.pivot = (_e = workingSheet[`${headers['pivot']}${index}`]) === null || _e === void 0 ? void 0 : _e.v;
door.type = (_f = workingSheet[`${headers['type']}${index}`]) === null || _f === void 0 ? void 0 : _f.v;
door.modelKruk = (_g = workingSheet[`${headers['modelKruk']}${index}`]) === null || _g === void 0 ? void 0 : _g.v;
door.remark = (_h = workingSheet[`${headers['remark']}${index}`]) === null || _h === void 0 ? void 0 : _h.v;
doorList.push(door);
}
}
resolve(doorList);
});
}
}
//# sourceMappingURL=door-service.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"door-service.js","sourceRoot":"","sources":["../../../../workspaces/electron-app/main/services/door-service.ts"],"names":[],"mappings":"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"}

View File

@@ -2,23 +2,51 @@ import { readdir } from 'node:fs';
import { WindowApiConst } from 'shared-lib'; import { WindowApiConst } from 'shared-lib';
import { AbstractService } from './abstract-service'; import { AbstractService } from './abstract-service';
export class FileListService extends AbstractService { export class FileListService extends AbstractService {
receptionChannel() { constructor() {
return WindowApiConst.FILELIST_INPUT; super(...arguments);
} this._paths = ['./assets'];
sendingChannel() { }
return WindowApiConst.FILELIST_OUTPUT; receptionChannel() {
} return WindowApiConst.FILELIST_INPUT;
process() { }
readdir('./', (error, fileList) => { sendingChannel() {
if (!error) { return WindowApiConst.FILELIST_OUTPUT;
const newList = {}; }
for (const file in fileList) { process() {
newList[file] = []; return new Promise((resolve) => {
} const projects = [];
return newList; Promise.all(this._paths.map((path) => this.readPath(path))).then((result) => {
} for (const entry of result.entries()) {
return {}; for (const file of entry[1].result) {
}); projects.push({
} path: entry[1].path,
name: file,
});
}
}
resolve(projects);
});
});
}
readPath(path) {
return new Promise((resolve) => {
readdir(path, (error, fileList) => {
if (!error) {
const newList = [];
for (const file of fileList) {
newList.push(file);
}
return resolve({
path,
result: newList,
});
}
return {};
});
});
}
setPaths(inputPaths) {
this._paths = inputPaths;
}
} }
//# sourceMappingURL=file-list-service.js.map //# sourceMappingURL=file-list-service.js.map

View File

@@ -1 +1 @@
{"version":3,"file":"file-list-service.js","sourceRoot":"","sources":["../../../../workspaces/electron-app/main/services/file-list-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,cAAc,EAAQ,MAAM,YAAY,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAErD,MAAM,OAAO,eAAgB,SAAQ,eAA8C;IAClF,gBAAgB;QACf,OAAO,cAAc,CAAC,cAAc,CAAC;IACtC,CAAC;IAED,cAAc;QACb,OAAO,cAAc,CAAC,eAAe,CAAC;IACvC,CAAC;IAED,OAAO;QACA,QAAQ,CAAC;QACT,OAAO,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE,QAAkB,EAAE,EAAE;YACxC,IAAI,CAAC,KAAK,EAAE;gBACR,MAAO,OAAO,GAA4B,EAAE,CAAC;gBAC7C,KAAI,MAAM,IAAI,IAAI,QAAQ,EAAE;oBACxB,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;iBACtB;gBACD,OAAO,OAAO,CAAC;aAClB;YAED,OAAO,EAAE,CAAC;QACd,CAAC,CAAC,CAAC;QAEH,OAAO,EAAE,CAAC;IACjB,CAAC;CACD"} {"version":3,"file":"file-list-service.js","sourceRoot":"","sources":["../../../../workspaces/electron-app/main/services/file-list-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAErD,MAAM,OAAO,eAAgB,SAAQ,eAA4B;IAAjE;;QACS,WAAM,GAAa,CAAC,UAAU,CAAC,CAAC;IAiDzC,CAAC;IA/CA,gBAAgB;QACf,OAAO,cAAc,CAAC,cAAc,CAAC;IACtC,CAAC;IAED,cAAc;QACb,OAAO,cAAc,CAAC,eAAe,CAAC;IACvC,CAAC;IAED,OAAO;QACN,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;YAC9B,MAAM,QAAQ,GAAU,EAAE,CAAC;YAC3B,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,MAAW,EAAE,EAAE;gBAChF,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,OAAO,EAAE,EAAE;oBACrC,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE;wBACnC,QAAQ,CAAC,IAAI,CAAC;4BACb,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI;4BACnB,IAAI,EAAE,IAAI;yBACV,CAAC,CAAC;qBACH;iBACD;gBACD,OAAO,CAAC,QAAQ,CAAC,CAAC;YACnB,CAAC,CAAC,CAAA;QACH,CAAC,CAAC,CAAC;IACJ,CAAC;IAEO,QAAQ,CAAC,IAAY;QAC5B,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;YAC9B,OAAO,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE,QAAkB,EAAE,EAAE;gBAC3C,IAAI,CAAC,KAAK,EAAE;oBACX,MAAM,OAAO,GAAa,EAAE,CAAC;oBAC7B,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE;wBAC5B,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;qBACnB;oBACD,OAAO,OAAO,CAAC;wBACd,IAAI;wBACJ,MAAM,EAAE,OAAO;qBACf,CAAC,CAAC;iBACH;gBAED,OAAO,EAAE,CAAC;YACX,CAAC,CAAC,CAAC;QACJ,CAAC,CAAC,CAAC;IACJ,CAAC;IAEM,QAAQ,CAAC,UAAoB;QACnC,IAAI,CAAC,MAAM,GAAG,UAAU,CAAC;IAC1B,CAAC;CACD"}

View File

@@ -0,0 +1,22 @@
import { WindowApiConst } from 'shared-lib';
import { AbstractService } from './abstract-service';
export class PrintService extends AbstractService {
sendingChannel() {
return WindowApiConst.PRINT_OUTPUT;
}
receptionChannel() {
return WindowApiConst.PRINT_INPUT;
}
process() {
return new Promise((resolve) => {
if (this._browserWindow) {
this._browserWindow.webContents.print({ silent: true });
}
resolve();
});
}
setWindow(window) {
this._browserWindow = window;
}
}
//# sourceMappingURL=print-service.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"print-service.js","sourceRoot":"","sources":["../../../../workspaces/electron-app/main/services/print-service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAErD,MAAM,OAAO,YAAa,SAAQ,eAA6B;IAE9D,cAAc;QACb,OAAO,cAAc,CAAC,YAAY,CAAC;IACpC,CAAC;IAED,gBAAgB;QACf,OAAO,cAAc,CAAC,WAAW,CAAC;IACnC,CAAC;IAED,OAAO;QACN,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;YAC9B,IAAI,IAAI,CAAC,cAAc,EAAE;gBACxB,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;aACxD;YACD,OAAO,EAAE,CAAC;QACX,CAAC,CAAC,CAAC;IACJ,CAAC;IAEM,SAAS,CAAC,MAAqB;QACrC,IAAI,CAAC,cAAc,GAAG,MAAM,CAAC;IAC9B,CAAC;CACD"}

View File

@@ -3,119 +3,111 @@ import * as os from 'node:os';
import * as path from 'node:path'; import * as path from 'node:path';
import * as winston from 'winston'; import * as winston from 'winston';
export class Logger { export class Logger {
constructor() { constructor() {
/** /**
* Custom winston file format * Custom winston file format
* Write JSON logs with given format : * Write JSON logs with given format :
* `${timestamp} ${level} : ${info.message} : ${meta})` * `${timestamp} ${level} : ${info.message} : ${meta})`
*/ */
this.fileFormat = winston.format.printf((data) => { this.fileFormat = winston.format.printf((data) => {
return JSON.stringify(this.prepareLogData(data)); return JSON.stringify(this.prepareLogData(data));
}); });
/** /**
* Custom winston console format * Custom winston console format
* Write logs with given format : * Write logs with given format :
* `${timestamp} ${level} : ${info.message} : JSON.stringify({ ...meta }) ` * `${timestamp} ${level} : ${info.message} : JSON.stringify({ ...meta }) `
*/ */
this.consoleFormat = winston.format.printf((data) => { this.consoleFormat = winston.format.printf((data) => {
const preparedData = this.prepareLogData(data); const preparedData = this.prepareLogData(data);
return ( return (`${preparedData.timestamp} ${preparedData.level} : ` +
`${preparedData.timestamp} ${preparedData.level} : ` + `${preparedData.message} : ${JSON.stringify(preparedData.meta)}`);
`${preparedData.message} : ${JSON.stringify(preparedData.meta)}` });
); this.prepareLogData = (data) => {
}); const additionalData = Object.assign({}, data);
this.prepareLogData = (data) => { delete additionalData.timestamp;
const additionalData = Object.assign({}, data); delete additionalData.level;
delete additionalData.timestamp; delete additionalData.message;
delete additionalData.level; delete additionalData.service;
delete additionalData.message; return {
delete additionalData.service; timestamp: data.timestamp,
return { level: data.level,
timestamp: data.timestamp, message: data.message,
level: data.level, meta: additionalData,
message: data.message, };
meta: additionalData, };
}; this._logger = winston.createLogger({
}; level: 'debug',
this._logger = winston.createLogger({ format: winston.format.json(),
level: 'debug', defaultMeta: { service: 'user-service' },
format: winston.format.json(), transports: [
defaultMeta: { service: 'user-service' }, new winston.transports.File({
transports: [ filename: this.getLogFilename(),
new winston.transports.File({ level: global.appConfig.mainLogLevel,
filename: this.getLogFilename(), format: winston.format.combine(winston.format.timestamp(), this.fileFormat),
level: global.appConfig.mainLogLevel, }),
format: winston.format.combine( ],
winston.format.timestamp(), });
this.fileFormat // If we're not in production then log also to the `console` with the format:
), // `${info.timestamp} ${info.level}: ${info.message} JSON.stringify({ ...rest }) `
}), if (global.appConfig.configId === 'development') {
], this._logger.add(new winston.transports.Console({
}); stderrLevels: ['error', 'warn'],
// If we're not in production then log also to the `console` with the format: format: winston.format.combine(winston.format.timestamp(), this.consoleFormat),
// `${info.timestamp} ${info.level}: ${info.message} JSON.stringify({ ...rest }) ` }));
if (global.appConfig.configId === 'development') { }
this._logger.add( }
new winston.transports.Console({ static error(message, ...meta) {
stderrLevels: ['error', 'warn'], Logger.initSingleton();
format: winston.format.combine( Logger.singleton._logger.error(message, meta);
winston.format.timestamp(), }
this.consoleFormat static warn(message, ...meta) {
), Logger.initSingleton();
}) Logger.singleton._logger.warn(message, meta);
); }
} static info(message, ...meta) {
} Logger.initSingleton();
static error(message, ...meta) { Logger.singleton._logger.info(message, meta);
Logger.initSingleton(); }
Logger.singleton._logger.error(message, meta); static http(message, ...meta) {
} Logger.initSingleton();
static warn(message, ...meta) { Logger.singleton._logger.http(message, meta);
Logger.initSingleton(); }
Logger.singleton._logger.warn(message, meta); static verbose(message, ...meta) {
} Logger.initSingleton();
static info(message, ...meta) { Logger.singleton._logger.verbose(message, meta);
Logger.initSingleton(); }
Logger.singleton._logger.info(message, meta); static debug(message, ...meta) {
} Logger.initSingleton();
static http(message, ...meta) { Logger.singleton._logger.debug(message, meta);
Logger.initSingleton(); }
Logger.singleton._logger.http(message, meta); static silly(message, ...meta) {
} Logger.initSingleton();
static verbose(message, ...meta) { Logger.singleton._logger.silly(message, meta);
Logger.initSingleton(); }
Logger.singleton._logger.verbose(message, meta); static initSingleton() {
} if (!Logger.singleton) {
static debug(message, ...meta) { Logger.singleton = new Logger();
Logger.initSingleton(); }
Logger.singleton._logger.debug(message, meta); }
} /**
static silly(message, ...meta) { * Returns log filename with standard path
Logger.initSingleton(); * In production, returns absolute standard path depending on platform
Logger.singleton._logger.silly(message, meta); */
} getLogFilename() {
static initSingleton() { let filename = global.appConfig.mainLogFile;
if (!Logger.singleton) { if (global.appConfig.configId === 'production') {
Logger.singleton = new Logger(); const appName = app.getName();
} if (process.platform == 'linux') {
} filename = `.config/${appName}/${filename}`;
/** }
* Returns log filename with standard path else if (process.platform == 'darwin') {
* In production, returns absolute standard path depending on platform filename = `Library/Logs/${appName}/${filename}`;
*/ }
getLogFilename() { else if (process.platform == 'win32') {
let filename = global.appConfig.mainLogFile; filename = `AppData\\Roaming\\${appName}\\${filename}`;
if (global.appConfig.configId === 'production') { }
const appName = app.getName(); }
if (process.platform == 'linux') { return path.join(os.homedir(), filename);
filename = `.config/${appName}/${filename}`; }
} else if (process.platform == 'darwin') {
filename = `Library/Logs/${appName}/${filename}`;
} else if (process.platform == 'win32') {
filename = `AppData\\Roaming\\${appName}\\${filename}`;
}
}
return path.join(os.homedir(), filename);
}
} }
//# sourceMappingURL=logger.js.map //# sourceMappingURL=logger.js.map

View File

@@ -26,7 +26,5 @@
* ``` * ```
*/ */
import './index.css'; import './index.css';
console.log( console.log('👋 This message is being logged by "renderer.js", included via webpack');
'👋 This message is being logged by "renderer.js", included via webpack' //# sourceMappingURL=index.js.map
);
//# sourceMappingURL=index.js.map

View File

@@ -35,19 +35,19 @@ if (process.env.X_NODE_ENV === 'e2e-test') {
import { contextBridge, ipcRenderer } from 'electron'; import { contextBridge, ipcRenderer } from 'electron';
import { WindowApiConst } from 'shared-lib'; import { WindowApiConst } from 'shared-lib';
contextBridge.exposeInMainWorld('api', { contextBridge.exposeInMainWorld('api', {
node: () => process.versions.node, node: () => process.versions.node,
chrome: () => process.versions.chrome, chrome: () => process.versions.chrome,
electron: () => process.versions.electron, electron: () => process.versions.electron,
send: (channel, input) => { send: (channel, input) => {
if (WindowApiConst.SENDING_SAFE_CHANNELS.includes(channel)) { if (WindowApiConst.SENDING_SAFE_CHANNELS.includes(channel)) {
ipcRenderer.send(channel, input); ipcRenderer.send(channel, input);
} }
}, },
receive: (channel, callback) => { receive: (channel, callback) => {
// Deliberately strip event as it includes `sender` // Deliberately strip event as it includes `sender`
ipcRenderer.on(channel, (_event, ...parameters) => callback(parameters[0])); ipcRenderer.on(channel, (_event, ...parameters) => callback(parameters[0]));
}, },
// we can also expose variables, not just functions // we can also expose variables, not just functions
}); });
console.log('The preload script has been injected successfully.'); console.log('The preload script has been injected successfully.');
//# sourceMappingURL=preload.js.map //# sourceMappingURL=preload.js.map

View File

@@ -28,53 +28,27 @@ describe('application loading', () => {
// }); // });
}); });
}); */ }); */
var __awaiter = var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
(this && this.__awaiter) || function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
function (thisArg, _arguments, P, generator) { return new (P || (P = Promise))(function (resolve, reject) {
function adopt(value) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
return value instanceof P function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
? value function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
: new P(function (resolve) { step((generator = generator.apply(thisArg, _arguments || [])).next());
resolve(value); });
}); };
}
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) {
try {
step(generator.next(value));
} catch (e) {
reject(e);
}
}
function rejected(value) {
try {
step(generator['throw'](value));
} catch (e) {
reject(e);
}
}
function step(result) {
result.done
? resolve(result.value)
: adopt(result.value).then(fulfilled, rejected);
}
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
describe('A simple test to check if app window is opened, visible and with expected title', () => { describe('A simple test to check if app window is opened, visible and with expected title', () => {
describe('App should', () => { describe('App should', () => {
it('show an initial window', () => it('show an initial window', () => __awaiter(this, void 0, void 0, function* () {
__awaiter(this, void 0, void 0, function* () { // Checking there is one visible window
// Checking there is one visible window // expect(await browser.).toEqual(true);
// expect(await browser.).toEqual(true); // Please note that getWindowHandles() will return 2 if `dev tools` is opened.
// Please note that getWindowHandles() will return 2 if `dev tools` is opened. const { length } = yield browser.getWindowHandles();
const { length } = yield browser.getWindowHandles(); expect(length).toEqual(1);
expect(length).toEqual(1); }));
})); it('have expected title', () => __awaiter(this, void 0, void 0, function* () {
it('have expected title', () => expect(yield browser.getTitle()).toEqual('ElectronAngularQuickStart');
__awaiter(this, void 0, void 0, function* () { }));
expect(yield browser.getTitle()).toEqual('ElectronAngularQuickStart'); });
}));
});
}); });
//# sourceMappingURL=app.spec.js.map //# sourceMappingURL=app.spec.js.map

View File

@@ -1,54 +1,28 @@
var __awaiter = var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
(this && this.__awaiter) || function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
function (thisArg, _arguments, P, generator) { return new (P || (P = Promise))(function (resolve, reject) {
function adopt(value) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
return value instanceof P function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
? value function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
: new P(function (resolve) { step((generator = generator.apply(thisArg, _arguments || [])).next());
resolve(value); });
}); };
}
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) {
try {
step(generator.next(value));
} catch (e) {
reject(e);
}
}
function rejected(value) {
try {
step(generator['throw'](value));
} catch (e) {
reject(e);
}
}
function step(result) {
result.done
? resolve(result.value)
: adopt(result.value).then(fulfilled, rejected);
}
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
import MultiplesPage from './pageobjects/multiples.page'; import MultiplesPage from './pageobjects/multiples.page';
describe('A simple test to check if a given input matches with computed multiples', () => { describe('A simple test to check if a given input matches with computed multiples', () => {
describe('Multiples component should', () => { describe('Multiples component should', () => {
it('show up on startup', () => it('show up on startup', () => __awaiter(void 0, void 0, void 0, function* () {
__awaiter(void 0, void 0, void 0, function* () { yield expect(MultiplesPage.root).toBeDisplayed();
yield expect(MultiplesPage.root).toBeDisplayed(); }));
})); const number = Math.floor(Math.random() * 100) % 10;
const number = Math.floor(Math.random() * 100) % 10; it(`display expected results on input (${number})`, () => __awaiter(void 0, void 0, void 0, function* () {
it(`display expected results on input (${number})`, () => yield MultiplesPage.enterInput(number);
__awaiter(void 0, void 0, void 0, function* () { const results = yield MultiplesPage.results;
yield MultiplesPage.enterInput(number); for (const index of results.keys()) {
const results = yield MultiplesPage.results; const ntimes = 1 + index;
for (const index of results.keys()) { const expected = `${number} * ${ntimes} = ${number * ntimes}`;
const ntimes = 1 + index; expect(yield results[index].getText()).toEqual(expected);
const expected = `${number} * ${ntimes} = ${number * ntimes}`; }
expect(yield results[index].getText()).toEqual(expected); }));
} });
}));
});
}); });
//# sourceMappingURL=multiples.spec.js.map //# sourceMappingURL=multiples.spec.js.map

View File

@@ -1,62 +1,38 @@
var __awaiter = var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
(this && this.__awaiter) || function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
function (thisArg, _arguments, P, generator) { return new (P || (P = Promise))(function (resolve, reject) {
function adopt(value) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
return value instanceof P function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
? value function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
: new P(function (resolve) { step((generator = generator.apply(thisArg, _arguments || [])).next());
resolve(value); });
}); };
}
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) {
try {
step(generator.next(value));
} catch (e) {
reject(e);
}
}
function rejected(value) {
try {
step(generator['throw'](value));
} catch (e) {
reject(e);
}
}
function step(result) {
result.done
? resolve(result.value)
: adopt(result.value).then(fulfilled, rejected);
}
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
import AbstractPage from './page'; import AbstractPage from './page';
class MultiplesPage extends AbstractPage { class MultiplesPage extends AbstractPage {
/** /**
* Selectors using getter methods * Selectors using getter methods
*/ */
get root() { get root() {
return $('#multiples'); return $('#multiples');
} }
get input() { get input() {
return $('#input'); return $('#input');
} }
get results() { get results() {
return $$('.results'); return $$('.results');
} }
get buttonSubmit() { get buttonSubmit() {
return $('button[type="submit"]'); return $('button[type="submit"]');
} }
/** /**
* Wrapper method to interact with the page * Wrapper method to interact with the page
*/ */
enterInput(number) { enterInput(number) {
return __awaiter(this, void 0, void 0, function* () { return __awaiter(this, void 0, void 0, function* () {
yield this.input.setValue(number); yield this.input.setValue(number);
yield this.buttonSubmit.click(); yield this.buttonSubmit.click();
}); });
} }
} }
export default new MultiplesPage(); export default new MultiplesPage();
//# sourceMappingURL=multiples.page.js.map //# sourceMappingURL=multiples.page.js.map

View File

@@ -2,5 +2,6 @@
* Abstract page object containing all methods, selectors and functionality * Abstract page object containing all methods, selectors and functionality
* that is shared across all page objects * that is shared across all page objects
*/ */
export default class AbstractPage {} export default class AbstractPage {
//# sourceMappingURL=page.js.map }
//# sourceMappingURL=page.js.map

View File

@@ -1,396 +1,362 @@
var __awaiter = var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
(this && this.__awaiter) || function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
function (thisArg, _arguments, P, generator) { return new (P || (P = Promise))(function (resolve, reject) {
function adopt(value) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
return value instanceof P function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
? value function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
: new P(function (resolve) { step((generator = generator.apply(thisArg, _arguments || [])).next());
resolve(value); });
}); };
}
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) {
try {
step(generator.next(value));
} catch (e) {
reject(e);
}
}
function rejected(value) {
try {
step(generator['throw'](value));
} catch (e) {
reject(e);
}
}
function step(result) {
result.done
? resolve(result.value)
: adopt(result.value).then(fulfilled, rejected);
}
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
import path from 'node:path'; import path from 'node:path';
// Path to local electron binary // Path to local electron binary
let electronPath = path.join(__dirname, '../../node_modules/.bin/electron'); let electronPath = path.join(__dirname, '../../node_modules/.bin/electron');
if (process.platform === 'win32') { if (process.platform === 'win32') {
electronPath += '.cmd'; electronPath += '.cmd';
} }
// Starting hook // Starting hook
const waitUntilWindowLoaded = () => const waitUntilWindowLoaded = () => __awaiter(void 0, void 0, void 0, function* () {
__awaiter(void 0, void 0, void 0, function* () { const timeout = 10000;
const timeout = 10000; yield browser.waitUntil(() => __awaiter(void 0, void 0, void 0, function* () { return (yield browser.isLoading()) === false; }), {
yield browser.waitUntil( timeout: timeout,
() => timeoutMsg: `Expected app to be loaded in less than ${timeout}ms`,
__awaiter(void 0, void 0, void 0, function* () { });
return (yield browser.isLoading()) === false; });
}),
{
timeout: timeout,
timeoutMsg: `Expected app to be loaded in less than ${timeout}ms`,
}
);
});
// Closing hook // Closing hook
const closeApplication = () => const closeApplication = () => __awaiter(void 0, void 0, void 0, function* () {
__awaiter(void 0, void 0, void 0, function* () { if (browser) {
if (browser) { // Wait 1 second and close window
// Wait 1 second and close window yield new Promise((resolve) => setTimeout(resolve, 1000));
yield new Promise((resolve) => setTimeout(resolve, 1000)); yield browser.closeWindow();
yield browser.closeWindow(); }
} });
});
export const config = { export const config = {
// //
// ==================== // ====================
// Runner Configuration // Runner Configuration
// ==================== // ====================
// //
// //
// ===================== // =====================
// ts-node Configurations // ts-node Configurations
// ===================== // =====================
// //
// You can write tests using TypeScript to get autocompletion and type safety. // You can write tests using TypeScript to get autocompletion and type safety.
// You will need typescript and ts-node installed as devDependencies. // You will need typescript and ts-node installed as devDependencies.
// WebdriverIO will automatically detect if these dependencies are installed // WebdriverIO will automatically detect if these dependencies are installed
// and will compile your config and tests for you. // and will compile your config and tests for you.
// If you need to configure how ts-node runs please use the // If you need to configure how ts-node runs please use the
// environment variables for ts-node or use wdio config's autoCompileOpts section. // environment variables for ts-node or use wdio config's autoCompileOpts section.
// //
autoCompileOpts: { autoCompileOpts: {
autoCompile: true, autoCompile: true,
// see https://github.com/TypeStrong/ts-node#cli-and-programmatic-options // see https://github.com/TypeStrong/ts-node#cli-and-programmatic-options
// for all available options // for all available options
tsNodeOpts: { tsNodeOpts: {
transpileOnly: true, transpileOnly: true,
project: 'workspaces/electron-e2e/tsconfig.json', project: 'workspaces/electron-e2e/tsconfig.json',
}, },
// tsconfig-paths is only used if "tsConfigPathsOpts" are provided, if you // tsconfig-paths is only used if "tsConfigPathsOpts" are provided, if you
// do please make sure "tsconfig-paths" is installed as dependency // do please make sure "tsconfig-paths" is installed as dependency
// tsConfigPathsOpts: { // tsConfigPathsOpts: {
// baseUrl: './' // baseUrl: './'
// } // }
}, },
// //
// ================== // ==================
// Specify Test Files // Specify Test Files
// ================== // ==================
// Define which test specs should run. The pattern is relative to the directory // Define which test specs should run. The pattern is relative to the directory
// from which `wdio` was called. // from which `wdio` was called.
// //
// The specs are defined as an array of spec files (optionally using wildcards // The specs are defined as an array of spec files (optionally using wildcards
// that will be expanded). The test for each spec file will be run in a separate // that will be expanded). The test for each spec file will be run in a separate
// worker process. In order to have a group of spec files run in the same worker // worker process. In order to have a group of spec files run in the same worker
// process simply enclose them in an array within the specs array. // process simply enclose them in an array within the specs array.
// //
// If you are calling `wdio` from an NPM script (see https://docs.npmjs.com/cli/run-script), // If you are calling `wdio` from an NPM script (see https://docs.npmjs.com/cli/run-script),
// then the current working directory is where your `package.json` resides, so `wdio` // then the current working directory is where your `package.json` resides, so `wdio`
// will be called from there. // will be called from there.
// //
specs: ['./workspaces/electron-e2e/**/*.spec.ts'], specs: ['./workspaces/electron-e2e/**/*.spec.ts'],
// Patterns to exclude. // Patterns to exclude.
exclude: [ exclude: [
// 'path/to/excluded/files' // 'path/to/excluded/files'
], ],
// //
// ============ // ============
// Capabilities // Capabilities
// ============ // ============
// Define your capabilities here. WebdriverIO can run multiple capabilities at the same // Define your capabilities here. WebdriverIO can run multiple capabilities at the same
// time. Depending on the number of capabilities, WebdriverIO launches several test // time. Depending on the number of capabilities, WebdriverIO launches several test
// sessions. Within your capabilities you can overwrite the spec and exclude options in // sessions. Within your capabilities you can overwrite the spec and exclude options in
// order to group specific specs to a specific capability. // order to group specific specs to a specific capability.
// //
// First, you can define how many instances should be started at the same time. Let's // First, you can define how many instances should be started at the same time. Let's
// say you have 3 different capabilities (Chrome, Firefox, and Safari) and you have // say you have 3 different capabilities (Chrome, Firefox, and Safari) and you have
// set maxInstances to 1; wdio will spawn 3 processes. Therefore, if you have 10 spec // set maxInstances to 1; wdio will spawn 3 processes. Therefore, if you have 10 spec
// files and you set maxInstances to 10, all spec files will get tested at the same time // files and you set maxInstances to 10, all spec files will get tested at the same time
// and 30 processes will get spawned. The property handles how many capabilities // and 30 processes will get spawned. The property handles how many capabilities
// from the same test should run tests. // from the same test should run tests.
// //
maxInstances: 10, maxInstances: 10,
// //
// If you have trouble getting all important capabilities together, check out the // If you have trouble getting all important capabilities together, check out the
// Sauce Labs platform configurator - a great tool to configure your capabilities: // Sauce Labs platform configurator - a great tool to configure your capabilities:
// https://saucelabs.com/platform/platform-configurator // https://saucelabs.com/platform/platform-configurator
// //
capabilities: [ capabilities: [
{ {
// maxInstances can get overwritten per capability. So if you have an in-house Selenium // maxInstances can get overwritten per capability. So if you have an in-house Selenium
// grid with only 5 firefox instances available you can make sure that not more than // grid with only 5 firefox instances available you can make sure that not more than
// 5 instances get started at a time. // 5 instances get started at a time.
maxInstances: 5, maxInstances: 5,
// //
browserName: 'chrome', browserName: 'chrome',
acceptInsecureCerts: true, acceptInsecureCerts: true,
'goog:chromeOptions': { 'goog:chromeOptions': {
binary: electronPath, binary: electronPath,
args: ['app=' + '.webpack/main/index.js'], args: ['app=' + '.webpack/main/index.js'],
}, },
// If outputDir is provided WebdriverIO can capture driver session logs // If outputDir is provided WebdriverIO can capture driver session logs
// it is possible to configure which logTypes to include/exclude. // it is possible to configure which logTypes to include/exclude.
// excludeDriverLogs: ['*'], // pass '*' to exclude all driver session logs // excludeDriverLogs: ['*'], // pass '*' to exclude all driver session logs
// excludeDriverLogs: ['bugreport', 'server'], // excludeDriverLogs: ['bugreport', 'server'],
}, },
], ],
// //
// =================== // ===================
// Test Configurations // Test Configurations
// =================== // ===================
// Define all options that are relevant for the WebdriverIO instance here // Define all options that are relevant for the WebdriverIO instance here
// //
// Level of logging verbosity: trace | debug | info | warn | error | silent // Level of logging verbosity: trace | debug | info | warn | error | silent
logLevel: 'info', logLevel: 'info',
// //
// Set specific log levels per logger // Set specific log levels per logger
// loggers: // loggers:
// - webdriver, webdriverio // - webdriver, webdriverio
// - @wdio/browserstack-service, @wdio/devtools-service, @wdio/sauce-service // - @wdio/browserstack-service, @wdio/devtools-service, @wdio/sauce-service
// - @wdio/mocha-framework, @wdio/jasmine-framework // - @wdio/mocha-framework, @wdio/jasmine-framework
// - @wdio/local-runner // - @wdio/local-runner
// - @wdio/sumologic-reporter // - @wdio/sumologic-reporter
// - @wdio/cli, @wdio/config, @wdio/utils // - @wdio/cli, @wdio/config, @wdio/utils
// Level of logging verbosity: trace | debug | info | warn | error | silent // Level of logging verbosity: trace | debug | info | warn | error | silent
// logLevels: { // logLevels: {
// webdriver: 'info', // webdriver: 'info',
// '@wdio/appium-service': 'info' // '@wdio/appium-service': 'info'
// }, // },
// //
// If you only want to run your tests until a specific amount of tests have failed use // If you only want to run your tests until a specific amount of tests have failed use
// bail (default is 0 - don't bail, run all tests). // bail (default is 0 - don't bail, run all tests).
bail: 0, bail: 0,
// //
// Set a base URL in order to shorten url command calls. If your `url` parameter starts // Set a base URL in order to shorten url command calls. If your `url` parameter starts
// with `/`, the base url gets prepended, not including the path portion of your baseUrl. // with `/`, the base url gets prepended, not including the path portion of your baseUrl.
// If your `url` parameter starts without a scheme or `/` (like `some/path`), the base url // If your `url` parameter starts without a scheme or `/` (like `some/path`), the base url
// gets prepended directly. // gets prepended directly.
baseUrl: 'http://localhost', baseUrl: 'http://localhost',
// //
// Default timeout for all waitFor* commands. // Default timeout for all waitFor* commands.
waitforTimeout: 10000, waitforTimeout: 10000,
// //
// Default timeout in milliseconds for request // Default timeout in milliseconds for request
// if browser driver or grid doesn't send response // if browser driver or grid doesn't send response
connectionRetryTimeout: 120000, connectionRetryTimeout: 120000,
// //
// Default request retries count // Default request retries count
connectionRetryCount: 3, connectionRetryCount: 3,
// //
// Test runner services // Test runner services
// Services take over a specific job you don't want to take care of. They enhance // Services take over a specific job you don't want to take care of. They enhance
// your test setup with almost no effort. Unlike plugins, they don't add new // your test setup with almost no effort. Unlike plugins, they don't add new
// commands. Instead, they hook themselves up into the test process. // commands. Instead, they hook themselves up into the test process.
services: ['chromedriver'], services: ['chromedriver'],
// Framework you want to run your specs with. // Framework you want to run your specs with.
// The following are supported: Mocha, Jasmine, and Cucumber // The following are supported: Mocha, Jasmine, and Cucumber
// see also: https://webdriver.io/docs/frameworks // see also: https://webdriver.io/docs/frameworks
// //
// Make sure you have the wdio adapter package for the specific framework installed // Make sure you have the wdio adapter package for the specific framework installed
// before running any tests. // before running any tests.
framework: 'jasmine', framework: 'jasmine',
// //
// The number of times to retry the entire specfile when it fails as a whole // The number of times to retry the entire specfile when it fails as a whole
// specFileRetries: 1, // specFileRetries: 1,
// //
// Delay in seconds between the spec file retry attempts // Delay in seconds between the spec file retry attempts
// specFileRetriesDelay: 0, // specFileRetriesDelay: 0,
// //
// Whether or not retried specfiles should be retried immediately or deferred to the end of the queue // Whether or not retried specfiles should be retried immediately or deferred to the end of the queue
// specFileRetriesDeferred: false, // specFileRetriesDeferred: false,
// //
// Test reporter for stdout. // Test reporter for stdout.
// The only one supported by default is 'dot' // The only one supported by default is 'dot'
// see also: https://webdriver.io/docs/dot-reporter // see also: https://webdriver.io/docs/dot-reporter
reporters: ['spec', ['allure', { outputDir: 'allure-results' }]], reporters: ['spec', ['allure', { outputDir: 'allure-results' }]],
// //
// Options to be passed to Jasmine. // Options to be passed to Jasmine.
jasmineOpts: { jasmineOpts: {
// Jasmine default timeout // Jasmine default timeout
defaultTimeoutInterval: 60000, defaultTimeoutInterval: 60000,
// //
// The Jasmine framework allows interception of each assertion in order to log the state of the application // The Jasmine framework allows interception of each assertion in order to log the state of the application
// or website depending on the result. For example, it is pretty handy to take a screenshot every time // or website depending on the result. For example, it is pretty handy to take a screenshot every time
// an assertion fails. // an assertion fails.
expectationResultHandler: function (_passed, _assertion) { expectationResultHandler: function (_passed, _assertion) {
// do something // do something
}, },
}, },
// //
// ===== // =====
// Hooks // Hooks
// ===== // =====
// WebdriverIO provides several hooks you can use to interfere with the test process in order to enhance // WebdriverIO provides several hooks you can use to interfere with the test process in order to enhance
// it and to build services around it. You can either apply a single function or an array of // it and to build services around it. You can either apply a single function or an array of
// methods to it. If one of them returns with a promise, WebdriverIO will wait until that promise got // methods to it. If one of them returns with a promise, WebdriverIO will wait until that promise got
// resolved to continue. // resolved to continue.
/** /**
* Gets executed once before all workers get launched. * Gets executed once before all workers get launched.
* @param {Object} config wdio configuration object * @param {Object} config wdio configuration object
* @param {Array.<Object>} capabilities list of capabilities details * @param {Array.<Object>} capabilities list of capabilities details
*/ */
// onPrepare: function (config, capabilities) { // onPrepare: function (config, capabilities) {
// }, // },
/** /**
* Gets executed before a worker process is spawned and can be used to initialise specific service * Gets executed before a worker process is spawned and can be used to initialise specific service
* for that worker as well as modify runtime environments in an async fashion. * for that worker as well as modify runtime environments in an async fashion.
* @param {String} cid capability id (e.g 0-0) * @param {String} cid capability id (e.g 0-0)
* @param {[type]} caps object containing capabilities for session that will be spawn in the worker * @param {[type]} caps object containing capabilities for session that will be spawn in the worker
* @param {[type]} specs specs to be run in the worker process * @param {[type]} specs specs to be run in the worker process
* @param {[type]} args object that will be merged with the main configuration once worker is initialized * @param {[type]} args object that will be merged with the main configuration once worker is initialized
* @param {[type]} execArgv list of string arguments passed to the worker process * @param {[type]} execArgv list of string arguments passed to the worker process
*/ */
// onWorkerStart: function (cid, caps, specs, args, execArgv) { // onWorkerStart: function (cid, caps, specs, args, execArgv) {
// }, // },
/** /**
* Gets executed just after a worker process has exited. * Gets executed just after a worker process has exited.
* @param {String} cid capability id (e.g 0-0) * @param {String} cid capability id (e.g 0-0)
* @param {Number} exitCode 0 - success, 1 - fail * @param {Number} exitCode 0 - success, 1 - fail
* @param {[type]} specs specs to be run in the worker process * @param {[type]} specs specs to be run in the worker process
* @param {Number} retries number of retries used * @param {Number} retries number of retries used
*/ */
// onWorkerEnd: function (cid, exitCode, specs, retries) { // onWorkerEnd: function (cid, exitCode, specs, retries) {
// }, // },
/** /**
* Gets executed just before initialising the webdriver session and test framework. It allows you * Gets executed just before initialising the webdriver session and test framework. It allows you
* to manipulate configurations depending on the capability or spec. * to manipulate configurations depending on the capability or spec.
* @param {Object} config wdio configuration object * @param {Object} config wdio configuration object
* @param {Array.<Object>} capabilities list of capabilities details * @param {Array.<Object>} capabilities list of capabilities details
* @param {Array.<String>} specs List of spec file paths that are to be run * @param {Array.<String>} specs List of spec file paths that are to be run
* @param {String} cid worker id (e.g. 0-0) * @param {String} cid worker id (e.g. 0-0)
*/ */
// beforeSession: function (config, capabilities, specs, cid) { // beforeSession: function (config, capabilities, specs, cid) {
// }, // },
/** /**
* Gets executed before test execution begins. At this point you can access to all global * Gets executed before test execution begins. At this point you can access to all global
* variables like `browser`. It is the perfect place to define custom commands. * variables like `browser`. It is the perfect place to define custom commands.
* @param {Array.<Object>} capabilities list of capabilities details * @param {Array.<Object>} capabilities list of capabilities details
* @param {Array.<String>} specs List of spec file paths that are to be run * @param {Array.<String>} specs List of spec file paths that are to be run
* @param {Object} browser instance of created browser/device session * @param {Object} browser instance of created browser/device session
*/ */
// before: function (capabilities, specs) { // before: function (capabilities, specs) {
// }, // },
/** /**
* Runs before a WebdriverIO command gets executed. * Runs before a WebdriverIO command gets executed.
* @param {String} commandName hook command name * @param {String} commandName hook command name
* @param {Array} args arguments that command would receive * @param {Array} args arguments that command would receive
*/ */
// beforeCommand: function (commandName, args) { // beforeCommand: function (commandName, args) {
// }, // },
/** /**
* Hook that gets executed before the suite starts * Hook that gets executed before the suite starts
* @param {Object} suite suite details * @param {Object} suite suite details
*/ */
beforeSuite: (_suite) => beforeSuite: (_suite) => __awaiter(void 0, void 0, void 0, function* () {
__awaiter(void 0, void 0, void 0, function* () { yield waitUntilWindowLoaded();
yield waitUntilWindowLoaded(); }),
}), /**
/** * Function to be executed before a test (in Mocha/Jasmine) starts.
* Function to be executed before a test (in Mocha/Jasmine) starts. */
*/ // beforeTest: function (test, context) {
// beforeTest: function (test, context) { // },
// }, /**
/** * Hook that gets executed _before_ a hook within the suite starts (e.g. runs before calling
* Hook that gets executed _before_ a hook within the suite starts (e.g. runs before calling * beforeEach in Mocha)
* beforeEach in Mocha) */
*/ // beforeHook: function (test, context) {
// beforeHook: function (test, context) { // },
// }, /**
/** * Hook that gets executed _after_ a hook within the suite starts (e.g. runs after calling
* Hook that gets executed _after_ a hook within the suite starts (e.g. runs after calling * afterEach in Mocha)
* afterEach in Mocha) */
*/ // afterHook: function (test, context, { error, result, duration, passed, retries }) {
// afterHook: function (test, context, { error, result, duration, passed, retries }) { // },
// }, /**
/** * Function to be executed after a test (in Mocha/Jasmine only)
* Function to be executed after a test (in Mocha/Jasmine only) * @param {Object} test test object
* @param {Object} test test object * @param {Object} context scope object the test was executed with
* @param {Object} context scope object the test was executed with * @param {Error} result.error error object in case the test fails, otherwise `undefined`
* @param {Error} result.error error object in case the test fails, otherwise `undefined` * @param {Any} result.result return object of test function
* @param {Any} result.result return object of test function * @param {Number} result.duration duration of test
* @param {Number} result.duration duration of test * @param {Boolean} result.passed true if test has passed, otherwise false
* @param {Boolean} result.passed true if test has passed, otherwise false * @param {Object} result.retries informations to spec related retries, e.g. `{ attempts: 0, limit: 0 }`
* @param {Object} result.retries informations to spec related retries, e.g. `{ attempts: 0, limit: 0 }` */
*/ afterTest: function (_test, _context, result) {
afterTest: function (_test, _context, result) { return __awaiter(this, void 0, void 0, function* () {
return __awaiter(this, void 0, void 0, function* () { // result = { _error, _result, _duration, passed, _retries }
// result = { _error, _result, _duration, passed, _retries } if (!result.passed) {
if (!result.passed) { yield browser.takeScreenshot();
yield browser.takeScreenshot(); }
} });
}); },
}, /**
/** * Hook that gets executed after the suite has ended
* Hook that gets executed after the suite has ended * @param {Object} suite suite details
* @param {Object} suite suite details */
*/ // afterSuite: async function (_suite) {
// afterSuite: async function (_suite) { // },
// }, /**
/** * Runs after a WebdriverIO command gets executed
* Runs after a WebdriverIO command gets executed * @param {String} commandName hook command name
* @param {String} commandName hook command name * @param {Array} args arguments that command would receive
* @param {Array} args arguments that command would receive * @param {Number} result 0 - command success, 1 - command error
* @param {Number} result 0 - command success, 1 - command error * @param {Object} error error object if any
* @param {Object} error error object if any */
*/ // afterCommand: function (commandName, args, result, error) {
// afterCommand: function (commandName, args, result, error) { // },
// }, /**
/** * Gets executed after all tests are done. You still have access to all global variables from
* Gets executed after all tests are done. You still have access to all global variables from * the test.
* the test. * @param {Number} result 0 - test pass, 1 - test fail
* @param {Number} result 0 - test pass, 1 - test fail * @param {Array.<Object>} capabilities list of capabilities details
* @param {Array.<Object>} capabilities list of capabilities details * @param {Array.<String>} specs List of spec file paths that ran
* @param {Array.<String>} specs List of spec file paths that ran */
*/ after: (_result, _capabilities, _specs) => __awaiter(void 0, void 0, void 0, function* () {
after: (_result, _capabilities, _specs) => yield closeApplication();
__awaiter(void 0, void 0, void 0, function* () { }),
yield closeApplication(); /**
}), * Gets executed right after terminating the webdriver session.
/** * @param {Object} config wdio configuration object
* Gets executed right after terminating the webdriver session. * @param {Array.<Object>} capabilities list of capabilities details
* @param {Object} config wdio configuration object * @param {Array.<String>} specs List of spec file paths that ran
* @param {Array.<Object>} capabilities list of capabilities details */
* @param {Array.<String>} specs List of spec file paths that ran // afterSession: function (config, capabilities, specs) {
*/ // },
// afterSession: function (config, capabilities, specs) { /**
// }, * Gets executed after all workers got shut down and the process is about to exit. An error
/** * thrown in the onComplete hook will result in the test run failing.
* Gets executed after all workers got shut down and the process is about to exit. An error * @param {Object} exitCode 0 - success, 1 - fail
* thrown in the onComplete hook will result in the test run failing. * @param {Object} config wdio configuration object
* @param {Object} exitCode 0 - success, 1 - fail * @param {Array.<Object>} capabilities list of capabilities details
* @param {Object} config wdio configuration object * @param {<Object>} results object containing test results
* @param {Array.<Object>} capabilities list of capabilities details */
* @param {<Object>} results object containing test results // onComplete: function(_exitCode, _config, _capabilities, _results) {
*/ // },
// onComplete: function(_exitCode, _config, _capabilities, _results) { /**
// }, * Gets executed when a refresh happens.
/** * @param {String} oldSessionId session ID of the old session
* Gets executed when a refresh happens. * @param {String} newSessionId session ID of the new session
* @param {String} oldSessionId session ID of the old session */
* @param {String} newSessionId session ID of the new session // onReload: function(oldSessionId, newSessionId) {
*/ // }
// onReload: function(oldSessionId, newSessionId) {
// }
}; };
//# sourceMappingURL=webdriverio.config.js.map //# sourceMappingURL=webdriverio.config.js.map

View File

@@ -19,19 +19,37 @@ export class DoorService extends AbstractService<any, Door[]> {
const workingSheet = workbook.Sheets['DEURLIJST']; const workingSheet = workbook.Sheets['DEURLIJST'];
const doorList: Door[] = []; const doorList: Door[] = [];
// remove 2 top rows
const headers: any = {};
// get header values
for (let index = 65; index <= 90; index++) {
const currentValue = workingSheet[`${String.fromCodePoint(index)}3`]?.v;
switch(currentValue) {
case 'L/R': this.setObjectWithChar(headers, 'lr', index); break;
case 'KRUK/\r\nSLOT': this.setObjectWithChar(headers, 'krukSlot', index); break;
case 'SCHARNIER': this.setObjectWithChar(headers, 'pivot', index); break;
case 'SOORT DEUR': this.setObjectWithChar(headers, 'type', index); break;
case 'MODEL\r\nKRUK': this.setObjectWithChar(headers, 'modelKruk', index); break;
case 'OPMERKING': this.setObjectWithChar(headers, 'remark', index); break;
default: break;
}
}
// get max records
const maxRecords = Number.parseInt(workingSheet['!ref'].split(':')[1].replace(/[A-Z]*/g, ''));
// stop at 19 // stop at 19
for (let index = 4; index < 19; index++) { for (let index = 4; index < maxRecords; index++) {
const door: Door = {}; const door: Door = {};
door.nr = workingSheet[`A${index}`]?.v; door.nr = workingSheet[`A${index}`]?.v;
if (door.nr) { if (door.nr) {
door.lr = workingSheet[`H${index}`]?.v; door.lr = workingSheet[`${headers['lr']}${index}`]?.v;
door.krukSlot = workingSheet[`K${index}`]?.v; door.krukSlot = workingSheet[`${headers['krukSlot']}${index}`]?.v;
door.pivot = workingSheet[`Q${index}`]?.v; door.pivot = workingSheet[`${headers['pivot']}${index}`]?.v;
door.type = workingSheet[`S${index}`]?.v; door.type = workingSheet[`${headers['type']}${index}`]?.v;
door.modelKruk = workingSheet[`T${index}`]?.v; door.modelKruk = workingSheet[`${headers['modelKruk']}${index}`]?.v;
door.remark = workingSheet[`U${index}`]?.v; door.remark = workingSheet[`${headers['remark']}${index}`]?.v;
doorList.push(door); doorList.push(door);
} }
@@ -40,4 +58,8 @@ export class DoorService extends AbstractService<any, Door[]> {
resolve(doorList); resolve(doorList);
}); });
} }
private setObjectWithChar(object: any, key: string, value: number) {
object[key] = String.fromCodePoint(value);
}
} }