update ci

This commit is contained in:
Philipp Kunz 2017-08-28 13:14:35 +02:00
parent 9d386f7c45
commit 824efb1fc8
6 changed files with 60 additions and 54 deletions

View File

@ -15,7 +15,9 @@ stages:
testLEGACY: testLEGACY:
stage: test stage: test
script: script:
- npmci test legacy - npmci node install legacy
- npmci npm install
- npmci npm test
coverage: /\d+.?\d+?\%\s*coverage/ coverage: /\d+.?\d+?\%\s*coverage/
tags: tags:
- docker - docker
@ -24,7 +26,9 @@ testLEGACY:
testLTS: testLTS:
stage: test stage: test
script: script:
- npmci test lts - npmci node install lts
- npmci npm install
- npmci npm test
coverage: /\d+.?\d+?\%\s*coverage/ coverage: /\d+.?\d+?\%\s*coverage/
tags: tags:
- docker - docker
@ -32,7 +36,9 @@ testLTS:
testSTABLE: testSTABLE:
stage: test stage: test
script: script:
- npmci test stable - npmci node install lts
- npmci npm install
- npmci npm test
coverage: /\d+.?\d+?\%\s*coverage/ coverage: /\d+.?\d+?\%\s*coverage/
tags: tags:
- docker - docker
@ -40,7 +46,8 @@ testSTABLE:
release: release:
stage: release stage: release
script: script:
- npmci publish - npmci npm prepare
- npmci npm publish
only: only:
- tags - tags
tags: tags:

View File

