chronokinesis 4.0.0 → 5.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +21 -19
- package/dist/chronokinesis.cjs +202 -0
- package/dist/index.cjs +196 -0
- package/index.d.ts +48 -0
- package/index.js +14 -18
- package/package.json +19 -22
- package/dist/chronokinesis.js +0 -315
- package/dist/index.es.js +0 -300
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
chronokinesis
|
|
2
2
|
=============
|
|
3
|
-
[](https://github.com/paed01/chronokinesis/actions/workflows/build.yaml) [](https://coveralls.io/github/paed01/chronokinesis?branch=master)
|
|
4
4
|
|
|
5
5
|
Mock time and date for traveling and freezing. Inspired and borrowed from [timekeeper](https://github.com/vesln/timekeeper).
|
|
6
6
|
|
|
@@ -19,8 +19,8 @@ Mock time and date for traveling and freezing. Inspired and borrowed from [timek
|
|
|
19
19
|
- [timezone `reset()`](#timezone-reset)
|
|
20
20
|
- [timezone `defrost()`](#timezone-defrost)
|
|
21
21
|
- [Distributions](#distributions)
|
|
22
|
-
- [
|
|
23
|
-
- [
|
|
22
|
+
- [Nodejs require](#nodejs-require)
|
|
23
|
+
- [Browser (UMD)](#browser-umd)
|
|
24
24
|
- [Acknowledgements](#acknowledgements)
|
|
25
25
|
|
|
26
26
|
<!-- tocstop -->
|
|
@@ -30,7 +30,7 @@ Mock time and date for traveling and freezing. Inspired and borrowed from [timek
|
|
|
30
30
|
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.
|
|
31
31
|
|
|
32
32
|
```javascript
|
|
33
|
-
|
|
33
|
+
import * as ck from 'chronokinesis';
|
|
34
34
|
|
|
35
35
|
ck.freeze();
|
|
36
36
|
|
|
@@ -45,8 +45,8 @@ setTimeout(() => {
|
|
|
45
45
|
or use with [`moment`](http://momentjs.com):
|
|
46
46
|
|
|
47
47
|
```javascript
|
|
48
|
-
|
|
49
|
-
|
|
48
|
+
import moment from 'moment';
|
|
49
|
+
import * as ck from 'chronokinesis';
|
|
50
50
|
|
|
51
51
|
ck.travel(moment().add(1, 'year'));
|
|
52
52
|
|
|
@@ -67,7 +67,7 @@ Freeze point in time. Calls can be made with the same arguments as the `Date` co
|
|
|
67
67
|
- `...args`: Optional date constructor arguments, if empty stops time at now
|
|
68
68
|
|
|
69
69
|
```javascript
|
|
70
|
-
|
|
70
|
+
import * as ck from 'chronokinesis';
|
|
71
71
|
|
|
72
72
|
ck.freeze('1942-01-08');
|
|
73
73
|
|
|
@@ -86,7 +86,7 @@ Time travel to another era. Calls can be made with the same arguments as the `Da
|
|
|
86
86
|
- `...args`: Optional date constructor arguments, pretty useless if empty but won´t crash
|
|
87
87
|
|
|
88
88
|
```javascript
|
|
89
|
-
|
|
89
|
+
import * as ck from 'chronokinesis';
|
|
90
90
|
let date = new Date(2018, 0, 31);
|
|
91
91
|
|
|
92
92
|
ck.travel(date);
|
|
@@ -100,8 +100,8 @@ setTimeout(function() {
|
|
|
100
100
|
When used in combination with [`freeze`](#freeze) the time is still frozen but at the travelled time().
|
|
101
101
|
|
|
102
102
|
```javascript
|
|
103
|
-
|
|
104
|
-
|
|
103
|
+
import * as ck from 'chronokinesis';
|
|
104
|
+
import moment from 'moment';
|
|
105
105
|
|
|
106
106
|
let date = new Date(2018, 0, 31);
|
|
107
107
|
|
|
@@ -121,7 +121,7 @@ setTimeout(function() {
|
|
|
121
121
|
Defrost a frozen point in time. Used in combination with travelling will start ticking the clock.
|
|
122
122
|
|
|
123
123
|
```javascript
|
|
124
|
-
|
|
124
|
+
import * as ck from 'chronokinesis';
|
|
125
125
|
|
|
126
126
|
ck.freeze(1980, 0, 1);
|
|
127
127
|
|
|
@@ -144,7 +144,7 @@ setTimeout(() => {
|
|
|
144
144
|
Resets Date to current glory.
|
|
145
145
|
|
|
146
146
|
```javascript
|
|
147
|
-
|
|
147
|
+
import * as ck from 'chronokinesis';
|
|
148
148
|
|
|
149
149
|
ck.freeze(2060, 0, 1);
|
|
150
150
|
console.log(`end of time is reached at ${new Date()} according to Newton`)
|
|
@@ -160,7 +160,7 @@ console.log(new Date())
|
|
|
160
160
|
Utility function to see if we still travel or freeze time.
|
|
161
161
|
|
|
162
162
|
```javascript
|
|
163
|
-
|
|
163
|
+
import * as ck from 'chronokinesis';
|
|
164
164
|
|
|
165
165
|
console.log(ck.isKeepingTime() ? 'Is' : 'Not', 'keeping time');
|
|
166
166
|
ck.travel(1893448800000);
|
|
@@ -172,7 +172,7 @@ console.log(ck.isKeepingTime() ? 'Is' : 'Not', 'keeping time');
|
|
|
172
172
|
Freeze and travel in different time zones.
|
|
173
173
|
|
|
174
174
|
```javascript
|
|
175
|
-
|
|
175
|
+
import * as ck from 'chronokinesis';
|
|
176
176
|
|
|
177
177
|
const tz = ck.timezone('Asia/Shanghai');
|
|
178
178
|
|
|
@@ -197,15 +197,17 @@ Same as [#defrost](#defrost)
|
|
|
197
197
|
|
|
198
198
|
# Distributions
|
|
199
199
|
|
|
200
|
-
The module is prepared for browser and
|
|
200
|
+
The module is prepared for browser and nodejs.
|
|
201
201
|
|
|
202
|
-
##
|
|
202
|
+
## Nodejs require
|
|
203
203
|
|
|
204
|
-
|
|
204
|
+
```js
|
|
205
|
+
const ck = require('chronokinesis');
|
|
206
|
+
```
|
|
205
207
|
|
|
206
|
-
##
|
|
208
|
+
## Browser (UMD)
|
|
207
209
|
|
|
208
|
-
`
|
|
210
|
+
Use `dist/chronokinesis.cjs`. Sets global property `chronokinesis`.
|
|
209
211
|
|
|
210
212
|
# Acknowledgements
|
|
211
213
|
|
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
(function (global, factory) {
|
|
2
|
+
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :
|
|
3
|
+
typeof define === 'function' && define.amd ? define(['exports'], factory) :
|
|
4
|
+
(global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.chronokinesis = {}));
|
|
5
|
+
})(this, (function (exports) { 'use strict';
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Inspired by Time keeper - EEasy testing of time-dependent code.
|
|
9
|
+
*
|
|
10
|
+
* Veselin Todorov <hi@vesln.com>
|
|
11
|
+
* MIT License.
|
|
12
|
+
*/
|
|
13
|
+
const NativeDate = Date;
|
|
14
|
+
const nativeGetTimezoneOffset = NativeDate.prototype.getTimezoneOffset;
|
|
15
|
+
|
|
16
|
+
let freezedAt = null;
|
|
17
|
+
let traveledTo = null;
|
|
18
|
+
let started = null;
|
|
19
|
+
let iana = null;
|
|
20
|
+
|
|
21
|
+
function FakeDate(...args) {
|
|
22
|
+
const length = args.length;
|
|
23
|
+
if (!length) {
|
|
24
|
+
if (freezedAt) args = [freezedAt];
|
|
25
|
+
else if (traveledTo) args = [time()];
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
const dt = instantiate(NativeDate, args);
|
|
29
|
+
|
|
30
|
+
Object.defineProperty(dt, 'getTimezoneOffset', {
|
|
31
|
+
enumerable: false,
|
|
32
|
+
value: function getTimezoneOffset() {
|
|
33
|
+
const curr = nativeGetTimezoneOffset.call(this);
|
|
34
|
+
if (!iana) return curr;
|
|
35
|
+
|
|
36
|
+
const tz = timezone(iana).getTime(this);
|
|
37
|
+
return Math.round((tz - this.getTime()) / 60000) + curr;
|
|
38
|
+
},
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
return dt;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
FakeDate.UTC = NativeDate.UTC;
|
|
45
|
+
FakeDate.parse = NativeDate.parse;
|
|
46
|
+
|
|
47
|
+
FakeDate.prototype = NativeDate.prototype;
|
|
48
|
+
|
|
49
|
+
FakeDate.now = function() {
|
|
50
|
+
if (freezedAt) return freezedAt.getTime();
|
|
51
|
+
return time();
|
|
52
|
+
};
|
|
53
|
+
|
|
54
|
+
function freeze(...args) {
|
|
55
|
+
useFakeDate();
|
|
56
|
+
freezedAt = instantiate(Date, args);
|
|
57
|
+
if (isNaN(freezedAt)) {
|
|
58
|
+
reset();
|
|
59
|
+
throw new TypeError('Chronokinesis cannot freeze to invalid date, check your arguments. Chronokinesis is reset');
|
|
60
|
+
}
|
|
61
|
+
return freezedAt;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
function defrost() {
|
|
65
|
+
freezedAt = null;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
function travel(...args) {
|
|
69
|
+
useFakeDate();
|
|
70
|
+
const travelToDate = instantiate(Date, args);
|
|
71
|
+
if (isNaN(travelToDate)) {
|
|
72
|
+
reset();
|
|
73
|
+
throw new TypeError('Chronokinesis cannot travel to invalid date, check your arguments. Chronokinesis is reset');
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
traveledTo = travelToDate.getTime();
|
|
77
|
+
started = NativeDate.now();
|
|
78
|
+
|
|
79
|
+
if (freezedAt) {
|
|
80
|
+
freezedAt = travelToDate;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
return travelToDate;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
function reset() {
|
|
87
|
+
useNativeDate();
|
|
88
|
+
freezedAt = null;
|
|
89
|
+
started = null;
|
|
90
|
+
traveledTo = null;
|
|
91
|
+
iana = null;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
function isKeepingTime() {
|
|
95
|
+
return Date === FakeDate;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
function timezone(timeZone) {
|
|
99
|
+
const options = {
|
|
100
|
+
year: 'numeric',
|
|
101
|
+
month: 'numeric',
|
|
102
|
+
day: 'numeric',
|
|
103
|
+
hour: 'numeric',
|
|
104
|
+
minute: 'numeric',
|
|
105
|
+
second: 'numeric',
|
|
106
|
+
hour12: false,
|
|
107
|
+
};
|
|
108
|
+
|
|
109
|
+
const current = Intl.DateTimeFormat('UTC', options);
|
|
110
|
+
const formatter = Intl.DateTimeFormat('UTC', {
|
|
111
|
+
timeZone: timeZone,
|
|
112
|
+
...options,
|
|
113
|
+
});
|
|
114
|
+
|
|
115
|
+
return {
|
|
116
|
+
timeZone,
|
|
117
|
+
defrost,
|
|
118
|
+
reset,
|
|
119
|
+
isKeepingTime,
|
|
120
|
+
getTime,
|
|
121
|
+
freeze: freezeInTimezone,
|
|
122
|
+
travel: travelInTimezone,
|
|
123
|
+
};
|
|
124
|
+
|
|
125
|
+
function freezeInTimezone(...args) {
|
|
126
|
+
if (!args.length && iana === timeZone) return freeze();
|
|
127
|
+
iana = timeZone;
|
|
128
|
+
return freeze(getTime(...args));
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
function travelInTimezone(...args) {
|
|
132
|
+
if (!args.length && iana === timeZone) return travel();
|
|
133
|
+
iana = timeZone;
|
|
134
|
+
return travel(getTime(...args));
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
function getTime(...args) {
|
|
138
|
+
const realDate = instantiate(Date, args);
|
|
139
|
+
const tz = new NativeDate(toUTC(formatter, realDate));
|
|
140
|
+
|
|
141
|
+
if (!args.length) return tz.getTime();
|
|
142
|
+
const currentTz = new NativeDate(toUTC(current, realDate));
|
|
143
|
+
|
|
144
|
+
return realDate.getTime() + currentTz.getTime() - tz.getTime();
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
function useFakeDate() {
|
|
149
|
+
Date = FakeDate; // eslint-disable-line no-global-assign
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
function useNativeDate() {
|
|
153
|
+
Date = NativeDate; // eslint-disable-line no-global-assign
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
function time() {
|
|
157
|
+
return traveledTo + (NativeDate.now() - started);
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
function instantiate(type, args) {
|
|
161
|
+
const ctorArgs = args.slice();
|
|
162
|
+
ctorArgs.unshift(null);
|
|
163
|
+
return new (Function.prototype.bind.apply(type, ctorArgs))();
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
function toUTC(formatter, dt) {
|
|
167
|
+
let year, month, day, hour, minute, second;
|
|
168
|
+
|
|
169
|
+
for (const {type, value} of formatter.formatToParts(dt)) {
|
|
170
|
+
switch (type) {
|
|
171
|
+
case 'year':
|
|
172
|
+
year = parseInt(value);
|
|
173
|
+
break;
|
|
174
|
+
case 'month':
|
|
175
|
+
month = parseInt(value) - 1;
|
|
176
|
+
break;
|
|
177
|
+
case 'day':
|
|
178
|
+
day = parseInt(value);
|
|
179
|
+
break;
|
|
180
|
+
case 'hour':
|
|
181
|
+
hour = parseInt(value) % 24;
|
|
182
|
+
break;
|
|
183
|
+
case 'minute':
|
|
184
|
+
minute = parseInt(value);
|
|
185
|
+
break;
|
|
186
|
+
case 'second':
|
|
187
|
+
second = parseInt(value);
|
|
188
|
+
break;
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
return NativeDate.UTC(year, month, day, hour, minute, second, dt.getMilliseconds());
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
exports.defrost = defrost;
|
|
196
|
+
exports.freeze = freeze;
|
|
197
|
+
exports.isKeepingTime = isKeepingTime;
|
|
198
|
+
exports.reset = reset;
|
|
199
|
+
exports.timezone = timezone;
|
|
200
|
+
exports.travel = travel;
|
|
201
|
+
|
|
202
|
+
}));
|
package/dist/index.cjs
ADDED
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Inspired by Time keeper - EEasy testing of time-dependent code.
|
|
5
|
+
*
|
|
6
|
+
* Veselin Todorov <hi@vesln.com>
|
|
7
|
+
* MIT License.
|
|
8
|
+
*/
|
|
9
|
+
const NativeDate = Date;
|
|
10
|
+
const nativeGetTimezoneOffset = NativeDate.prototype.getTimezoneOffset;
|
|
11
|
+
|
|
12
|
+
let freezedAt = null;
|
|
13
|
+
let traveledTo = null;
|
|
14
|
+
let started = null;
|
|
15
|
+
let iana = null;
|
|
16
|
+
|
|
17
|
+
function FakeDate(...args) {
|
|
18
|
+
const length = args.length;
|
|
19
|
+
if (!length) {
|
|
20
|
+
if (freezedAt) args = [freezedAt];
|
|
21
|
+
else if (traveledTo) args = [time()];
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
const dt = instantiate(NativeDate, args);
|
|
25
|
+
|
|
26
|
+
Object.defineProperty(dt, 'getTimezoneOffset', {
|
|
27
|
+
enumerable: false,
|
|
28
|
+
value: function getTimezoneOffset() {
|
|
29
|
+
const curr = nativeGetTimezoneOffset.call(this);
|
|
30
|
+
if (!iana) return curr;
|
|
31
|
+
|
|
32
|
+
const tz = timezone(iana).getTime(this);
|
|
33
|
+
return Math.round((tz - this.getTime()) / 60000) + curr;
|
|
34
|
+
},
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
return dt;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
FakeDate.UTC = NativeDate.UTC;
|
|
41
|
+
FakeDate.parse = NativeDate.parse;
|
|
42
|
+
|
|
43
|
+
FakeDate.prototype = NativeDate.prototype;
|
|
44
|
+
|
|
45
|
+
FakeDate.now = function() {
|
|
46
|
+
if (freezedAt) return freezedAt.getTime();
|
|
47
|
+
return time();
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
function freeze(...args) {
|
|
51
|
+
useFakeDate();
|
|
52
|
+
freezedAt = instantiate(Date, args);
|
|
53
|
+
if (isNaN(freezedAt)) {
|
|
54
|
+
reset();
|
|
55
|
+
throw new TypeError('Chronokinesis cannot freeze to invalid date, check your arguments. Chronokinesis is reset');
|
|
56
|
+
}
|
|
57
|
+
return freezedAt;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
function defrost() {
|
|
61
|
+
freezedAt = null;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
function travel(...args) {
|
|
65
|
+
useFakeDate();
|
|
66
|
+
const travelToDate = instantiate(Date, args);
|
|
67
|
+
if (isNaN(travelToDate)) {
|
|
68
|
+
reset();
|
|
69
|
+
throw new TypeError('Chronokinesis cannot travel to invalid date, check your arguments. Chronokinesis is reset');
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
traveledTo = travelToDate.getTime();
|
|
73
|
+
started = NativeDate.now();
|
|
74
|
+
|
|
75
|
+
if (freezedAt) {
|
|
76
|
+
freezedAt = travelToDate;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
return travelToDate;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
function reset() {
|
|
83
|
+
useNativeDate();
|
|
84
|
+
freezedAt = null;
|
|
85
|
+
started = null;
|
|
86
|
+
traveledTo = null;
|
|
87
|
+
iana = null;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
function isKeepingTime() {
|
|
91
|
+
return Date === FakeDate;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
function timezone(timeZone) {
|
|
95
|
+
const options = {
|
|
96
|
+
year: 'numeric',
|
|
97
|
+
month: 'numeric',
|
|
98
|
+
day: 'numeric',
|
|
99
|
+
hour: 'numeric',
|
|
100
|
+
minute: 'numeric',
|
|
101
|
+
second: 'numeric',
|
|
102
|
+
hour12: false,
|
|
103
|
+
};
|
|
104
|
+
|
|
105
|
+
const current = Intl.DateTimeFormat('UTC', options);
|
|
106
|
+
const formatter = Intl.DateTimeFormat('UTC', {
|
|
107
|
+
timeZone: timeZone,
|
|
108
|
+
...options,
|
|
109
|
+
});
|
|
110
|
+
|
|
111
|
+
return {
|
|
112
|
+
timeZone,
|
|
113
|
+
defrost,
|
|
114
|
+
reset,
|
|
115
|
+
isKeepingTime,
|
|
116
|
+
getTime,
|
|
117
|
+
freeze: freezeInTimezone,
|
|
118
|
+
travel: travelInTimezone,
|
|
119
|
+
};
|
|
120
|
+
|
|
121
|
+
function freezeInTimezone(...args) {
|
|
122
|
+
if (!args.length && iana === timeZone) return freeze();
|
|
123
|
+
iana = timeZone;
|
|
124
|
+
return freeze(getTime(...args));
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
function travelInTimezone(...args) {
|
|
128
|
+
if (!args.length && iana === timeZone) return travel();
|
|
129
|
+
iana = timeZone;
|
|
130
|
+
return travel(getTime(...args));
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
function getTime(...args) {
|
|
134
|
+
const realDate = instantiate(Date, args);
|
|
135
|
+
const tz = new NativeDate(toUTC(formatter, realDate));
|
|
136
|
+
|
|
137
|
+
if (!args.length) return tz.getTime();
|
|
138
|
+
const currentTz = new NativeDate(toUTC(current, realDate));
|
|
139
|
+
|
|
140
|
+
return realDate.getTime() + currentTz.getTime() - tz.getTime();
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
function useFakeDate() {
|
|
145
|
+
Date = FakeDate; // eslint-disable-line no-global-assign
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
function useNativeDate() {
|
|
149
|
+
Date = NativeDate; // eslint-disable-line no-global-assign
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
function time() {
|
|
153
|
+
return traveledTo + (NativeDate.now() - started);
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
function instantiate(type, args) {
|
|
157
|
+
const ctorArgs = args.slice();
|
|
158
|
+
ctorArgs.unshift(null);
|
|
159
|
+
return new (Function.prototype.bind.apply(type, ctorArgs))();
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
function toUTC(formatter, dt) {
|
|
163
|
+
let year, month, day, hour, minute, second;
|
|
164
|
+
|
|
165
|
+
for (const {type, value} of formatter.formatToParts(dt)) {
|
|
166
|
+
switch (type) {
|
|
167
|
+
case 'year':
|
|
168
|
+
year = parseInt(value);
|
|
169
|
+
break;
|
|
170
|
+
case 'month':
|
|
171
|
+
month = parseInt(value) - 1;
|
|
172
|
+
break;
|
|
173
|
+
case 'day':
|
|
174
|
+
day = parseInt(value);
|
|
175
|
+
break;
|
|
176
|
+
case 'hour':
|
|
177
|
+
hour = parseInt(value) % 24;
|
|
178
|
+
break;
|
|
179
|
+
case 'minute':
|
|
180
|
+
minute = parseInt(value);
|
|
181
|
+
break;
|
|
182
|
+
case 'second':
|
|
183
|
+
second = parseInt(value);
|
|
184
|
+
break;
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
return NativeDate.UTC(year, month, day, hour, minute, second, dt.getMilliseconds());
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
exports.defrost = defrost;
|
|
192
|
+
exports.freeze = freeze;
|
|
193
|
+
exports.isKeepingTime = isKeepingTime;
|
|
194
|
+
exports.reset = reset;
|
|
195
|
+
exports.timezone = timezone;
|
|
196
|
+
exports.travel = travel;
|
package/index.d.ts
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Freeze point in time.
|
|
3
|
+
* @param args Same arguments as the `Date` constructor.
|
|
4
|
+
*/
|
|
5
|
+
export function freeze(...args: any[]): Date;
|
|
6
|
+
/**
|
|
7
|
+
* Defrost a frozen point in time.
|
|
8
|
+
* Used in combination with travelling will start ticking the clock.
|
|
9
|
+
*/
|
|
10
|
+
export function defrost(): void;
|
|
11
|
+
/**
|
|
12
|
+
* Time travel to another era.
|
|
13
|
+
* @param args Same arguments as Date constructor.
|
|
14
|
+
*/
|
|
15
|
+
export function travel(...args: any[]): Date;
|
|
16
|
+
/**
|
|
17
|
+
* Resets Date to current glory.
|
|
18
|
+
*/
|
|
19
|
+
export function reset(): void;
|
|
20
|
+
/**
|
|
21
|
+
* Utility function to see if we still travel or freeze time.
|
|
22
|
+
*/
|
|
23
|
+
export function isKeepingTime(): boolean;
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Timezone traveling
|
|
27
|
+
*/
|
|
28
|
+
interface TimezoneTraveling {
|
|
29
|
+
/** Timezone */
|
|
30
|
+
readonly timeZone: string;
|
|
31
|
+
defrost: typeof defrost;
|
|
32
|
+
reset: typeof reset;
|
|
33
|
+
isKeepingTime: typeof isKeepingTime;
|
|
34
|
+
freeze: typeof freeze;
|
|
35
|
+
travel: typeof travel;
|
|
36
|
+
/**
|
|
37
|
+
* Get timezone datetime in milliseconds, like Date.getTime
|
|
38
|
+
* @param args Same arguments as Date constructor.
|
|
39
|
+
* @returns number of milliseconds since the epoch (January 1, 1970, UTC)
|
|
40
|
+
*/
|
|
41
|
+
getTime: (...args: any[]) => number;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Freeze and travel in different time zones.
|
|
46
|
+
* @param timeZone
|
|
47
|
+
*/
|
|
48
|
+
export function timezone(timeZone: string): TimezoneTraveling;
|
package/index.js
CHANGED
|
@@ -4,8 +4,6 @@
|
|
|
4
4
|
* Veselin Todorov <hi@vesln.com>
|
|
5
5
|
* MIT License.
|
|
6
6
|
*/
|
|
7
|
-
'use strict';
|
|
8
|
-
|
|
9
7
|
const NativeDate = Date;
|
|
10
8
|
const nativeGetTimezoneOffset = NativeDate.prototype.getTimezoneOffset;
|
|
11
9
|
|
|
@@ -47,29 +45,27 @@ FakeDate.now = function() {
|
|
|
47
45
|
return time();
|
|
48
46
|
};
|
|
49
47
|
|
|
50
|
-
|
|
51
|
-
freeze,
|
|
52
|
-
defrost,
|
|
53
|
-
travel,
|
|
54
|
-
reset,
|
|
55
|
-
isKeepingTime,
|
|
56
|
-
timezone,
|
|
57
|
-
};
|
|
58
|
-
|
|
59
|
-
function freeze(...args) {
|
|
48
|
+
export function freeze(...args) {
|
|
60
49
|
useFakeDate();
|
|
61
50
|
freezedAt = instantiate(Date, args);
|
|
51
|
+
if (isNaN(freezedAt)) {
|
|
52
|
+
reset();
|
|
53
|
+
throw new TypeError('Chronokinesis cannot freeze to invalid date, check your arguments. Chronokinesis is reset');
|
|
54
|
+
}
|
|
62
55
|
return freezedAt;
|
|
63
56
|
}
|
|
64
57
|
|
|
65
|
-
function defrost() {
|
|
58
|
+
export function defrost() {
|
|
66
59
|
freezedAt = null;
|
|
67
60
|
}
|
|
68
61
|
|
|
69
|
-
function travel(...args) {
|
|
62
|
+
export function travel(...args) {
|
|
70
63
|
useFakeDate();
|
|
71
|
-
|
|
72
64
|
const travelToDate = instantiate(Date, args);
|
|
65
|
+
if (isNaN(travelToDate)) {
|
|
66
|
+
reset();
|
|
67
|
+
throw new TypeError('Chronokinesis cannot travel to invalid date, check your arguments. Chronokinesis is reset');
|
|
68
|
+
}
|
|
73
69
|
|
|
74
70
|
traveledTo = travelToDate.getTime();
|
|
75
71
|
started = NativeDate.now();
|
|
@@ -81,7 +77,7 @@ function travel(...args) {
|
|
|
81
77
|
return travelToDate;
|
|
82
78
|
}
|
|
83
79
|
|
|
84
|
-
function reset() {
|
|
80
|
+
export function reset() {
|
|
85
81
|
useNativeDate();
|
|
86
82
|
freezedAt = null;
|
|
87
83
|
started = null;
|
|
@@ -89,11 +85,11 @@ function reset() {
|
|
|
89
85
|
iana = null;
|
|
90
86
|
}
|
|
91
87
|
|
|
92
|
-
function isKeepingTime() {
|
|
88
|
+
export function isKeepingTime() {
|
|
93
89
|
return Date === FakeDate;
|
|
94
90
|
}
|
|
95
91
|
|
|
96
|
-
function timezone(timeZone) {
|
|
92
|
+
export function timezone(timeZone) {
|
|
97
93
|
const options = {
|
|
98
94
|
year: 'numeric',
|
|
99
95
|
month: 'numeric',
|
package/package.json
CHANGED
|
@@ -1,35 +1,36 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "chronokinesis",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "5.0.0",
|
|
4
4
|
"description": "Module for testing time-dependent code",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Pål Edman",
|
|
7
7
|
"url": "https://github.com/paed01"
|
|
8
8
|
},
|
|
9
9
|
"license": "MIT",
|
|
10
|
-
"
|
|
11
|
-
"
|
|
12
|
-
"
|
|
10
|
+
"type": "module",
|
|
11
|
+
"module": "index.js",
|
|
12
|
+
"main": "dist/main.cjs",
|
|
13
|
+
"browser": "dist/chronokinesis.cjs",
|
|
14
|
+
"jsnext:main": "index.js",
|
|
15
|
+
"sideEffects": true,
|
|
13
16
|
"repository": {
|
|
14
17
|
"type": "git",
|
|
15
18
|
"url": "git://github.com/paed01/chronokinesis"
|
|
16
19
|
},
|
|
17
|
-
"engines": {
|
|
18
|
-
"node": ">=12"
|
|
19
|
-
},
|
|
20
20
|
"scripts": {
|
|
21
|
-
"toc": "node generate-api-toc.
|
|
21
|
+
"toc": "node generate-api-toc.cjs",
|
|
22
22
|
"test": "mocha",
|
|
23
|
-
"
|
|
24
|
-
"test:lcov": "c8 -r lcov npm
|
|
25
|
-
"
|
|
23
|
+
"lint": "eslint . --cache",
|
|
24
|
+
"test:lcov": "c8 -r lcov -r text mocha && npm run lint",
|
|
25
|
+
"posttest": "npm run lint && npm run dist",
|
|
26
|
+
"prepack": "npm run dist",
|
|
27
|
+
"dist": "npm run toc && rollup -c"
|
|
26
28
|
},
|
|
27
29
|
"files": [
|
|
28
30
|
"index.js",
|
|
29
|
-
"
|
|
30
|
-
"dist/
|
|
31
|
-
"
|
|
32
|
-
"README.md"
|
|
31
|
+
"index.d.ts",
|
|
32
|
+
"dist/chronokinesis.cjs",
|
|
33
|
+
"dist/index.cjs"
|
|
33
34
|
],
|
|
34
35
|
"bugs": {
|
|
35
36
|
"url": "https://github.com/paed01/chronokinesis/issues"
|
|
@@ -47,18 +48,14 @@
|
|
|
47
48
|
"fake now"
|
|
48
49
|
],
|
|
49
50
|
"devDependencies": {
|
|
50
|
-
"@
|
|
51
|
-
"@babel/preset-env": "^7.12.1",
|
|
51
|
+
"@rollup/plugin-commonjs": "^24.0.1",
|
|
52
52
|
"c8": "^7.12.0",
|
|
53
53
|
"chai": "^4.3.7",
|
|
54
|
-
"coveralls": "^3.1.0",
|
|
55
54
|
"eslint": "^8.29.0",
|
|
56
55
|
"lodash.clonedeep": "^4.5.0",
|
|
57
56
|
"markdown-toc": "^1.2.0",
|
|
58
57
|
"mocha": "^10.1.0",
|
|
59
|
-
"moment": "^2.29.
|
|
60
|
-
"rollup": "^
|
|
61
|
-
"rollup-plugin-babel": "^4.4.0",
|
|
62
|
-
"rollup-plugin-commonjs": "^10.1.0"
|
|
58
|
+
"moment": "^2.29.4",
|
|
59
|
+
"rollup": "^3.7.0"
|
|
63
60
|
}
|
|
64
61
|
}
|
package/dist/chronokinesis.js
DELETED
|
@@ -1,315 +0,0 @@
|
|
|
1
|
-
var chronokinesis = (function (exports) {
|
|
2
|
-
'use strict';
|
|
3
|
-
|
|
4
|
-
function ownKeys(object, enumerableOnly) {
|
|
5
|
-
var keys = Object.keys(object);
|
|
6
|
-
if (Object.getOwnPropertySymbols) {
|
|
7
|
-
var symbols = Object.getOwnPropertySymbols(object);
|
|
8
|
-
enumerableOnly && (symbols = symbols.filter(function (sym) {
|
|
9
|
-
return Object.getOwnPropertyDescriptor(object, sym).enumerable;
|
|
10
|
-
})), keys.push.apply(keys, symbols);
|
|
11
|
-
}
|
|
12
|
-
return keys;
|
|
13
|
-
}
|
|
14
|
-
function _objectSpread2(target) {
|
|
15
|
-
for (var i = 1; i < arguments.length; i++) {
|
|
16
|
-
var source = null != arguments[i] ? arguments[i] : {};
|
|
17
|
-
i % 2 ? ownKeys(Object(source), !0).forEach(function (key) {
|
|
18
|
-
_defineProperty(target, key, source[key]);
|
|
19
|
-
}) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) {
|
|
20
|
-
Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));
|
|
21
|
-
});
|
|
22
|
-
}
|
|
23
|
-
return target;
|
|
24
|
-
}
|
|
25
|
-
function _defineProperty(obj, key, value) {
|
|
26
|
-
key = _toPropertyKey(key);
|
|
27
|
-
if (key in obj) {
|
|
28
|
-
Object.defineProperty(obj, key, {
|
|
29
|
-
value: value,
|
|
30
|
-
enumerable: true,
|
|
31
|
-
configurable: true,
|
|
32
|
-
writable: true
|
|
33
|
-
});
|
|
34
|
-
} else {
|
|
35
|
-
obj[key] = value;
|
|
36
|
-
}
|
|
37
|
-
return obj;
|
|
38
|
-
}
|
|
39
|
-
function _unsupportedIterableToArray(o, minLen) {
|
|
40
|
-
if (!o) return;
|
|
41
|
-
if (typeof o === "string") return _arrayLikeToArray(o, minLen);
|
|
42
|
-
var n = Object.prototype.toString.call(o).slice(8, -1);
|
|
43
|
-
if (n === "Object" && o.constructor) n = o.constructor.name;
|
|
44
|
-
if (n === "Map" || n === "Set") return Array.from(o);
|
|
45
|
-
if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);
|
|
46
|
-
}
|
|
47
|
-
function _arrayLikeToArray(arr, len) {
|
|
48
|
-
if (len == null || len > arr.length) len = arr.length;
|
|
49
|
-
for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];
|
|
50
|
-
return arr2;
|
|
51
|
-
}
|
|
52
|
-
function _createForOfIteratorHelper(o, allowArrayLike) {
|
|
53
|
-
var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"];
|
|
54
|
-
if (!it) {
|
|
55
|
-
if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") {
|
|
56
|
-
if (it) o = it;
|
|
57
|
-
var i = 0;
|
|
58
|
-
var F = function () {};
|
|
59
|
-
return {
|
|
60
|
-
s: F,
|
|
61
|
-
n: function () {
|
|
62
|
-
if (i >= o.length) return {
|
|
63
|
-
done: true
|
|
64
|
-
};
|
|
65
|
-
return {
|
|
66
|
-
done: false,
|
|
67
|
-
value: o[i++]
|
|
68
|
-
};
|
|
69
|
-
},
|
|
70
|
-
e: function (e) {
|
|
71
|
-
throw e;
|
|
72
|
-
},
|
|
73
|
-
f: F
|
|
74
|
-
};
|
|
75
|
-
}
|
|
76
|
-
throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
|
|
77
|
-
}
|
|
78
|
-
var normalCompletion = true,
|
|
79
|
-
didErr = false,
|
|
80
|
-
err;
|
|
81
|
-
return {
|
|
82
|
-
s: function () {
|
|
83
|
-
it = it.call(o);
|
|
84
|
-
},
|
|
85
|
-
n: function () {
|
|
86
|
-
var step = it.next();
|
|
87
|
-
normalCompletion = step.done;
|
|
88
|
-
return step;
|
|
89
|
-
},
|
|
90
|
-
e: function (e) {
|
|
91
|
-
didErr = true;
|
|
92
|
-
err = e;
|
|
93
|
-
},
|
|
94
|
-
f: function () {
|
|
95
|
-
try {
|
|
96
|
-
if (!normalCompletion && it.return != null) it.return();
|
|
97
|
-
} finally {
|
|
98
|
-
if (didErr) throw err;
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
};
|
|
102
|
-
}
|
|
103
|
-
function _toPrimitive(input, hint) {
|
|
104
|
-
if (typeof input !== "object" || input === null) return input;
|
|
105
|
-
var prim = input[Symbol.toPrimitive];
|
|
106
|
-
if (prim !== undefined) {
|
|
107
|
-
var res = prim.call(input, hint || "default");
|
|
108
|
-
if (typeof res !== "object") return res;
|
|
109
|
-
throw new TypeError("@@toPrimitive must return a primitive value.");
|
|
110
|
-
}
|
|
111
|
-
return (hint === "string" ? String : Number)(input);
|
|
112
|
-
}
|
|
113
|
-
function _toPropertyKey(arg) {
|
|
114
|
-
var key = _toPrimitive(arg, "string");
|
|
115
|
-
return typeof key === "symbol" ? key : String(key);
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
/**
|
|
119
|
-
* Inspired by Time keeper - EEasy testing of time-dependent code.
|
|
120
|
-
*
|
|
121
|
-
* Veselin Todorov <hi@vesln.com>
|
|
122
|
-
* MIT License.
|
|
123
|
-
*/
|
|
124
|
-
var NativeDate = Date;
|
|
125
|
-
var nativeGetTimezoneOffset = NativeDate.prototype.getTimezoneOffset;
|
|
126
|
-
var freezedAt = null;
|
|
127
|
-
var traveledTo = null;
|
|
128
|
-
var started = null;
|
|
129
|
-
var iana = null;
|
|
130
|
-
function FakeDate() {
|
|
131
|
-
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
|
|
132
|
-
args[_key] = arguments[_key];
|
|
133
|
-
}
|
|
134
|
-
var length = args.length;
|
|
135
|
-
if (!length) {
|
|
136
|
-
if (freezedAt) args = [freezedAt];else if (traveledTo) args = [time()];
|
|
137
|
-
}
|
|
138
|
-
var dt = instantiate(NativeDate, args);
|
|
139
|
-
Object.defineProperty(dt, 'getTimezoneOffset', {
|
|
140
|
-
enumerable: false,
|
|
141
|
-
value: function getTimezoneOffset() {
|
|
142
|
-
var curr = nativeGetTimezoneOffset.call(this);
|
|
143
|
-
if (!iana) return curr;
|
|
144
|
-
var tz = timezone(iana).getTime(this);
|
|
145
|
-
return Math.round((tz - this.getTime()) / 60000) + curr;
|
|
146
|
-
}
|
|
147
|
-
});
|
|
148
|
-
return dt;
|
|
149
|
-
}
|
|
150
|
-
FakeDate.UTC = NativeDate.UTC;
|
|
151
|
-
FakeDate.parse = NativeDate.parse;
|
|
152
|
-
FakeDate.prototype = NativeDate.prototype;
|
|
153
|
-
FakeDate.now = function () {
|
|
154
|
-
if (freezedAt) return freezedAt.getTime();
|
|
155
|
-
return time();
|
|
156
|
-
};
|
|
157
|
-
var chronokinesis = {
|
|
158
|
-
freeze: freeze,
|
|
159
|
-
defrost: defrost,
|
|
160
|
-
travel: travel,
|
|
161
|
-
reset: reset,
|
|
162
|
-
isKeepingTime: isKeepingTime,
|
|
163
|
-
timezone: timezone
|
|
164
|
-
};
|
|
165
|
-
function freeze() {
|
|
166
|
-
useFakeDate();
|
|
167
|
-
for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
|
|
168
|
-
args[_key2] = arguments[_key2];
|
|
169
|
-
}
|
|
170
|
-
freezedAt = instantiate(Date, args);
|
|
171
|
-
return freezedAt;
|
|
172
|
-
}
|
|
173
|
-
function defrost() {
|
|
174
|
-
freezedAt = null;
|
|
175
|
-
}
|
|
176
|
-
function travel() {
|
|
177
|
-
useFakeDate();
|
|
178
|
-
for (var _len3 = arguments.length, args = new Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {
|
|
179
|
-
args[_key3] = arguments[_key3];
|
|
180
|
-
}
|
|
181
|
-
var travelToDate = instantiate(Date, args);
|
|
182
|
-
traveledTo = travelToDate.getTime();
|
|
183
|
-
started = NativeDate.now();
|
|
184
|
-
if (freezedAt) {
|
|
185
|
-
freezedAt = travelToDate;
|
|
186
|
-
}
|
|
187
|
-
return travelToDate;
|
|
188
|
-
}
|
|
189
|
-
function reset() {
|
|
190
|
-
useNativeDate();
|
|
191
|
-
freezedAt = null;
|
|
192
|
-
started = null;
|
|
193
|
-
traveledTo = null;
|
|
194
|
-
iana = null;
|
|
195
|
-
}
|
|
196
|
-
function isKeepingTime() {
|
|
197
|
-
return Date === FakeDate;
|
|
198
|
-
}
|
|
199
|
-
function timezone(timeZone) {
|
|
200
|
-
var options = {
|
|
201
|
-
year: 'numeric',
|
|
202
|
-
month: 'numeric',
|
|
203
|
-
day: 'numeric',
|
|
204
|
-
hour: 'numeric',
|
|
205
|
-
minute: 'numeric',
|
|
206
|
-
second: 'numeric',
|
|
207
|
-
hour12: false
|
|
208
|
-
};
|
|
209
|
-
var current = Intl.DateTimeFormat('UTC', options);
|
|
210
|
-
var formatter = Intl.DateTimeFormat('UTC', _objectSpread2({
|
|
211
|
-
timeZone: timeZone
|
|
212
|
-
}, options));
|
|
213
|
-
return {
|
|
214
|
-
timeZone: timeZone,
|
|
215
|
-
defrost: defrost,
|
|
216
|
-
reset: reset,
|
|
217
|
-
isKeepingTime: isKeepingTime,
|
|
218
|
-
getTime: getTime,
|
|
219
|
-
freeze: freezeInTimezone,
|
|
220
|
-
travel: travelInTimezone
|
|
221
|
-
};
|
|
222
|
-
function freezeInTimezone() {
|
|
223
|
-
if (!arguments.length && iana === timeZone) return freeze();
|
|
224
|
-
iana = timeZone;
|
|
225
|
-
return freeze(getTime.apply(void 0, arguments));
|
|
226
|
-
}
|
|
227
|
-
function travelInTimezone() {
|
|
228
|
-
if (!arguments.length && iana === timeZone) return travel();
|
|
229
|
-
iana = timeZone;
|
|
230
|
-
return travel(getTime.apply(void 0, arguments));
|
|
231
|
-
}
|
|
232
|
-
function getTime() {
|
|
233
|
-
for (var _len4 = arguments.length, args = new Array(_len4), _key4 = 0; _key4 < _len4; _key4++) {
|
|
234
|
-
args[_key4] = arguments[_key4];
|
|
235
|
-
}
|
|
236
|
-
var realDate = instantiate(Date, args);
|
|
237
|
-
var tz = new NativeDate(toUTC(formatter, realDate));
|
|
238
|
-
if (!args.length) return tz.getTime();
|
|
239
|
-
var currentTz = new NativeDate(toUTC(current, realDate));
|
|
240
|
-
return realDate.getTime() + currentTz.getTime() - tz.getTime();
|
|
241
|
-
}
|
|
242
|
-
}
|
|
243
|
-
function useFakeDate() {
|
|
244
|
-
Date = FakeDate; // eslint-disable-line no-global-assign
|
|
245
|
-
}
|
|
246
|
-
|
|
247
|
-
function useNativeDate() {
|
|
248
|
-
Date = NativeDate; // eslint-disable-line no-global-assign
|
|
249
|
-
}
|
|
250
|
-
|
|
251
|
-
function time() {
|
|
252
|
-
return traveledTo + (NativeDate.now() - started);
|
|
253
|
-
}
|
|
254
|
-
function instantiate(type, args) {
|
|
255
|
-
var ctorArgs = args.slice();
|
|
256
|
-
ctorArgs.unshift(null);
|
|
257
|
-
return new (Function.prototype.bind.apply(type, ctorArgs))();
|
|
258
|
-
}
|
|
259
|
-
function toUTC(formatter, dt) {
|
|
260
|
-
var year, month, day, hour, minute, second;
|
|
261
|
-
var _iterator = _createForOfIteratorHelper(formatter.formatToParts(dt)),
|
|
262
|
-
_step;
|
|
263
|
-
try {
|
|
264
|
-
for (_iterator.s(); !(_step = _iterator.n()).done;) {
|
|
265
|
-
var _step$value = _step.value,
|
|
266
|
-
type = _step$value.type,
|
|
267
|
-
value = _step$value.value;
|
|
268
|
-
switch (type) {
|
|
269
|
-
case 'year':
|
|
270
|
-
year = parseInt(value);
|
|
271
|
-
break;
|
|
272
|
-
case 'month':
|
|
273
|
-
month = parseInt(value) - 1;
|
|
274
|
-
break;
|
|
275
|
-
case 'day':
|
|
276
|
-
day = parseInt(value);
|
|
277
|
-
break;
|
|
278
|
-
case 'hour':
|
|
279
|
-
hour = parseInt(value) % 24;
|
|
280
|
-
break;
|
|
281
|
-
case 'minute':
|
|
282
|
-
minute = parseInt(value);
|
|
283
|
-
break;
|
|
284
|
-
case 'second':
|
|
285
|
-
second = parseInt(value);
|
|
286
|
-
break;
|
|
287
|
-
}
|
|
288
|
-
}
|
|
289
|
-
} catch (err) {
|
|
290
|
-
_iterator.e(err);
|
|
291
|
-
} finally {
|
|
292
|
-
_iterator.f();
|
|
293
|
-
}
|
|
294
|
-
return NativeDate.UTC(year, month, day, hour, minute, second, dt.getMilliseconds());
|
|
295
|
-
}
|
|
296
|
-
var chronokinesis_1 = chronokinesis.freeze;
|
|
297
|
-
var chronokinesis_2 = chronokinesis.defrost;
|
|
298
|
-
var chronokinesis_3 = chronokinesis.travel;
|
|
299
|
-
var chronokinesis_4 = chronokinesis.reset;
|
|
300
|
-
var chronokinesis_5 = chronokinesis.isKeepingTime;
|
|
301
|
-
var chronokinesis_6 = chronokinesis.timezone;
|
|
302
|
-
|
|
303
|
-
exports["default"] = chronokinesis;
|
|
304
|
-
exports.defrost = chronokinesis_2;
|
|
305
|
-
exports.freeze = chronokinesis_1;
|
|
306
|
-
exports.isKeepingTime = chronokinesis_5;
|
|
307
|
-
exports.reset = chronokinesis_4;
|
|
308
|
-
exports.timezone = chronokinesis_6;
|
|
309
|
-
exports.travel = chronokinesis_3;
|
|
310
|
-
|
|
311
|
-
Object.defineProperty(exports, '__esModule', { value: true });
|
|
312
|
-
|
|
313
|
-
return exports;
|
|
314
|
-
|
|
315
|
-
})({});
|
package/dist/index.es.js
DELETED
|
@@ -1,300 +0,0 @@
|
|
|
1
|
-
function ownKeys(object, enumerableOnly) {
|
|
2
|
-
var keys = Object.keys(object);
|
|
3
|
-
if (Object.getOwnPropertySymbols) {
|
|
4
|
-
var symbols = Object.getOwnPropertySymbols(object);
|
|
5
|
-
enumerableOnly && (symbols = symbols.filter(function (sym) {
|
|
6
|
-
return Object.getOwnPropertyDescriptor(object, sym).enumerable;
|
|
7
|
-
})), keys.push.apply(keys, symbols);
|
|
8
|
-
}
|
|
9
|
-
return keys;
|
|
10
|
-
}
|
|
11
|
-
function _objectSpread2(target) {
|
|
12
|
-
for (var i = 1; i < arguments.length; i++) {
|
|
13
|
-
var source = null != arguments[i] ? arguments[i] : {};
|
|
14
|
-
i % 2 ? ownKeys(Object(source), !0).forEach(function (key) {
|
|
15
|
-
_defineProperty(target, key, source[key]);
|
|
16
|
-
}) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) {
|
|
17
|
-
Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));
|
|
18
|
-
});
|
|
19
|
-
}
|
|
20
|
-
return target;
|
|
21
|
-
}
|
|
22
|
-
function _defineProperty(obj, key, value) {
|
|
23
|
-
key = _toPropertyKey(key);
|
|
24
|
-
if (key in obj) {
|
|
25
|
-
Object.defineProperty(obj, key, {
|
|
26
|
-
value: value,
|
|
27
|
-
enumerable: true,
|
|
28
|
-
configurable: true,
|
|
29
|
-
writable: true
|
|
30
|
-
});
|
|
31
|
-
} else {
|
|
32
|
-
obj[key] = value;
|
|
33
|
-
}
|
|
34
|
-
return obj;
|
|
35
|
-
}
|
|
36
|
-
function _unsupportedIterableToArray(o, minLen) {
|
|
37
|
-
if (!o) return;
|
|
38
|
-
if (typeof o === "string") return _arrayLikeToArray(o, minLen);
|
|
39
|
-
var n = Object.prototype.toString.call(o).slice(8, -1);
|
|
40
|
-
if (n === "Object" && o.constructor) n = o.constructor.name;
|
|
41
|
-
if (n === "Map" || n === "Set") return Array.from(o);
|
|
42
|
-
if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);
|
|
43
|
-
}
|
|
44
|
-
function _arrayLikeToArray(arr, len) {
|
|
45
|
-
if (len == null || len > arr.length) len = arr.length;
|
|
46
|
-
for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];
|
|
47
|
-
return arr2;
|
|
48
|
-
}
|
|
49
|
-
function _createForOfIteratorHelper(o, allowArrayLike) {
|
|
50
|
-
var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"];
|
|
51
|
-
if (!it) {
|
|
52
|
-
if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") {
|
|
53
|
-
if (it) o = it;
|
|
54
|
-
var i = 0;
|
|
55
|
-
var F = function () {};
|
|
56
|
-
return {
|
|
57
|
-
s: F,
|
|
58
|
-
n: function () {
|
|
59
|
-
if (i >= o.length) return {
|
|
60
|
-
done: true
|
|
61
|
-
};
|
|
62
|
-
return {
|
|
63
|
-
done: false,
|
|
64
|
-
value: o[i++]
|
|
65
|
-
};
|
|
66
|
-
},
|
|
67
|
-
e: function (e) {
|
|
68
|
-
throw e;
|
|
69
|
-
},
|
|
70
|
-
f: F
|
|
71
|
-
};
|
|
72
|
-
}
|
|
73
|
-
throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
|
|
74
|
-
}
|
|
75
|
-
var normalCompletion = true,
|
|
76
|
-
didErr = false,
|
|
77
|
-
err;
|
|
78
|
-
return {
|
|
79
|
-
s: function () {
|
|
80
|
-
it = it.call(o);
|
|
81
|
-
},
|
|
82
|
-
n: function () {
|
|
83
|
-
var step = it.next();
|
|
84
|
-
normalCompletion = step.done;
|
|
85
|
-
return step;
|
|
86
|
-
},
|
|
87
|
-
e: function (e) {
|
|
88
|
-
didErr = true;
|
|
89
|
-
err = e;
|
|
90
|
-
},
|
|
91
|
-
f: function () {
|
|
92
|
-
try {
|
|
93
|
-
if (!normalCompletion && it.return != null) it.return();
|
|
94
|
-
} finally {
|
|
95
|
-
if (didErr) throw err;
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
};
|
|
99
|
-
}
|
|
100
|
-
function _toPrimitive(input, hint) {
|
|
101
|
-
if (typeof input !== "object" || input === null) return input;
|
|
102
|
-
var prim = input[Symbol.toPrimitive];
|
|
103
|
-
if (prim !== undefined) {
|
|
104
|
-
var res = prim.call(input, hint || "default");
|
|
105
|
-
if (typeof res !== "object") return res;
|
|
106
|
-
throw new TypeError("@@toPrimitive must return a primitive value.");
|
|
107
|
-
}
|
|
108
|
-
return (hint === "string" ? String : Number)(input);
|
|
109
|
-
}
|
|
110
|
-
function _toPropertyKey(arg) {
|
|
111
|
-
var key = _toPrimitive(arg, "string");
|
|
112
|
-
return typeof key === "symbol" ? key : String(key);
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
/**
|
|
116
|
-
* Inspired by Time keeper - EEasy testing of time-dependent code.
|
|
117
|
-
*
|
|
118
|
-
* Veselin Todorov <hi@vesln.com>
|
|
119
|
-
* MIT License.
|
|
120
|
-
*/
|
|
121
|
-
var NativeDate = Date;
|
|
122
|
-
var nativeGetTimezoneOffset = NativeDate.prototype.getTimezoneOffset;
|
|
123
|
-
var freezedAt = null;
|
|
124
|
-
var traveledTo = null;
|
|
125
|
-
var started = null;
|
|
126
|
-
var iana = null;
|
|
127
|
-
function FakeDate() {
|
|
128
|
-
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
|
|
129
|
-
args[_key] = arguments[_key];
|
|
130
|
-
}
|
|
131
|
-
var length = args.length;
|
|
132
|
-
if (!length) {
|
|
133
|
-
if (freezedAt) args = [freezedAt];else if (traveledTo) args = [time()];
|
|
134
|
-
}
|
|
135
|
-
var dt = instantiate(NativeDate, args);
|
|
136
|
-
Object.defineProperty(dt, 'getTimezoneOffset', {
|
|
137
|
-
enumerable: false,
|
|
138
|
-
value: function getTimezoneOffset() {
|
|
139
|
-
var curr = nativeGetTimezoneOffset.call(this);
|
|
140
|
-
if (!iana) return curr;
|
|
141
|
-
var tz = timezone(iana).getTime(this);
|
|
142
|
-
return Math.round((tz - this.getTime()) / 60000) + curr;
|
|
143
|
-
}
|
|
144
|
-
});
|
|
145
|
-
return dt;
|
|
146
|
-
}
|
|
147
|
-
FakeDate.UTC = NativeDate.UTC;
|
|
148
|
-
FakeDate.parse = NativeDate.parse;
|
|
149
|
-
FakeDate.prototype = NativeDate.prototype;
|
|
150
|
-
FakeDate.now = function () {
|
|
151
|
-
if (freezedAt) return freezedAt.getTime();
|
|
152
|
-
return time();
|
|
153
|
-
};
|
|
154
|
-
var chronokinesis = {
|
|
155
|
-
freeze: freeze,
|
|
156
|
-
defrost: defrost,
|
|
157
|
-
travel: travel,
|
|
158
|
-
reset: reset,
|
|
159
|
-
isKeepingTime: isKeepingTime,
|
|
160
|
-
timezone: timezone
|
|
161
|
-
};
|
|
162
|
-
function freeze() {
|
|
163
|
-
useFakeDate();
|
|
164
|
-
for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
|
|
165
|
-
args[_key2] = arguments[_key2];
|
|
166
|
-
}
|
|
167
|
-
freezedAt = instantiate(Date, args);
|
|
168
|
-
return freezedAt;
|
|
169
|
-
}
|
|
170
|
-
function defrost() {
|
|
171
|
-
freezedAt = null;
|
|
172
|
-
}
|
|
173
|
-
function travel() {
|
|
174
|
-
useFakeDate();
|
|
175
|
-
for (var _len3 = arguments.length, args = new Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {
|
|
176
|
-
args[_key3] = arguments[_key3];
|
|
177
|
-
}
|
|
178
|
-
var travelToDate = instantiate(Date, args);
|
|
179
|
-
traveledTo = travelToDate.getTime();
|
|
180
|
-
started = NativeDate.now();
|
|
181
|
-
if (freezedAt) {
|
|
182
|
-
freezedAt = travelToDate;
|
|
183
|
-
}
|
|
184
|
-
return travelToDate;
|
|
185
|
-
}
|
|
186
|
-
function reset() {
|
|
187
|
-
useNativeDate();
|
|
188
|
-
freezedAt = null;
|
|
189
|
-
started = null;
|
|
190
|
-
traveledTo = null;
|
|
191
|
-
iana = null;
|
|
192
|
-
}
|
|
193
|
-
function isKeepingTime() {
|
|
194
|
-
return Date === FakeDate;
|
|
195
|
-
}
|
|
196
|
-
function timezone(timeZone) {
|
|
197
|
-
var options = {
|
|
198
|
-
year: 'numeric',
|
|
199
|
-
month: 'numeric',
|
|
200
|
-
day: 'numeric',
|
|
201
|
-
hour: 'numeric',
|
|
202
|
-
minute: 'numeric',
|
|
203
|
-
second: 'numeric',
|
|
204
|
-
hour12: false
|
|
205
|
-
};
|
|
206
|
-
var current = Intl.DateTimeFormat('UTC', options);
|
|
207
|
-
var formatter = Intl.DateTimeFormat('UTC', _objectSpread2({
|
|
208
|
-
timeZone: timeZone
|
|
209
|
-
}, options));
|
|
210
|
-
return {
|
|
211
|
-
timeZone: timeZone,
|
|
212
|
-
defrost: defrost,
|
|
213
|
-
reset: reset,
|
|
214
|
-
isKeepingTime: isKeepingTime,
|
|
215
|
-
getTime: getTime,
|
|
216
|
-
freeze: freezeInTimezone,
|
|
217
|
-
travel: travelInTimezone
|
|
218
|
-
};
|
|
219
|
-
function freezeInTimezone() {
|
|
220
|
-
if (!arguments.length && iana === timeZone) return freeze();
|
|
221
|
-
iana = timeZone;
|
|
222
|
-
return freeze(getTime.apply(void 0, arguments));
|
|
223
|
-
}
|
|
224
|
-
function travelInTimezone() {
|
|
225
|
-
if (!arguments.length && iana === timeZone) return travel();
|
|
226
|
-
iana = timeZone;
|
|
227
|
-
return travel(getTime.apply(void 0, arguments));
|
|
228
|
-
}
|
|
229
|
-
function getTime() {
|
|
230
|
-
for (var _len4 = arguments.length, args = new Array(_len4), _key4 = 0; _key4 < _len4; _key4++) {
|
|
231
|
-
args[_key4] = arguments[_key4];
|
|
232
|
-
}
|
|
233
|
-
var realDate = instantiate(Date, args);
|
|
234
|
-
var tz = new NativeDate(toUTC(formatter, realDate));
|
|
235
|
-
if (!args.length) return tz.getTime();
|
|
236
|
-
var currentTz = new NativeDate(toUTC(current, realDate));
|
|
237
|
-
return realDate.getTime() + currentTz.getTime() - tz.getTime();
|
|
238
|
-
}
|
|
239
|
-
}
|
|
240
|
-
function useFakeDate() {
|
|
241
|
-
Date = FakeDate; // eslint-disable-line no-global-assign
|
|
242
|
-
}
|
|
243
|
-
|
|
244
|
-
function useNativeDate() {
|
|
245
|
-
Date = NativeDate; // eslint-disable-line no-global-assign
|
|
246
|
-
}
|
|
247
|
-
|
|
248
|
-
function time() {
|
|
249
|
-
return traveledTo + (NativeDate.now() - started);
|
|
250
|
-
}
|
|
251
|
-
function instantiate(type, args) {
|
|
252
|
-
var ctorArgs = args.slice();
|
|
253
|
-
ctorArgs.unshift(null);
|
|
254
|
-
return new (Function.prototype.bind.apply(type, ctorArgs))();
|
|
255
|
-
}
|
|
256
|
-
function toUTC(formatter, dt) {
|
|
257
|
-
var year, month, day, hour, minute, second;
|
|
258
|
-
var _iterator = _createForOfIteratorHelper(formatter.formatToParts(dt)),
|
|
259
|
-
_step;
|
|
260
|
-
try {
|
|
261
|
-
for (_iterator.s(); !(_step = _iterator.n()).done;) {
|
|
262
|
-
var _step$value = _step.value,
|
|
263
|
-
type = _step$value.type,
|
|
264
|
-
value = _step$value.value;
|
|
265
|
-
switch (type) {
|
|
266
|
-
case 'year':
|
|
267
|
-
year = parseInt(value);
|
|
268
|
-
break;
|
|
269
|
-
case 'month':
|
|
270
|
-
month = parseInt(value) - 1;
|
|
271
|
-
break;
|
|
272
|
-
case 'day':
|
|
273
|
-
day = parseInt(value);
|
|
274
|
-
break;
|
|
275
|
-
case 'hour':
|
|
276
|
-
hour = parseInt(value) % 24;
|
|
277
|
-
break;
|
|
278
|
-
case 'minute':
|
|
279
|
-
minute = parseInt(value);
|
|
280
|
-
break;
|
|
281
|
-
case 'second':
|
|
282
|
-
second = parseInt(value);
|
|
283
|
-
break;
|
|
284
|
-
}
|
|
285
|
-
}
|
|
286
|
-
} catch (err) {
|
|
287
|
-
_iterator.e(err);
|
|
288
|
-
} finally {
|
|
289
|
-
_iterator.f();
|
|
290
|
-
}
|
|
291
|
-
return NativeDate.UTC(year, month, day, hour, minute, second, dt.getMilliseconds());
|
|
292
|
-
}
|
|
293
|
-
var chronokinesis_1 = chronokinesis.freeze;
|
|
294
|
-
var chronokinesis_2 = chronokinesis.defrost;
|
|
295
|
-
var chronokinesis_3 = chronokinesis.travel;
|
|
296
|
-
var chronokinesis_4 = chronokinesis.reset;
|
|
297
|
-
var chronokinesis_5 = chronokinesis.isKeepingTime;
|
|
298
|
-
var chronokinesis_6 = chronokinesis.timezone;
|
|
299
|
-
|
|
300
|
-
export { chronokinesis as default, chronokinesis_2 as defrost, chronokinesis_1 as freeze, chronokinesis_5 as isKeepingTime, chronokinesis_4 as reset, chronokinesis_6 as timezone, chronokinesis_3 as travel };
|