jordy 0.15.0 → 0.16.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,3 +1,4 @@
1
1
  export * from './component.type';
2
2
  export * from './etc.type';
3
3
  export * from './marshalling.type';
4
+ export * from './time.type';
@@ -0,0 +1 @@
1
+ export {};
@@ -1,4 +1,5 @@
1
1
  import { __read, __spreadArray } from "tslib";
2
+ import equalFn from 'fast-deep-equal/es6';
2
3
  export function reorder(list, startIndex, endIndex) {
3
4
  var result = __spreadArray([], __read(list), false);
4
5
  var _a = __read(result.splice(startIndex, 1), 1), removed = _a[0];
@@ -15,3 +16,25 @@ export function remove(list, index) {
15
16
  copied.splice(index, 1);
16
17
  return copied;
17
18
  }
19
+ export function hasOwn(obj, key) {
20
+ return Object.prototype.hasOwnProperty.call(obj, key);
21
+ }
22
+ export var deepEqual = equalFn;
23
+ export function createMemoize() {
24
+ var prevData = null;
25
+ var fn = function memorize(data) {
26
+ if (!prevData) {
27
+ prevData = data;
28
+ return data;
29
+ }
30
+ if (deepEqual(prevData, data)) {
31
+ return prevData;
32
+ }
33
+ prevData = data;
34
+ return data;
35
+ };
36
+ fn.clear = function () {
37
+ prevData = null;
38
+ };
39
+ return fn;
40
+ }
@@ -12,5 +12,7 @@ export * from './redux';
12
12
  export * from './template';
13
13
  export * from './libLoader';
14
14
  export * from './AsyncQueue';
15
+ export * from './refine';
16
+ export * from './time';
15
17
  var isServer = envCheck.isServer;
16
18
  export { envCheck, isServer };
@@ -0,0 +1,62 @@
1
+ import { __assign } from "tslib";
2
+ import { isValidDateStr, createDateRangeByType, addMonthsByPredefined, } from './time';
3
+ export function createEnumRefiner(enumType, def) {
4
+ var enumList = Array.isArray(enumType) ? enumType : Object.values(enumType);
5
+ return function refineForEnum(target) {
6
+ if (enumList.includes(target)) {
7
+ return target;
8
+ }
9
+ return def;
10
+ };
11
+ }
12
+ export function createPageSizeRefiner(sizeList, defaultIndex) {
13
+ if (defaultIndex === void 0) { defaultIndex = 0; }
14
+ return createEnumRefiner(sizeList, sizeList[defaultIndex]);
15
+ }
16
+ export function refinePageNumber(raw) {
17
+ var page = Math.floor(Math.abs(Number(raw || 1)));
18
+ if (Number.isFinite(page) && page > 0) {
19
+ return page;
20
+ }
21
+ return 1;
22
+ }
23
+ export function refineToRestrictedDateRange(dateRange, maxType, defType) {
24
+ var result = __assign({}, dateRange);
25
+ result.gte = isValidDateStr(result.gte) ? result.gte : '';
26
+ result.lte = isValidDateStr(result.lte) ? result.lte : '';
27
+ if (!result.gte || !result.lte) {
28
+ if (defType) {
29
+ var tmp = createDateRangeByType(defType);
30
+ result.gte = tmp.gte;
31
+ result.lte = tmp.lte;
32
+ }
33
+ return result;
34
+ }
35
+ var maxMonth = addMonthsByPredefined(result.gte, maxType);
36
+ if (result.lte > maxMonth) {
37
+ result.lte = maxMonth;
38
+ }
39
+ else if (result.lte < result.gte) {
40
+ result.lte = result.gte;
41
+ }
42
+ return result;
43
+ }
44
+ function refineDate(value, def) {
45
+ if (!isValidDateStr(value)) {
46
+ return def;
47
+ }
48
+ return value;
49
+ }
50
+ export function refineDateRange(dateRange, preset) {
51
+ if (preset === void 0) { preset = 'month'; }
52
+ var def = createDateRangeByType(preset);
53
+ if (!dateRange || !dateRange.gte || !dateRange.lte) {
54
+ return def;
55
+ }
56
+ var gte = refineDate(dateRange.gte, def.gte);
57
+ var lte = refineDate(dateRange.lte, def.lte);
58
+ return {
59
+ gte: gte,
60
+ lte: lte,
61
+ };
62
+ }
@@ -0,0 +1,217 @@
1
+ import { isString } from './typeCheck';
2
+ export var MAX_MONTH_LOOKUP_TABLE = {
3
+ month: 1,
4
+ threeMonths: 3,
5
+ sixMonths: 6,
6
+ };
7
+ function padZero(num) {
8
+ return num.toString().padStart(2, '0');
9
+ }
10
+ export function dateFormat(date, delimiter) {
11
+ if (delimiter === void 0) { delimiter = '-'; }
12
+ var year = date.getFullYear();
13
+ var month = date.getMonth() + 1;
14
+ var dates = date.getDate();
15
+ return "".concat(year).concat(delimiter).concat(padZero(month)).concat(delimiter).concat(padZero(dates));
16
+ }
17
+ export function getToday(todayRef) {
18
+ if (todayRef === void 0) { todayRef = new Date(); }
19
+ var dateToday = new Date(todayRef);
20
+ var today = dateFormat(dateToday);
21
+ return today;
22
+ }
23
+ export function getBeforeMonthAt(months, todayRef) {
24
+ if (months === void 0) { months = 1; }
25
+ if (todayRef === void 0) { todayRef = new Date(); }
26
+ var beforeMonth;
27
+ if (todayRef.getMonth() - months === 1) {
28
+ var dateFeb = new Date(todayRef);
29
+ dateFeb.setDate(1);
30
+ dateFeb.setMonth(2);
31
+ dateFeb.setDate(0);
32
+ if (dateFeb.getDate() < todayRef.getDate()) {
33
+ beforeMonth = dateFormat(dateFeb);
34
+ return beforeMonth;
35
+ }
36
+ }
37
+ var dateBeforeMonth = new Date(todayRef);
38
+ dateBeforeMonth.setMonth(dateBeforeMonth.getMonth() - months);
39
+ beforeMonth = dateFormat(dateBeforeMonth);
40
+ return beforeMonth;
41
+ }
42
+ export function addDays(date, days) {
43
+ if (isString(date)) {
44
+ return addDays(new Date(date), days);
45
+ }
46
+ var after = new Date(date);
47
+ after.setDate(after.getDate() + days);
48
+ return dateFormat(after);
49
+ }
50
+ function getYesterday(todayRef) {
51
+ if (todayRef === void 0) { todayRef = new Date(); }
52
+ return addDays(todayRef, -1);
53
+ }
54
+ function getBeforeWeek(todayRef) {
55
+ if (todayRef === void 0) { todayRef = new Date(); }
56
+ return addDays(todayRef, -7);
57
+ }
58
+ function getAfterTwoWeeks(todayRef) {
59
+ if (todayRef === void 0) { todayRef = new Date(); }
60
+ return addDays(todayRef, 14);
61
+ }
62
+ export function toPredefinedDateRangeType(gte, lte, todayRef) {
63
+ if (todayRef === void 0) { todayRef = new Date(); }
64
+ if (!gte || !lte) {
65
+ return '';
66
+ }
67
+ var today = getToday(todayRef);
68
+ if (gte === today && lte === today) {
69
+ return 'today';
70
+ }
71
+ var yesterday = getYesterday(todayRef);
72
+ if (gte === yesterday && lte === yesterday) {
73
+ return 'yesterday';
74
+ }
75
+ var beforeWeek = getBeforeWeek(todayRef);
76
+ if (gte === beforeWeek && lte === today) {
77
+ return 'week';
78
+ }
79
+ var beforeMonth = getBeforeMonthAt(1, todayRef);
80
+ if (gte === beforeMonth && lte === today) {
81
+ return 'month';
82
+ }
83
+ var before3Months = getBeforeMonthAt(3, todayRef);
84
+ if (gte === before3Months && lte === today) {
85
+ return 'threeMonths';
86
+ }
87
+ var before6Months = getBeforeMonthAt(6, todayRef);
88
+ if (gte === before6Months && lte === today) {
89
+ return 'sixMonths';
90
+ }
91
+ var beforeYear = getBeforeMonthAt(12, todayRef);
92
+ if (gte === beforeYear && lte === today) {
93
+ return 'year';
94
+ }
95
+ var afterTwoWeeks = getAfterTwoWeeks(todayRef);
96
+ if (gte === beforeMonth && lte === afterTwoWeeks) {
97
+ return 'calcDefRange';
98
+ }
99
+ return '';
100
+ }
101
+ var converter = {
102
+ today: function (todayRef) {
103
+ var today = getToday(todayRef);
104
+ return {
105
+ gte: today,
106
+ lte: today,
107
+ };
108
+ },
109
+ yesterday: function (todayRef) {
110
+ var yesterday = getYesterday(todayRef);
111
+ return {
112
+ gte: yesterday,
113
+ lte: yesterday,
114
+ };
115
+ },
116
+ week: function (todayRef) {
117
+ var today = getToday(todayRef);
118
+ var beforeWeek = getBeforeWeek(todayRef);
119
+ return {
120
+ gte: beforeWeek,
121
+ lte: today,
122
+ };
123
+ },
124
+ month: function (todayRef) {
125
+ var today = getToday(todayRef);
126
+ var beforeMonth = getBeforeMonthAt(1, todayRef);
127
+ return {
128
+ gte: beforeMonth,
129
+ lte: today,
130
+ };
131
+ },
132
+ threeMonths: function (todayRef) {
133
+ var today = getToday(todayRef);
134
+ var beforeMonth = getBeforeMonthAt(3, todayRef);
135
+ return {
136
+ gte: beforeMonth,
137
+ lte: today,
138
+ };
139
+ },
140
+ sixMonths: function (todayRef) {
141
+ var today = getToday(todayRef);
142
+ var beforeMonth = getBeforeMonthAt(6, todayRef);
143
+ return {
144
+ gte: beforeMonth,
145
+ lte: today,
146
+ };
147
+ },
148
+ year: function (todayRef) {
149
+ var today = getToday(todayRef);
150
+ var beforeMonth = getBeforeMonthAt(12, todayRef);
151
+ return {
152
+ gte: beforeMonth,
153
+ lte: today,
154
+ };
155
+ },
156
+ calcDefRange: function (todayRef) {
157
+ var beforeMonth = getBeforeMonthAt(1, todayRef);
158
+ var afterTwoWeeks = getAfterTwoWeeks(todayRef);
159
+ return {
160
+ gte: beforeMonth,
161
+ lte: afterTwoWeeks,
162
+ };
163
+ },
164
+ '': function () { return ({ gte: '', lte: '' }); },
165
+ };
166
+ export function createDateRangeByType(predefinedType, todayRef) {
167
+ if (todayRef === void 0) { todayRef = new Date(); }
168
+ if (!predefinedType) {
169
+ return {
170
+ gte: '',
171
+ lte: '',
172
+ };
173
+ }
174
+ return converter[predefinedType](todayRef);
175
+ }
176
+ export function addMonths(date, months) {
177
+ if (isString(date)) {
178
+ return addMonths(new Date(date), months);
179
+ }
180
+ var after = new Date(date);
181
+ after.setMonth(after.getMonth() + months);
182
+ if (after.getDate() !== date.getDate()) {
183
+ after.setDate(0);
184
+ }
185
+ return dateFormat(after);
186
+ }
187
+ export function addMonthsByPredefined(date, type) {
188
+ return addMonths(date, MAX_MONTH_LOOKUP_TABLE[type]);
189
+ }
190
+ export function isValidDateStr(value) {
191
+ if (!value || !isString(value) || value.length !== 10) {
192
+ return false;
193
+ }
194
+ if (/^[0-9]{4}-[0-1][0-9]-[0-3][0-9]$/.test(value) === false) {
195
+ return false;
196
+ }
197
+ try {
198
+ return dateFormat(new Date(value)) === value;
199
+ }
200
+ catch (error) {
201
+ return false;
202
+ }
203
+ }
204
+ export function changeDateFormat(dateStr, showSeconds) {
205
+ if (showSeconds === void 0) { showSeconds = true; }
206
+ if (!dateStr || dateStr.length < 19) {
207
+ return '';
208
+ }
209
+ return "".concat(dateStr.substring(0, 10), " ").concat(dateStr.substring(11, showSeconds ? 19 : 16));
210
+ }
211
+ export function changeDateTimeFormatWithOffset(value, isLessThenEqual) {
212
+ if (isLessThenEqual === void 0) { isLessThenEqual = false; }
213
+ if (isLessThenEqual) {
214
+ return "".concat(value, "T23:59:59+09:00");
215
+ }
216
+ return "".concat(value, "T00:00:00+09:00");
217
+ }
@@ -1,3 +1,4 @@
1
1
  export * from './component.type';
2
2
  export * from './etc.type';
3
3
  export * from './marshalling.type';
4
+ export * from './time.type';
@@ -0,0 +1,16 @@
1
+ export declare type PredefinedMaxMonthType = 'month' | 'threeMonths' | 'sixMonths';
2
+ export declare type PredefinedDateRangeType = '' | 'yesterday' | 'today' | 'week' | 'month' | 'threeMonths' | 'sixMonths' | 'year' | 'calcDefRange';
3
+ export interface DateRangeDto {
4
+ /**
5
+ * 시작날짜
6
+ *
7
+ * yyyy-mm-dd 형식
8
+ */
9
+ gte: string;
10
+ /**
11
+ * 종료날짜
12
+ *
13
+ * yyyy-mm-dd 형식
14
+ */
15
+ lte: string;
16
+ }
@@ -1,3 +1,7 @@
1
+ interface MemoizeFunction<T> {
2
+ (data: T): T;
3
+ clear(): void;
4
+ }
1
5
  /**
2
6
  * 주어진 배열내 특정 2가지 요소에 대하여 서로 순서를 뒤바꾼다.
3
7
  *
@@ -23,3 +27,54 @@ export declare function update<T>(list: T[], index: number, item: T): T[];
23
27
  * @returns
24
28
  */
25
29
  export declare function remove<T>(list: T[], index: number): T[];
30
+ /**
31
+ * 특정 객체에 제시되는 키 값이 실제 키로 쓰이는지를 검사한다.
32
+ * @param obj 확인 할 객체
33
+ * @param key 확인 할 키값
34
+ * @returns
35
+ */
36
+ export declare function hasOwn<T extends Record<string | number | symbol, any>>(obj: T, key: string | number | symbol): key is keyof T;
37
+ /**
38
+ * 두 객체가 가진 필드값을 직접 비교한다.
39
+ *
40
+ * @see https://github.com/epoberezkin/fast-deep-equal
41
+ */
42
+ export declare const deepEqual: (a: any, b: any) => boolean;
43
+ /**
44
+ * 특정 데이터에 대하여 깊은 비교(deep equality)를 활용하는 메모이즈 함수를 만든다.
45
+ *
46
+ * @example
47
+ * interface SampleDto {
48
+ * name: string;
49
+ * age: number;
50
+ * }
51
+ *
52
+ * const memoize = createMemoize<SampleDto>();
53
+ * const prev: SampleDto = { name: '룩핀', age: 10 };
54
+ * const next: SampleDto = { name: '룩핀', age: 10 };
55
+ *
56
+ * // next 와 prev 는 서로 다른 인스턴스 이므로 다르다.
57
+ * console.log(prev === next); // false
58
+ *
59
+ * const first = memoize(prev);
60
+ *
61
+ * console.log(first === prev); // true
62
+ *
63
+ * const second = memoize(next);
64
+ *
65
+ * // next 값이 prev 값과 완전 동일하므로 이전값을 대신 반환한다.
66
+ * console.log(second === next); // false
67
+ * console.log(second === prev); // true
68
+ *
69
+ * const third = memoize({ name: '룩핀만세', age: 7 });
70
+ *
71
+ * // 새로운 값은 이전과 동일하지 않으므로 새로운 값을 대신 반환한다.
72
+ * console.log(third === prev); // false
73
+ * console.log(third); // { name: '룩핀만세', age: 7 }
74
+ *
75
+ * @returns 메모이즈 함수
76
+ *
77
+ * @see https://github.com/epoberezkin/fast-deep-equal
78
+ */
79
+ export declare function createMemoize<T>(): MemoizeFunction<T>;
80
+ export {};
@@ -12,5 +12,7 @@ export * from './redux';
12
12
  export * from './template';
13
13
  export * from './libLoader';
14
14
  export * from './AsyncQueue';
15
+ export * from './refine';
16
+ export * from './time';
15
17
  declare const isServer: () => boolean;
16
18
  export { envCheck, isServer };
@@ -0,0 +1,86 @@
1
+ import { DateRangeDto, PredefinedMaxMonthType, PredefinedDateRangeType } from '../types';
2
+ /**
3
+ * 데이터 정제기를 만든다.
4
+ *
5
+ * @example
6
+ * enum MyEnum {
7
+ * FASHION = 'f',
8
+ * STYLE = 's',
9
+ * LOOK = 'look',
10
+ * PIN = 'P'
11
+ * }
12
+ *
13
+ * const refine = createEnumRefiner(MyEnum, MyEnum.LOOK);
14
+ * const result = refine('anything');
15
+ *
16
+ * console.log(result); // 'look'
17
+ *
18
+ * @param enumType 열거형
19
+ * @param def 범위에 속하지 않을 때 내보낼 기본값
20
+ * @returns
21
+ */
22
+ export declare function createEnumRefiner<T>(enumType: Record<string, unknown>, def: T): (target: unknown) => T;
23
+ /**
24
+ * 데이터 정제기를 만든다.
25
+ *
26
+ * @example
27
+ * const LIST = ['가', '나', '다'];
28
+ *
29
+ * const refine = createEnumRefiner(LIST, LIST[2]);
30
+ * const result = refine('anything');
31
+ *
32
+ * console.log(result); // '다'
33
+ *
34
+ * @param list 상수값 배열
35
+ * @param def 범위에 속하지 않을 때 내보낼 기본값
36
+ * @returns
37
+ */
38
+ export declare function createEnumRefiner<T>(list: T[], def: T): (target: unknown) => T;
39
+ /**
40
+ * 페이지 사이즈에 대한 정제기를 만든다.
41
+ *
42
+ * @example
43
+ *
44
+ * const refine = createPageSizeRefiner([10, 20, 30]);
45
+ * let result = refine(100);
46
+ *
47
+ * console.log(result); // 10
48
+ *
49
+ * result = refine('20');
50
+ *
51
+ * console.log(result); // 20
52
+ *
53
+ * @param sizeList
54
+ * @param defaultIndex 기본 0
55
+ * @returns
56
+ */
57
+ export declare function createPageSizeRefiner(sizeList: number[], defaultIndex?: number): (target: unknown) => number;
58
+ /**
59
+ * 페이지 번호를 정제한다.
60
+ *
61
+ * 0보다 큰 양의 정수만 통과시킨다. (문자열 입력 가능)
62
+ *
63
+ * const result = refinePageNumber('-1');
64
+ *
65
+ * console.log(result); // 1
66
+ * @param raw
67
+ * @returns
68
+ */
69
+ export declare function refinePageNumber(raw: unknown): number;
70
+ /**
71
+ * 제한된 기준으로 날짜범위값을 정제한다.
72
+ *
73
+ * 범위 기준은 DateRange->gte (시작날짜) 이다.
74
+ * @param dateRange 정제할 날짜범위 객체
75
+ * @param maxType 정제 허용 최대 범위. 1달, 3달, 6달 중 1가지
76
+ * @param defType 날짜범위 내용 중 하나라도 비었을 경우 기본적으로 만들어 줄 날짜 범위 유형
77
+ * @returns
78
+ */
79
+ export declare function refineToRestrictedDateRange<T extends DateRangeDto>(dateRange: T, maxType: PredefinedMaxMonthType, defType?: PredefinedDateRangeType): T;
80
+ /**
81
+ * 날짜범위를 지정된 규칙에 따라 정제한다.
82
+ * @param dateRange 정제할 날짜범위 값.
83
+ * @param preset 지정할 규칙
84
+ * @returns
85
+ */
86
+ export declare function refineDateRange(dateRange: Partial<DateRangeDto> | Record<string, string> | undefined | null, preset?: PredefinedDateRangeType): DateRangeDto;
@@ -0,0 +1,51 @@
1
+ import { DateRangeDto, PredefinedDateRangeType, PredefinedMaxMonthType } from '../types';
2
+ export declare const MAX_MONTH_LOOKUP_TABLE: Record<PredefinedMaxMonthType, number>;
3
+ /**
4
+ * yyyy-MM-dd 형식의 날짜 문자열로 바꾼다.
5
+ * @param date
6
+ * @param delimiter
7
+ * @returns
8
+ */
9
+ export declare function dateFormat(date: Date, delimiter?: string): string;
10
+ /**
11
+ * yyyy-MM-dd 형식의 오늘 날짜 문자열을 가져온다.
12
+ * @param todayRef
13
+ * @returns
14
+ */
15
+ export declare function getToday(todayRef?: Date): string;
16
+ export declare function getBeforeMonthAt(months?: number, todayRef?: Date): string;
17
+ export declare function addDays(date: Date | string, days: number): string;
18
+ export declare function toPredefinedDateRangeType(gte: string, lte: string, todayRef?: Date): PredefinedDateRangeType;
19
+ export declare function createDateRangeByType(predefinedType: PredefinedDateRangeType, todayRef?: Date): DateRangeDto;
20
+ export declare function addMonths(date: Date | string, months: number): string;
21
+ export declare function addMonthsByPredefined(date: string, type: PredefinedMaxMonthType): string;
22
+ /**
23
+ * 문자열값이 날짜형식(yyyy-MM-dd)에 맞는지 검사한다.
24
+ * @param value
25
+ * @returns
26
+ */
27
+ export declare function isValidDateStr(value?: unknown): value is string;
28
+ /**
29
+ * UTC로 작성된 날짜 포멧을 "yyyy-MM-dd hh:mm:ss" 포멧으로 바꿔준다.
30
+ *
31
+ * showSeconds 를 false 로 줄 경우 "yyyy-MM-dd hh:mm" 포멧으로 바꾼다.
32
+ * @param dateStr
33
+ * @param showSeconds 초단위 표현 여부. 기본 true
34
+ * @returns
35
+ */
36
+ export declare function changeDateFormat(dateStr: string, showSeconds?: boolean): string;
37
+ /**
38
+ * yyyy-MM-dd 형식의 날짜에 offset 을 추가하여 datetime 포멧으로 바꾼다.
39
+ *
40
+ * - 주로 외부와 날짜 형식을 맞춰줘야 할 때 쓰인다.
41
+ *
42
+ * @example
43
+ *
44
+ * const result = changeDateTimeFormatWithOffset('2022-06-01');
45
+ *
46
+ * console.log(result); // 2022-06-01T00:00:00+09:00
47
+ * @param value 변경할 날짜 데이터
48
+ * @param isLessThenEqual true 로 줄 경우 시간을 23:59:59 로 바꿔서 준다. 기본 false.
49
+ * @returns
50
+ */
51
+ export declare function changeDateTimeFormatWithOffset(value: string, isLessThenEqual?: boolean): string;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "jordy",
3
- "version": "0.15.0",
3
+ "version": "0.16.0",
4
4
  "description": "typescript based frontend toolkit",
5
5
  "repository": {
6
6
  "type": "git",