date-and-time 0.14.2 → 2.0.1

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.
Files changed (133) hide show
  1. package/EXTEND.md +29 -11
  2. package/LOCALE.md +19 -34
  3. package/PLUGINS.md +222 -113
  4. package/README.md +203 -171
  5. package/date-and-time.js +171 -147
  6. package/date-and-time.min.js +14 -14
  7. package/esm/date-and-time.es.js +466 -0
  8. package/esm/date-and-time.es.min.js +17 -0
  9. package/esm/date-and-time.mjs +466 -0
  10. package/esm/locale/ar.es.js +39 -0
  11. package/esm/locale/ar.mjs +39 -0
  12. package/esm/locale/az.es.js +44 -0
  13. package/esm/locale/az.mjs +44 -0
  14. package/esm/locale/bn.es.js +50 -0
  15. package/esm/locale/bn.mjs +50 -0
  16. package/esm/locale/cs.es.js +22 -0
  17. package/esm/locale/cs.mjs +22 -0
  18. package/esm/locale/de.es.js +23 -0
  19. package/esm/locale/de.mjs +23 -0
  20. package/esm/locale/dk.es.js +22 -0
  21. package/esm/locale/dk.mjs +22 -0
  22. package/esm/locale/el.es.js +44 -0
  23. package/esm/locale/el.mjs +44 -0
  24. package/esm/locale/en.es.js +13 -0
  25. package/esm/locale/en.mjs +13 -0
  26. package/esm/locale/es.es.js +42 -0
  27. package/esm/locale/es.mjs +42 -0
  28. package/esm/locale/fa.es.js +39 -0
  29. package/esm/locale/fa.mjs +39 -0
  30. package/esm/locale/fr.es.js +23 -0
  31. package/esm/locale/fr.mjs +23 -0
  32. package/esm/locale/hi.es.js +50 -0
  33. package/esm/locale/hi.mjs +50 -0
  34. package/esm/locale/hu.es.js +23 -0
  35. package/esm/locale/hu.mjs +23 -0
  36. package/esm/locale/id.es.js +46 -0
  37. package/esm/locale/id.mjs +46 -0
  38. package/esm/locale/it.es.js +23 -0
  39. package/esm/locale/it.mjs +23 -0
  40. package/esm/locale/ja.es.js +31 -0
  41. package/esm/locale/ja.mjs +31 -0
  42. package/esm/locale/jv.es.js +46 -0
  43. package/esm/locale/jv.mjs +46 -0
  44. package/esm/locale/ko.es.js +23 -0
  45. package/esm/locale/ko.mjs +23 -0
  46. package/esm/locale/my.es.js +38 -0
  47. package/esm/locale/my.mjs +38 -0
  48. package/esm/locale/nl.es.js +37 -0
  49. package/esm/locale/nl.mjs +37 -0
  50. package/esm/locale/pa-in.es.js +62 -0
  51. package/esm/locale/pa-in.mjs +62 -0
  52. package/esm/locale/pl.es.js +37 -0
  53. package/esm/locale/pl.mjs +37 -0
  54. package/esm/locale/pt.es.js +44 -0
  55. package/esm/locale/pt.mjs +44 -0
  56. package/esm/locale/ro.es.js +22 -0
  57. package/esm/locale/ro.mjs +22 -0
  58. package/esm/locale/ru.es.js +44 -0
  59. package/esm/locale/ru.mjs +44 -0
  60. package/esm/locale/rw.es.js +22 -0
  61. package/esm/locale/rw.mjs +22 -0
  62. package/esm/locale/sr.es.js +22 -0
  63. package/esm/locale/sr.mjs +22 -0
  64. package/esm/locale/th.es.js +23 -0
  65. package/esm/locale/th.mjs +23 -0
  66. package/esm/locale/tr.es.js +22 -0
  67. package/esm/locale/tr.mjs +22 -0
  68. package/esm/locale/uk.es.js +57 -0
  69. package/esm/locale/uk.mjs +57 -0
  70. package/esm/locale/uz.es.js +22 -0
  71. package/esm/locale/uz.mjs +22 -0
  72. package/esm/locale/vi.es.js +23 -0
  73. package/esm/locale/vi.mjs +23 -0
  74. package/esm/locale/zh-cn.es.js +48 -0
  75. package/esm/locale/zh-cn.mjs +48 -0
  76. package/esm/locale/zh-tw.es.js +46 -0
  77. package/esm/locale/zh-tw.mjs +46 -0
  78. package/esm/plugin/day-of-week.es.js +19 -0
  79. package/esm/plugin/day-of-week.mjs +19 -0
  80. package/esm/plugin/meridiem.es.js +47 -0
  81. package/esm/plugin/meridiem.mjs +47 -0
  82. package/esm/plugin/microsecond.es.js +31 -0
  83. package/esm/plugin/microsecond.mjs +31 -0
  84. package/esm/plugin/ordinal.es.js +34 -0
  85. package/esm/plugin/ordinal.mjs +34 -0
  86. package/esm/plugin/timespan.es.js +75 -0
  87. package/esm/plugin/timespan.mjs +75 -0
  88. package/esm/plugin/timezone.es.js +73 -0
  89. package/esm/plugin/timezone.mjs +73 -0
  90. package/esm/plugin/two-digit-year.es.js +21 -0
  91. package/esm/plugin/two-digit-year.mjs +21 -0
  92. package/locale/ar.js +14 -19
  93. package/locale/az.js +14 -19
  94. package/locale/bn.js +14 -19
  95. package/locale/cs.js +14 -19
  96. package/locale/de.js +15 -20
  97. package/locale/dk.js +15 -20
  98. package/locale/el.js +21 -24
  99. package/locale/en.js +17 -19
  100. package/locale/es.js +14 -19
  101. package/locale/fa.js +14 -19
  102. package/locale/fr.js +14 -19
  103. package/locale/hi.js +14 -19
  104. package/locale/hu.js +14 -19
  105. package/locale/id.js +14 -19
  106. package/locale/it.js +14 -19
  107. package/locale/ja.js +14 -19
  108. package/locale/jv.js +14 -19
  109. package/locale/ko.js +14 -19
  110. package/locale/my.js +14 -19
  111. package/locale/nl.js +20 -23
  112. package/locale/pa-in.js +14 -19
  113. package/locale/pl.js +20 -23
  114. package/locale/pt.js +14 -19
  115. package/locale/ro.js +15 -20
  116. package/locale/ru.js +14 -19
  117. package/locale/rw.js +30 -0
  118. package/locale/sr.js +14 -19
  119. package/locale/th.js +14 -19
  120. package/locale/tr.js +14 -19
  121. package/locale/uk.js +23 -26
  122. package/locale/uz.js +14 -19
  123. package/locale/vi.js +14 -19
  124. package/locale/zh-cn.js +14 -19
  125. package/locale/zh-tw.js +14 -19
  126. package/package.json +26 -11
  127. package/plugin/day-of-week.js +13 -14
  128. package/plugin/meridiem.js +32 -24
  129. package/plugin/microsecond.js +14 -15
  130. package/plugin/ordinal.js +13 -14
  131. package/plugin/timespan.js +13 -14
  132. package/plugin/timezone.js +81 -0
  133. package/plugin/two-digit-year.js +13 -19
