UNPKG

3.43 kBJavaScriptView Raw
1'use strict';
2
3Object.defineProperty(exports, "__esModule", {
4 value: true
5});
6exports.tzFromOffset = tzFromOffset;
7exports.default = Time;
8
9var _lodash = require('lodash');
10
11var _lodash2 = _interopRequireDefault(_lodash);
12
13var _errors = require('./errors');
14
15var _moment = require('moment');
16
17var _moment2 = _interopRequireDefault(_moment);
18
19var _timezones = require('./timezones');
20
21var _timezones2 = _interopRequireDefault(_timezones);
22
23function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
24
25// From 'moment/src/lib/parse/regex.js'
26var OFFSET_REGEX = /Z|[+-]\d\d:?\d\d/gi; // +00:00 -00:00 +0000 -0000 or Z
27
28function tzFromOffset(offset) {
29 if (_lodash2.default.isInteger(offset)) {
30 var sign = offset >= 0 ? '+' : '-';
31 var abs = Math.abs(offset);
32 // If the offset belongs to [-15, 15] it is considered to represent hours
33 // This reproduces Moment's utcOffset behaviour.
34 if (abs < 16) return '' + sign + _lodash2.default.padStart(abs, 2, '0') + ':00';
35 return '' + sign + _lodash2.default.padStart(Math.floor(abs / 60), 2, '0') + ':' + _lodash2.default.padStart(abs % 60, 2, '0');
36 } else {
37 return offset;
38 }
39}
40
41function Time() {
42 var t = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : undefined;
43 var tz = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : undefined;
44
45 // Make sure it works with or without new.
46 if (!(this instanceof Time)) {
47 return new Time(t, tz);
48 }
49
50 var m = void 0;
51 if (t instanceof Time) {
52 // t is an instance of Time
53 m = _moment2.default.unix(t.timestamp);
54 m.utcOffset(t.timezone);
55 } else if (t instanceof _moment2.default) {
56 // t is an instance of moment
57 m = t;
58 } else if (_lodash2.default.isDate(t)) {
59 // t is a js Date
60 m = (0, _moment2.default)(t);
61 } else if (_lodash2.default.isNumber(t)) {
62 // t is a posix timestamp
63 // it might be a float as retrieved by Date.now() / 1000
64 m = _moment2.default.unix(t);
65 } else if (_lodash2.default.isString(t)) {
66 // To make it consistent everywhere we only handle ISO 8601 format
67 if (t.match(OFFSET_REGEX)) {
68 // String with a explicit offset
69 m = _moment2.default.parseZone(t, _moment2.default.ISO_8601);
70 } else {
71 // No explicit offset
72 m = (0, _moment2.default)(t, _moment2.default.ISO_8601);
73 }
74 } else if (_lodash2.default.isUndefined(t)) {
75 m = (0, _moment2.default)();
76 }
77
78 if (m === undefined || !m.isValid()) {
79 throw new _errors.CraftAiTimeError('Time error, given "' + t + '" is invalid.');
80 }
81
82 if (tz) {
83 // tz formats should be parseable by moment
84 if (!(0, _timezones2.default)(tz)) {
85 throw new _errors.CraftAiTimeError('Time error, the given timezone "' + tz + '" is invalid.\n Please refer to the client\'s documentation to see accepted formats:\n https://beta.craft.ai/doc/http#context-properties-types.');
86 }
87 m.utcOffset(_timezones.timezones[tz] || tz);
88 }
89
90 var minuteOffset = m.utcOffset();
91
92 return _lodash2.default.extend(this, {
93 timestamp: m.unix(),
94 timezone: tzFromOffset(minuteOffset),
95 time_of_day: m.hour() + m.minute() / 60 + m.second() / 3600,
96 day_of_month: m.date(), // we want day to be in [1;31]
97 month_of_year: m.month() + 1, // we want months to be in [1;12]
98 day_of_week: m.isoWeekday() - 1, // we want week day to be in [0;6]
99 utc: m.toISOString()
100 });
101}
\No newline at end of file