nmce-func 1.4.1 → 1.5.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.
@@ -1,328 +0,0 @@
1
- import { DateTime, Duration, Settings } from 'luxon';
2
- export class DateFunc {
3
- /**
4
- * At runtime, there's no simple guarantee that the input is Date. Sometimes you codes expect date, but the response from the Web service may give you string or number.
5
- * This function give you safe parse of date data from I/O, not of your control.
6
- * If the data is invalid, throws RangeError or TypeError.
7
- * @param dt
8
- * @returns
9
- */
10
- static dateDataToDate(dt) {
11
- if (dt instanceof Date) {
12
- return dt;
13
- }
14
- if (typeof dt === 'string') {
15
- const r = Date.parse(dt);
16
- if (isNaN(r)) {
17
- throw new RangeError('Invalid string for Date');
18
- }
19
- return new Date(r);
20
- }
21
- if (typeof dt === 'number') {
22
- const rd = new Date(dt);
23
- if (Number.isNaN(rd.valueOf())) {
24
- throw new RangeError('Invalid number for Date');
25
- }
26
- return rd;
27
- }
28
- throw new TypeError('Expect Date, string or number');
29
- }
30
- /**
31
- * Similar to dateDataToDate, but allow null and defined semantically.
32
- * @param dt
33
- * @returns
34
- */
35
- static dateDataToDateOrNull(dt) {
36
- if (dt instanceof Date) {
37
- return dt;
38
- }
39
- if (typeof dt === 'string') {
40
- const r = Date.parse(dt);
41
- if (isNaN(r)) {
42
- throw new RangeError('Invalid string for Date');
43
- }
44
- return new Date(r);
45
- }
46
- if (typeof dt === 'number') {
47
- const rd = new Date(dt);
48
- if (Number.isNaN(rd.valueOf())) {
49
- throw new RangeError('Invalid number for Date');
50
- }
51
- return rd;
52
- }
53
- if (dt == null) {
54
- return dt;
55
- }
56
- throw new TypeError('Expect Date, string or number');
57
- }
58
- /**
59
- * Transform UTC DateTime to local date without H, M and S. For example, the month day of 2018-01-23T22:00:00Z is 24 in Australia.
60
- * @param dtUtc
61
- */
62
- static dateTimeUtcToLocalDateNumber(dtUtc) {
63
- if (dtUtc == null) {
64
- return dtUtc;
65
- }
66
- const localDt = this.dateDataToDate(dtUtc);
67
- const localDNum = localDt.setHours(0, 0, 0, 0);
68
- return localDNum;
69
- }
70
- /**
71
- * Date only. However, the date may still be in UTC.
72
- * @param dtUtc
73
- * @returns new Date object.
74
- */
75
- static dateTimeUtcToLocalDate(dtUtc) {
76
- if (dtUtc == null) {
77
- return dtUtc;
78
- }
79
- const localDt = this.dateDataToDate(dtUtc);
80
- const localNum = localDt.setHours(0, 0, 0, 0);
81
- return new Date(localNum);
82
- }
83
- /**
84
- * '2018-01-23T22:00:00Z' will become '2018-01-24' in Australia.
85
- * @param dtUtc
86
- * @returns new Date object.
87
- */
88
- static localISODateString(dtUtc) {
89
- const dt = this.dateTimeUtcToLocalDate(dtUtc);
90
- if (dt == null) {
91
- return dt;
92
- }
93
- const d = DateTime.fromJSDate(dt);
94
- return d.toISODate();
95
- }
96
- /**
97
- * local date ONLY (no time) to UTC date.
98
- * The input could be a string of yyyy-MM-dd, or a Date Object.
99
- * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date
100
- * While the time value at the heart of a Date object is UTC, the basic methods to fetch the date and time
101
- * or its components all work in the local (i.e. host system) time zone and offset.
102
- * @param dt if dt contain time info, it will become dt.setHours(0, 0, 0, 0)
103
- */
104
- static localDateToUtc(d) {
105
- if (d == null) {
106
- return d;
107
- }
108
- const dt = this.dateDataToDate(d);
109
- const n = dt.setHours(0, 0, 0, 0);
110
- const offset = dt.getTimezoneOffset() * 60000;
111
- return new Date(n + offset);
112
- }
113
- static getEndOfWeek(dt) {
114
- const dateTime = DateTime.fromJSDate(this.dateDataToDate(dt));
115
- return dateTime.endOf('week').toJSDate();
116
- }
117
- static getStartOfWeek(dt) {
118
- const dateTime = DateTime.fromJSDate(this.dateDataToDate(dt));
119
- return dateTime.startOf('week').toJSDate();
120
- }
121
- static getEndOfMonth(dt) {
122
- const dateTime = DateTime.fromJSDate(this.dateDataToDate(dt));
123
- return dateTime.endOf('month').toJSDate();
124
- }
125
- static getStartOfMonth(dt) {
126
- const dateTime = DateTime.fromJSDate(this.dateDataToDate(dt));
127
- return dateTime.startOf('month').toJSDate();
128
- }
129
- static getEndOfDate(dt) {
130
- const dateTime = DateTime.fromJSDate(this.dateDataToDate(dt));
131
- return dateTime.endOf('day').toJSDate();
132
- }
133
- static getStartOfDate(dt) {
134
- const dateTime = DateTime.fromJSDate(this.dateDataToDate(dt));
135
- return dateTime.startOf('day').toJSDate();
136
- }
137
- static getEndOfToday() {
138
- return this.getEndOfDate(Date.now());
139
- }
140
- static getStartOfToday() {
141
- return this.getStartOfDate(Date.now());
142
- }
143
- static getDaysBetween(d1, d2) {
144
- const dm1 = DateTime.fromJSDate(this.dateDataToDate(d1));
145
- const dm2 = DateTime.fromJSDate(this.dateDataToDate(d1));
146
- return dm2.diff(dm1, 'days').days;
147
- }
148
- //inspired https://stackoverflow.com/questions/563406/add-days-to-javascript-date
149
- static addDays(dt, days) {
150
- const dat = DateTime.fromJSDate(this.dateDataToDate(dt));
151
- const r = dat.plus({ days: days });
152
- return r.toJSDate();
153
- }
154
- static addMonths(dt, months) {
155
- const dat = DateTime.fromJSDate(this.dateDataToDate(dt));
156
- const r = dat.plus({ months: months });
157
- return r.toJSDate();
158
- }
159
- static addYears(dt, years) {
160
- const dat = DateTime.fromJSDate(this.dateDataToDate(dt));
161
- const r = dat.plus({ years: years });
162
- return r.toJSDate();
163
- }
164
- static addHours(dt, hours) {
165
- const dat = DateTime.fromJSDate(this.dateDataToDate(dt));
166
- const r = dat.plus({ hours: hours });
167
- return r.toJSDate();
168
- }
169
- static addMinutes(dt, minutes) {
170
- const dat = DateTime.fromJSDate(this.dateDataToDate(dt));
171
- const r = dat.plus({ minutes: minutes });
172
- return r.toJSDate();
173
- }
174
- /**
175
- * Start of today
176
- */
177
- static get today() {
178
- return this.getStartOfToday();
179
- }
180
- static get now() {
181
- return new Date(Date.now());
182
- }
183
- /**
184
- * From now, next 5 minute mark. For example 2:23:44 will be 2:25:00;
185
- * @returns
186
- */
187
- static getNext5MinuteMark() {
188
- const m = DateTime.now().set({ second: 0, millisecond: 0 });
189
- const minute = m.minute;
190
- const mod = minute % 5;
191
- if (mod) {
192
- const delta = 5 - mod;
193
- return m.plus({ minutes: delta }).toJSDate();
194
- }
195
- return m.toJSDate();
196
- }
197
- static getYMD(d) {
198
- const dt = DateTime.fromJSDate(this.dateDataToDate(d));
199
- return dt.toFormat('yyyyMMdd');
200
- }
201
- static getDMYWithSlash(d) {
202
- const dt = DateTime.fromJSDate(this.dateDataToDate(d));
203
- return dt.toFormat('dd/MM/yyyy');
204
- }
205
- static getDMYHmWithSlash(d) {
206
- const dt = DateTime.fromJSDate(this.dateDataToDate(d));
207
- return dt.toFormat('dd/MM/yyyy HH:mm');
208
- }
209
- /**
210
- *
211
- * @param dtUtc In 24 hour format, and the date separator depending on the system or Luxon default locale
212
- * @returns
213
- */
214
- static getDateTime24Simple(dtUtc) {
215
- if (dtUtc == null) {
216
- return dtUtc;
217
- }
218
- const d = this.dateDataToDate(dtUtc);
219
- const dt = DateTime.fromJSDate(d);
220
- return dt.toLocaleString(DateTime.DATE_SHORT) + ' ' + dt.toLocaleString(DateTime.TIME_24_SIMPLE);
221
- }
222
- static setDefaultLocale(locale) {
223
- Settings.defaultLocale = locale;
224
- }
225
- static getDefaultLocale() {
226
- return Settings.defaultLocale;
227
- }
228
- static setDefaultZone(zone) {
229
- Settings.defaultZone = zone;
230
- }
231
- static getDefaultZone() {
232
- return Settings.defaultZone.name;
233
- }
234
- static isZoneValid() {
235
- return Settings.defaultZone.isValid;
236
- }
237
- /**
238
- * For example, in AEST, it is -600.
239
- * @returns
240
- */
241
- static getLocalTimezoneOffset() {
242
- const dt = new Date(Date.now());
243
- return dt.getTimezoneOffset();
244
- }
245
- /**
246
- * Get hour of the date. If Date is not defined, the hour will be current hour.
247
- * @param dtUtc
248
- */
249
- static getHour(dtUtc) {
250
- const dt = DateTime.fromJSDate(this.dateDataToDate(dtUtc));
251
- return dt.hour;
252
- }
253
- static getMinute(dtUtc) {
254
- const dt = DateTime.fromJSDate(this.dateDataToDate(dtUtc));
255
- return dt.minute;
256
- }
257
- static GetHM(dtUtc) {
258
- const dt = DateTime.fromJSDate(this.dateDataToDate(dtUtc));
259
- return { h: dt.hour, m: dt.minute };
260
- }
261
- static composeDateTime(dt, h = 0, minute = 0, second = 0) {
262
- return new Date(this.dateDataToDate(dt).setHours(h, minute, second, 0));
263
- }
264
- static olderThan24Hours(d) {
265
- const m = DateTime.fromJSDate(this.dateDataToDate(d));
266
- return DateTime.now().diff(m, 'hours') >= Duration.fromISO('PT24H');
267
- }
268
- static olderThanHours(d, hours) {
269
- const m = DateTime.fromJSDate(this.dateDataToDate(d));
270
- const diff = DateTime.now().diff(m, 'hours');
271
- const duration = Duration.fromISO(`PT${hours}H`);
272
- console.debug('diff: ' + diff.hours + ' duration: ' + duration.hours);
273
- return diff.hours >= duration.hours;
274
- }
275
- static olderThanMinutes(d, minutes) {
276
- const m = DateTime.fromJSDate(this.dateDataToDate(d));
277
- return DateTime.now().diff(m, 'minutes') >= Duration.fromMillis(minutes * 60 * 1000);
278
- }
279
- /**
280
- * It could be 11PM yesterday, and 1 AM today. Actually based on local today.
281
- */
282
- static olderThan1Day(dtUtc) {
283
- return DateFunc.getDayAge(dtUtc) > 0;
284
- }
285
- static getHourAge(d) {
286
- const m = DateTime.fromJSDate(this.dateDataToDate(d));
287
- return DateTime.now().diff(m, 'hours').hours;
288
- }
289
- /**
290
- * Compare date with now.
291
- * @param dtUtc
292
- */
293
- static getDayAge(d) {
294
- const m = DateTime.fromJSDate(this.dateDataToDate(d));
295
- return DateTime.now().diff(m, 'days').days;
296
- }
297
- /**
298
- * How many years from now.
299
- * @param d
300
- * @returns
301
- */
302
- static getAge(d) {
303
- const m = DateTime.fromJSDate(this.dateDataToDate(d));
304
- return DateTime.now().diff(m, 'years').years;
305
- }
306
- /**
307
- * Convert minutes from midnight to HH:mm text
308
- * @param minutes
309
- */
310
- static getHMFromMins(minutes) {
311
- if (minutes >= 24 * 60 || minutes < 0) {
312
- throw new RangeError('Valid input should be greater than or equal to 0 and less than 1440.');
313
- }
314
- const h = minutes / 60 | 0, m = minutes % 60 | 0;
315
- return DateTime.utc().set({ hour: h, minute: m }).toFormat('HH:mm');
316
- }
317
- static getMinutesSinceMidnight(d) {
318
- const dt = DateTime.fromJSDate(this.dateDataToDate(d));
319
- const midnight = dt.startOf('day');
320
- return dt.diff(midnight, 'minutes').minutes;
321
- }
322
- static getMinutesBetween(start, end) {
323
- const m = DateTime.fromJSDate(this.dateDataToDate(start));
324
- const m2 = DateTime.fromJSDate(this.dateDataToDate(end));
325
- return m2.diff(m, 'minutes').minutes;
326
- }
327
- }
328
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZUZ1bmMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9ubWNlLWZ1bmMvc3JjL19mdW5jL2RhdGVGdW5jLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxNQUFNLE9BQU8sQ0FBQztBQUVyRCxNQUFNLE9BQU8sUUFBUTtJQUNwQjs7Ozs7O09BTUc7SUFDSCxNQUFNLENBQUMsY0FBYyxDQUFDLEVBQTBCO1FBQy9DLElBQUksRUFBRSxZQUFZLElBQUksRUFBQyxDQUFDO1lBQ3ZCLE9BQU8sRUFBRSxDQUFDO1FBQ1gsQ0FBQztRQUVELElBQUksT0FBTyxFQUFFLEtBQUssUUFBUSxFQUFDLENBQUM7WUFDM0IsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUN6QixJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBQyxDQUFDO2dCQUNiLE1BQU0sSUFBSSxVQUFVLENBQUMseUJBQXlCLENBQUMsQ0FBQztZQUNqRCxDQUFDO1lBRUQsT0FBTyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNwQixDQUFDO1FBRUQsSUFBSSxPQUFPLEVBQUUsS0FBSyxRQUFRLEVBQUMsQ0FBQztZQUMzQixNQUFNLEVBQUUsR0FBRyxJQUFJLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQTtZQUN2QixJQUFJLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLE9BQU8sRUFBRSxDQUFDLEVBQUMsQ0FBQztnQkFDL0IsTUFBTSxJQUFJLFVBQVUsQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO1lBQ2pELENBQUM7WUFFRCxPQUFPLEVBQUUsQ0FBQztRQUNYLENBQUM7UUFFRCxNQUFNLElBQUksU0FBUyxDQUFDLCtCQUErQixDQUFDLENBQUM7SUFDdEQsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxNQUFNLENBQUMs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QUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDekQsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQyxPQUFPLENBQUM7SUFDdEMsQ0FBQztDQUNEIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGF0ZVRpbWUsIER1cmF0aW9uLCBTZXR0aW5ncyB9IGZyb20gJ2x1eG9uJztcclxuXHJcbmV4cG9ydCBjbGFzcyBEYXRlRnVuYyB7XHJcblx0LyoqXHJcblx0ICogQXQgcnVudGltZSwgdGhlcmUncyBubyBzaW1wbGUgZ3VhcmFudGVlIHRoYXQgdGhlIGlucHV0IGlzIERhdGUuIFNvbWV0aW1lcyB5b3UgY29kZXMgZXhwZWN0IGRhdGUsIGJ1dCB0aGUgcmVzcG9uc2UgZnJvbSB0aGUgV2ViIHNlcnZpY2UgbWF5IGdpdmUgeW91IHN0cmluZyBvciBudW1iZXIuXHJcblx0ICogVGhpcyBmdW5jdGlvbiBnaXZlIHlvdSBzYWZlIHBhcnNlIG9mIGRhdGUgZGF0YSBmcm9tIEkvTywgbm90IG9mIHlvdXIgY29udHJvbC5cclxuXHQgKiBJZiB0aGUgZGF0YSBpcyBpbnZhbGlkLCB0aHJvd3MgUmFuZ2VFcnJvciBvciBUeXBlRXJyb3IuXHJcblx0ICogQHBhcmFtIGR0IFxyXG5cdCAqIEByZXR1cm5zIFxyXG5cdCAqL1xyXG5cdHN0YXRpYyBkYXRlRGF0YVRvRGF0ZShkdDogRGF0ZSB8IHN0cmluZyB8IG51bWJlcikgOiBEYXRlIHtcclxuXHRcdGlmIChkdCBpbnN0YW5jZW9mIERhdGUpe1xyXG5cdFx0XHRyZXR1cm4gZHQ7XHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKHR5cGVvZiBkdCA9PT0gJ3N0cmluZycpe1xyXG5cdFx0XHRjb25zdCByID0gRGF0ZS5wYXJzZShkdCk7XHJcblx0XHRcdGlmIChpc05hTihyKSl7XHJcblx0XHRcdFx0dGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0ludmFsaWQgc3RyaW5nIGZvciBEYXRlJyk7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHJldHVybiBuZXcgRGF0ZShyKTtcclxuXHRcdH1cclxuXHJcblx0XHRpZiAodHlwZW9mIGR0ID09PSAnbnVtYmVyJyl7XHJcblx0XHRcdGNvbnN0IHJkID0gbmV3IERhdGUoZHQpXHJcblx0XHRcdGlmIChOdW1iZXIuaXNOYU4ocmQudmFsdWVPZigpKSl7XHJcblx0XHRcdFx0dGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0ludmFsaWQgbnVtYmVyIGZvciBEYXRlJyk7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHJldHVybiByZDtcclxuXHRcdH1cclxuXHJcblx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCdFeHBlY3QgRGF0ZSwgc3RyaW5nIG9yIG51bWJlcicpO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2ltaWxhciB0byBkYXRlRGF0YVRvRGF0ZSwgYnV0IGFsbG93IG51bGwgYW5kIGRlZmluZWQgc2VtYW50aWNhbGx5LlxyXG5cdCAqIEBwYXJhbSBkdCBcclxuXHQgKiBAcmV0dXJucyBcclxuXHQgKi9cclxuXHRzdGF0aWMgZGF0ZURhdGFUb0RhdGVPck51bGwoZHQ6IERhdGUgfCBzdHJpbmcgfCBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkKSA6IERhdGUgfCBudWxsIHwgdW5kZWZpbmVkIHtcclxuXHRcdGlmIChkdCBpbnN0YW5jZW9mIERhdGUpe1xyXG5cdFx0XHRyZXR1cm4gZHQ7XHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKHR5cGVvZiBkdCA9PT0gJ3N0cmluZycpe1xyXG5cdFx0XHRjb25zdCByID0gRGF0ZS5wYXJzZShkdCk7XHJcblx0XHRcdGlmIChpc05hTihyKSl7XHJcblx0XHRcdFx0dGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0ludmFsaWQgc3RyaW5nIGZvciBEYXRlJyk7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHJldHVybiBuZXcgRGF0ZShyKTtcclxuXHRcdH1cclxuXHJcblx0XHRpZiAodHlwZW9mIGR0ID09PSAnbnVtYmVyJyl7XHJcblx0XHRcdGNvbnN0IHJkID0gbmV3IERhdGUoZHQpXHJcblx0XHRcdGlmIChOdW1iZXIuaXNOYU4ocmQudmFsdWVPZigpKSl7XHJcblx0XHRcdFx0dGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0ludmFsaWQgbnVtYmVyIGZvciBEYXRlJyk7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHJldHVybiByZDtcclxuXHRcdH1cclxuXHJcblx0XHRpZiAoZHQgPT0gbnVsbCl7IFxyXG5cdFx0XHRyZXR1cm4gZHQ7XHJcblx0XHR9XHJcblxyXG5cdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignRXhwZWN0IERhdGUsIHN0cmluZyBvciBudW1iZXInKTtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRyYW5zZm9ybSBVVEMgRGF0ZVRpbWUgdG8gbG9jYWwgZGF0ZSB3aXRob3V0IEgsIE0gYW5kIFMuIEZvciBleGFtcGxlLCB0aGUgbW9udGggZGF5IG9mIDIwMTgtMDEtMjNUMjI6MDA6MDBaIGlzIDI0IGluIEF1c3RyYWxpYS5cclxuXHQgKiBAcGFyYW0gZHRVdGNcclxuXHQgKi9cclxuXHRzdGF0aWMgZGF0ZVRpbWVVdGNUb0xvY2FsRGF0ZU51bWJlcihkdFV0YzogRGF0ZSB8IHN0cmluZyB8IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQpOiBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkIHtcclxuXHRcdGlmIChkdFV0YyA9PSBudWxsKSB7XHJcblx0XHRcdHJldHVybiBkdFV0YztcclxuXHRcdH1cclxuXHJcblx0XHRjb25zdCBsb2NhbER0ID0gdGhpcy5kYXRlRGF0YVRvRGF0ZShkdFV0Yyk7XHJcblx0XHRjb25zdCBsb2NhbEROdW0gPSBsb2NhbER0LnNldEhvdXJzKDAsIDAsIDAsIDApO1xyXG5cclxuXHRcdHJldHVybiBsb2NhbEROdW07XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBEYXRlIG9ubHkuIEhvd2V2ZXIsIHRoZSBkYXRlIG1heSBzdGlsbCBiZSBpbiBVVEMuXHJcblx0ICogQHBhcmFtIGR0VXRjXHJcblx0ICogQHJldHVybnMgbmV3IERhdGUgb2JqZWN0LlxyXG5cdCAqL1xyXG5cdHN0YXRpYyBkYXRlVGltZVV0Y1RvTG9jYWxEYXRlKGR0VXRjOiBEYXRlIHwgc3RyaW5nIHwgbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCk6IERhdGUgfCBudWxsIHwgdW5kZWZpbmVkIHtcclxuXHRcdGlmIChkdFV0YyA9PSBudWxsKSB7XHJcblx0XHRcdHJldHVybiBkdFV0YztcclxuXHRcdH1cclxuXHJcblx0XHRjb25zdCBsb2NhbER0ID0gdGhpcy5kYXRlRGF0YVRvRGF0ZShkdFV0Yyk7XHJcblx0XHRjb25zdCBsb2NhbE51bSA9IGxvY2FsRHQuc2V0SG91cnMoMCwgMCwgMCwgMCk7XHJcblx0XHRyZXR1cm4gbmV3IERhdGUobG9jYWxOdW0pO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogJzIwMTgtMDEtMjNUMjI6MDA6MDBaJyB3aWxsIGJlY29tZSAnMjAxOC0wMS0yNCcgaW4gQXVzdHJhbGlhLlxyXG5cdCAqIEBwYXJhbSBkdFV0YyBcclxuXHQgKiBAcmV0dXJucyAgbmV3IERhdGUgb2JqZWN0LlxyXG5cdCAqL1xyXG5cdHN0YXRpYyBsb2NhbElTT0RhdGVTdHJpbmcoZHRVdGM6IERhdGUgfCBzdHJpbmcgfCBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkKTogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCB7XHRcdFxyXG5cdCAgICBjb25zdCBkdCA9IHRoaXMuZGF0ZVRpbWVVdGNUb0xvY2FsRGF0ZShkdFV0Yyk7XHJcblx0XHRpZiAoZHQgPT0gbnVsbCkge1xyXG5cdFx0XHRyZXR1cm4gZHQ7XHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3QgZD0gRGF0ZVRpbWUuZnJvbUpTRGF0ZShkdCk7XHJcblx0XHRyZXR1cm4gZC50b0lTT0RhdGUoKTtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIGxvY2FsIGRhdGUgT05MWSAobm8gdGltZSkgdG8gVVRDIGRhdGUuXHJcblx0ICogVGhlIGlucHV0IGNvdWxkIGJlIGEgc3RyaW5nIG9mIHl5eXktTU0tZGQsIG9yIGEgRGF0ZSBPYmplY3QuXHJcblx0ICogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvRGF0ZVxyXG5cdCAqIFdoaWxlIHRoZSB0aW1lIHZhbHVlIGF0IHRoZSBoZWFydCBvZiBhIERhdGUgb2JqZWN0IGlzIFVUQywgdGhlIGJhc2ljIG1ldGhvZHMgdG8gZmV0Y2ggdGhlIGRhdGUgYW5kIHRpbWUgXHJcblx0ICogb3IgaXRzIGNvbXBvbmVudHMgYWxsIHdvcmsgaW4gdGhlIGxvY2FsIChpLmUuIGhvc3Qgc3lzdGVtKSB0aW1lIHpvbmUgYW5kIG9mZnNldC5cclxuXHQgKiBAcGFyYW0gZHQgaWYgZHQgY29udGFpbiB0aW1lIGluZm8sIGl0IHdpbGwgYmVjb21lIGR0LnNldEhvdXJzKDAsIDAsIDAsIDApXHJcblx0ICovXHJcblx0c3RhdGljIGxvY2FsRGF0ZVRvVXRjKGQ6IERhdGUgfCBzdHJpbmcgfCBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkIHwgc3RyaW5nKTogRGF0ZSB8IG51bGwgfCB1bmRlZmluZWQge1xyXG5cdFx0aWYgKGQgPT0gbnVsbCkge1xyXG5cdFx0XHRyZXR1cm4gZDtcclxuXHRcdH1cclxuXHJcblx0XHRjb25zdCBkdCA9IHRoaXMuZGF0ZURhdGFUb0RhdGUoZCk7XHJcblx0XHRjb25zdCBuID0gZHQuc2V0SG91cnMoMCwgMCwgMCwgMCk7XHJcblx0XHRjb25zdCBvZmZzZXQgPSBkdC5nZXRUaW1lem9uZU9mZnNldCgpICogNjAwMDA7XHJcblx0XHRyZXR1cm4gbmV3IERhdGUobiArIG9mZnNldCk7XHJcblx0fVxyXG5cclxuXHRzdGF0aWMgZ2V0RW5kT2ZXZWVrKGR0OiBEYXRlIHwgc3RyaW5nIHwgbnVtYmVyKSA6IERhdGUge1xyXG5cdFx0Y29uc3QgZGF0ZVRpbWUgPSBEYXRlVGltZS5mcm9tSlNEYXRlKHRoaXMuZGF0ZURhdGFUb0RhdGUoZHQpKTtcclxuXHRcdHJldHVybiBkYXRlVGltZS5lbmRPZignd2VlaycpLnRvSlNEYXRlKCk7XHJcblx0fVxyXG5cclxuXHRzdGF0aWMgZ2V0U3RhcnRPZldlZWsoZHQ6IERhdGUgfCBzdHJpbmcgfCBudW1iZXIpIDogRGF0ZSB7XHJcblx0XHRjb25zdCBkYXRlVGltZSA9IERhdGVUaW1lLmZyb21KU0RhdGUodGhpcy5kYXRlRGF0YVRvRGF0ZShkdCkpO1xyXG5cdFx0cmV0dXJuIGRhdGVUaW1lLnN0YXJ0T2YoJ3dlZWsnKS50b0pTRGF0ZSgpO1xyXG5cdH1cclxuXHJcblx0c3RhdGljIGdldEVuZE9mTW9udGgoZHQ6IERhdGUgfCBzdHJpbmcgfCBudW1iZXIpIDogRGF0ZSB7XHJcblx0XHRjb25zdCBkYXRlVGltZSA9IERhdGVUaW1lLmZyb21KU0RhdGUodGhpcy5kYXRlRGF0YVRvRGF0ZShkdCkpO1xyXG5cdFx0cmV0dXJuIGRhdGVUaW1lLmVuZE9mKCdtb250aCcpLnRvSlNEYXRlKCk7XHJcblx0fVxyXG5cclxuXHRzdGF0aWMgZ2V0U3RhcnRPZk1vbnRoKGR0OiBEYXRlIHwgc3RyaW5nIHwgbnVtYmVyKSA6IERhdGUge1xyXG5cdFx0Y29uc3QgZGF0ZVRpbWUgPSBEYXRlVGltZS5mcm9tSlNEYXRlKHRoaXMuZGF0ZURhdGFUb0RhdGUoZHQpKTtcclxuXHRcdHJldHVybiBkYXRlVGltZS5zdGFydE9mKCdtb250aCcpLnRvSlNEYXRlKCk7XHJcblx0fVxyXG5cclxuXHRzdGF0aWMgZ2V0RW5kT2ZEYXRlKGR0OiBEYXRlIHwgc3RyaW5nIHwgbnVtYmVyKTogRGF0ZSB7XHJcblx0XHRjb25zdCBkYXRlVGltZSA9IERhdGVUaW1lLmZyb21KU0RhdGUodGhpcy5kYXRlRGF0YVRvRGF0ZShkdCkpO1xyXG5cdFx0cmV0dXJuIGRhdGVUaW1lLmVuZE9mKCdkYXknKS50b0pTRGF0ZSgpO1xyXG5cdH1cclxuXHJcblx0c3RhdGljIGdldFN0YXJ0T2ZEYXRlKGR0OiBEYXRlIHwgc3RyaW5nIHwgbnVtYmVyKTogRGF0ZSB7XHJcblx0XHRjb25zdCBkYXRlVGltZSA9IERhdGVUaW1lLmZyb21KU0RhdGUodGhpcy5kYXRlRGF0YVRvRGF0ZShkdCkpO1xyXG5cdFx0cmV0dXJuIGRhdGVUaW1lLnN0YXJ0T2YoJ2RheScpLnRvSlNEYXRlKCk7XHJcblx0fVxyXG5cclxuXHRzdGF0aWMgZ2V0RW5kT2ZUb2RheSgpOiBEYXRlIHwgbnVsbCB8IHVuZGVmaW5lZCB7XHJcblx0XHRyZXR1cm4gdGhpcy5nZXRFbmRPZkRhdGUoRGF0ZS5ub3coKSk7XHJcblxyXG5cdH1cclxuXHJcblx0c3RhdGljIGdldFN0YXJ0T2ZUb2RheSgpOiBEYXRlIHtcclxuXHRcdHJldHVybiB0aGlzLmdldFN0YXJ0T2ZEYXRlKERhdGUubm93KCkpO1xyXG5cdH1cclxuXHJcblx0c3RhdGljIGdldERheXNCZXR3ZWVuKGQxOiBEYXRlIHwgc3RyaW5nIHwgbnVtYmVyLCBkMjogRGF0ZSB8IHN0cmluZyB8IG51bWJlcik6IG51bWJlciB7XHJcblx0XHRjb25zdCBkbTEgPSBEYXRlVGltZS5mcm9tSlNEYXRlKHRoaXMuZGF0ZURhdGFUb0RhdGUoZDEpKTtcclxuXHRcdGNvbnN0IGRtMiA9IERhdGVUaW1lLmZyb21KU0RhdGUodGhpcy5kYXRlRGF0YVRvRGF0ZShkMSkpO1xyXG5cdFx0cmV0dXJuIGRtMi5kaWZmKGRtMSwgJ2RheXMnKS5kYXlzO1xyXG5cdH1cclxuXHJcblx0Ly9pbnNwaXJlZCBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy81NjM0MDYvYWRkLWRheXMtdG8tamF2YXNjcmlwdC1kYXRlXHJcblx0c3RhdGljIGFkZERheXMoZHQ6IERhdGUgfCBzdHJpbmcgfCBudW1iZXIsIGRheXM6IG51bWJlcikgOiBEYXRlIHtcclxuXHRcdGNvbnN0IGRhdCA9IERhdGVUaW1lLmZyb21KU0RhdGUodGhpcy5kYXRlRGF0YVRvRGF0ZShkdCkpO1xyXG5cdFx0Y29uc3QgciA9IGRhdC5wbHVzKHtkYXlzOiBkYXlzfSk7XHJcblx0XHRyZXR1cm4gci50b0pTRGF0ZSgpO1xyXG5cdH1cclxuXHJcblx0c3RhdGljIGFkZE1vbnRocyhkdDogRGF0ZSB8IHN0cmluZyB8IG51bWJlciwgbW9udGhzOiBudW1iZXIpIDogRGF0ZSB7XHJcblx0XHRjb25zdCBkYXQgPSBEYXRlVGltZS5mcm9tSlNEYXRlKHRoaXMuZGF0ZURhdGFUb0RhdGUoZHQpKTtcclxuXHRcdGNvbnN0IHIgPSBkYXQucGx1cyh7bW9udGhzOiBtb250aHN9KTtcclxuXHRcdHJldHVybiByLnRvSlNEYXRlKCk7XHJcblx0fVxyXG5cclxuXHRzdGF0aWMgYWRkWWVhcnMoZHQ6IERhdGUgfCBzdHJpbmcgfCBudW1iZXIsIHllYXJzOiBudW1iZXIpIDogRGF0ZSB7XHJcblx0XHRjb25zdCBkYXQgPSBEYXRlVGltZS5mcm9tSlNEYXRlKHRoaXMuZGF0ZURhdGFUb0RhdGUoZHQpKTtcclxuXHRcdGNvbnN0IHIgPSBkYXQucGx1cyh7eWVhcnM6IHllYXJzfSk7XHJcblx0XHRyZXR1cm4gci50b0pTRGF0ZSgpO1xyXG5cdH1cclxuXHJcblx0c3RhdGljIGFkZEhvdXJzKGR0OiBEYXRlIHwgc3RyaW5nIHwgbnVtYmVyLCBob3VyczogbnVtYmVyKSA6IERhdGUge1xyXG5cdFx0Y29uc3QgZGF0ID0gRGF0ZVRpbWUuZnJvbUpTRGF0ZSh0aGlzLmRhdGVEYXRhVG9EYXRlKGR0KSk7XHJcblx0XHRjb25zdCByID0gZGF0LnBsdXMoe2hvdXJzOiBob3Vyc30pO1xyXG5cdFx0cmV0dXJuIHIudG9KU0RhdGUoKTtcclxuXHR9XHJcblxyXG5cdHN0YXRpYyBhZGRNaW51dGVzKGR0OiBEYXRlIHwgc3RyaW5nIHwgbnVtYmVyLCBtaW51dGVzOiBudW1iZXIpIDogRGF0ZSB7XHJcblx0XHRjb25zdCBkYXQgPSBEYXRlVGltZS5mcm9tSlNEYXRlKHRoaXMuZGF0ZURhdGFUb0RhdGUoZHQpKTtcclxuXHRcdGNvbnN0IHIgPSBkYXQucGx1cyh7bWludXRlczogbWludXRlc30pO1xyXG5cdFx0cmV0dXJuIHIudG9KU0RhdGUoKTtcclxuXHR9XHJcblxyXG5cclxuXHQvKipcclxuXHQgKiBTdGFydCBvZiB0b2RheVxyXG5cdCAqL1xyXG5cdHN0YXRpYyBnZXQgdG9kYXkoKTogRGF0ZSB7XHJcblx0XHRyZXR1cm4gdGhpcy5nZXRTdGFydE9mVG9kYXkoKTtcclxuXHR9XHJcblxyXG5cdHN0YXRpYyBnZXQgbm93KCk6IERhdGUge1xyXG5cdFx0cmV0dXJuIG5ldyBEYXRlKERhdGUubm93KCkpO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRnJvbSBub3csIG5leHQgNSBtaW51dGUgbWFyay4gRm9yIGV4YW1wbGUgMjoyMzo0NCB3aWxsIGJlIDI6MjU6MDA7XHJcblx0ICogQHJldHVybnMgXHJcblx0ICovXHJcblx0c3RhdGljIGdldE5leHQ1TWludXRlTWFyaygpOiBEYXRlIHtcclxuXHRcdGNvbnN0IG0gPSBEYXRlVGltZS5ub3coKS5zZXQoe3NlY29uZDogMCwgbWlsbGlzZWNvbmQ6MH0pO1xyXG5cdFx0Y29uc3QgbWludXRlID0gbS5taW51dGU7XHJcblx0XHRjb25zdCBtb2QgPSBtaW51dGUgJSA1O1xyXG5cdFx0aWYgKG1vZCkge1xyXG5cdFx0XHRjb25zdCBkZWx0YSA9IDUgLSBtb2Q7XHJcblx0XHRcdHJldHVybiBtLnBsdXMoe21pbnV0ZXM6IGRlbHRhfSkudG9KU0RhdGUoKTtcclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gbS50b0pTRGF0ZSgpO1xyXG5cdH1cclxuXHJcblx0c3RhdGljIGdldFlNRChkOiBEYXRlIHwgc3RyaW5nIHwgbnVtYmVyKSB7XHJcblx0XHRjb25zdCBkdCA9IERhdGVUaW1lLmZyb21KU0RhdGUodGhpcy5kYXRlRGF0YVRvRGF0ZShkKSk7XHJcblx0XHRyZXR1cm4gZHQudG9Gb3JtYXQoJ3l5eXlNTWRkJyk7XHJcblx0fVxyXG5cclxuXHRzdGF0aWMgZ2V0RE1ZV2l0aFNsYXNoKGQ6IERhdGUgfCBzdHJpbmcgfCBudW1iZXIpIHtcclxuXHRcdGNvbnN0IGR0ID0gRGF0ZVRpbWUuZnJvbUpTRGF0ZSh0aGlzLmRhdGVEYXRhVG9EYXRlKGQpKTtcclxuXHRcdHJldHVybiBkdC50b0Zvcm1hdCgnZGQvTU0veXl5eScpO1xyXG5cdH1cclxuXHJcblx0c3RhdGljIGdldERNWUhtV2l0aFNsYXNoKGQ6IERhdGUgfCBzdHJpbmcgfCBudW1iZXIpIHtcclxuXHRcdGNvbnN0IGR0ID0gRGF0ZVRpbWUuZnJvbUpTRGF0ZSh0aGlzLmRhdGVEYXRhVG9EYXRlKGQpKTtcclxuXHRcdHJldHVybiBkdC50b0Zvcm1hdCgnZGQvTU0veXl5eSBISDptbScpO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogXHJcblx0ICogQHBhcmFtIGR0VXRjIEluIDI0IGhvdXIgZm9ybWF0LCBhbmQgdGhlIGRhdGUgc2VwYXJhdG9yIGRlcGVuZGluZyBvbiB0aGUgc3lzdGVtIG9yIEx1eG9uIGRlZmF1bHQgbG9jYWxlXHJcblx0ICogQHJldHVybnMgXHJcblx0ICovXHJcblx0c3RhdGljIGdldERhdGVUaW1lMjRTaW1wbGUoZHRVdGM6IERhdGUgfCBzdHJpbmcgfCBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkKSB7XHJcblx0XHRpZiAoZHRVdGMgPT0gbnVsbCkge1xyXG5cdFx0XHRyZXR1cm4gZHRVdGM7XHJcblx0XHR9XHJcblx0XHRcclxuXHRcdGNvbnN0IGQgPSB0aGlzLmRhdGVEYXRhVG9EYXRlKGR0VXRjKTtcclxuXHRcdGNvbnN0IGR0ID0gRGF0ZVRpbWUuZnJvbUpTRGF0ZShkKTtcclxuXHRcdHJldHVybiBkdC50b0xvY2FsZVN0cmluZyhEYXRlVGltZS5EQVRFX1NIT1JUKSArICcgJyArIGR0LnRvTG9jYWxlU3RyaW5nKERhdGVUaW1lLlRJTUVfMjRfU0lNUExFKTtcclxuXHR9XHJcblxyXG5cdHN0YXRpYyBzZXREZWZhdWx0TG9jYWxlKGxvY2FsZTogc3RyaW5nKXtcclxuXHRcdFNldHRpbmdzLmRlZmF1bHRMb2NhbGU9bG9jYWxlO1xyXG5cdH1cclxuXHJcblx0c3RhdGljIGdldERlZmF1bHRMb2NhbGUoKXtcclxuXHRcdHJldHVybiBTZXR0aW5ncy5kZWZhdWx0TG9jYWxlO1xyXG5cdH1cclxuXHJcblx0c3RhdGljIHNldERlZmF1bHRab25lKHpvbmU6IHN0cmluZyl7XHJcblx0XHRTZXR0aW5ncy5kZWZhdWx0Wm9uZT16b25lO1xyXG5cdH1cclxuXHJcblx0c3RhdGljIGdldERlZmF1bHRab25lKCkgOiBzdHJpbmcge1xyXG5cdFx0cmV0dXJuIFNldHRpbmdzLmRlZmF1bHRab25lLm5hbWU7XHJcblx0fVxyXG5cclxuXHRzdGF0aWMgaXNab25lVmFsaWQoKTogYm9vbGVhbntcclxuXHRcdHJldHVybiBTZXR0aW5ncy5kZWZhdWx0Wm9uZS5pc1ZhbGlkO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRm9yIGV4YW1wbGUsIGluIEFFU1QsIGl0IGlzIC02MDAuXHJcblx0ICogQHJldHVybnMgXHJcblx0ICovXHJcblx0c3RhdGljIGdldExvY2FsVGltZXpvbmVPZmZzZXQoKTogbnVtYmVyIHtcclxuXHRcdGNvbnN0IGR0ID0gbmV3IERhdGUoRGF0ZS5ub3coKSk7XHJcblx0XHRyZXR1cm4gZHQuZ2V0VGltZXpvbmVPZmZzZXQoKTtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEdldCBob3VyIG9mIHRoZSBkYXRlLiBJZiBEYXRlIGlzIG5vdCBkZWZpbmVkLCB0aGUgaG91ciB3aWxsIGJlIGN1cnJlbnQgaG91ci5cclxuXHQgKiBAcGFyYW0gZHRVdGNcclxuXHQgKi9cclxuXHRzdGF0aWMgZ2V0SG91cihkdFV0YzogRGF0ZSB8IHN0cmluZyB8IG51bWJlcik6IG51bWJlciB7XHJcblx0XHRjb25zdCBkdCA9IERhdGVUaW1lLmZyb21KU0RhdGUodGhpcy5kYXRlRGF0YVRvRGF0ZShkdFV0YykpO1xyXG5cdFx0cmV0dXJuIGR0LmhvdXI7XHJcblx0fVxyXG5cclxuXHRzdGF0aWMgZ2V0TWludXRlKGR0VXRjOiBEYXRlIHwgc3RyaW5nIHwgbnVtYmVyKTogbnVtYmVyIHtcclxuXHRcdGNvbnN0IGR0ID0gRGF0ZVRpbWUuZnJvbUpTRGF0ZSh0aGlzLmRhdGVEYXRhVG9EYXRlKGR0VXRjKSk7XHJcblx0XHRyZXR1cm4gZHQubWludXRlO1xyXG5cdH1cclxuXHJcblx0c3RhdGljIEdldEhNKGR0VXRjOiBEYXRlIHwgc3RyaW5nIHwgbnVtYmVyKToge2g6IG51bWJlciwgbTogbnVtYmVyfXtcclxuXHRcdGNvbnN0IGR0ID0gRGF0ZVRpbWUuZnJvbUpTRGF0ZSh0aGlzLmRhdGVEYXRhVG9EYXRlKGR0VXRjKSk7XHJcblx0XHRyZXR1cm4ge2g6IGR0LmhvdXIsIG06IGR0Lm1pbnV0ZX07XHJcblx0fVxyXG5cclxuXHRzdGF0aWMgY29tcG9zZURhdGVUaW1lKGR0OiBEYXRlIHwgc3RyaW5nIHwgbnVtYmVyLCBoOiBudW1iZXIgPSAwLCBtaW51dGU6IG51bWJlciA9IDAsIHNlY29uZDogbnVtYmVyID0gMCk6IERhdGUge1xyXG5cdFx0cmV0dXJuIG5ldyBEYXRlKCB0aGlzLmRhdGVEYXRhVG9EYXRlKGR0KS5zZXRIb3VycyhoLCBtaW51dGUsIHNlY29uZCwgMCkpO1xyXG5cdH1cclxuXHJcblx0c3RhdGljIG9sZGVyVGhhbjI0SG91cnMoZDogRGF0ZSB8IHN0cmluZyB8IG51bWJlcik6IGJvb2xlYW4ge1xyXG5cdFx0Y29uc3QgbSA9IERhdGVUaW1lLmZyb21KU0RhdGUodGhpcy5kYXRlRGF0YVRvRGF0ZShkKSk7XHJcblx0XHRyZXR1cm4gRGF0ZVRpbWUubm93KCkuZGlmZihtLCAnaG91cnMnKSA+PSBEdXJhdGlvbi5mcm9tSVNPKCdQVDI0SCcpO1xyXG5cdH1cclxuXHJcblx0c3RhdGljIG9sZGVyVGhhbkhvdXJzKGQ6IERhdGUgfCBzdHJpbmcgfCBudW1iZXIsIGhvdXJzOiBudW1iZXIpIDogYm9vbGVhbiB7XHJcblx0XHRjb25zdCBtID0gRGF0ZVRpbWUuZnJvbUpTRGF0ZSh0aGlzLmRhdGVEYXRhVG9EYXRlKGQpKTtcclxuXHRcdGNvbnN0IGRpZmYgPSBEYXRlVGltZS5ub3coKS5kaWZmKG0sICdob3VycycpOyBcclxuXHRcdGNvbnN0IGR1cmF0aW9uID0gRHVyYXRpb24uZnJvbUlTTyhgUFQke2hvdXJzfUhgKTtcclxuXHRcdGNvbnNvbGUuZGVidWcoJ2RpZmY6ICcgKyBkaWZmLmhvdXJzICsgJyAgIGR1cmF0aW9uOiAnICsgZHVyYXRpb24uaG91cnMpO1xyXG5cdFx0cmV0dXJuIGRpZmYuaG91cnMgPj0gZHVyYXRpb24uaG91cnM7XHJcblx0fVxyXG5cclxuXHRzdGF0aWMgb2xkZXJUaGFuTWludXRlcyhkOiBEYXRlIHwgc3RyaW5nIHwgbnVtYmVyLCBtaW51dGVzOiBudW1iZXIpIHtcclxuXHRcdGNvbnN0IG0gPSBEYXRlVGltZS5mcm9tSlNEYXRlKHRoaXMuZGF0ZURhdGFUb0RhdGUoZCkpO1xyXG5cdFx0cmV0dXJuIERhdGVUaW1lLm5vdygpLmRpZmYobSwgJ21pbnV0ZXMnKSA+PSBEdXJhdGlvbi5mcm9tTWlsbGlzKG1pbnV0ZXMqNjAqMTAwMCk7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBJdCBjb3VsZCBiZSAxMVBNIHllc3RlcmRheSwgYW5kIDEgQU0gdG9kYXkuIEFjdHVhbGx5IGJhc2VkIG9uIGxvY2FsIHRvZGF5LlxyXG5cdCAqL1xyXG5cdHN0YXRpYyBvbGRlclRoYW4xRGF5KGR0VXRjOiBEYXRlIHwgc3RyaW5nIHwgbnVtYmVyKTogYm9vbGVhbiB7XHJcblx0XHRyZXR1cm4gRGF0ZUZ1bmMuZ2V0RGF5QWdlKGR0VXRjKSA+IDA7XHJcblx0fVxyXG5cclxuXHRzdGF0aWMgZ2V0SG91ckFnZShkOiBEYXRlIHwgc3RyaW5nIHwgbnVtYmVyKSB7XHJcblx0XHRjb25zdCBtID0gRGF0ZVRpbWUuZnJvbUpTRGF0ZSh0aGlzLmRhdGVEYXRhVG9EYXRlKGQpKTtcclxuXHRcdHJldHVybiBEYXRlVGltZS5ub3coKS5kaWZmKG0sICdob3VycycpLmhvdXJzO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29tcGFyZSBkYXRlIHdpdGggbm93LlxyXG5cdCAqIEBwYXJhbSBkdFV0Y1xyXG5cdCAqL1xyXG5cdHN0YXRpYyBnZXREYXlBZ2UoZDogRGF0ZSB8IHN0cmluZyB8IG51bWJlcikge1xyXG5cdFx0Y29uc3QgbSA9IERhdGVUaW1lLmZyb21KU0RhdGUodGhpcy5kYXRlRGF0YVRvRGF0ZShkKSk7XHJcblx0XHRyZXR1cm4gRGF0ZVRpbWUubm93KCkuZGlmZihtLCAnZGF5cycpLmRheXM7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBIb3cgbWFueSB5ZWFycyBmcm9tIG5vdy5cclxuXHQgKiBAcGFyYW0gZFxyXG5cdCAqIEByZXR1cm5zXHJcblx0ICovXHJcblx0c3RhdGljIGdldEFnZShkOiBEYXRlIHwgc3RyaW5nIHwgbnVtYmVyKSB7XHJcblx0XHRjb25zdCBtID0gRGF0ZVRpbWUuZnJvbUpTRGF0ZSh0aGlzLmRhdGVEYXRhVG9EYXRlKGQpKTtcclxuXHRcdHJldHVybiBEYXRlVGltZS5ub3coKS5kaWZmKG0sICd5ZWFycycpLnllYXJzO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29udmVydCBtaW51dGVzIGZyb20gbWlkbmlnaHQgdG8gSEg6bW0gdGV4dFxyXG5cdCAqIEBwYXJhbSBtaW51dGVzXHJcblx0ICovXHJcblx0c3RhdGljIGdldEhNRnJvbU1pbnMobWludXRlczogbnVtYmVyKTogc3RyaW5nIHtcclxuXHRcdGlmIChtaW51dGVzID49IDI0ICogNjAgfHwgbWludXRlcyA8IDApIHtcclxuXHRcdFx0dGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1ZhbGlkIGlucHV0IHNob3VsZCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gMCBhbmQgbGVzcyB0aGFuIDE0NDAuJyk7XHJcblx0XHR9XHJcblx0XHRjb25zdCBoID0gbWludXRlcyAvIDYwIHwgMCxcclxuXHRcdFx0bSA9IG1pbnV0ZXMgJSA2MCB8IDA7XHJcblx0XHRyZXR1cm4gRGF0ZVRpbWUudXRjKCkuc2V0KHtob3VyOiBoLCBtaW51dGU6IG19KS50b0Zvcm1hdCgnSEg6bW0nKTtcclxuXHR9XHJcblxyXG5cdHN0YXRpYyBnZXRNaW51dGVzU2luY2VNaWRuaWdodChkOiBEYXRlIHwgc3RyaW5nIHwgbnVtYmVyKSB7XHJcblx0XHRjb25zdCBkdCA9IERhdGVUaW1lLmZyb21KU0RhdGUodGhpcy5kYXRlRGF0YVRvRGF0ZShkKSk7XHJcblx0XHRjb25zdCBtaWRuaWdodCA9IGR0LnN0YXJ0T2YoJ2RheScpO1xyXG5cdFx0cmV0dXJuIGR0LmRpZmYobWlkbmlnaHQsICdtaW51dGVzJykubWludXRlcztcclxuXHR9XHJcblxyXG5cdHN0YXRpYyBnZXRNaW51dGVzQmV0d2VlbihzdGFydDogRGF0ZSB8IHN0cmluZyB8IG51bWJlciwgZW5kOiBEYXRlIHwgc3RyaW5nIHwgbnVtYmVyKSB7XHJcblx0XHRjb25zdCBtID0gRGF0ZVRpbWUuZnJvbUpTRGF0ZSh0aGlzLmRhdGVEYXRhVG9EYXRlKHN0YXJ0KSk7XHJcblx0XHRjb25zdCBtMiA9IERhdGVUaW1lLmZyb21KU0RhdGUodGhpcy5kYXRlRGF0YVRvRGF0ZShlbmQpKTtcclxuXHRcdHJldHVybiBtMi5kaWZmKG0sICdtaW51dGVzJykubWludXRlcztcclxuXHR9XHJcbn1cclxuXHJcbiJdfQ==
@@ -1,45 +0,0 @@
1
- export class HtmlPrintFunc {
2
- /**
3
- * Print with CSS for internal reports
4
- * @param htmlTags
5
- * @param cssUrl
6
- */
7
- static printWithCSS(htmlTags, cssUrl) {
8
- if (window) {
9
- const htmlToPrint = `<html><head>
10
- <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"/>
11
- <link rel="stylesheet" type="text/css" href="${cssUrl}" media="screen,print"/>
12
- </head><body onload="window.print()">${htmlTags}</body></html>`;
13
- const popup = window.open('', '_blank', 'width=1024,height=768');
14
- popup?.document.open();
15
- popup?.document.write(htmlToPrint);
16
- popup?.document.close();
17
- }
18
- return true;
19
- }
20
- /**
21
- * Print for external documents.
22
- * @param htmlTags
23
- */
24
- static print(htmlTags) {
25
- if (window) {
26
- const htmlToPrint = `<html><head>
27
- <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"/>
28
- </head><body onload="window.print()">${htmlTags}</body></html>`;
29
- const popup = window.open('', '_blank', 'width=1024,height=768');
30
- popup?.document.open();
31
- popup?.document.write(htmlToPrint);
32
- popup?.document.close();
33
- }
34
- return true;
35
- }
36
- /**
37
- * Print image url through html img.
38
- * @param url
39
- */
40
- static printImage(url) {
41
- const imageTags = `<img src="${url}" alt="Image from URL"/>`;
42
- HtmlPrintFunc.print(imageTags);
43
- }
44
- }
45
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHRtbFByaW50RnVuYy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL25tY2UtZnVuYy9zcmMvX2Z1bmMvaHRtbFByaW50RnVuYy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxNQUFNLE9BQU8sYUFBYTtJQUN6Qjs7OztPQUlHO0lBQ0gsTUFBTSxDQUFDLFlBQVksQ0FBQyxRQUFnQixFQUFFLE1BQWM7UUFDbkQsSUFBSSxNQUFNLEVBQUUsQ0FBQztZQUNaLE1BQU0sV0FBVyxHQUFHOzsrQ0FFd0IsTUFBTTt1Q0FDZCxRQUFRLGdCQUFnQixDQUFDO1lBRTdELE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLFFBQVEsRUFBRSx1QkFBdUIsQ0FBQyxDQUFDO1lBQ2pFLEtBQUssRUFBRSxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDdkIsS0FBSyxFQUFFLFFBQVEsQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUM7WUFFbkMsS0FBSyxFQUFFLFFBQVEsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUN6QixDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDYixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsTUFBTSxDQUFDLEtBQUssQ0FBQyxRQUFnQjtRQUM1QixJQUFJLE1BQU0sRUFBRSxDQUFDO1lBQ1osTUFBTSxXQUFXLEdBQUc7O3VDQUVnQixRQUFRLGdCQUFnQixDQUFDO1lBRTdELE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLFFBQVEsRUFBRSx1QkFBdUIsQ0FBQyxDQUFDO1lBQ2pFLEtBQUssRUFBRSxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDdkIsS0FBSyxFQUFFLFFBQVEsQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUM7WUFFbkMsS0FBSyxFQUFFLFFBQVEsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUN6QixDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDYixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsTUFBTSxDQUFDLFVBQVUsQ0FBQyxHQUFXO1FBQzVCLE1BQU0sU0FBUyxHQUFHLGFBQWEsR0FBRywwQkFBMEIsQ0FBQztRQUM3RCxhQUFhLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ2hDLENBQUM7Q0FDRCIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBjbGFzcyBIdG1sUHJpbnRGdW5jIHtcclxuXHQvKipcclxuXHQgKiBQcmludCB3aXRoIENTUyBmb3IgaW50ZXJuYWwgcmVwb3J0c1xyXG5cdCAqIEBwYXJhbSBodG1sVGFnc1xyXG5cdCAqIEBwYXJhbSBjc3NVcmxcclxuXHQgKi9cclxuXHRzdGF0aWMgcHJpbnRXaXRoQ1NTKGh0bWxUYWdzOiBzdHJpbmcsIGNzc1VybDogc3RyaW5nKSB7XHJcblx0XHRpZiAod2luZG93KSB7XHJcblx0XHRcdGNvbnN0IGh0bWxUb1ByaW50ID0gYDxodG1sPjxoZWFkPlxyXG48bWV0YSBuYW1lPVwidmlld3BvcnRcIiBjb250ZW50PVwid2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTEsIHNocmluay10by1maXQ9bm9cIi8+XHJcbjxsaW5rIHJlbD1cInN0eWxlc2hlZXRcIiB0eXBlPVwidGV4dC9jc3NcIiBocmVmPVwiJHtjc3NVcmx9XCIgbWVkaWE9XCJzY3JlZW4scHJpbnRcIi8+XHJcbjwvaGVhZD48Ym9keSBvbmxvYWQ9XCJ3aW5kb3cucHJpbnQoKVwiPiR7aHRtbFRhZ3N9PC9ib2R5PjwvaHRtbD5gO1xyXG5cclxuXHRcdFx0Y29uc3QgcG9wdXAgPSB3aW5kb3cub3BlbignJywgJ19ibGFuaycsICd3aWR0aD0xMDI0LGhlaWdodD03NjgnKTtcclxuXHRcdFx0cG9wdXA/LmRvY3VtZW50Lm9wZW4oKTtcclxuXHRcdFx0cG9wdXA/LmRvY3VtZW50LndyaXRlKGh0bWxUb1ByaW50KTtcclxuXHJcblx0XHRcdHBvcHVwPy5kb2N1bWVudC5jbG9zZSgpO1xyXG5cdFx0fVxyXG5cdFx0cmV0dXJuIHRydWU7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBQcmludCBmb3IgZXh0ZXJuYWwgZG9jdW1lbnRzLlxyXG5cdCAqIEBwYXJhbSBodG1sVGFnc1xyXG5cdCAqL1xyXG5cdHN0YXRpYyBwcmludChodG1sVGFnczogc3RyaW5nKSB7XHJcblx0XHRpZiAod2luZG93KSB7XHJcblx0XHRcdGNvbnN0IGh0bWxUb1ByaW50ID0gYDxodG1sPjxoZWFkPlxyXG48bWV0YSBuYW1lPVwidmlld3BvcnRcIiBjb250ZW50PVwid2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTEsIHNocmluay10by1maXQ9bm9cIi8+XHJcbjwvaGVhZD48Ym9keSBvbmxvYWQ9XCJ3aW5kb3cucHJpbnQoKVwiPiR7aHRtbFRhZ3N9PC9ib2R5PjwvaHRtbD5gO1xyXG5cclxuXHRcdFx0Y29uc3QgcG9wdXAgPSB3aW5kb3cub3BlbignJywgJ19ibGFuaycsICd3aWR0aD0xMDI0LGhlaWdodD03NjgnKTtcclxuXHRcdFx0cG9wdXA/LmRvY3VtZW50Lm9wZW4oKTtcclxuXHRcdFx0cG9wdXA/LmRvY3VtZW50LndyaXRlKGh0bWxUb1ByaW50KTtcclxuXHJcblx0XHRcdHBvcHVwPy5kb2N1bWVudC5jbG9zZSgpO1xyXG5cdFx0fVxyXG5cdFx0cmV0dXJuIHRydWU7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBQcmludCBpbWFnZSB1cmwgdGhyb3VnaCBodG1sIGltZy5cclxuXHQgKiBAcGFyYW0gdXJsIFxyXG5cdCAqL1xyXG5cdHN0YXRpYyBwcmludEltYWdlKHVybDogc3RyaW5nKSB7XHJcblx0XHRjb25zdCBpbWFnZVRhZ3MgPSBgPGltZyBzcmM9XCIke3VybH1cIiBhbHQ9XCJJbWFnZSBmcm9tIFVSTFwiLz5gO1xyXG5cdFx0SHRtbFByaW50RnVuYy5wcmludChpbWFnZVRhZ3MpO1xyXG5cdH1cclxufVxyXG4iXX0=
@@ -1,10 +0,0 @@
1
- export * from './addressFunc';
2
- export * from './currencyFunc';
3
- export * from './dateFunc';
4
- export * from './htmlPrintFunc';
5
- export * from './javascriptFunc';
6
- export * from './jsonFunc';
7
- export * from './stringAusFunc';
8
- export * from './stringFunc';
9
- export * from './uuidFunc';
10
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9ubWNlLWZ1bmMvc3JjL19mdW5jL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsZUFBZSxDQUFDO0FBQzlCLGNBQWMsZ0JBQWdCLENBQUM7QUFDL0IsY0FBYyxZQUFZLENBQUM7QUFDM0IsY0FBYyxpQkFBaUIsQ0FBQztBQUNoQyxjQUFjLGtCQUFrQixDQUFDO0FBQ2pDLGNBQWMsWUFBWSxDQUFDO0FBQzNCLGNBQWMsaUJBQWlCLENBQUM7QUFDaEMsY0FBYyxjQUFjLENBQUM7QUFDN0IsY0FBYyxZQUFZLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL2FkZHJlc3NGdW5jJztcclxuZXhwb3J0ICogZnJvbSAnLi9jdXJyZW5jeUZ1bmMnO1xyXG5leHBvcnQgKiBmcm9tICcuL2RhdGVGdW5jJztcclxuZXhwb3J0ICogZnJvbSAnLi9odG1sUHJpbnRGdW5jJztcclxuZXhwb3J0ICogZnJvbSAnLi9qYXZhc2NyaXB0RnVuYyc7XHJcbmV4cG9ydCAqIGZyb20gJy4vanNvbkZ1bmMnO1xyXG5leHBvcnQgKiBmcm9tICcuL3N0cmluZ0F1c0Z1bmMnO1xyXG5leHBvcnQgKiBmcm9tICcuL3N0cmluZ0Z1bmMnO1xyXG5leHBvcnQgKiBmcm9tICcuL3V1aWRGdW5jJztcclxuXHJcblxyXG4iXX0=
@@ -1,21 +0,0 @@
1
- export class JavaScriptFunc {
2
- /**
3
- * Some business functions depend on external JavaScript libraries. Lazy loading of respective business modules is good,
4
- * and this function supports lazy loading of JS libraries.
5
- * @param scriptUrl
6
- * @param type things like module.
7
- * @returns Promise for subsequent JS function calls.
8
- */
9
- static loadExternalScript(scriptUrl, type) {
10
- return new Promise((resolve, reject) => {
11
- const scriptElement = document.createElement('script');
12
- if (type) {
13
- scriptElement.type = type;
14
- }
15
- scriptElement.src = scriptUrl;
16
- scriptElement.onload = resolve;
17
- document.body.appendChild(scriptElement);
18
- });
19
- }
20
- }
21
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiamF2YXNjcmlwdEZ1bmMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9ubWNlLWZ1bmMvc3JjL19mdW5jL2phdmFzY3JpcHRGdW5jLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE1BQU0sT0FBTyxjQUFjO0lBQzFCOzs7Ozs7T0FNRztJQUNILE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxTQUFpQixFQUFFLElBQWE7UUFDekQsT0FBTyxJQUFJLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRTtZQUN0QyxNQUFNLGFBQWEsR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ3ZELElBQUksSUFBSSxFQUFDLENBQUM7Z0JBQ1QsYUFBYSxDQUFDLElBQUksR0FBQyxJQUFJLENBQUM7WUFDekIsQ0FBQztZQUVELGFBQWEsQ0FBQyxHQUFHLEdBQUcsU0FBUyxDQUFDO1lBQzlCLGFBQWEsQ0FBQyxNQUFNLEdBQUcsT0FBTyxDQUFDO1lBQy9CLFFBQVEsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQzFDLENBQUMsQ0FBQyxDQUFDO0lBQ0osQ0FBQztDQUNEIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGNsYXNzIEphdmFTY3JpcHRGdW5jIHtcclxuXHQvKipcclxuXHQgKiBTb21lIGJ1c2luZXNzIGZ1bmN0aW9ucyBkZXBlbmQgb24gZXh0ZXJuYWwgSmF2YVNjcmlwdCBsaWJyYXJpZXMuIExhenkgbG9hZGluZyBvZiByZXNwZWN0aXZlIGJ1c2luZXNzIG1vZHVsZXMgaXMgZ29vZCwgXHJcblx0ICogYW5kIHRoaXMgZnVuY3Rpb24gc3VwcG9ydHMgbGF6eSBsb2FkaW5nIG9mIEpTIGxpYnJhcmllcy5cclxuXHQgKiBAcGFyYW0gc2NyaXB0VXJsIFxyXG5cdCAqIEBwYXJhbSB0eXBlIHRoaW5ncyBsaWtlIG1vZHVsZS5cclxuXHQgKiBAcmV0dXJucyBQcm9taXNlIGZvciBzdWJzZXF1ZW50IEpTIGZ1bmN0aW9uIGNhbGxzLlxyXG5cdCAqL1xyXG5cdHN0YXRpYyBsb2FkRXh0ZXJuYWxTY3JpcHQoc2NyaXB0VXJsOiBzdHJpbmcsIHR5cGU/OiBzdHJpbmcpIHtcclxuXHRcdHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcblx0XHRcdGNvbnN0IHNjcmlwdEVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTtcclxuXHRcdFx0aWYgKHR5cGUpe1xyXG5cdFx0XHRcdHNjcmlwdEVsZW1lbnQudHlwZT10eXBlO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRzY3JpcHRFbGVtZW50LnNyYyA9IHNjcmlwdFVybDtcclxuXHRcdFx0c2NyaXB0RWxlbWVudC5vbmxvYWQgPSByZXNvbHZlO1xyXG5cdFx0XHRkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHNjcmlwdEVsZW1lbnQpO1xyXG5cdFx0fSk7XHJcblx0fVxyXG59XHJcbiJdfQ==
@@ -1,69 +0,0 @@
1
- import { DateFunc } from './dateFunc';
2
- /**
3
- * Basic JSON functions
4
- */
5
- export class JsonFunc {
6
- /**
7
- *
8
- * @param array Group by a property of array element.
9
- * @param propertyName
10
- * @returns
11
- */
12
- static groupBy(array, propertyName) {
13
- return array.reduce(function (acc, obj) {
14
- const key = obj[propertyName];
15
- if (!acc[key]) {
16
- acc[key] = [];
17
- }
18
- acc[key].push(obj);
19
- return acc;
20
- }, {});
21
- }
22
- /**
23
- * Group by a date property. The key is always of string type and representing milliseconds.
24
- * The client should convert the string to number.
25
- * Angular date pipe could actually consume such string without explicitly converting to number.
26
- * @param array
27
- * @param propertyName
28
- */
29
- static groupByDate(array, propertyName) {
30
- return array.reduce(function (acc, obj) {
31
- const key = DateFunc.dateTimeUtcToLocalDateNumber(obj[propertyName]);
32
- if (key != null) {
33
- if (!acc[key]) {
34
- acc[key] = [];
35
- }
36
- acc[key].push(obj);
37
- }
38
- return acc;
39
- }, {});
40
- }
41
- /**
42
- * Remove null or empty fields including those in nested objects.
43
- * This is useful for reducing payload of AJAX serialization.
44
- * @param obj
45
- */
46
- static removeNullOrEmptyFields(obj) {
47
- for (const f in obj) {
48
- let p = obj[f];
49
- if (p === null || p === '') {
50
- delete obj[f];
51
- }
52
- else if (typeof p === 'object' && p !== null) {
53
- this.removeNullOrEmptyFields(p);
54
- }
55
- }
56
- }
57
- /**
58
- *
59
- * @param obj Remove null fields of object at only the 1st level.
60
- */
61
- static removeNullFields(obj) {
62
- for (const f in obj) {
63
- if (obj[f] === null) {
64
- delete obj[f];
65
- }
66
- }
67
- }
68
- }
69
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoianNvbkZ1bmMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9ubWNlLWZ1bmMvc3JjL19mdW5jL2pzb25GdW5jLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFFdEM7O0dBRUc7QUFDSCxNQUFNLE9BQU8sUUFBUTtJQUNwQjs7Ozs7T0FLRztJQUNILE1BQU0sQ0FBQyxPQUFPLENBQUksS0FBZSxFQUFFLFlBQW9CO1FBQ3RELE9BQU8sS0FBSyxDQUFDLE1BQU0sQ0FBQyxVQUFVLEdBQVEsRUFBRSxHQUFRO1lBQy9DLE1BQU0sR0FBRyxHQUFHLEdBQUcsQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUM5QixJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQ2YsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUNmLENBQUM7WUFDRCxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ25CLE9BQU8sR0FBRyxDQUFDO1FBQ1osQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ1IsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNILE1BQU0sQ0FBQyxXQUFXLENBQUksS0FBZSxFQUFFLFlBQW9CO1FBQzFELE9BQU8sS0FBSyxDQUFDLE1BQU0sQ0FBQyxVQUFVLEdBQVEsRUFBRSxHQUFRO1lBQy9DLE1BQU0sR0FBRyxHQUFHLFFBQVEsQ0FBQyw0QkFBNEIsQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQztZQUNyRSxJQUFJLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztnQkFDakIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO29CQUNmLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7Z0JBQ2YsQ0FBQztnQkFDRCxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3BCLENBQUM7WUFDRCxPQUFPLEdBQUcsQ0FBQztRQUNaLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUNSLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsTUFBTSxDQUFDLHVCQUF1QixDQUFDLEdBQVE7UUFDdEMsS0FBSyxNQUFNLENBQUMsSUFBSSxHQUFHLEVBQUUsQ0FBQztZQUNyQixJQUFJLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDZixJQUFJLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDO2dCQUM1QixPQUFPLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNmLENBQUM7aUJBQU0sSUFBSSxPQUFPLENBQUMsS0FBSyxRQUFRLElBQUksQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFDO2dCQUNoRCxJQUFJLENBQUMsdUJBQXVCLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDakMsQ0FBQztRQUNGLENBQUM7SUFDRixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsTUFBTSxDQUFDLGdCQUFnQixDQUFDLEdBQVE7UUFDL0IsS0FBSyxNQUFNLENBQUMsSUFBSSxHQUFHLEVBQUUsQ0FBQztZQUNyQixJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQztnQkFDckIsT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDZixDQUFDO1FBQ0YsQ0FBQztJQUNGLENBQUM7Q0FFRCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERhdGVGdW5jIH0gZnJvbSAnLi9kYXRlRnVuYyc7XHJcblxyXG4vKipcclxuICogQmFzaWMgSlNPTiBmdW5jdGlvbnNcclxuICovXHJcbmV4cG9ydCBjbGFzcyBKc29uRnVuYyB7XHJcblx0LyoqXHJcblx0ICogXHJcblx0ICogQHBhcmFtIGFycmF5IEdyb3VwIGJ5IGEgcHJvcGVydHkgb2YgYXJyYXkgZWxlbWVudC5cclxuXHQgKiBAcGFyYW0gcHJvcGVydHlOYW1lIFxyXG5cdCAqIEByZXR1cm5zIFxyXG5cdCAqL1xyXG5cdHN0YXRpYyBncm91cEJ5PFQ+KGFycmF5OiBBcnJheTxUPiwgcHJvcGVydHlOYW1lOiBzdHJpbmcpIHtcclxuXHRcdHJldHVybiBhcnJheS5yZWR1Y2UoZnVuY3Rpb24gKGFjYzogYW55LCBvYmo6IGFueSkge1xyXG5cdFx0XHRjb25zdCBrZXkgPSBvYmpbcHJvcGVydHlOYW1lXTtcclxuXHRcdFx0aWYgKCFhY2Nba2V5XSkge1xyXG5cdFx0XHRcdGFjY1trZXldID0gW107XHJcblx0XHRcdH1cclxuXHRcdFx0YWNjW2tleV0ucHVzaChvYmopO1xyXG5cdFx0XHRyZXR1cm4gYWNjO1xyXG5cdFx0fSwge30pO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogR3JvdXAgYnkgYSBkYXRlIHByb3BlcnR5LiBUaGUga2V5IGlzIGFsd2F5cyBvZiBzdHJpbmcgdHlwZSBhbmQgcmVwcmVzZW50aW5nIG1pbGxpc2Vjb25kcy4gXHJcblx0ICogVGhlIGNsaWVudCBzaG91bGQgY29udmVydCB0aGUgc3RyaW5nIHRvIG51bWJlci5cclxuXHQgKiBBbmd1bGFyIGRhdGUgcGlwZSBjb3VsZCBhY3R1YWxseSBjb25zdW1lIHN1Y2ggc3RyaW5nIHdpdGhvdXQgZXhwbGljaXRseSBjb252ZXJ0aW5nIHRvIG51bWJlci5cclxuXHQgKiBAcGFyYW0gYXJyYXlcclxuXHQgKiBAcGFyYW0gcHJvcGVydHlOYW1lXHJcblx0ICovXHJcblx0c3RhdGljIGdyb3VwQnlEYXRlPFQ+KGFycmF5OiBBcnJheTxUPiwgcHJvcGVydHlOYW1lOiBzdHJpbmcpIHtcclxuXHRcdHJldHVybiBhcnJheS5yZWR1Y2UoZnVuY3Rpb24gKGFjYzogYW55LCBvYmo6IGFueSkge1xyXG5cdFx0XHRjb25zdCBrZXkgPSBEYXRlRnVuYy5kYXRlVGltZVV0Y1RvTG9jYWxEYXRlTnVtYmVyKG9ialtwcm9wZXJ0eU5hbWVdKTtcclxuXHRcdFx0aWYgKGtleSAhPSBudWxsKSB7XHJcblx0XHRcdFx0aWYgKCFhY2Nba2V5XSkge1xyXG5cdFx0XHRcdFx0YWNjW2tleV0gPSBbXTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0YWNjW2tleV0ucHVzaChvYmopO1xyXG5cdFx0XHR9XHJcblx0XHRcdHJldHVybiBhY2M7XHJcblx0XHR9LCB7fSk7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZW1vdmUgbnVsbCBvciBlbXB0eSBmaWVsZHMgaW5jbHVkaW5nIHRob3NlIGluIG5lc3RlZCBvYmplY3RzLlxyXG5cdCAqIFRoaXMgaXMgdXNlZnVsIGZvciByZWR1Y2luZyBwYXlsb2FkIG9mIEFKQVggc2VyaWFsaXphdGlvbi5cclxuXHQgKiBAcGFyYW0gb2JqIFxyXG5cdCAqL1xyXG5cdHN0YXRpYyByZW1vdmVOdWxsT3JFbXB0eUZpZWxkcyhvYmo6IGFueSkge1xyXG5cdFx0Zm9yIChjb25zdCBmIGluIG9iaikge1xyXG5cdFx0XHRsZXQgcCA9IG9ialtmXTtcclxuXHRcdFx0aWYgKHAgPT09IG51bGwgfHwgcCA9PT0gJycpIHtcclxuXHRcdFx0XHRkZWxldGUgb2JqW2ZdO1xyXG5cdFx0XHR9IGVsc2UgaWYgKHR5cGVvZiBwID09PSAnb2JqZWN0JyAmJiBwICE9PSBudWxsKSB7XHJcblx0XHRcdFx0dGhpcy5yZW1vdmVOdWxsT3JFbXB0eUZpZWxkcyhwKTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogXHJcblx0ICogQHBhcmFtIG9iaiBSZW1vdmUgbnVsbCBmaWVsZHMgb2Ygb2JqZWN0IGF0IG9ubHkgdGhlIDFzdCBsZXZlbC5cclxuXHQgKi9cclxuXHRzdGF0aWMgcmVtb3ZlTnVsbEZpZWxkcyhvYmo6IGFueSkge1xyXG5cdFx0Zm9yIChjb25zdCBmIGluIG9iaikge1xyXG5cdFx0XHRpZiAob2JqW2ZdID09PSBudWxsKSB7XHJcblx0XHRcdFx0ZGVsZXRlIG9ialtmXTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdH1cclxuXHJcbn1cclxuIl19