later icon indicating copy to clipboard operation
later copied to clipboard

[fix] Order is significant in composite/complex schedules where only some entries specify a year

Open shaunhurley opened this issue 2 years ago • 1 comments

Describe the bug

  • Node.js version: all versions up to v16.x so far
  • OS & version: Windows 10, Ubuntu

Not sure if this is truly a bug, or an expected behavior. In a composite schedule where some entries specify a year, and others do not, using the .next() call with the schedule throws an error depending on the order that the crontabs are presented / processed. If schedules that include a year are presented last, then the result is as expected. If schedules that include a year are presented before any open/generic schedules it throws an error.

Actual behavior

\test-later\node_modules\@breejs\later\lib\index.js:926
      return !b || a.getTime() > b.getTime();
                     ^

TypeError: a.getTime is not a function
    at \test-later\node_modules\←[4m@breejs←[24m\later\lib\index.js:926:22
    at findNext (\test-later\node_modules\←[4m@breejs←[24m\later\lib\index.js:936:26)
    at getInstances (\test-later\node_modules\←[4m@breejs←[24m\later\lib\index.js:745:50)
    at Object.next (\test-later\node_modules\←[4m@breejs←[24m\later\lib\index.js:949:14)
    at Object.<anonymous> (\test-later\bad.js:25:52)
←[90m    at Module._compile (node:internal/modules/cjs/loader:1101:14)←[39m
←[90m    at Object.Module._extensions..js (node:internal/modules/cjs/loader:1153:10)←[39m
←[90m    at Module.load (node:internal/modules/cjs/loader:981:32)←[39m
←[90m    at Function.Module._load (node:internal/modules/cjs/loader:822:12)←[39m
←[90m    at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:81:12)←[39m

Expected behavior

[
  2023-01-01T23:30:00.000Z,
  2024-01-01T23:30:00.000Z,
  2025-01-01T23:30:00.000Z,
  2026-01-01T23:30:00.000Z,
  2027-01-01T23:30:00.000Z
]

Code to reproduce

const later = require('@breejs/later');
later.date.localTime();

let good_composite_schedule = {
  "schedules": [
    { "s": [ 0 ], "m": [ 30 ], "h": [ 18 ], "D": [ 1 ], "M": [ 1 ] },
    { "s": [ 0 ], "m": [ 30 ], "h": [ 17 ], "D": [ 2 ], "M": [ 2 ],"Y": [ 2021 ] }
  ],
  "exceptions": []
};
console.log(later.schedule(good_composite_schedule).next(5));

let bad_composite_schedule = {
  "schedules": [
    { "s": [ 0 ], "m": [ 30 ], "h": [ 17 ], "D": [ 2 ], "M": [ 2 ],"Y": [ 2021 ] },
    { "s": [ 0 ], "m": [ 30 ], "h": [ 18 ], "D": [ 1 ], "M": [ 1 ] }
  ],
  "exceptions": []
};
console.log(later.schedule(bad_composite_schedule).next(5));

Checklist

  • [ X ] I have read the documentation.
  • [ X ] I have tried my code with the latest version of Node.js and @breejs/later.

shaunhurley avatar Mar 15 '22 15:03 shaunhurley

I had to comment this out since it was breaking of course, but I at least merged it. If you find the solution and submit a PR please uncomment the tests. Thank you

titanism avatar Nov 28 '23 21:11 titanism