@ -39,4 +39,4 @@ exports.beautyConsole = {
} }
}; };
route(true); route(true);
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmVhdXR5bG9nLmNvbnNvbGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9iZWF1dHlsb2cuY29uc29sZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLDBCQUF1QjtBQUV2QixtRUFBOEQ7QUFDOUQsSUFBSSxTQUFTLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQTtBQUMzQixJQUFJLFdBQVcsR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFBO0FBRS9COztHQUVHO0FBQ0gsSUFBSSxLQUFLLEdBQUcsVUFBUyxTQUFrQjtJQUNuQyxFQUFFLENBQUMsQ0FBQyxTQUFTLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQztRQUNyQixPQUFPLENBQUMsR0FBRyxHQUFHLHFCQUFhLENBQUMsR0FBRyxDQUFBO1FBQy9CLE9BQU8sQ0FBQyxLQUFLLEdBQUcscUJBQWEsQ0FBQyxLQUFLLENBQUE7SUFDdkMsQ0FBQztJQUFDLElBQUksQ0FBQyxDQUFDO1FBQ0osT0FBTyxDQUFDLEdBQUcsR0FBRyxTQUFTLENBQUE7SUFDM0IsQ0FBQztBQUNMLENBQUMsQ0FBQTtBQUVVLFFBQUEsYUFBYSxHQUFHO0lBQ3ZCLEdBQUcsRUFBRSxVQUFTLE1BQVc7UUFDckIsRUFBRSxDQUFDLENBQUMsaUNBQVMsQ0FBQyxDQUFDLENBQUM7WUFDWixpQ0FBUyxDQUFDLEtBQUssRUFBRSxDQUFBO1lBQ2pCLFNBQVMsQ0FBQyxLQUFLLENBQUMsU0FBUyxFQUFFLFNBQVMsQ0FBQyxDQUFBO1lBQ3JDLGlDQUFTLENBQUMsS0FBSyxFQUFFLENBQUE7UUFDckIsQ0FBQztRQUFDLElBQUksQ0FBQyxDQUFDO1lBQ0osU0FBUyxDQUFDLEtBQUssQ0FBQyxTQUFTLEVBQUUsU0FBUyxDQUFDLENBQUE7UUFDekMsQ0FBQztJQUNMLENBQUM7SUFDRCxLQUFLLEVBQUU7UUFDSCxFQUFFLENBQUMsQ0FBQyxpQ0FBUyxDQUFDLENBQUMsQ0FBQztZQUNaLGlDQUFTLENBQUMsS0FBSyxFQUFFLENBQUE7WUFDakIsU0FBUyxDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQUUsU0FBUyxDQUFDLENBQUE7WUFDdkMsaUNBQVMsQ0FBQyxLQUFLLEVBQUUsQ0FBQTtRQUNyQixDQUFDO1FBQUMsSUFBSSxDQUFDLENBQUM7WUFDSixTQUFTLENBQUMsS0FBSyxDQUFDLFdBQVcsRUFBRSxTQUFTLENBQUMsQ0FBQTtRQUMzQyxDQUFDO0lBQ0wsQ0FBQztDQUNKLENBQUE7QUFFRCxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUEifQ== //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmVhdXR5bG9nLmNvbnNvbGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9iZWF1dHlsb2cuY29uc29sZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLDBCQUF1QjtBQUV2QixtRUFBOEQ7QUFDOUQsSUFBSSxTQUFTLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQTtBQUMzQixJQUFJLFdBQVcsR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFBO0FBRS9COztHQUVHO0FBQ0gsSUFBSSxLQUFLLEdBQUcsVUFBVSxTQUFrQjtJQUN0QyxFQUFFLENBQUMsQ0FBQyxTQUFTLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQztRQUN2QixPQUFPLENBQUMsR0FBRyxHQUFHLHFCQUFhLENBQUMsR0FBRyxDQUFBO1FBQy9CLE9BQU8sQ0FBQyxLQUFLLEdBQUcscUJBQWEsQ0FBQyxLQUFLLENBQUE7SUFDckMsQ0FBQztJQUFDLElBQUksQ0FBQyxDQUFDO1FBQ04sT0FBTyxDQUFDLEdBQUcsR0FBRyxTQUFTLENBQUE7SUFDekIsQ0FBQztBQUNILENBQUMsQ0FBQTtBQUVVLFFBQUEsYUFBYSxHQUFHO0lBQ3pCLEdBQUcsRUFBRSxVQUFVLE1BQVc7UUFDeEIsRUFBRSxDQUFDLENBQUMsaUNBQVMsQ0FBQyxDQUFDLENBQUM7WUFDZCxpQ0FBUyxDQUFDLEtBQUssRUFBRSxDQUFBO1lBQ2pCLFNBQVMsQ0FBQyxLQUFLLENBQUMsU0FBUyxFQUFFLFNBQVMsQ0FBQyxDQUFBO1lBQ3JDLGlDQUFTLENBQUMsS0FBSyxFQUFFLENBQUE7UUFDbkIsQ0FBQztRQUFDLElBQUksQ0FBQyxDQUFDO1lBQ04sU0FBUyxDQUFDLEtBQUssQ0FBQyxTQUFTLEVBQUUsU0FBUyxDQUFDLENBQUE7UUFDdkMsQ0FBQztJQUNILENBQUM7SUFDRCxLQUFLLEVBQUU7UUFDTCxFQUFFLENBQUMsQ0FBQyxpQ0FBUyxDQUFDLENBQUMsQ0FBQztZQUNkLGlDQUFTLENBQUMsS0FBSyxFQUFFLENBQUE7WUFDakIsU0FBUyxDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQUUsU0FBUyxDQUFDLENBQUE7WUFDdkMsaUNBQVMsQ0FBQyxLQUFLLEVBQUUsQ0FBQTtRQUNuQixDQUFDO1FBQUMsSUFBSSxDQUFDLENBQUM7WUFDTixTQUFTLENBQUMsS0FBSyxDQUFDLFdBQVcsRUFBRSxTQUFTLENBQUMsQ0FBQTtRQUN6QyxDQUFDO0lBQ0gsQ0FBQztDQUNGLENBQUE7QUFFRCxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUEifQ==

View File