@@ -0,0 +1,466 @@
1
+ /**
2
+ * @preserve date-and-time (c) KNOWLEDGECODE | MIT
3
+ */
4
+
5
+ var locales = {},
6
+ plugins = {},
7
+ lang = 'en',
8
+ _res = {
9
+ MMMM: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],
10
+ MMM: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],
11
+ dddd: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],
12
+ ddd: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],
13
+ dd: ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa'],
14
+ A: ['AM', 'PM']
15
+ },
16
+ _formatter = {
17
+ YYYY: function (d/*, formatString*/) { return ('000' + d.getFullYear()).slice(-4); },
18
+ YY: function (d/*, formatString*/) { return ('0' + d.getFullYear()).slice(-2); },
19
+ Y: function (d/*, formatString*/) { return '' + d.getFullYear(); },
20
+ MMMM: function (d/*, formatString*/) { return this.res.MMMM[d.getMonth()]; },
21
+ MMM: function (d/*, formatString*/) { return this.res.MMM[d.getMonth()]; },
22
+ MM: function (d/*, formatString*/) { return ('0' + (d.getMonth() + 1)).slice(-2); },
23
+ M: function (d/*, formatString*/) { return '' + (d.getMonth() + 1); },
24
+ DD: function (d/*, formatString*/) { return ('0' + d.getDate()).slice(-2); },
25
+ D: function (d/*, formatString*/) { return '' + d.getDate(); },
26
+ HH: function (d/*, formatString*/) { return ('0' + d.getHours()).slice(-2); },
27
+ H: function (d/*, formatString*/) { return '' + d.getHours(); },
28
+ A: function (d/*, formatString*/) { return this.res.A[d.getHours() > 11 | 0]; },
29
+ hh: function (d/*, formatString*/) { return ('0' + (d.getHours() % 12 || 12)).slice(-2); },
30
+ h: function (d/*, formatString*/) { return '' + (d.getHours() % 12 || 12); },
31
+ mm: function (d/*, formatString*/) { return ('0' + d.getMinutes()).slice(-2); },
32
+ m: function (d/*, formatString*/) { return '' + d.getMinutes(); },
33
+ ss: function (d/*, formatString*/) { return ('0' + d.getSeconds()).slice(-2); },
34
+ s: function (d/*, formatString*/) { return '' + d.getSeconds(); },
35
+ SSS: function (d/*, formatString*/) { return ('00' + d.getMilliseconds()).slice(-3); },
36
+ SS: function (d/*, formatString*/) { return ('0' + (d.getMilliseconds() / 10 | 0)).slice(-2); },
37
+ S: function (d/*, formatString*/) { return '' + (d.getMilliseconds() / 100 | 0); },
38
+ dddd: function (d/*, formatString*/) { return this.res.dddd[d.getDay()]; },
39
+ ddd: function (d/*, formatString*/) { return this.res.ddd[d.getDay()]; },
40
+ dd: function (d/*, formatString*/) { return this.res.dd[d.getDay()]; },
41
+ Z: function (d/*, formatString*/) {
42
+ var offset = d.getTimezoneOffset() / 0.6 | 0;
43
+ return (offset > 0 ? '-' : '+') + ('000' + Math.abs(offset - (offset % 100 * 0.4 | 0))).slice(-4);
44
+ },
45
+ post: function (str) { return str; },
46
+ res: _res
47
+ },
48
+ _parser = {
49
+ YYYY: function (str/*, formatString */) { return this.exec(/^\d{4}/, str); },
50
+ Y: function (str/*, formatString */) { return this.exec(/^\d{1,4}/, str); },
51
+ MMMM: function (str/*, formatString */) {
52
+ var result = this.find(this.res.MMMM, str);
53
+ result.value++;
54
+ return result;
55
+ },
56
+ MMM: function (str/*, formatString */) {
57
+ var result = this.find(this.res.MMM, str);
58
+ result.value++;
59
+ return result;
60
+ },
61
+ MM: function (str/*, formatString */) { return this.exec(/^\d\d/, str); },
62
+ M: function (str/*, formatString */) { return this.exec(/^\d\d?/, str); },
63
+ DD: function (str/*, formatString */) { return this.exec(/^\d\d/, str); },
64
+ D: function (str/*, formatString */) { return this.exec(/^\d\d?/, str); },
65
+ HH: function (str/*, formatString */) { return this.exec(/^\d\d/, str); },
66
+ H: function (str/*, formatString */) { return this.exec(/^\d\d?/, str); },
67
+ A: function (str/*, formatString */) { return this.find(this.res.A, str); },
68
+ hh: function (str/*, formatString */) { return this.exec(/^\d\d/, str); },
69
+ h: function (str/*, formatString */) { return this.exec(/^\d\d?/, str); },
70
+ mm: function (str/*, formatString */) { return this.exec(/^\d\d/, str); },
71
+ m: function (str/*, formatString */) { return this.exec(/^\d\d?/, str); },
72
+ ss: function (str/*, formatString */) { return this.exec(/^\d\d/, str); },
73
+ s: function (str/*, formatString */) { return this.exec(/^\d\d?/, str); },
74
+ SSS: function (str/*, formatString */) { return this.exec(/^\d{1,3}/, str); },
75
+ SS: function (str/*, formatString */) {
76
+ var result = this.exec(/^\d\d?/, str);
77
+ result.value *= 10;
78
+ return result;
79
+ },
80
+ S: function (str/*, formatString */) {
81
+ var result = this.exec(/^\d/, str);
82
+ result.value *= 100;
83
+ return result;
84
+ },
85
+ Z: function (str/*, formatString */) {
86
+ var result = this.exec(/^[\+-]\d{2}[0-5]\d/, str);
87
+ result.value = (result.value / 100 | 0) * -60 - result.value % 100;
88
+ return result;
89
+ },
90
+ h12: function (h, a) { return (h === 12 ? 0 : h) + a * 12; },
91
+ exec: function (re, str) {
92
+ var result = (re.exec(str) || [''])[0];
93
+ return { value: result | 0, length: result.length };
94
+ },
95
+ find: function (array, str) {
96
+ var index = -1, length = 0;
97
+
98
+ for (var i = 0, len = array.length, item; i < len; i++) {
99
+ item = array[i];
100
+ if (!str.indexOf(item) && item.length > length) {
101
+ index = i;
102
+ length = item.length;
103
+ }
104
+ }
105
+ return { value: index, length: length };
106
+ },
107
+ pre: function (str) { return str; },
108
+ res: _res
109
+ },
110
+ extend = function (base, props, override, res) {
111
+ var obj = {}, key;
112
+
113
+ for (key in base) {
114
+ obj[key] = base[key];
115
+ }
116
+ for (key in props || {}) {
117
+ if (!(!!override ^ !!obj[key])) {
118
+ obj[key] = props[key];
119
+ }
120
+ }
121
+ if (res) {
122
+ obj.res = res;
123
+ }
124
+ return obj;
125
+ };
126
+
127
+ var proto = {
128
+ _formatter: _formatter,
129
+ _parser: _parser
130
+ };
131
+
132
+ /**
133
+ * Compiling a format string
134
+ * @param {string} formatString - a format string
135
+ * @returns {Array.<string>} a compiled object
136
+ */
137
+ proto.compile = function (formatString) {
138
+ var re = /\[([^\[\]]|\[[^\[\]]*])*]|([A-Za-z])\2+|\.{3}|./g, keys, pattern = [formatString];
139
+
140
+ while ((keys = re.exec(formatString))) {
141
+ pattern[pattern.length] = keys[0];
142
+ }
143
+ return pattern;
144
+ };
145
+
146
+ /**
147
+ * Formatting a Date and Time
148
+ * @param {Date} dateObj - a Date object
149
+ * @param {string|Array.<string>} arg - a format string or its compiled object
150
+ * @param {boolean} [utc] - output as UTC
151
+ * @returns {string} a formatted string
152
+ */
153
+ proto.format = function (dateObj, arg, utc) {
154
+ var pattern = typeof arg === 'string' ? this.compile(arg) : arg,
155
+ offset = dateObj.getTimezoneOffset(),
156
+ d = this.addMinutes(dateObj, utc ? offset : 0),
157
+ formatter = this._formatter, str = '';
158
+
159
+ d.getTimezoneOffset = function () { return utc ? 0 : offset; };
160
+ for (var i = 1, len = pattern.length, token; i < len; i++) {
161
+ token = pattern[i];
162
+ str += formatter[token] ? formatter.post(formatter[token](d, pattern[0])) : token.replace(/\[(.*)]/, '$1');
163
+ }
164
+ return str;
165
+ };
166
+
167
+ /**
168
+ * Pre-parsing a Date and Time string
169
+ * @param {string} dateString - a date string
170
+ * @param {string|Array.<string>} arg - a format string or its compiled object
171
+ * @returns {Object} a date structure
172
+ */
173
+ proto.preparse = function (dateString, arg) {
174
+ var pattern = typeof arg === 'string' ? this.compile(arg) : arg,
175
+ dt = { Y: 1970, M: 1, D: 1, H: 0, A: 0, h: 0, m: 0, s: 0, S: 0, Z: 0, _index: 0, _length: 0, _match: 0 },
176
+ comment = /\[(.*)]/, parser = this._parser, offset = 0;
177
+
178
+ dateString = parser.pre(dateString);
179
+ for (var i = 1, len = pattern.length, token, result; i < len; i++) {
180
+ token = pattern[i];
181
+ if (parser[token]) {
182
+ result = parser[token](dateString.slice(offset), pattern[0]);
183
+ if (!result.length) {
184
+ break;
185
+ }
186
+ offset += result.length;
187
+ dt[result.token || token.charAt(0)] = result.value;
188
+ dt._match++;
189
+ } else if (token === dateString.charAt(offset) || token === ' ') {
190
+ offset++;
191
+ } else if (comment.test(token) && !dateString.slice(offset).indexOf(comment.exec(token)[1])) {
192
+ offset += token.length - 2;
193
+ } else if (token === '...') {
194
+ offset = dateString.length;
195
+ break;
196
+ } else {
197
+ break;
198
+ }
199
+ }
200
+ dt.H = dt.H || parser.h12(dt.h, dt.A);
201
+ dt._index = offset;
202
+ dt._length = dateString.length;
203
+ return dt;
204
+ };
205
+
206
+ /**
207
+ * Parsing a Date and Time string
208
+ * @param {string} dateString - a date string
209
+ * @param {string|Array.<string>} arg - a format string or its compiled object
210
+ * @param {boolean} [utc] - input as UTC
211
+ * @returns {Date} a constructed date
212
+ */
213
+ proto.parse = function (dateString, arg, utc) {
214
+ var dt = this.preparse(dateString, arg);
215
+
216
+ if (this.isValid(dt)) {
217
+ dt.M -= dt.Y < 100 ? 22801 : 1; // 22801 = 1900 * 12 + 1
218
+ if (utc || dt.Z) {
219
+ return new Date(Date.UTC(dt.Y, dt.M, dt.D, dt.H, dt.m + dt.Z, dt.s, dt.S));
220
+ }
221
+ return new Date(dt.Y, dt.M, dt.D, dt.H, dt.m, dt.s, dt.S);
222
+ }
223
+ return new Date(NaN);
224
+ };
225
+
226
+ /**
227
+ * Validation
228
+ * @param {Object|string} arg1 - a date structure or a date string
229
+ * @param {string|Array.<string>} [arg2] - a format string or its compiled object
230
+ * @returns {boolean} whether the date string is a valid date
231
+ */
232
+ proto.isValid = function (arg1, arg2) {
233
+ var dt = typeof arg1 === 'string' ? this.preparse(arg1, arg2) : arg1,
234
+ last = [31, 28 + this.isLeapYear(dt.Y) | 0, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][dt.M - 1];
235
+
236
+ return !(
237
+ dt._index < 1 || dt._length < 1 || dt._index - dt._length || dt._match < 1 ||
238
+ dt.Y < 1 || dt.Y > 9999 || dt.M < 1 || dt.M > 12 || dt.D < 1 || dt.D > last ||
239
+ dt.H < 0 || dt.H > 23 || dt.m < 0 || dt.m > 59 || dt.s < 0 || dt.s > 59 || dt.S < 0 || dt.S > 999 ||
240
+ dt.Z < -720 || dt.Z > 840
241
+ );
242
+ };
243
+
244
+ /**
245
+ * Transforming a Date and Time string
246
+ * @param {string} dateString - a date string
247
+ * @param {string|Array.<string>} arg1 - a format string or its compiled object
248
+ * @param {string|Array.<string>} arg2 - a transformed format string or its compiled object
249
+ * @param {boolean} [utc] - output as UTC
250
+ * @returns {string} a formatted string
251
+ */
252
+ proto.transform = function (dateString, arg1, arg2, utc) {
253
+ return this.format(this.parse(dateString, arg1), arg2, utc);
254
+ };
255
+
256
+ /**
257
+ * Adding years
258
+ * @param {Date} dateObj - a date object
259
+ * @param {number} years - number of years to add
260
+ * @returns {Date} a date after adding the value
261
+ */
262
+ proto.addYears = function (dateObj, years) {
263
+ return this.addMonths(dateObj, years * 12);
264
+ };
265
+
266
+ /**
267
+ * Adding months
268
+ * @param {Date} dateObj - a date object
269
+ * @param {number} months - number of months to add
270
+ * @returns {Date} a date after adding the value
271
+ */
272
+ proto.addMonths = function (dateObj, months) {
273
+ var d = new Date(dateObj.getTime());
274
+
275
+ d.setMonth(d.getMonth() + months);
276
+ return d;
277
+ };
278
+
279
+ /**
280
+ * Adding days
281
+ * @param {Date} dateObj - a date object
282
+ * @param {number} days - number of days to add
283
+ * @returns {Date} a date after adding the value
284
+ */
285
+ proto.addDays = function (dateObj, days) {
286
+ var d = new Date(dateObj.getTime());
287
+
288
+ d.setDate(d.getDate() + days);
289
+ return d;
290
+ };
291
+
292
+ /**
293
+ * Adding hours
294
+ * @param {Date} dateObj - a date object
295
+ * @param {number} hours - number of hours to add
296
+ * @returns {Date} a date after adding the value
297
+ */
298
+ proto.addHours = function (dateObj, hours) {
299
+ return this.addMinutes(dateObj, hours * 60);
300
+ };
301
+
302
+ /**
303
+ * Adding minutes
304
+ * @param {Date} dateObj - a date object
305
+ * @param {number} minutes - number of minutes to add
306
+ * @returns {Date} a date after adding the value
307
+ */
308
+ proto.addMinutes = function (dateObj, minutes) {
309
+ return this.addSeconds(dateObj, minutes * 60);
310
+ };
311
+
312
+ /**
313
+ * Adding seconds
314
+ * @param {Date} dateObj - a date object
315
+ * @param {number} seconds - number of seconds to add
316
+ * @returns {Date} a date after adding the value
317
+ */
318
+ proto.addSeconds = function (dateObj, seconds) {
319
+ return this.addMilliseconds(dateObj, seconds * 1000);
320
+ };
321
+
322
+ /**
323
+ * Adding milliseconds
324
+ * @param {Date} dateObj - a date object
325
+ * @param {number} milliseconds - number of milliseconds to add
326
+ * @returns {Date} a date after adding the value
327
+ */
328
+ proto.addMilliseconds = function (dateObj, milliseconds) {
329
+ return new Date(dateObj.getTime() + milliseconds);
330
+ };
331
+
332
+ /**
333
+ * Subtracting two dates
334
+ * @param {Date} date1 - a Date object
335
+ * @param {Date} date2 - a Date object
336
+ * @returns {Object} a result object subtracting date2 from date1
337
+ */
338
+ proto.subtract = function (date1, date2) {
339
+ var delta = date1.getTime() - date2.getTime();
340
+
341
+ return {
342
+ toMilliseconds: function () {
343
+ return delta;
344
+ },
345
+ toSeconds: function () {
346
+ return delta / 1000;
347
+ },
348
+ toMinutes: function () {
349
+ return delta / 60000;
350
+ },
351
+ toHours: function () {
352
+ return delta / 3600000;
353
+ },
354
+ toDays: function () {
355
+ return delta / 86400000;
356
+ }
357
+ };
358
+ };
359
+
360
+ /**
361
+ * Whether year is leap year
362
+ * @param {number} y - year
363
+ * @returns {boolean} whether year is leap year
364
+ */
365
+ proto.isLeapYear = function (y) {
366
+ return (!(y % 4) && !!(y % 100)) || !(y % 400);
367
+ };
368
+
369
+ /**
370
+ * Comparison of two dates
371
+ * @param {Date} date1 - a Date object
372
+ * @param {Date} date2 - a Date object
373
+ * @returns {boolean} whether the two dates are the same day (time is ignored)
374
+ */
375
+ proto.isSameDay = function (date1, date2) {
376
+ return date1.toDateString() === date2.toDateString();
377
+ };
378
+
379
+ /**
380
+ * Defining new locale
381
+ * @param {string} code - language code
382
+ * @param {Function} locale - locale installer
383
+ * @returns {string} current language code
384
+ */
385
+ proto.locale = function (code, locale) {
386
+ if (!locales[code]) {
387
+ locales[code] = locale;
388
+ }
389
+ };
390
+
391
+ /**
392
+ * Defining new plugin
393
+ * @param {string} name - plugin name
394
+ * @param {Function} plugin - plugin installer
395
+ * @returns {void}
396
+ */
397
+ proto.plugin = function (name, plugin) {
398
+ if (!plugins[name]) {
399
+ plugins[name] = plugin;
400
+ }
401
+ };
402
+
403
+ var localized_proto = extend(proto);
404
+ var date = extend(proto);
405
+
406
+ /**
407
+ * Changing locale
408
+ * @param {Function|string} [locale] - locale object | language code
409
+ * @returns {string} current language code
410
+ */
411
+ date.locale = function (locale) {
412
+ var install = typeof locale === 'function' ? locale : date.locale[locale];
413
+
414
+ if (!install) {
415
+ return lang;
416
+ }
417
+ lang = install(proto);
418
+
419
+ var extension = locales[lang] || {};
420
+ var res = extend(_res, extension.res, true);
421
+ var formatter = extend(_formatter, extension.formatter, true, res);
422
+ var parser = extend(_parser, extension.parser, true, res);
423
+
424
+ date._formatter = localized_proto._formatter = formatter;
425
+ date._parser = localized_proto._parser = parser;
426
+
427
+ for (var plugin in plugins) {
428
+ date.extend(plugins[plugin]);
429
+ }
430
+
431
+ return lang;
432
+ };
433
+
434
+ /**
435
+ * Feature extension
436
+ * @param {Object} extension - extension object
437
+ * @returns {void}
438
+ */
439
+ date.extend = function (extension) {
440
+ var res = extend(date._parser.res, extension.res);
441
+ var extender = extension.extender || {};
442
+
443
+ date._formatter = extend(date._formatter, extension.formatter, false, res);
444
+ date._parser = extend(date._parser, extension.parser, false, res);
445
+
446
+ for (var key in extender) {
447
+ if (!date[key]) {
448
+ date[key] = extender[key];
449
+ }
450
+ }
451
+ };
452
+
453
+ /**
454
+ * Importing plugin
455
+ * @param {Function|string} plugin - plugin object | plugin name
456
+ * @returns {void}
457
+ */
458
+ date.plugin = function (plugin) {
459
+ var install = typeof plugin === 'function' ? plugin : date.plugin[plugin];
460
+
461
+ if (install) {
462
+ date.extend(plugins[install(proto, localized_proto)] || {});
463
+ }
464
+ };
465
+
466
+ export { date as default };
@@ -0,0 +1,17 @@
1
+ /*
2
+ date-and-time (c) KNOWLEDGECODE | MIT
3
+ */
4
+ var g={},l={},m="en",p={MMMM:"January February March April May June July August September October November December".split(" "),MMM:"Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec".split(" "),dddd:"Sunday Monday Tuesday Wednesday Thursday Friday Saturday".split(" "),ddd:"Sun Mon Tue Wed Thu Fri Sat".split(" "),dd:"Su Mo Tu We Th Fr Sa".split(" "),A:["AM","PM"]},q={YYYY:function(a){return("000"+a.getFullYear()).slice(-4)},YY:function(a){return("0"+a.getFullYear()).slice(-2)},Y:function(a){return""+
5
+ a.getFullYear()},MMMM:function(a){return this.res.MMMM[a.getMonth()]},MMM:function(a){return this.res.MMM[a.getMonth()]},MM:function(a){return("0"+(a.getMonth()+1)).slice(-2)},M:function(a){return""+(a.getMonth()+1)},DD:function(a){return("0"+a.getDate()).slice(-2)},D:function(a){return""+a.getDate()},HH:function(a){return("0"+a.getHours()).slice(-2)},H:function(a){return""+a.getHours()},A:function(a){return this.res.A[11<a.getHours()|0]},hh:function(a){return("0"+(a.getHours()%12||12)).slice(-2)},
6
+ h:function(a){return""+(a.getHours()%12||12)},mm:function(a){return("0"+a.getMinutes()).slice(-2)},m:function(a){return""+a.getMinutes()},ss:function(a){return("0"+a.getSeconds()).slice(-2)},s:function(a){return""+a.getSeconds()},SSS:function(a){return("00"+a.getMilliseconds()).slice(-3)},SS:function(a){return("0"+(a.getMilliseconds()/10|0)).slice(-2)},S:function(a){return""+(a.getMilliseconds()/100|0)},dddd:function(a){return this.res.dddd[a.getDay()]},ddd:function(a){return this.res.ddd[a.getDay()]},
7
+ dd:function(a){return this.res.dd[a.getDay()]},Z:function(a){a=a.getTimezoneOffset()/.6|0;return(0<a?"-":"+")+("000"+Math.abs(a-(a%100*.4|0))).slice(-4)},post:function(a){return a},res:p},r={YYYY:function(a){return this.exec(/^\d{4}/,a)},Y:function(a){return this.exec(/^\d{1,4}/,a)},MMMM:function(a){a=this.find(this.res.MMMM,a);a.value++;return a},MMM:function(a){a=this.find(this.res.MMM,a);a.value++;return a},MM:function(a){return this.exec(/^\d\d/,a)},M:function(a){return this.exec(/^\d\d?/,a)},
8
+ DD:function(a){return this.exec(/^\d\d/,a)},D:function(a){return this.exec(/^\d\d?/,a)},HH:function(a){return this.exec(/^\d\d/,a)},H:function(a){return this.exec(/^\d\d?/,a)},A:function(a){return this.find(this.res.A,a)},hh:function(a){return this.exec(/^\d\d/,a)},h:function(a){return this.exec(/^\d\d?/,a)},mm:function(a){return this.exec(/^\d\d/,a)},m:function(a){return this.exec(/^\d\d?/,a)},ss:function(a){return this.exec(/^\d\d/,a)},s:function(a){return this.exec(/^\d\d?/,a)},SSS:function(a){return this.exec(/^\d{1,3}/,
9
+ a)},SS:function(a){a=this.exec(/^\d\d?/,a);a.value*=10;return a},S:function(a){a=this.exec(/^\d/,a);a.value*=100;return a},Z:function(a){a=this.exec(/^[\+-]\d{2}[0-5]\d/,a);a.value=-60*(a.value/100|0)-a.value%100;return a},h12:function(a,b){return(12===a?0:a)+12*b},exec:function(a,b){a=(a.exec(b)||[""])[0];return{value:a|0,length:a.length}},find:function(a,b){for(var c=-1,d=0,f=0,e=a.length,k;f<e;f++)k=a[f],!b.indexOf(k)&&k.length>d&&(c=f,d=k.length);return{value:c,length:d}},pre:function(a){return a},
10
+ res:p};function t(a,b,c,d){var f={},e;for(e in a)f[e]=a[e];for(e in b||{})!!c^!!f[e]||(f[e]=b[e]);d&&(f.res=d);return f}
11
+ var v={_formatter:q,_parser:r,compile:function(a){for(var b=/\[([^\[\]]|\[[^\[\]]*])*]|([A-Za-z])\2+|\.{3}|./g,c,d=[a];c=b.exec(a);)d[d.length]=c[0];return d},format:function(a,b,c){b="string"===typeof b?this.compile(b):b;var d=a.getTimezoneOffset();a=this.addMinutes(a,c?d:0);var f=this._formatter,e="";a.getTimezoneOffset=function(){return c?0:d};for(var k=1,u=b.length,h;k<u;k++)h=b[k],e+=f[h]?f.post(f[h](a,b[0])):h.replace(/\[(.*)]/,"$1");return e},preparse:function(a,b){b="string"===typeof b?this.compile(b):
12
+ b;var c={Y:1970,M:1,D:1,H:0,A:0,h:0,m:0,s:0,S:0,Z:0,_index:0,_length:0,_match:0},d=/\[(.*)]/,f=this._parser,e=0;a=f.pre(a);for(var k=1,u=b.length,h,n;k<u;k++)if(h=b[k],f[h]){n=f[h](a.slice(e),b[0]);if(!n.length)break;e+=n.length;c[n.token||h.charAt(0)]=n.value;c._match++}else if(h===a.charAt(e)||" "===h)e++;else if(d.test(h)&&!a.slice(e).indexOf(d.exec(h)[1]))e+=h.length-2;else{"..."===h&&(e=a.length);break}c.H=c.H||f.h12(c.h,c.A);c._index=e;c._length=a.length;return c},parse:function(a,b,c){a=this.preparse(a,
13
+ b);return this.isValid(a)?(a.M-=100>a.Y?22801:1,c||a.Z?new Date(Date.UTC(a.Y,a.M,a.D,a.H,a.m+a.Z,a.s,a.S)):new Date(a.Y,a.M,a.D,a.H,a.m,a.s,a.S)):new Date(NaN)},isValid:function(a,b){a="string"===typeof a?this.preparse(a,b):a;b=[31,28+this.isLeapYear(a.Y)|0,31,30,31,30,31,31,30,31,30,31][a.M-1];return!(1>a._index||1>a._length||a._index-a._length||1>a._match||1>a.Y||9999<a.Y||1>a.M||12<a.M||1>a.D||a.D>b||0>a.H||23<a.H||0>a.m||59<a.m||0>a.s||59<a.s||0>a.S||999<a.S||-720>a.Z||840<a.Z)},transform:function(a,
14
+ b,c,d){return this.format(this.parse(a,b),c,d)},addYears:function(a,b){return this.addMonths(a,12*b)},addMonths:function(a,b){a=new Date(a.getTime());a.setMonth(a.getMonth()+b);return a},addDays:function(a,b){a=new Date(a.getTime());a.setDate(a.getDate()+b);return a},addHours:function(a,b){return this.addMinutes(a,60*b)},addMinutes:function(a,b){return this.addSeconds(a,60*b)},addSeconds:function(a,b){return this.addMilliseconds(a,1E3*b)},addMilliseconds:function(a,b){return new Date(a.getTime()+
15
+ b)},subtract:function(a,b){var c=a.getTime()-b.getTime();return{toMilliseconds:function(){return c},toSeconds:function(){return c/1E3},toMinutes:function(){return c/6E4},toHours:function(){return c/36E5},toDays:function(){return c/864E5}}},isLeapYear:function(a){return!(a%4)&&!!(a%100)||!(a%400)},isSameDay:function(a,b){return a.toDateString()===b.toDateString()},locale:function(a,b){g[a]||(g[a]=b)},plugin:function(a,b){l[a]||(l[a]=b)}},w=t(v),x=t(v);
16
+ x.locale=function(a){a="function"===typeof a?a:x.locale[a];if(!a)return m;m=a(v);var b=g[m]||{},c=t(p,b.res,!0);a=t(q,b.formatter,!0,c);b=t(r,b.parser,!0,c);x._formatter=w._formatter=a;x._parser=w._parser=b;for(var d in l)x.extend(l[d]);return m};x.extend=function(a){var b=t(x._parser.res,a.res),c=a.extender||{};x._formatter=t(x._formatter,a.formatter,!1,b);x._parser=t(x._parser,a.parser,!1,b);for(var d in c)x[d]||(x[d]=c[d])};
17
+ x.plugin=function(a){(a="function"===typeof a?a:x.plugin[a])&&x.extend(l[a(v,w)]||{})};export default x