chronokinesis
Mock time and date for traveling and freezing. Inspired and borrowed from timekeeper.
Introduction
Mock Date and Date.now in order to help you test time-dependent code. Provides travel, freeze, and timezone functionality for your Node.js tests.
import * as ck from 'chronokinesis';
ck.freeze();
setTimeout(() => {
// Frozen
console.log(new Date());
ck.reset();
}, 2000);With arguments:
import * as ck from 'chronokinesis';
import assert from 'node:assert';
ck.freeze(1980, 0, 1);
assert.equal(true, ck.isKeepingTime());
assert.deepEqual(new Date(), new Date(1980, 0, 1));
ck.reset();or use with luxon:
import { DateTime } from 'luxon';
import * as ck from 'chronokinesis';
ck.travel(DateTime.now().plus({ year: 1 }).toMillis());
setTimeout(() => {
console.log('Traveled with Luxon DateTime one year and some', new Date());
ck.reset();
}, 2000);or use with moment:
import moment from 'moment';
import * as ck from 'chronokinesis';
ck.travel(moment().add(1, 'year'));
setTimeout(() => {
console.log('Traveled with Moment Date one year and some', new Date());
ck.reset();
}, 2000);API Reference
freeze([...args])
Freeze point in time. Calls can be made with the same arguments as the Date constructor.
...args: Optional date constructor arguments, if empty stops time at now
import * as ck from 'chronokinesis';
ck.freeze('1942-01-08');
setTimeout(() => {
// Frozen
console.log(new Date());
ck.reset();
}, 2000);travel([...args])
Time travel to another era. Calls can be made with the same arguments as the Date constructor
...args: Optional date constructor arguments, pretty useless if empty but won´t crash
import * as ck from 'chronokinesis';
let date = new Date(2018, 0, 31);
ck.travel(date);
setTimeout(function () {
console.log(new Date());
ck.reset();
}, 1500);When used in combination with freeze the time is still frozen but at the travelled time().
import * as ck from 'chronokinesis';
import moment from 'moment';
let date = new Date(2018, 0, 31);
ck.freeze(date);
ck.travel(moment().add(1, 'year'));
setTimeout(function () {
console.log(`Still frozen but one year ahead ${new Date()}`);
ck.reset();
}, 1500);defrost()
Defrost a frozen point in time. Used in combination with travelling will start ticking the clock.
import * as ck from 'chronokinesis';
ck.freeze(1980, 0, 1);
// Travel one year
ck.travel(1981, 1, 1);
// Start ticking
ck.defrost();
setTimeout(() => {
// Tick tack
console.log(new Date());
ck.reset();
}, 2000);reset()
Resets Date to current glory.
import * as ck from 'chronokinesis';
ck.freeze(2060, 0, 1);
console.log(`end of time is reached at ${new Date()} according to Newton`);
ck.reset();
// Today
console.log(new Date());isKeepingTime()
Utility function to see if we still travel or freeze time.
import * as ck from 'chronokinesis';
console.log(ck.isKeepingTime() ? 'Is' : 'Not', 'keeping time');
ck.travel(1893448800000);
console.log(ck.isKeepingTime() ? 'Is' : 'Not', 'keeping time');
ck.reset();timezone(timeZone[, ...args])
Travel to time zone.
timeZone: IANA time zone string...args: Optional travel to date arguments
Returns TimeZoneTraveller api
import * as ck from 'chronokinesis';
ck.reset();
const tz = ck.timezone('Asia/Shanghai');
console.log('Now in Shanghai', new Date());
tz.freeze();
ck.reset();new TimeZoneTraveller(timeZone)
Time zone traveller api.
import { TimeZoneTraveller, reset } from 'chronokinesis';
const timezone = new TimeZoneTraveller('Asia/Shanghai');
timezone.freeze();
reset();timezone.freeze([...args])
Freeze at the specific timezone.
timezone.travel([...args])
Start traveling in the specific timezone.
timezone.reset()
Same as #reset
timezone.defrost()
Same as #defrost
Distributions
The module is prepared for browser and nodejs.
Nodejs require
const ck = require('chronokinesis');Browser (UMD)
Use dist/chronokinesis.cjs. Sets global property chronokinesis.
Acknowledgements
chronokinesis initial code is inspired and borrowed from timekeeper