@ -84,4 +84,4 @@ exports.logReduced = (logTextArg, repeatEveryTimesArg = 0) => {
}; };
let previousMessage = ''; let previousMessage = '';
let sameMessageCounter = 0; let sameMessageCounter = 0;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmVhdXR5bG9nLmxvZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL2JlYXV0eWxvZy5sb2cudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSwwQkFBdUI7QUFFdkIsbUVBQW1EO0FBRW5EOzs7O0dBSUc7QUFFUSxRQUFBLEdBQUcsR0FBRyxDQUFDLE9BQU87SUFDckIsTUFBTSxDQUFDLG1DQUFXLENBQUMsS0FBSyxFQUFDLE9BQU8sQ0FBQyxDQUFBO0FBQ3JDLENBQUMsQ0FBQTtBQUVVLFFBQUEsSUFBSSxHQUFHLENBQUMsT0FBTztJQUN0QixNQUFNLENBQUMsbUNBQVcsQ0FBQyxNQUFNLEVBQUMsT0FBTyxDQUFDLENBQUE7QUFDdEMsQ0FBQyxDQUFBO0FBRUQ7Ozs7R0FJRztBQUNRLFFBQUEsRUFBRSxHQUFHLENBQUMsT0FBTztJQUNwQixNQUFNLENBQUMsbUNBQVcsQ0FBQyxJQUFJLEVBQUMsT0FBTyxDQUFDLENBQUE7QUFDcEMsQ0FBQyxDQUFBO0FBRUQ7Ozs7R0FJRztBQUNRLFFBQUEsT0FBTyxHQUFHLENBQUMsT0FBTztJQUN6QixNQUFNLENBQUMsbUNBQVcsQ0FBQyxTQUFTLEVBQUMsT0FBTyxDQUFDLENBQUE7QUFDekMsQ0FBQyxDQUFBO0FBRUQ7Ozs7R0FJRztBQUNRLFFBQUEsSUFBSSxHQUFHLENBQUMsT0FBTztJQUN0QixNQUFNLENBQUMsbUNBQVcsQ0FBQyxNQUFNLEVBQUMsT0FBTyxDQUFDLENBQUE7QUFDdEMsQ0FBQyxDQUFBO0FBRUQ7Ozs7R0FJRztBQUNRLFFBQUEsS0FBSyxHQUFHLENBQUMsT0FBTztJQUN2QixNQUFNLENBQUMsbUNBQVcsQ0FBQyxPQUFPLEVBQUMsT0FBTyxDQUFDLENBQUE7QUFDdkMsQ0FBQyxDQUFBO0FBRUQ7Ozs7R0FJRztBQUNRLFFBQUEsR0FBRyxHQUFHLENBQUMsT0FBTztJQUNyQixNQUFNLENBQUMsbUNBQVcsQ0FBQyxLQUFLLEVBQUMsT0FBTyxDQUFDLENBQUE7QUFDckMsQ0FBQyxDQUFBO0FBRUQ7O0dBRUc7QUFDUSxRQUFBLElBQUksR0FBRyxDQUFDLE9BQU87SUFDdEIsTUFBTSxDQUFDLG1DQUFXLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFBO0FBQ3ZDLENBQUMsQ0FBQTtBQUVEOzs7O0dBSUc7QUFDUSxRQUFBLE9BQU8sR0FBRyxDQUFDLFdBQW1CLENBQUM7SUFDdEMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxRQUFRLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUNoQyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFBO0lBQ3JCLENBQUM7QUFDTCxDQUFDLENBQUE7QUFFRDs7R0FFRztBQUNRLFFBQUEsVUFBVSxHQUFHLENBQUMsVUFBa0IsRUFBQyxzQkFBOEIsQ0FBQztJQUN2RSxFQUFFLENBQUMsQ0FBQyxVQUFVLEtBQUssZUFBZSxJQUFJLENBQUMsbUJBQW1CLEtBQUssQ0FBQyxJQUFJLGtCQUFrQixLQUFLLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzlHLGtCQUFrQixFQUFFLENBQUE7SUFDeEIsQ0FBQztJQUFDLElBQUksQ0FBQyxDQUFDO1FBQ0osa0JBQWtCLEdBQUcsQ0FBQyxDQUFBO1FBQ3RCLGVBQWUsR0FBRyxVQUFVLENBQUE7UUFDNUIsV0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFBO0lBQ25CLENBQUM7QUFDTCxDQUFDLENBQUE7QUFDRCxJQUFJLGVBQWUsR0FBVyxFQUFFLENBQUE7QUFDaEMsSUFBSSxrQkFBa0IsR0FBVyxDQUFDLENBQUEifQ== //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmVhdXR5bG9nLmxvZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL2JlYXV0eWxvZy5sb2cudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSwwQkFBdUI7QUFFdkIsbUVBQXFEO0FBRXJEOzs7O0dBSUc7QUFFUSxRQUFBLEdBQUcsR0FBRyxDQUFDLE9BQU87SUFDdkIsTUFBTSxDQUFDLG1DQUFXLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFBO0FBQ3BDLENBQUMsQ0FBQTtBQUVVLFFBQUEsSUFBSSxHQUFHLENBQUMsT0FBTztJQUN4QixNQUFNLENBQUMsbUNBQVcsQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUE7QUFDckMsQ0FBQyxDQUFBO0FBRUQ7Ozs7R0FJRztBQUNRLFFBQUEsRUFBRSxHQUFHLENBQUMsT0FBTztJQUN0QixNQUFNLENBQUMsbUNBQVcsQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUE7QUFDbkMsQ0FBQyxDQUFBO0FBRUQ7Ozs7R0FJRztBQUNRLFFBQUEsT0FBTyxHQUFHLENBQUMsT0FBTztJQUMzQixNQUFNLENBQUMsbUNBQVcsQ0FBQyxTQUFTLEVBQUUsT0FBTyxDQUFDLENBQUE7QUFDeEMsQ0FBQyxDQUFBO0FBRUQ7Ozs7R0FJRztBQUNRLFFBQUEsSUFBSSxHQUFHLENBQUMsT0FBTztJQUN4QixNQUFNLENBQUMsbUNBQVcsQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUE7QUFDckMsQ0FBQyxDQUFBO0FBRUQ7Ozs7R0FJRztBQUNRLFFBQUEsS0FBSyxHQUFHLENBQUMsT0FBTztJQUN6QixNQUFNLENBQUMsbUNBQVcsQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUE7QUFDdEMsQ0FBQyxDQUFBO0FBRUQ7Ozs7R0FJRztBQUNRLFFBQUEsR0FBRyxHQUFHLENBQUMsT0FBTztJQUN2QixNQUFNLENBQUMsbUNBQVcsQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUE7QUFDcEMsQ0FBQyxDQUFBO0FBRUQ7O0dBRUc7QUFDUSxRQUFBLElBQUksR0FBRyxDQUFDLE9BQU87SUFDeEIsTUFBTSxDQUFDLG1DQUFXLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFBO0FBQ3JDLENBQUMsQ0FBQTtBQUVEOzs7O0dBSUc7QUFDUSxRQUFBLE9BQU8sR0FBRyxDQUFDLFdBQW1CLENBQUM7SUFDeEMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxRQUFRLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUNsQyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFBO0lBQ25CLENBQUM7QUFDSCxDQUFDLENBQUE7QUFFRDs7R0FFRztBQUNRLFFBQUEsVUFBVSxHQUFHLENBQUMsVUFBa0IsRUFBRSxzQkFBOEIsQ0FBQztJQUMxRSxFQUFFLENBQUMsQ0FBQyxVQUFVLEtBQUssZUFBZSxJQUFJLENBQUMsbUJBQW1CLEtBQUssQ0FBQyxJQUFJLGtCQUFrQixLQUFLLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2hILGtCQUFrQixFQUFFLENBQUE7SUFDdEIsQ0FBQztJQUFDLElBQUksQ0FBQyxDQUFDO1FBQ04sa0JBQWtCLEdBQUcsQ0FBQyxDQUFBO1FBQ3RCLGVBQWUsR0FBRyxVQUFVLENBQUE7UUFDNUIsV0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFBO0lBQ2pCLENBQUM7QUFDSCxDQUFDLENBQUE7QUFDRCxJQUFJLGVBQWUsR0FBVyxFQUFFLENBQUE7QUFDaEMsSUFBSSxrQkFBa0IsR0FBVyxDQUFDLENBQUEifQ==

