Skip to content
New issue

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

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

Already on GitHub? Sign in to your account

Fix features - dependencies - timezone - variable scope #248

Merged
merged 11 commits into from Mar 10, 2021
2 changes: 1 addition & 1 deletion README.md
Expand Up @@ -138,7 +138,7 @@ Arguments:
#### Options

- **scheduled**: A `boolean` to set if the created task is scheduled. Default `true`;
- **timezone**: The timezone that is used for job scheduling. See [tz-offset](https://github.com/node-cron/tz-offset/blob/master/generated/offsets.json) for valid values.
- **timezone**: The timezone that is used for job scheduling. See [moment-timezone](https://momentjs.com/timezone) for valid values.

**Example**:

Expand Down
1,921 changes: 714 additions & 1,207 deletions package-lock.json

Large diffs are not rendered by default.

1 change: 1 addition & 0 deletions package.json
Expand Up @@ -35,6 +35,7 @@
"eslint": "^5.7.0",
"istanbul": "^0.4.2",
"mocha": "^6.1.4",
"moment-timezone": "^0.5.31",
"nyc": "^14.0.0",
"sinon": "^7.3.2"
},
Expand Down
18 changes: 9 additions & 9 deletions src/convert-expression/index.js
@@ -1,10 +1,10 @@
'use strict';

var monthNamesConversion = require('./month-names-conversion');
var weekDayNamesConversion = require('./week-day-names-conversion');
var convertAsterisksToRanges = require('./asterisk-to-range-conversion');
var convertRanges = require('./range-conversion');
var convertSteps = require('./step-values-conversion');
const monthNamesConversion = require('./month-names-conversion');
const weekDayNamesConversion = require('./week-day-names-conversion');
const convertAsterisksToRanges = require('./asterisk-to-range-conversion');
const convertRanges = require('./range-conversion');
const convertSteps = require('./step-values-conversion');

module.exports = (() => {

Expand All @@ -21,9 +21,9 @@ module.exports = (() => {

// Function that takes care of normalization.
function normalizeIntegers(expressions) {
for (var i=0; i < expressions.length; i++){
var numbers = expressions[i].split(',');
for (var j=0; j<numbers.length; j++){
for (let i=0; i < expressions.length; i++){
const numbers = expressions[i].split(',');
for (let j=0; j<numbers.length; j++){
numbers[j] = parseInt(numbers[j]);
}
expressions[i] = numbers;
Expand All @@ -49,7 +49,7 @@ module.exports = (() => {
* - Will be translated to 1,2,3,4,5 * * * *
*/
function interprete(expression){
var expressions = removeSpaces(expression).split(' ');
let expressions = removeSpaces(expression).split(' ');
expressions = appendSeccondExpression(expressions);
expressions[4] = monthNamesConversion(expressions[4]);
expressions[5] = weekDayNamesConversion(expressions[5]);
Expand Down
6 changes: 3 additions & 3 deletions src/convert-expression/month-names-conversion.js
@@ -1,12 +1,12 @@
'use strict';
module.exports = (() => {
var months = ['january','february','march','april','may','june','july',
const months = ['january','february','march','april','may','june','july',
'august','september','october','november','december'];
var shortMonths = ['jan', 'feb', 'mar', 'apr', 'may', 'jun', 'jul', 'aug',
const shortMonths = ['jan', 'feb', 'mar', 'apr', 'may', 'jun', 'jul', 'aug',
'sep', 'oct', 'nov', 'dec'];

function convertMonthName(expression, items){
for(var i = 0; i < items.length; i++){
for(let i = 0; i < items.length; i++){
expression = expression.replace(new RegExp(items[i], 'gi'), parseInt(i, 10) + 1);
}
return expression;
Expand Down
17 changes: 7 additions & 10 deletions src/convert-expression/range-conversion.js
Expand Up @@ -2,25 +2,25 @@
module.exports = ( () => {
function replaceWithRange(expression, text, init, end) {

var numbers = [];
var last = parseInt(end);
var first = parseInt(init);
const numbers = [];
let last = parseInt(end);
let first = parseInt(init);

if(first > last){
last = parseInt(init);
first = parseInt(end);
}

for(var i = first; i <= last; i++) {
for(let i = first; i <= last; i++) {
numbers.push(i);
}

return expression.replace(new RegExp(text, 'gi'), numbers.join());
}

function convertRange(expression){
var rangeRegEx = /(\d+)-(\d+)/;
var match = rangeRegEx.exec(expression);
const rangeRegEx = /(\d+)-(\d+)/;
let match = rangeRegEx.exec(expression);
while(match !== null && match.length > 0){
expression = replaceWithRange(expression, match[0], match[1], match[2]);
match = rangeRegEx.exec(expression);
Expand All @@ -29,14 +29,11 @@ module.exports = ( () => {
}

function convertAllRanges(expressions){
for(var i = 0; i < expressions.length; i++){
for(let i = 0; i < expressions.length; i++){
expressions[i] = convertRange(expressions[i]);
}
return expressions;
}

return convertAllRanges;
})();



23 changes: 11 additions & 12 deletions src/convert-expression/step-values-conversion.js
Expand Up @@ -2,26 +2,25 @@

module.exports = (() => {
function convertSteps(expressions){
var stepValuePattern = /^(.+)\/(\d+)$/;
for(var i = 0; i < expressions.length; i++){
var match = stepValuePattern.exec(expressions[i]);
var isStepValue = match !== null && match.length > 0;
const stepValuePattern = /^(.+)\/(\d+)$/;
for(let i = 0; i < expressions.length; i++){
const match = stepValuePattern.exec(expressions[i]);
const isStepValue = match !== null && match.length > 0;
if(isStepValue){
var values = match[1].split(',');
var setpValues = [];
var divider = parseInt(match[2], 10);
for(var j = 0; j <= values.length; j++){
var value = parseInt(values[j], 10);
const values = match[1].split(',');
const stepValues = [];
const divider = parseInt(match[2], 10);
for(let j = 0; j <= values.length; j++){
const value = parseInt(values[j], 10);
if(value % divider === 0){
setpValues.push(value);
stepValues.push(value);
}
}
expressions[i] = setpValues.join(',');
expressions[i] = stepValues.join(',');
}
}
return expressions;
}

return convertSteps;
})();

6 changes: 3 additions & 3 deletions src/convert-expression/week-day-names-conversion.js
@@ -1,11 +1,11 @@
'use strict';
module.exports = (() => {
var weekDays = ['sunday', 'monday', 'tuesday', 'wednesday', 'thursday',
const weekDays = ['sunday', 'monday', 'tuesday', 'wednesday', 'thursday',
'friday', 'saturday'];
var shortWeekDays = ['sun', 'mon', 'tue', 'wed', 'thu', 'fri', 'sat'];
const shortWeekDays = ['sun', 'mon', 'tue', 'wed', 'thu', 'fri', 'sat'];

function convertWeekDayName(expression, items){
for(var i = 0; i < items.length; i++){
for(let i = 0; i < items.length; i++){
expression = expression.replace(new RegExp(items[i], 'gi'), parseInt(i, 10));
}
return expression;
Expand Down
3 changes: 1 addition & 2 deletions src/node-cron.js
Expand Up @@ -35,9 +35,8 @@ module.exports = (() => {
function createTask(expression, func, options){
if(typeof func === 'string'){
return new BackgroundScheduledTask(expression, func, options);
} else {
return new ScheduledTask(expression, func, options);
}
return new ScheduledTask(expression, func, options);
}

/**
Expand Down
18 changes: 9 additions & 9 deletions src/pattern-validation.js
@@ -1,15 +1,15 @@
'use strict';

var convertExpression = require('./convert-expression');
const convertExpression = require('./convert-expression');


module.exports = ( () => {
function isValidExpression(expression, min, max){
var options = expression.split(',');
var regexValidation = /^\d+$|^\*$|^\*\/\d+$/;
for(var i = 0; i < options.length; i++){
var option = options[i];
var optionAsInt = parseInt(options[i], 10);
const options = expression.split(',');
const regexValidation = /^\d+$|^\*$|^\*\/\d+$/;
for(let i = 0; i < options.length; i++){
const option = options[i];
const optionAsInt = parseInt(options[i], 10);
if(optionAsInt < min || optionAsInt > max || !regexValidation.test(option)) {
return false;
}
Expand Down Expand Up @@ -72,9 +72,9 @@ module.exports = ( () => {
throw 'pattern must be a string!';
}

var patterns = pattern.split(' ');
var executablePattern = convertExpression(pattern);
var executablePatterns = executablePattern.split(' ');
let patterns = pattern.split(' ');
const executablePattern = convertExpression(pattern);
const executablePatterns = executablePattern.split(' ');

if(patterns.length === 5){
patterns = ['0'].concat(patterns);
Expand Down
15 changes: 8 additions & 7 deletions src/scheduler.js
Expand Up @@ -15,20 +15,21 @@ class Scheduler extends EventEmitter{
this.stop();

let lastCheck = process.hrtime();
let lastExecution = new Date();
let lastExecution = this.timeMatcher.apply(new Date());

var matchTime = () => {
const matchTime = () => {
const delay = 1000;
const elapsedTime = process.hrtime(lastCheck);
const elapsedMs = (elapsedTime[0] * 1e9 + elapsedTime[1]) / 1e6;
const missedExecutions = Math.floor(elapsedMs / 1000);

for(let i = missedExecutions; i >= 0; i--){
var date = new Date(new Date().getTime() - i * 1000);
if(lastExecution.getTime() < date.getTime() && (i === 0 || this.autorecover) && this.timeMatcher.match(date)){
this.emit('scheduled-time-matched', date);
date.setMilliseconds(0);
lastExecution = date;
const date = new Date(new Date().getTime() - i * 1000);
let date_tmp = this.timeMatcher.apply(date);
if(lastExecution.getTime() < date_tmp.getTime() && (i === 0 || this.autorecover) && this.timeMatcher.match(date)){
this.emit('scheduled-time-matched', date_tmp);
date_tmp.setMilliseconds(0);
lastExecution = date_tmp;
}
}
lastCheck = process.hrtime();
Expand Down
29 changes: 18 additions & 11 deletions src/time-matcher.js
@@ -1,10 +1,10 @@
const validatePattern = require('./pattern-validation');
const convertExpression = require('./convert-expression');
const tzOffset = require('tz-offset');
const moment = require('moment-timezone');

function matchPattern(pattern, value){
if( pattern.indexOf(',') !== -1 ){
var patterns = pattern.split(',');
const patterns = pattern.split(',');
return patterns.indexOf(value.toString()) !== -1;
}
return pattern === value.toString();
Expand All @@ -19,18 +19,25 @@ class TimeMatcher{
}

match(date){
if(this.timezone){
date = tzOffset.timeAt(date, this.timezone);
}
var runOnSecond = matchPattern(this.expressions[0], date.getSeconds());
var runOnMinute = matchPattern(this.expressions[1], date.getMinutes());
var runOnHour = matchPattern(this.expressions[2], date.getHours());
var runOnDay = matchPattern(this.expressions[3], date.getDate());
var runOnMonth = matchPattern(this.expressions[4], date.getMonth() + 1);
var runOnWeekDay = matchPattern(this.expressions[5], date.getDay());
date = this.apply(date);

const runOnSecond = matchPattern(this.expressions[0], date.getSeconds());
const runOnMinute = matchPattern(this.expressions[1], date.getMinutes());
const runOnHour = matchPattern(this.expressions[2], date.getHours());
const runOnDay = matchPattern(this.expressions[3], date.getDate());
const runOnMonth = matchPattern(this.expressions[4], date.getMonth() + 1);
const runOnWeekDay = matchPattern(this.expressions[5], date.getDay());

return runOnSecond && runOnMinute && runOnHour && runOnDay && runOnMonth && runOnWeekDay;
}

apply(date){
if(this.timezone){
const tmp = moment.tz(date, this.timezone);
return new Date(tmp.year(), tmp.month(), tmp.date(), tmp.hour(), tmp.minute(), tmp.second(), tmp.millisecond());
}
return date;
}
}

module.exports = TimeMatcher;
6 changes: 3 additions & 3 deletions test/convert-expression/asterisk-to-range-conversion-test.js
@@ -1,12 +1,12 @@
'use strict';

const { expect } = require('chai');
var conversion = require('../../src/convert-expression/asterisk-to-range-conversion');
const conversion = require('../../src/convert-expression/asterisk-to-range-conversion');

describe('asterisk-to-range-conversion.js', () => {
it('shuld convert * to ranges', () => {
var expressions = '* * * * * *'.split(' ');
var expression = conversion(expressions).join(' ');
const expressions = '* * * * * *'.split(' ');
const expression = conversion(expressions).join(' ');
expect(expression).to.equal('0-59 0-59 0-23 1-31 1-12 0-6');
});
});
10 changes: 5 additions & 5 deletions test/convert-expression/convert-expression-test.js
@@ -1,18 +1,18 @@
'use strict';

const { expect } = require('chai');
var conversion = require('../../src/convert-expression');
const conversion = require('../../src/convert-expression');

describe('month-names-conversion.js', () => {
it('shuld convert month names', () => {
var expression = conversion('* * * * January,February *');
var expressions = expression.split(' ');
const expression = conversion('* * * * January,February *');
const expressions = expression.split(' ');
expect(expressions[4]).to.equal('1,2');
});

it('shuld convert week day names', () => {
var expression = conversion('* * * * * Mon,Sun');
var expressions = expression.split(' ');
const expression = conversion('* * * * * Mon,Sun');
const expressions = expression.split(' ');
expect(expressions[5]).to.equal('1,0');
});
});
6 changes: 3 additions & 3 deletions test/convert-expression/month-names-conversion-test.js
@@ -1,16 +1,16 @@
'use strict';

const { expect } = require('chai');
var conversion = require('../../src/convert-expression/month-names-conversion');
const conversion = require('../../src/convert-expression/month-names-conversion');

describe('month-names-conversion.js', () => {
it('shuld convert month names', () => {
var months = conversion('January,February,March,April,May,June,July,August,September,October,November,December');
const months = conversion('January,February,March,April,May,June,July,August,September,October,November,December');
expect(months).to.equal('1,2,3,4,5,6,7,8,9,10,11,12');
});

it('shuld convert month names', () => {
var months = conversion('Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec');
const months = conversion('Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec');
expect(months).to.equal('1,2,3,4,5,6,7,8,9,10,11,12');
});
});
10 changes: 5 additions & 5 deletions test/convert-expression/range-conversion-test.js
@@ -1,18 +1,18 @@
'use strict';

const { expect } = require('chai');
var conversion = require('../../src/convert-expression/range-conversion');
const conversion = require('../../src/convert-expression/range-conversion');

describe('range-conversion.js', () => {
it('shuld convert ranges to numbers', () => {
var expressions = '0-3 0-3 0-2 1-3 1-2 0-3'.split(' ');
var expression = conversion(expressions).join(' ');
const expressions = '0-3 0-3 0-2 1-3 1-2 0-3'.split(' ');
const expression = conversion(expressions).join(' ');
expect(expression).to.equal('0,1,2,3 0,1,2,3 0,1,2 1,2,3 1,2 0,1,2,3');
});

it('shuld convert ranges to numbers', () => {
var expressions = '0-3 0-3 8-10 1-3 1-2 0-3'.split(' ');
var expression = conversion(expressions).join(' ');
const expressions = '0-3 0-3 8-10 1-3 1-2 0-3'.split(' ');
const expression = conversion(expressions).join(' ');
expect(expression).to.equal('0,1,2,3 0,1,2,3 8,9,10 1,2,3 1,2 0,1,2,3');
});
});
4 changes: 2 additions & 2 deletions test/convert-expression/step-values-conversion-test.js
@@ -1,11 +1,11 @@
'use strict';

const { expect } = require('chai');
var conversion = require('../../src/convert-expression/step-values-conversion');
const conversion = require('../../src/convert-expression/step-values-conversion');

describe('step-values-conversion.js', () => {
it('shuld convert step values', () => {
var expressions = '1,2,3,4,5,6,7,8,9,10/2 0,1,2,3,4,5,6,7,8,9/5 * * * *'.split(' ');
let expressions = '1,2,3,4,5,6,7,8,9,10/2 0,1,2,3,4,5,6,7,8,9/5 * * * *'.split(' ');
expressions = conversion(expressions);
expect(expressions[0]).to.equal('2,4,6,8,10');
expect(expressions[1]).to.equal('0,5');
Expand Down