web-one 0.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.
package/README.md ADDED
@@ -0,0 +1 @@
1
+ # web
package/lib/index.js ADDED
@@ -0,0 +1,535 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ var resources = (function () {
4
+ function resources() {
5
+ }
6
+ resources.limits = [12, 24, 60, 100, 120, 180, 300, 600];
7
+ resources.page = "page";
8
+ resources.limit = "limit";
9
+ resources.defaultLimit = 12;
10
+ resources.sort = "sort";
11
+ return resources;
12
+ }());
13
+ exports.resources = resources;
14
+ function removePage(obj) {
15
+ var arr = [];
16
+ var keys = Object.keys(obj);
17
+ for (var _i = 0, keys_1 = keys; _i < keys_1.length; _i++) {
18
+ var k = keys_1[_i];
19
+ if (k !== resources.page) {
20
+ var v = obj[k];
21
+ arr.push(k + "=" + encodeURI(v));
22
+ }
23
+ }
24
+ return arr.length === 0 ? "" : arr.join("&");
25
+ }
26
+ exports.removePage = removePage;
27
+ function removeSort(obj) {
28
+ var arr = [];
29
+ var keys = Object.keys(obj);
30
+ for (var _i = 0, keys_2 = keys; _i < keys_2.length; _i++) {
31
+ var k = keys_2[_i];
32
+ if (k !== resources.sort) {
33
+ var v = obj[k];
34
+ arr.push(k + "=" + encodeURI(v));
35
+ }
36
+ }
37
+ return arr.length === 0 ? "" : arr.join("&");
38
+ }
39
+ exports.removeSort = removeSort;
40
+ function getSortString(field, sort) {
41
+ if (field === sort.field) {
42
+ return sort.type === "-" ? field : "-" + field;
43
+ }
44
+ return field;
45
+ }
46
+ exports.getSortString = getSortString;
47
+ function buildFilter(obj, dates, nums, arr) {
48
+ var filter = fromParams(obj, arr);
49
+ filter[resources.page] = getPage(filter[resources.page]);
50
+ filter[resources.limit] = getLimit(filter[resources.limit]);
51
+ format(filter, dates, nums);
52
+ return filter;
53
+ }
54
+ exports.buildFilter = buildFilter;
55
+ function fromParams(obj, arr) {
56
+ var s = {};
57
+ var keys = Object.keys(obj);
58
+ for (var _i = 0, keys_3 = keys; _i < keys_3.length; _i++) {
59
+ var key = keys_3[_i];
60
+ if (inArray(key, arr)) {
61
+ var x = obj[key].split(",");
62
+ setValue(s, key, x);
63
+ }
64
+ else {
65
+ setValue(s, key, obj[key]);
66
+ }
67
+ }
68
+ return s;
69
+ }
70
+ exports.fromParams = fromParams;
71
+ function inArray(s, arr) {
72
+ if (!arr || arr.length === 0) {
73
+ return false;
74
+ }
75
+ for (var _i = 0, arr_1 = arr; _i < arr_1.length; _i++) {
76
+ var a = arr_1[_i];
77
+ if (s === a) {
78
+ return true;
79
+ }
80
+ }
81
+ return false;
82
+ }
83
+ exports.inArray = inArray;
84
+ function setValue(o, key, value) {
85
+ var obj = o;
86
+ var replaceKey = key.replace(/\[/g, ".[").replace(/\.\./g, ".");
87
+ if (replaceKey.indexOf(".") === 0) {
88
+ replaceKey = replaceKey.slice(1, replaceKey.length);
89
+ }
90
+ var keys = replaceKey.split(".");
91
+ var firstKey = keys.shift();
92
+ if (!firstKey) {
93
+ return;
94
+ }
95
+ var isArrayKey = /\[([0-9]+)\]/.test(firstKey);
96
+ if (keys.length > 0) {
97
+ var firstKeyValue = obj[firstKey] || {};
98
+ var returnValue = setValue(firstKeyValue, keys.join("."), value);
99
+ return setKey(obj, isArrayKey, firstKey, returnValue);
100
+ }
101
+ return setKey(obj, isArrayKey, firstKey, value);
102
+ }
103
+ exports.setValue = setValue;
104
+ var setKey = function (_object, _isArrayKey, _key, _nextValue) {
105
+ if (_isArrayKey) {
106
+ if (_object.length > _key) {
107
+ _object[_key] = _nextValue;
108
+ }
109
+ else {
110
+ _object.push(_nextValue);
111
+ }
112
+ }
113
+ else {
114
+ _object[_key] = _nextValue;
115
+ }
116
+ return _object;
117
+ };
118
+ var _datereg = "/Date(";
119
+ var _re = /-?\d+/;
120
+ function toDate(v) {
121
+ if (!v) {
122
+ return null;
123
+ }
124
+ if (v instanceof Date) {
125
+ return v;
126
+ }
127
+ else if (typeof v === "number") {
128
+ return new Date(v);
129
+ }
130
+ var i = v.indexOf(_datereg);
131
+ if (i >= 0) {
132
+ var m = _re.exec(v);
133
+ if (m !== null) {
134
+ var d = parseInt(m[0], 10);
135
+ return new Date(d);
136
+ }
137
+ else {
138
+ return null;
139
+ }
140
+ }
141
+ else {
142
+ if (isNaN(v)) {
143
+ return new Date(v);
144
+ }
145
+ else {
146
+ var d = parseInt(v, 10);
147
+ return new Date(d);
148
+ }
149
+ }
150
+ }
151
+ function format(obj, dates, nums) {
152
+ var o = obj;
153
+ if (dates && dates.length > 0) {
154
+ for (var _i = 0, dates_1 = dates; _i < dates_1.length; _i++) {
155
+ var s = dates_1[_i];
156
+ var v = o[s];
157
+ if (v) {
158
+ if (v instanceof Date) {
159
+ continue;
160
+ }
161
+ if (typeof v === "string" || typeof v === "number") {
162
+ var d = toDate(v);
163
+ if (d) {
164
+ if (!(d instanceof Date) || d.toString() === "Invalid Date") {
165
+ delete o[s];
166
+ }
167
+ else {
168
+ o[s] = d;
169
+ }
170
+ }
171
+ }
172
+ else if (typeof v === "object") {
173
+ var keys = Object.keys(v);
174
+ for (var _a = 0, keys_4 = keys; _a < keys_4.length; _a++) {
175
+ var key = keys_4[_a];
176
+ var v2 = v[key];
177
+ if (v2 instanceof Date) {
178
+ continue;
179
+ }
180
+ if (typeof v2 === "string" || typeof v2 === "number") {
181
+ var d2 = toDate(v2);
182
+ if (d2) {
183
+ if (!(d2 instanceof Date) || d2.toString() === "Invalid Date") {
184
+ delete v[key];
185
+ }
186
+ else {
187
+ v[key] = d2;
188
+ }
189
+ }
190
+ }
191
+ }
192
+ }
193
+ }
194
+ }
195
+ }
196
+ if (nums && nums.length > 0) {
197
+ for (var _b = 0, nums_1 = nums; _b < nums_1.length; _b++) {
198
+ var s = nums_1[_b];
199
+ var v = o[s];
200
+ if (v) {
201
+ if (v instanceof Date) {
202
+ delete o[s];
203
+ continue;
204
+ }
205
+ if (typeof v === "number") {
206
+ continue;
207
+ }
208
+ if (typeof v === "string") {
209
+ if (!isNaN(v)) {
210
+ delete o[s];
211
+ continue;
212
+ }
213
+ else {
214
+ var i = parseFloat(v);
215
+ o[s] = i;
216
+ }
217
+ }
218
+ else if (typeof v === "object") {
219
+ var keys = Object.keys(v);
220
+ for (var _c = 0, keys_5 = keys; _c < keys_5.length; _c++) {
221
+ var key = keys_5[_c];
222
+ var v2 = v[key];
223
+ if (v2 instanceof Date) {
224
+ delete o[key];
225
+ continue;
226
+ }
227
+ if (typeof v2 === "number") {
228
+ continue;
229
+ }
230
+ if (typeof v2 === "string") {
231
+ if (!isNaN(v2)) {
232
+ delete v[key];
233
+ }
234
+ else {
235
+ var i = parseFloat(v2);
236
+ v[key] = i;
237
+ }
238
+ }
239
+ }
240
+ }
241
+ }
242
+ }
243
+ }
244
+ return o;
245
+ }
246
+ exports.format = format;
247
+ function buildSort(s) {
248
+ if (!s || s.indexOf(",") >= 0) {
249
+ return {};
250
+ }
251
+ if (s.startsWith("-")) {
252
+ return { field: s.substring(1), type: "-" };
253
+ }
254
+ else {
255
+ return { field: s.startsWith("+") ? s.substring(1) : s, type: "+" };
256
+ }
257
+ }
258
+ exports.buildSort = buildSort;
259
+ function buildSortFromParams(params) {
260
+ var s = params[resources.sort];
261
+ return buildSort(s);
262
+ }
263
+ exports.buildSortFromParams = buildSortFromParams;
264
+ function renderSort(field, sort) {
265
+ if (field === sort.field) {
266
+ return sort.type === "-" ? "<i class='sort-down'></i>" : "<i class='sort-up'></i>";
267
+ }
268
+ return "";
269
+ }
270
+ exports.renderSort = renderSort;
271
+ function buildSortSearch(params, fields, sortStr) {
272
+ var search = removeSort(params);
273
+ var sort = buildSort(sortStr);
274
+ var sorts = {};
275
+ var prefix = search.length > 0 ? "?" + search + "&" : "?";
276
+ for (var i = 0; i < fields.length; i++) {
277
+ sorts[fields[i]] = {
278
+ url: prefix + resources.sort + "=" + getSortString(fields[i], sort),
279
+ tag: renderSort(fields[i], sort),
280
+ };
281
+ }
282
+ return sorts;
283
+ }
284
+ exports.buildSortSearch = buildSortSearch;
285
+ function getDateFormat(profile) {
286
+ return "M/D/YYYY";
287
+ }
288
+ exports.getDateFormat = getDateFormat;
289
+ function getPage(page) {
290
+ var num = getNumber(page);
291
+ return num === undefined || num < 1 ? 1 : num;
292
+ }
293
+ exports.getPage = getPage;
294
+ function getLimit(limit) {
295
+ var num = getNumber(limit);
296
+ return num === undefined || num < 1 ? resources.defaultLimit : num;
297
+ }
298
+ exports.getLimit = getLimit;
299
+ function getNumber(num, defaultNum) {
300
+ return !num || num.length === 0 ? defaultNum : isNaN(num) ? undefined : parseInt(num, 10);
301
+ }
302
+ exports.getNumber = getNumber;
303
+ function clone(obj) {
304
+ if (!obj) {
305
+ return obj;
306
+ }
307
+ if (obj instanceof Date) {
308
+ return new Date(obj.getTime());
309
+ }
310
+ if (typeof obj !== "object") {
311
+ return obj;
312
+ }
313
+ if (Array.isArray(obj)) {
314
+ var arr = [];
315
+ for (var _i = 0, obj_1 = obj; _i < obj_1.length; _i++) {
316
+ var sub = obj_1[_i];
317
+ var c = clone(sub);
318
+ arr.push(c);
319
+ }
320
+ return arr;
321
+ }
322
+ var x = {};
323
+ var keys = Object.keys(obj);
324
+ for (var _a = 0, keys_6 = keys; _a < keys_6.length; _a++) {
325
+ var k = keys_6[_a];
326
+ var v = obj[k];
327
+ if (v instanceof Date) {
328
+ x[k] = new Date(v.getTime());
329
+ }
330
+ else {
331
+ switch (typeof v) {
332
+ case "object":
333
+ x[k] = clone(v);
334
+ break;
335
+ default:
336
+ x[k] = v;
337
+ break;
338
+ }
339
+ }
340
+ }
341
+ return x;
342
+ }
343
+ exports.clone = clone;
344
+ function datetimeToString(date) {
345
+ if (!date || date === "") {
346
+ return undefined;
347
+ }
348
+ var d2 = typeof date !== "string" ? date : new Date(date);
349
+ var year = d2.getFullYear();
350
+ var month = pad(d2.getMonth() + 1);
351
+ var day = pad(d2.getDate());
352
+ var hours = pad(d2.getHours());
353
+ var minutes = pad(d2.getMinutes());
354
+ var seconds = pad(d2.getSeconds());
355
+ return year + "-" + month + "-" + day + "T" + hours + ":" + minutes + ":" + seconds;
356
+ }
357
+ exports.datetimeToString = datetimeToString;
358
+ function formatDate(d, dateFormat, full, upper) {
359
+ if (!d) {
360
+ return "";
361
+ }
362
+ var format = dateFormat && dateFormat.length > 0 ? dateFormat : "M/D/YYYY";
363
+ if (upper) {
364
+ format = format.toUpperCase();
365
+ }
366
+ var arr = ["", "", ""];
367
+ var items = format.split(/\/|\.| |-/);
368
+ var iday = items.indexOf("D");
369
+ var im = items.indexOf("M");
370
+ var iyear = items.indexOf("YYYY");
371
+ var fm = full ? full : false;
372
+ var fd = full ? full : false;
373
+ var fy = true;
374
+ if (iday === -1) {
375
+ iday = items.indexOf("DD");
376
+ fd = true;
377
+ }
378
+ if (im === -1) {
379
+ im = items.indexOf("MM");
380
+ fm = true;
381
+ }
382
+ if (iyear === -1) {
383
+ iyear = items.indexOf("YY");
384
+ fy = full ? full : false;
385
+ }
386
+ arr[iday] = getD(d.getDate(), fd);
387
+ arr[im] = getD(d.getMonth() + 1, fm);
388
+ arr[iyear] = getYear(d.getFullYear(), fy);
389
+ var s = detectSeparator(format);
390
+ var e = detectLastSeparator(format);
391
+ var l = items.length === 4 ? format[format.length - 1] : "";
392
+ return arr[0] + s + arr[1] + e + arr[2] + l;
393
+ }
394
+ exports.formatDate = formatDate;
395
+ function detectSeparator(format) {
396
+ var len = format.length;
397
+ for (var i = 0; i < len; i++) {
398
+ var c = format[i];
399
+ if (!((c >= "A" && c <= "Z") || (c >= "a" && c <= "z"))) {
400
+ return c;
401
+ }
402
+ }
403
+ return "/";
404
+ }
405
+ function detectLastSeparator(format) {
406
+ var len = format.length - 3;
407
+ for (var i = len; i > -0; i--) {
408
+ var c = format[i];
409
+ if (!((c >= "A" && c <= "Z") || (c >= "a" && c <= "z"))) {
410
+ return c;
411
+ }
412
+ }
413
+ return "/";
414
+ }
415
+ function getYear(y, full) {
416
+ if (full || (y <= 99 && y >= -99)) {
417
+ return y.toString();
418
+ }
419
+ var s = y.toString();
420
+ return s.substring(s.length - 2);
421
+ }
422
+ exports.getYear = getYear;
423
+ function getD(n, fu) {
424
+ return fu ? pad(n) : n.toString();
425
+ }
426
+ function formatDateTime(date, dateFormat, full, upper) {
427
+ if (!date) {
428
+ return "";
429
+ }
430
+ var sd = formatDate(date, dateFormat, full, upper);
431
+ if (sd.length === 0) {
432
+ return sd;
433
+ }
434
+ return sd + " " + formatTime(date);
435
+ }
436
+ exports.formatDateTime = formatDateTime;
437
+ function formatLongDateTime(date, dateFormat, full, upper) {
438
+ if (!date) {
439
+ return "";
440
+ }
441
+ var sd = formatDate(date, dateFormat, full, upper);
442
+ if (sd.length === 0) {
443
+ return sd;
444
+ }
445
+ return sd + " " + formatLongTime(date);
446
+ }
447
+ exports.formatLongDateTime = formatLongDateTime;
448
+ function formatFullDateTime(date, dateFormat, s, full, upper) {
449
+ if (!date) {
450
+ return "";
451
+ }
452
+ var sd = formatDate(date, dateFormat, full, upper);
453
+ if (sd.length === 0) {
454
+ return sd;
455
+ }
456
+ return sd + " " + formatFullTime(date, s);
457
+ }
458
+ exports.formatFullDateTime = formatFullDateTime;
459
+ function formatTime(d) {
460
+ return pad(d.getHours()) + ":" + pad(d.getMinutes());
461
+ }
462
+ exports.formatTime = formatTime;
463
+ function formatLongTime(d) {
464
+ return pad(d.getHours()) + ":" + pad(d.getMinutes()) + ":" + pad(d.getSeconds());
465
+ }
466
+ exports.formatLongTime = formatLongTime;
467
+ function formatFullTime(d, s) {
468
+ var se = s && s.length > 0 ? s : ".";
469
+ return formatLongTime(d) + se + pad3(d.getMilliseconds());
470
+ }
471
+ exports.formatFullTime = formatFullTime;
472
+ function dateToString(d, milli) {
473
+ var s = "" + d.getFullYear() + pad(d.getMonth() + 1) + pad(d.getDate()) + pad(d.getHours()) + pad(d.getMinutes()) + pad(d.getSeconds());
474
+ if (milli) {
475
+ return s + pad3(d.getMilliseconds());
476
+ }
477
+ return s;
478
+ }
479
+ exports.dateToString = dateToString;
480
+ function pad(n) {
481
+ return n < 10 ? "0" + n : n.toString();
482
+ }
483
+ function pad3(n) {
484
+ if (n >= 100) {
485
+ return n.toString();
486
+ }
487
+ return n < 10 ? "00" + n : "0" + n.toString();
488
+ }
489
+ var formatter = (function () {
490
+ function formatter() {
491
+ }
492
+ formatter.removePhoneFormat = function (phone) {
493
+ if (phone) {
494
+ return phone.replace(formatter.phone, "");
495
+ }
496
+ else {
497
+ return phone;
498
+ }
499
+ };
500
+ formatter.formatPhone = function (phone) {
501
+ if (!phone) {
502
+ return "";
503
+ }
504
+ var s = phone;
505
+ var x = formatter.removePhoneFormat(phone);
506
+ if (x.length === 10) {
507
+ var USNumber = x.match(formatter.usPhone);
508
+ if (USNumber != null) {
509
+ s = USNumber[1] + " " + USNumber[2] + "-" + USNumber[3];
510
+ }
511
+ }
512
+ else if (x.length <= 3 && x.length > 0) {
513
+ s = x;
514
+ }
515
+ else if (x.length > 3 && x.length < 7) {
516
+ s = x.substring(0, 3) + " " + x.substring(3, x.length);
517
+ }
518
+ else if (x.length >= 7 && x.length < 10) {
519
+ s = x.substring(0, 3) + " " + x.substring(3, 6) + "-" + x.substring(6, x.length);
520
+ }
521
+ else if (x.length >= 11) {
522
+ var l = x.length;
523
+ s = x.substring(0, l - 7) + " " + x.substring(l - 7, l - 4) + "-" + x.substring(l - 4, l);
524
+ }
525
+ return s;
526
+ };
527
+ formatter.phone = / |\-|\.|\(|\)/g;
528
+ formatter.usPhone = /(\d{3})(\d{3})(\d{4})/;
529
+ return formatter;
530
+ }());
531
+ exports.formatter = formatter;
532
+ function formatPhone(phone) {
533
+ return formatter.formatPhone(phone);
534
+ }
535
+ exports.formatPhone = formatPhone;
package/package.json ADDED
@@ -0,0 +1,26 @@
1
+ {
2
+ "name": "web-one",
3
+ "version": "0.0.1",
4
+ "description": "Validate data",
5
+ "main": "./lib/index.js",
6
+ "types": "./src/index.ts",
7
+ "scripts": {
8
+ "build:lib": "tsc",
9
+ "clean:lib": "rimraf lib"
10
+ },
11
+ "devDependencies": {
12
+ "tslint": "5.10.0",
13
+ "typescript": "^3.8.3"
14
+ },
15
+ "publishConfig": {
16
+ "registry": "https://registry.npmjs.org/"
17
+ },
18
+ "repository": {
19
+ "type": "git",
20
+ "url": "git@github.com/core-ts/web"
21
+ },
22
+ "keywords": [
23
+ "web",
24
+ "web utilities"
25
+ ]
26
+ }
package/src/index.ts ADDED
@@ -0,0 +1,500 @@
1
+ export class resources {
2
+ static limits = [12, 24, 60, 100, 120, 180, 300, 600]
3
+ static page = "page"
4
+ static limit = "limit"
5
+ static defaultLimit = 12
6
+ static sort = "sort"
7
+ }
8
+ export interface StringMap {
9
+ [key: string]: string
10
+ }
11
+ export interface Params {
12
+ params: StringMap
13
+ searchParams: StringMap
14
+ }
15
+ export function removePage(obj: StringMap): string {
16
+ const arr: string[] = []
17
+ const keys = Object.keys(obj)
18
+ for (const k of keys) {
19
+ if (k !== resources.page) {
20
+ const v = obj[k]
21
+ arr.push(`${k}=${encodeURI(v)}`)
22
+ }
23
+ }
24
+ return arr.length === 0 ? "" : arr.join("&")
25
+ }
26
+
27
+ export function removeSort(obj: StringMap): string {
28
+ const arr: string[] = []
29
+ const keys = Object.keys(obj)
30
+ for (const k of keys) {
31
+ if (k !== resources.sort) {
32
+ const v = obj[k]
33
+ arr.push(`${k}=${encodeURI(v)}`)
34
+ }
35
+ }
36
+ return arr.length === 0 ? "" : arr.join("&")
37
+ }
38
+ export type SearchParams = {
39
+ q?: string
40
+ page?: string
41
+ limit?: string
42
+ sort?: string
43
+ }
44
+ export interface Sort {
45
+ field?: string
46
+ type?: string
47
+ }
48
+ export interface SortType {
49
+ url: string
50
+ tag: string
51
+ }
52
+ export interface SortMap {
53
+ [key: string]: SortType
54
+ }
55
+ export function getSortString(field: string, sort: Sort): string {
56
+ if (field === sort.field) {
57
+ return sort.type === "-" ? field : "-" + field
58
+ }
59
+ return field
60
+ }
61
+ export function buildFilter<T>(obj: StringMap, dates?: string[], nums?: string[], arr?: string[]): T {
62
+ const filter: any = fromParams<T>(obj, arr)
63
+ filter[resources.page] = getPage(filter[resources.page] as string)
64
+ filter[resources.limit] = getLimit(filter[resources.limit] as string)
65
+ format(filter, dates, nums)
66
+ return filter
67
+ }
68
+ export function fromParams<T>(obj: StringMap, arr?: string[]): T {
69
+ const s: any = {}
70
+ const keys = Object.keys(obj)
71
+ for (const key of keys) {
72
+ if (inArray(key, arr)) {
73
+ const x = (obj[key] as string).split(",")
74
+ setValue(s, key, x)
75
+ } else {
76
+ setValue(s, key, obj[key] as string)
77
+ }
78
+ }
79
+ return s
80
+ }
81
+ export function inArray(s: string, arr?: string[]): boolean {
82
+ if (!arr || arr.length === 0) {
83
+ return false
84
+ }
85
+ for (const a of arr) {
86
+ if (s === a) {
87
+ return true
88
+ }
89
+ }
90
+ return false
91
+ }
92
+ export function setValue<T, V>(o: T, key: string, value: V): any {
93
+ const obj: any = o
94
+ let replaceKey = key.replace(/\[/g, ".[").replace(/\.\./g, ".")
95
+ if (replaceKey.indexOf(".") === 0) {
96
+ replaceKey = replaceKey.slice(1, replaceKey.length)
97
+ }
98
+ const keys = replaceKey.split(".")
99
+ const firstKey = keys.shift()
100
+ if (!firstKey) {
101
+ return
102
+ }
103
+ const isArrayKey = /\[([0-9]+)\]/.test(firstKey)
104
+ if (keys.length > 0) {
105
+ const firstKeyValue = obj[firstKey] || {}
106
+ const returnValue = setValue(firstKeyValue, keys.join("."), value)
107
+ return setKey(obj, isArrayKey, firstKey, returnValue)
108
+ }
109
+ return setKey(obj, isArrayKey, firstKey, value)
110
+ }
111
+ const setKey = (_object: any, _isArrayKey: boolean, _key: string, _nextValue: any) => {
112
+ if (_isArrayKey) {
113
+ if (_object.length > _key) {
114
+ _object[_key] = _nextValue
115
+ } else {
116
+ _object.push(_nextValue)
117
+ }
118
+ } else {
119
+ _object[_key] = _nextValue
120
+ }
121
+ return _object
122
+ }
123
+ const _datereg = "/Date("
124
+ const _re = /-?\d+/
125
+ function toDate(v: any): Date | null | undefined {
126
+ if (!v) {
127
+ return null
128
+ }
129
+ if (v instanceof Date) {
130
+ return v
131
+ } else if (typeof v === "number") {
132
+ return new Date(v)
133
+ }
134
+ const i = v.indexOf(_datereg)
135
+ if (i >= 0) {
136
+ const m = _re.exec(v)
137
+ if (m !== null) {
138
+ const d = parseInt(m[0], 10)
139
+ return new Date(d)
140
+ } else {
141
+ return null
142
+ }
143
+ } else {
144
+ if (isNaN(v)) {
145
+ return new Date(v)
146
+ } else {
147
+ const d = parseInt(v, 10)
148
+ return new Date(d)
149
+ }
150
+ }
151
+ }
152
+ export function format<T>(obj: T, dates?: string[], nums?: string[]): T {
153
+ const o: any = obj
154
+ if (dates && dates.length > 0) {
155
+ for (const s of dates) {
156
+ const v = o[s]
157
+ if (v) {
158
+ if (v instanceof Date) {
159
+ continue
160
+ }
161
+ if (typeof v === "string" || typeof v === "number") {
162
+ const d = toDate(v)
163
+ if (d) {
164
+ if (!(d instanceof Date) || d.toString() === "Invalid Date") {
165
+ delete o[s]
166
+ } else {
167
+ o[s] = d
168
+ }
169
+ }
170
+ } else if (typeof v === "object") {
171
+ const keys = Object.keys(v)
172
+ for (const key of keys) {
173
+ const v2 = v[key]
174
+ if (v2 instanceof Date) {
175
+ continue
176
+ }
177
+ if (typeof v2 === "string" || typeof v2 === "number") {
178
+ const d2 = toDate(v2)
179
+ if (d2) {
180
+ if (!(d2 instanceof Date) || d2.toString() === "Invalid Date") {
181
+ delete v[key]
182
+ } else {
183
+ v[key] = d2
184
+ }
185
+ }
186
+ }
187
+ }
188
+ }
189
+ }
190
+ }
191
+ }
192
+ if (nums && nums.length > 0) {
193
+ for (const s of nums) {
194
+ const v = o[s]
195
+ if (v) {
196
+ if (v instanceof Date) {
197
+ delete o[s]
198
+ continue
199
+ }
200
+ if (typeof v === "number") {
201
+ continue
202
+ }
203
+ if (typeof v === "string") {
204
+ if (!isNaN(v as any)) {
205
+ delete o[s]
206
+ continue
207
+ } else {
208
+ const i = parseFloat(v)
209
+ o[s] = i
210
+ }
211
+ } else if (typeof v === "object") {
212
+ const keys = Object.keys(v)
213
+ for (const key of keys) {
214
+ const v2 = v[key]
215
+ if (v2 instanceof Date) {
216
+ delete o[key]
217
+ continue
218
+ }
219
+ if (typeof v2 === "number") {
220
+ continue
221
+ }
222
+ if (typeof v2 === "string") {
223
+ if (!isNaN(v2 as any)) {
224
+ delete v[key]
225
+ } else {
226
+ const i = parseFloat(v2)
227
+ v[key] = i
228
+ }
229
+ }
230
+ }
231
+ }
232
+ }
233
+ }
234
+ }
235
+ return o
236
+ }
237
+
238
+ export function buildSort(s?: string): Sort {
239
+ if (!s || s.indexOf(",") >= 0) {
240
+ return {} as Sort
241
+ }
242
+ if (s.startsWith("-")) {
243
+ return { field: s.substring(1), type: "-" }
244
+ } else {
245
+ return { field: s.startsWith("+") ? s.substring(1) : s, type: "+" }
246
+ }
247
+ }
248
+ export function buildSortFromParams(params: StringMap): Sort {
249
+ const s = params[resources.sort] as string
250
+ return buildSort(s)
251
+ }
252
+ export function renderSort(field: string, sort: Sort): string {
253
+ if (field === sort.field) {
254
+ return sort.type === "-" ? "<i class='sort-down'></i>" : "<i class='sort-up'></i>"
255
+ }
256
+ return ""
257
+ }
258
+ export function buildSortSearch(params: StringMap, fields: string[], sortStr?: string): SortMap {
259
+ const search = removeSort(params)
260
+ const sort = buildSort(sortStr)
261
+ let sorts: SortMap = {}
262
+ const prefix = search.length > 0 ? "?" + search + "&" : "?"
263
+ for (let i = 0; i < fields.length; i++) {
264
+ sorts[fields[i]] = {
265
+ url: prefix + resources.sort + "=" + getSortString(fields[i], sort),
266
+ tag: renderSort(fields[i], sort),
267
+ }
268
+ }
269
+ return sorts
270
+ }
271
+
272
+ export function getDateFormat(profile?: string): string {
273
+ return "M/D/YYYY"
274
+ }
275
+ export function getPage(page?: string): number {
276
+ const num = getNumber(page)
277
+ return num === undefined || num < 1 ? 1 : num
278
+ }
279
+ export function getLimit(limit?: string): number {
280
+ const num = getNumber(limit)
281
+ return num === undefined || num < 1 ? resources.defaultLimit : num
282
+ }
283
+ export function getNumber(num?: string, defaultNum?: number): number | undefined {
284
+ return !num || num.length === 0 ? defaultNum : isNaN(num as any) ? undefined : parseInt(num, 10)
285
+ }
286
+ export function clone(obj: any): any {
287
+ if (!obj) {
288
+ return obj
289
+ }
290
+ if (obj instanceof Date) {
291
+ return new Date(obj.getTime())
292
+ }
293
+ if (typeof obj !== "object") {
294
+ return obj
295
+ }
296
+ if (Array.isArray(obj)) {
297
+ const arr = []
298
+ for (const sub of obj) {
299
+ const c = clone(sub)
300
+ arr.push(c)
301
+ }
302
+ return arr
303
+ }
304
+ const x: any = {}
305
+ const keys = Object.keys(obj)
306
+ for (const k of keys) {
307
+ const v = obj[k]
308
+ if (v instanceof Date) {
309
+ x[k] = new Date(v.getTime())
310
+ } else {
311
+ switch (typeof v) {
312
+ case "object":
313
+ x[k] = clone(v)
314
+ break
315
+ default:
316
+ x[k] = v
317
+ break
318
+ }
319
+ }
320
+ }
321
+ return x
322
+ }
323
+
324
+ export function datetimeToString(date?: Date | string): string | undefined {
325
+ if (!date || date === "") {
326
+ return undefined
327
+ }
328
+ const d2 = typeof date !== "string" ? date : new Date(date)
329
+ const year = d2.getFullYear()
330
+ const month = pad(d2.getMonth() + 1)
331
+ const day = pad(d2.getDate())
332
+ const hours = pad(d2.getHours())
333
+ const minutes = pad(d2.getMinutes())
334
+ const seconds = pad(d2.getSeconds())
335
+ return `${year}-${month}-${day}T${hours}:${minutes}:${seconds}`
336
+ }
337
+
338
+ export function formatDate(d: Date | null | undefined, dateFormat?: string, full?: boolean, upper?: boolean): string {
339
+ if (!d) {
340
+ return ""
341
+ }
342
+ let format = dateFormat && dateFormat.length > 0 ? dateFormat : "M/D/YYYY"
343
+ if (upper) {
344
+ format = format.toUpperCase()
345
+ }
346
+ let arr = ["", "", ""]
347
+ const items = format.split(/\/|\.| |-/)
348
+ let iday = items.indexOf("D")
349
+ let im = items.indexOf("M")
350
+ let iyear = items.indexOf("YYYY")
351
+ let fm = full ? full : false
352
+ let fd = full ? full : false
353
+ let fy = true
354
+ if (iday === -1) {
355
+ iday = items.indexOf("DD")
356
+ fd = true
357
+ }
358
+ if (im === -1) {
359
+ im = items.indexOf("MM")
360
+ fm = true
361
+ }
362
+ if (iyear === -1) {
363
+ iyear = items.indexOf("YY")
364
+ fy = full ? full : false
365
+ }
366
+ arr[iday] = getD(d.getDate(), fd)
367
+ arr[im] = getD(d.getMonth() + 1, fm)
368
+ arr[iyear] = getYear(d.getFullYear(), fy)
369
+ const s = detectSeparator(format)
370
+ const e = detectLastSeparator(format)
371
+ const l = items.length === 4 ? format[format.length - 1] : ""
372
+ return arr[0] + s + arr[1] + e + arr[2] + l
373
+ }
374
+ function detectSeparator(format: string): string {
375
+ const len = format.length
376
+ for (let i = 0; i < len; i++) {
377
+ const c = format[i]
378
+ if (!((c >= "A" && c <= "Z") || (c >= "a" && c <= "z"))) {
379
+ return c
380
+ }
381
+ }
382
+ return "/"
383
+ }
384
+ function detectLastSeparator(format: string): string {
385
+ const len = format.length - 3
386
+ for (let i = len; i > -0; i--) {
387
+ const c = format[i]
388
+ if (!((c >= "A" && c <= "Z") || (c >= "a" && c <= "z"))) {
389
+ return c
390
+ }
391
+ }
392
+ return "/"
393
+ }
394
+ export function getYear(y: number, full?: boolean): string {
395
+ if (full || (y <= 99 && y >= -99)) {
396
+ return y.toString()
397
+ }
398
+ const s = y.toString()
399
+ return s.substring(s.length - 2)
400
+ }
401
+ function getD(n: number, fu: boolean): string {
402
+ return fu ? pad(n) : n.toString()
403
+ }
404
+ export function formatDateTime(date: Date | null | undefined, dateFormat?: string, full?: boolean, upper?: boolean): string {
405
+ if (!date) {
406
+ return ""
407
+ }
408
+ const sd = formatDate(date, dateFormat, full, upper)
409
+ if (sd.length === 0) {
410
+ return sd
411
+ }
412
+ return sd + " " + formatTime(date)
413
+ }
414
+ export function formatLongDateTime(date: Date | null | undefined, dateFormat?: string, full?: boolean, upper?: boolean): string {
415
+ if (!date) {
416
+ return ""
417
+ }
418
+ const sd = formatDate(date, dateFormat, full, upper)
419
+ if (sd.length === 0) {
420
+ return sd
421
+ }
422
+ return sd + " " + formatLongTime(date)
423
+ }
424
+ export function formatFullDateTime(date: Date | null | undefined, dateFormat?: string, s?: string, full?: boolean, upper?: boolean): string {
425
+ if (!date) {
426
+ return ""
427
+ }
428
+ const sd = formatDate(date, dateFormat, full, upper)
429
+ if (sd.length === 0) {
430
+ return sd
431
+ }
432
+ return sd + " " + formatFullTime(date, s)
433
+ }
434
+ export function formatTime(d: Date): string {
435
+ return pad(d.getHours()) + ":" + pad(d.getMinutes())
436
+ }
437
+ export function formatLongTime(d: Date): string {
438
+ return pad(d.getHours()) + ":" + pad(d.getMinutes()) + ":" + pad(d.getSeconds())
439
+ }
440
+ export function formatFullTime(d: Date, s?: string): string {
441
+ const se = s && s.length > 0 ? s : "."
442
+ return formatLongTime(d) + se + pad3(d.getMilliseconds())
443
+ }
444
+ export function dateToString(d: Date, milli?: boolean): string {
445
+ const s = `${d.getFullYear()}${pad(d.getMonth() + 1)}${pad(d.getDate())}${pad(d.getHours())}${pad(d.getMinutes())}${pad(d.getSeconds())}`
446
+ if (milli) {
447
+ return s + pad3(d.getMilliseconds())
448
+ }
449
+ return s
450
+ }
451
+ function pad(n: number): string {
452
+ return n < 10 ? "0" + n : n.toString()
453
+ }
454
+ function pad3(n: number): string {
455
+ if (n >= 100) {
456
+ return n.toString()
457
+ }
458
+ return n < 10 ? "00" + n : "0" + n.toString()
459
+ }
460
+ // tslint:disable-next-line:class-name
461
+ export class formatter {
462
+ static phone = / |\-|\.|\(|\)/g
463
+ static usPhone = /(\d{3})(\d{3})(\d{4})/
464
+ static removePhoneFormat(phone: string): string {
465
+ if (phone) {
466
+ return phone.replace(formatter.phone, "")
467
+ } else {
468
+ return phone
469
+ }
470
+ }
471
+ static formatPhone(phone?: string | null): string {
472
+ if (!phone) {
473
+ return ""
474
+ }
475
+ // reformat phone number
476
+ // 555 123-4567 or (+1) 555 123-4567
477
+ let s = phone
478
+ const x = formatter.removePhoneFormat(phone)
479
+ if (x.length === 10) {
480
+ const USNumber = x.match(formatter.usPhone)
481
+ if (USNumber != null) {
482
+ s = `${USNumber[1]} ${USNumber[2]}-${USNumber[3]}`
483
+ }
484
+ } else if (x.length <= 3 && x.length > 0) {
485
+ s = x
486
+ } else if (x.length > 3 && x.length < 7) {
487
+ s = `${x.substring(0, 3)} ${x.substring(3, x.length)}`
488
+ } else if (x.length >= 7 && x.length < 10) {
489
+ s = `${x.substring(0, 3)} ${x.substring(3, 6)}-${x.substring(6, x.length)}`
490
+ } else if (x.length >= 11) {
491
+ const l = x.length
492
+ s = `${x.substring(0, l - 7)} ${x.substring(l - 7, l - 4)}-${x.substring(l - 4, l)}`
493
+ // formatedPhone = `(+${phoneNumber.charAt(0)}) ${phoneNumber.substring(0, 3)} ${phoneNumber.substring(3, 6)}-${phoneNumber.substring(6, phoneNumber.length - 1)}`;
494
+ }
495
+ return s
496
+ }
497
+ }
498
+ export function formatPhone(phone?: string | null): string {
499
+ return formatter.formatPhone(phone)
500
+ }
package/tsconfig.json ADDED
@@ -0,0 +1,26 @@
1
+ {
2
+ "compileOnSave": true,
3
+ "compilerOptions": {
4
+ "target": "es5",
5
+ "baseUrl": "./src",
6
+ "outDir": "./lib",
7
+ "module": "commonjs",
8
+ "moduleResolution": "node",
9
+ "strict": true,
10
+ "pretty": true,
11
+ "sourceMap": false,
12
+ "declaration": false,
13
+ "experimentalDecorators": false,
14
+ "removeComments": true,
15
+ "lib": [
16
+ "es5",
17
+ "es6"
18
+ ]
19
+ },
20
+ "include": [
21
+ "src/**/*.ts"
22
+ ],
23
+ "exclude": [
24
+ "node_modules"
25
+ ]
26
+ }