View File

@ -1,12 +1,11 @@
import { tap, expect } from 'tapbundle' import { tap, expect } from 'tapbundle'
import * as smartdelay from 'smartdelay'
import beautylog = require('../dist/index')
import * as beautyremote from 'beautyremote'
import * as qenv from 'qenv' import * as qenv from 'qenv'
let testQenv = new qenv.Qenv(process.cwd(), process.cwd() + '/.nogit') let testQenv = new qenv.Qenv(process.cwd(), process.cwd() + '/.nogit')
import * as smartdelay from 'smartdelay' import * as beautyremote from 'beautyremote'
import beautylog = require('../ts/index')
tap.test('.registerRemote should accept a beautyremote', async () => { tap.test('.registerRemote should accept a beautyremote', async () => {
let myRemote = new beautyremote.Loggly({ let myRemote = new beautyremote.Loggly({

View File

@ -7,34 +7,34 @@ let nativeError = console.error
/** /**
* routes the console to got through beautylog, so beautylog can take action before things are logged to console. * routes the console to got through beautylog, so beautylog can take action before things are logged to console.
*/ */
let route = function(statusArg: boolean){ let route = function (statusArg: boolean) {
if (statusArg === true) { if (statusArg === true) {
console.log = beautyConsole.log console.log = beautyConsole.log
console.error = beautyConsole.error console.error = beautyConsole.error
} else { } else {
console.log = nativeLog console.log = nativeLog
} }
} }
export let beautyConsole = { export let beautyConsole = {
log: function(logArg: any) { log: function (logArg: any) {
if (oraActive) { if (oraActive) {
activeOra.pause() activeOra.pause()
nativeLog.apply(nativeLog, arguments) nativeLog.apply(nativeLog, arguments)
activeOra.start() activeOra.start()
} else { } else {
nativeLog.apply(nativeLog, arguments) nativeLog.apply(nativeLog, arguments)
}
},
error: function(){
if (oraActive) {
activeOra.pause()
nativeLog.apply(nativeError, arguments)
activeOra.start()
} else {
nativeLog.apply(nativeError, arguments)
}
} }
},
error: function () {
if (oraActive) {
activeOra.pause()
nativeLog.apply(nativeError, arguments)
activeOra.start()
} else {
nativeLog.apply(nativeError, arguments)
}
}
} }
route(true) route(true)

View File

@ -1,6 +1,6 @@
import 'typings-global' import 'typings-global'
import {internalLog} from './beautylog.log.helpers' import { internalLog } from './beautylog.log.helpers'
/** /**
* logs an info to console * logs an info to console
@ -9,11 +9,11 @@ import {internalLog} from './beautylog.log.helpers'
*/ */
export let log = (logText) => { export let log = (logText) => {
return internalLog('log',logText) return internalLog('log', logText)
} }
export let info = (logText) => { export let info = (logText) => {
return internalLog('info',logText) return internalLog('info', logText)
} }
/** /**
@ -22,7 +22,7 @@ export let info = (logText) => {
* @returns {boolean} * @returns {boolean}
*/ */
export let ok = (logText) => { export let ok = (logText) => {
return internalLog('ok',logText) return internalLog('ok', logText)
} }
/** /**
@ -31,7 +31,7 @@ export let ok = (logText) => {
* @returns {boolean} * @returns {boolean}
*/ */
export let success = (logText) => { export let success = (logText) => {
return internalLog('success',logText) return internalLog('success', logText)
} }
/** /**
@ -40,7 +40,7 @@ export let success = (logText) => {
* @returns {boolean} * @returns {boolean}
*/ */
export let warn = (logText) => { export let warn = (logText) => {
return internalLog('warn',logText) return internalLog('warn', logText)
} }
/** /**
@ -49,7 +49,7 @@ export let warn = (logText) => {
* @returns {boolean} * @returns {boolean}
*/ */
export let error = (logText) => { export let error = (logText) => {
return internalLog('error',logText) return internalLog('error', logText)
} }
/** /**
@ -58,14 +58,14 @@ export let error = (logText) => {
* @returns {boolean} * @returns {boolean}
*/ */
export let dir = (logText) => { export let dir = (logText) => {
return internalLog('dir',logText) return internalLog('dir', logText)
} }
/** /**
* note * note
*/ */
export let note = (logText) => { export let note = (logText) => {
return internalLog('note', logText) return internalLog('note', logText)
} }
/** /**
@ -74,22 +74,22 @@ export let note = (logText) => {
* @returns void * @returns void
*/ */
export let newLine = (linesArg: number = 1) => { export let newLine = (linesArg: number = 1) => {
for (let i = 0; i < linesArg; i++) { for (let i = 0; i < linesArg; i++) {
console.log('\n') console.log('\n')
} }
} }
/** /**
* logs a reduced log that only logs changes of consequential log messages * logs a reduced log that only logs changes of consequential log messages
*/ */
export let logReduced = (logTextArg: string,repeatEveryTimesArg: number = 0) => { export let logReduced = (logTextArg: string, repeatEveryTimesArg: number = 0) => {
if (logTextArg === previousMessage && (repeatEveryTimesArg === 0 || sameMessageCounter !== repeatEveryTimesArg)) { if (logTextArg === previousMessage && (repeatEveryTimesArg === 0 || sameMessageCounter !== repeatEveryTimesArg)) {
sameMessageCounter++ sameMessageCounter++
} else { } else {
sameMessageCounter = 0 sameMessageCounter = 0
previousMessage = logTextArg previousMessage = logTextArg
log(logTextArg) log(logTextArg)
} }
} }
let previousMessage: string = '' let previousMessage: string = ''
let sameMessageCounter: number = 0 let sameMessageCounter: number = 0