sales-frontend-utils 0.0.41 → 0.0.43
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/dist/index.cjs +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +11 -442
- package/dist/index.d.ts +11 -442
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/types/common.types.cjs +4 -0
- package/dist/types/common.types.cjs.map +1 -0
- package/dist/types/common.types.d.cts +11 -0
- package/dist/types/common.types.d.ts +11 -0
- package/dist/types/common.types.js +3 -0
- package/dist/types/common.types.js.map +1 -0
- package/dist/types/window.types.d.cjs +4 -0
- package/dist/types/window.types.d.cjs.map +1 -0
- package/dist/types/window.types.d.d.cts +6 -0
- package/dist/types/window.types.d.d.ts +6 -0
- package/dist/types/window.types.d.js +3 -0
- package/dist/types/window.types.d.js.map +1 -0
- package/dist/utils/age-utils.cjs +214 -0
- package/dist/utils/age-utils.cjs.map +1 -0
- package/dist/utils/age-utils.d.cts +63 -0
- package/dist/utils/age-utils.d.ts +63 -0
- package/dist/utils/age-utils.js +207 -0
- package/dist/utils/age-utils.js.map +1 -0
- package/dist/utils/astx2-utils.cjs +108 -0
- package/dist/utils/astx2-utils.cjs.map +1 -0
- package/dist/utils/astx2-utils.d.cts +28 -0
- package/dist/utils/astx2-utils.d.ts +28 -0
- package/dist/utils/astx2-utils.js +102 -0
- package/dist/utils/astx2-utils.js.map +1 -0
- package/dist/utils/canvas-utils.cjs +70 -0
- package/dist/utils/canvas-utils.cjs.map +1 -0
- package/dist/utils/canvas-utils.d.cts +30 -0
- package/dist/utils/canvas-utils.d.ts +30 -0
- package/dist/utils/canvas-utils.js +67 -0
- package/dist/utils/canvas-utils.js.map +1 -0
- package/dist/utils/cookie-utils.cjs +43 -0
- package/dist/utils/cookie-utils.cjs.map +1 -0
- package/dist/utils/cookie-utils.d.cts +13 -0
- package/dist/utils/cookie-utils.d.ts +13 -0
- package/dist/utils/cookie-utils.js +39 -0
- package/dist/utils/cookie-utils.js.map +1 -0
- package/dist/utils/date-utils.cjs +158 -0
- package/dist/utils/date-utils.cjs.map +1 -0
- package/dist/utils/date-utils.d.cts +100 -0
- package/dist/utils/date-utils.d.ts +100 -0
- package/dist/utils/date-utils.js +141 -0
- package/dist/utils/date-utils.js.map +1 -0
- package/dist/utils/environment-utils.cjs +187 -0
- package/dist/utils/environment-utils.cjs.map +1 -0
- package/dist/utils/environment-utils.d.cts +93 -0
- package/dist/utils/environment-utils.d.ts +93 -0
- package/dist/utils/environment-utils.js +175 -0
- package/dist/utils/environment-utils.js.map +1 -0
- package/dist/utils/event-handler-utils.cjs +53 -0
- package/dist/utils/event-handler-utils.cjs.map +1 -0
- package/dist/utils/event-handler-utils.d.cts +29 -0
- package/dist/utils/event-handler-utils.d.ts +29 -0
- package/dist/utils/event-handler-utils.js +51 -0
- package/dist/utils/event-handler-utils.js.map +1 -0
- package/dist/utils/file-utils.cjs +116 -0
- package/dist/utils/file-utils.cjs.map +1 -0
- package/dist/utils/file-utils.d.cts +20 -0
- package/dist/utils/file-utils.d.ts +20 -0
- package/dist/utils/file-utils.js +106 -0
- package/dist/utils/file-utils.js.map +1 -0
- package/dist/utils/formatting.cjs +41 -0
- package/dist/utils/formatting.cjs.map +1 -0
- package/dist/utils/formatting.d.cts +7 -0
- package/dist/utils/formatting.d.ts +7 -0
- package/dist/utils/formatting.js +35 -0
- package/dist/utils/formatting.js.map +1 -0
- package/dist/utils/timing-utils.cjs +40 -0
- package/dist/utils/timing-utils.cjs.map +1 -0
- package/dist/utils/timing-utils.d.cts +16 -0
- package/dist/utils/timing-utils.d.ts +16 -0
- package/dist/utils/timing-utils.js +37 -0
- package/dist/utils/timing-utils.js.map +1 -0
- package/dist/utils/user-agent-utils.cjs +328 -0
- package/dist/utils/user-agent-utils.cjs.map +1 -0
- package/dist/utils/user-agent-utils.d.cts +113 -0
- package/dist/utils/user-agent-utils.d.ts +113 -0
- package/dist/utils/user-agent-utils.js +307 -0
- package/dist/utils/user-agent-utils.js.map +1 -0
- package/package.json +111 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"common.types.cjs"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
type ExecutionEnvironment = 'web' | 'android-webview' | 'ios-webview' | 'iframe' | 'unknown';
|
|
2
|
+
/**
|
|
3
|
+
* 운영체제 이름을 판단하는 타입
|
|
4
|
+
*/
|
|
5
|
+
type OSName = 'windows' | 'mac' | 'linux' | 'android' | 'ios' | 'unknown';
|
|
6
|
+
/**
|
|
7
|
+
* 브라우저 이름을 판단하는 타입
|
|
8
|
+
*/
|
|
9
|
+
type BrowserName = 'chrome' | 'firefox' | 'safari' | 'edge' | 'opera' | 'samsung' | 'unknown';
|
|
10
|
+
|
|
11
|
+
export type { BrowserName, ExecutionEnvironment, OSName };
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
type ExecutionEnvironment = 'web' | 'android-webview' | 'ios-webview' | 'iframe' | 'unknown';
|
|
2
|
+
/**
|
|
3
|
+
* 운영체제 이름을 판단하는 타입
|
|
4
|
+
*/
|
|
5
|
+
type OSName = 'windows' | 'mac' | 'linux' | 'android' | 'ios' | 'unknown';
|
|
6
|
+
/**
|
|
7
|
+
* 브라우저 이름을 판단하는 타입
|
|
8
|
+
*/
|
|
9
|
+
type BrowserName = 'chrome' | 'firefox' | 'safari' | 'edge' | 'opera' | 'samsung' | 'unknown';
|
|
10
|
+
|
|
11
|
+
export type { BrowserName, ExecutionEnvironment, OSName };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"common.types.js"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"window.types.d.cjs"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"window.types.d.js"}
|
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var dayjs = require('dayjs');
|
|
4
|
+
var customParseFormat = require('dayjs/plugin/customParseFormat.js');
|
|
5
|
+
|
|
6
|
+
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
7
|
+
|
|
8
|
+
var dayjs__default = /*#__PURE__*/_interopDefault(dayjs);
|
|
9
|
+
var customParseFormat__default = /*#__PURE__*/_interopDefault(customParseFormat);
|
|
10
|
+
|
|
11
|
+
var __defProp = Object.defineProperty;
|
|
12
|
+
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
13
|
+
var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
|
|
14
|
+
dayjs__default.default.locale("ko");
|
|
15
|
+
dayjs__default.default.extend(customParseFormat__default.default);
|
|
16
|
+
function getLastDay(year, month) {
|
|
17
|
+
switch (month) {
|
|
18
|
+
case 2:
|
|
19
|
+
return year % 4 === 0 ? 29 : 28;
|
|
20
|
+
case 4:
|
|
21
|
+
case 6:
|
|
22
|
+
case 9:
|
|
23
|
+
case 11:
|
|
24
|
+
return 30;
|
|
25
|
+
default:
|
|
26
|
+
return 31;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
// src/utils/age-utils.ts
|
|
31
|
+
var Age = class {
|
|
32
|
+
constructor({ front, back, options }) {
|
|
33
|
+
/**
|
|
34
|
+
* 주민번호 앞자리만 입력받는 케이스
|
|
35
|
+
* residentNumber: "880108"
|
|
36
|
+
*
|
|
37
|
+
* 생년월일 YYYYMMDD 를 입력받는 케이스
|
|
38
|
+
* residentNumber: "19880108"
|
|
39
|
+
*/
|
|
40
|
+
__publicField(this, "front");
|
|
41
|
+
/**
|
|
42
|
+
* 주민번호 뒷자리 첫글자
|
|
43
|
+
*/
|
|
44
|
+
__publicField(this, "back");
|
|
45
|
+
__publicField(this, "options");
|
|
46
|
+
__publicField(this, "dataType");
|
|
47
|
+
this.front = this.filter(front);
|
|
48
|
+
this.back = this.filter(back);
|
|
49
|
+
this.options = options;
|
|
50
|
+
const checkDataType = this.findDataType();
|
|
51
|
+
this.invalidType(checkDataType);
|
|
52
|
+
this.dataType = options?.type || checkDataType;
|
|
53
|
+
}
|
|
54
|
+
invalidType(checkDataType) {
|
|
55
|
+
if (checkDataType === "Unknown") {
|
|
56
|
+
throw new Error("Invalid resident number");
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
filter(val) {
|
|
60
|
+
if (!val) {
|
|
61
|
+
return "";
|
|
62
|
+
}
|
|
63
|
+
return val.toString().replace(/[^0-9]/g, "");
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* 주민번호의 타입을 찾는 메소드
|
|
67
|
+
* 입력된 타입이 없는 경우, 데이터를 기반으로 유추한다.
|
|
68
|
+
* @returns inputType
|
|
69
|
+
*/
|
|
70
|
+
findDataType() {
|
|
71
|
+
if (this.front.length === 8) {
|
|
72
|
+
return "YYYYMMDD";
|
|
73
|
+
} else if (this.front.length === 6) {
|
|
74
|
+
return "YYMMDD";
|
|
75
|
+
}
|
|
76
|
+
return "Unknown";
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* 보험나이를 계산하여 리턴한다.
|
|
80
|
+
* 기존 ageUtils를 참고하여 구현
|
|
81
|
+
*/
|
|
82
|
+
getInsuranceAge() {
|
|
83
|
+
let yBirth;
|
|
84
|
+
let mBirth;
|
|
85
|
+
let dBirth;
|
|
86
|
+
if (this.dataType === "YYYYMMDD") {
|
|
87
|
+
yBirth = parseFloat(this.front.substring(0, 4));
|
|
88
|
+
mBirth = parseFloat(this.front.substring(4, 6));
|
|
89
|
+
dBirth = parseFloat(this.front.substring(6, 8));
|
|
90
|
+
} else if (this.dataType === "YYMMDD") {
|
|
91
|
+
if (this.front.substring(0, 1) === "0" || this.front.substring(0, 1) === "1" || this.front.substring(0, 1) === "2") {
|
|
92
|
+
yBirth = parseFloat(this.front.substring(0, 2)) + 2e3;
|
|
93
|
+
} else {
|
|
94
|
+
yBirth = parseFloat(this.front.substring(0, 2)) + 1900;
|
|
95
|
+
}
|
|
96
|
+
mBirth = parseFloat(this.front.substring(2, 4));
|
|
97
|
+
dBirth = parseFloat(this.front.substring(4, 6));
|
|
98
|
+
} else {
|
|
99
|
+
console.error("getInsuranceAge >> \uB098\uC774 \uC785\uB825 \uD3EC\uBA67 \uC624\uB958");
|
|
100
|
+
return -1;
|
|
101
|
+
}
|
|
102
|
+
const curDate = /* @__PURE__ */ new Date();
|
|
103
|
+
const yToday = curDate.getFullYear();
|
|
104
|
+
const mToday = curDate.getMonth() + 1;
|
|
105
|
+
const dToday = curDate.getDate();
|
|
106
|
+
let yDiff = yToday - yBirth;
|
|
107
|
+
let mDiff = mToday - mBirth - (dToday < dBirth ? 1 : 0);
|
|
108
|
+
if (mDiff < 0) {
|
|
109
|
+
mDiff += 12;
|
|
110
|
+
--yDiff;
|
|
111
|
+
}
|
|
112
|
+
if (yDiff < 0) {
|
|
113
|
+
return -1;
|
|
114
|
+
}
|
|
115
|
+
if (mDiff === 5 && dToday < dBirth && dToday === getLastDay(yToday, mToday)) {
|
|
116
|
+
++mDiff;
|
|
117
|
+
}
|
|
118
|
+
return yDiff + (6 <= mDiff ? 1 : 0);
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* 입력되어잔 생년월일 값과 주민등록번호 뒤 첫째자리 값을 통해 만나이를 반환합니다.
|
|
122
|
+
* 에러: -1 반환
|
|
123
|
+
* @param front 주민등록번호 앞 6자리
|
|
124
|
+
* @param back 주민등록번호 뒤 첫자리
|
|
125
|
+
* @returns number
|
|
126
|
+
*/
|
|
127
|
+
getFullAge() {
|
|
128
|
+
const month = parseInt(this.front.slice(2, 4));
|
|
129
|
+
const day = parseInt(this.front.slice(4, 6));
|
|
130
|
+
const birthYear = this.getBirthYear();
|
|
131
|
+
if (!birthYear) {
|
|
132
|
+
console.error("birthYear is not defined");
|
|
133
|
+
return -1;
|
|
134
|
+
}
|
|
135
|
+
const currentDate = /* @__PURE__ */ new Date();
|
|
136
|
+
let yDiff = currentDate.getFullYear() - birthYear;
|
|
137
|
+
console.log(yDiff, currentDate.getFullYear(), birthYear);
|
|
138
|
+
let mDiff = currentDate.getMonth() + 1 - month - (currentDate.getDate() < day ? 1 : 0);
|
|
139
|
+
if (mDiff < 0) {
|
|
140
|
+
mDiff += 12;
|
|
141
|
+
--yDiff;
|
|
142
|
+
}
|
|
143
|
+
if (yDiff < 0) {
|
|
144
|
+
return -1;
|
|
145
|
+
}
|
|
146
|
+
return yDiff;
|
|
147
|
+
}
|
|
148
|
+
getBirthYear() {
|
|
149
|
+
if (this.dataType === "YYMMDD") {
|
|
150
|
+
if (!this.back) {
|
|
151
|
+
console.error("back is not defined");
|
|
152
|
+
return -1;
|
|
153
|
+
}
|
|
154
|
+
const year = this.front.slice(0, 2);
|
|
155
|
+
let centuryOffset;
|
|
156
|
+
if (["1", "2", "5", "6"].includes(this.back)) {
|
|
157
|
+
centuryOffset = 1900;
|
|
158
|
+
} else if (["3", "4", "7", "8"].includes(this.back)) {
|
|
159
|
+
centuryOffset = 2e3;
|
|
160
|
+
} else if (["9", "0"].includes(this.back)) {
|
|
161
|
+
centuryOffset = 1800;
|
|
162
|
+
} else {
|
|
163
|
+
return -1;
|
|
164
|
+
}
|
|
165
|
+
const birthYear = centuryOffset + parseInt(year, 10);
|
|
166
|
+
return birthYear;
|
|
167
|
+
} else if (this.dataType === "YYYYMMDD") {
|
|
168
|
+
return parseInt(this.front.slice(0, 4));
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* 외국인 여부 판단
|
|
173
|
+
* 주민등록번호 뒷자리의 첫번째 자리값 내려보내고 있어요.
|
|
174
|
+
* 5, 6, 7, 8 -> 외국인
|
|
175
|
+
*/
|
|
176
|
+
isForeigner() {
|
|
177
|
+
if (!this.back) {
|
|
178
|
+
console.error("back is not defined");
|
|
179
|
+
return -1;
|
|
180
|
+
}
|
|
181
|
+
return ["5", "6", "7", "8"].includes(this.back.toString());
|
|
182
|
+
}
|
|
183
|
+
static isForeigner(value) {
|
|
184
|
+
const str = String(value);
|
|
185
|
+
const firstChar = str.charAt(0);
|
|
186
|
+
return ["5", "6", "7", "8"].includes(firstChar);
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* 외국인 여부 판단
|
|
190
|
+
* 주민등록번호 전체로 판단
|
|
191
|
+
* 5, 6, 7, 8 -> 외국인
|
|
192
|
+
*/
|
|
193
|
+
static isForeignerFullNumber(regNo) {
|
|
194
|
+
if (!regNo) {
|
|
195
|
+
console.error("regNo is not defined");
|
|
196
|
+
return false;
|
|
197
|
+
}
|
|
198
|
+
const cleaned = regNo.replace(/[^0-9]/g, "");
|
|
199
|
+
if (cleaned.length < 7) {
|
|
200
|
+
console.error("cleaned.length < 7");
|
|
201
|
+
return false;
|
|
202
|
+
}
|
|
203
|
+
const firstOfBack = cleaned[6];
|
|
204
|
+
if (!firstOfBack) {
|
|
205
|
+
console.error("firstOfBack is not defined");
|
|
206
|
+
return false;
|
|
207
|
+
}
|
|
208
|
+
return ["5", "6", "7", "8"].includes(firstOfBack);
|
|
209
|
+
}
|
|
210
|
+
};
|
|
211
|
+
|
|
212
|
+
exports.Age = Age;
|
|
213
|
+
//# sourceMappingURL=age-utils.cjs.map
|
|
214
|
+
//# sourceMappingURL=age-utils.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/utils/date-utils.ts","../../src/utils/age-utils.ts"],"names":["dayjs","customParseFormat"],"mappings":"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","file":"age-utils.cjs","sourcesContent":["\nimport dayjs from 'dayjs';\nimport customParseFormat from 'dayjs/plugin/customParseFormat.js';\n\n/*****************************\n * 날짜 관련 유틸\n ******************************/\ndayjs.locale('ko');\ndayjs.extend(customParseFormat);\n\n/**\n *\n * @param year\n * @param month\n * @returns\n */\nexport function getLastDay(year: number, month: number) {\n switch (month) {\n case 2:\n return year % 4 === 0 ? 29 : 28;\n case 4:\n case 6:\n case 9:\n case 11:\n return 30;\n default:\n return 31;\n }\n}\n\n/**\n * 한달뒤 날짜를 포맷형태로 리턴\n * @param 20200101 or 2020.01.01\n * @param 'YYYY.MM.DD'\n * @returns\n */\nexport const getOneMonthLater = (value?: string, format?: string): string => {\n const str = value ? value.split('.').join('') : '';\n const date = value\n ? new Date(Number(str.substring(0, 4)), Number(str.substring(4, 6)) - 1, Number(str.substring(6, 8)))\n : new Date();\n try {\n return dayjs(new Date(date.setMonth(date.getMonth() + 1))).format(format || 'YYYY.MM.DD');\n } catch (err) {\n console.warn(err);\n\n return '';\n }\n};\n\n/**\n * 날짜 차이를 구한다. 포맷에 맞지 않으면 Not a Number 리턴\n * @param date1 (yyyymmdd or yyyy.mm.dd or yyyy-mm-dd)\n * @param date2 (yyyymmdd or yyyy.mm.dd or yyyy-mm-dd)\n * @returns date1 - date2\n */\nexport const getDateDiff = (date1: string | number | dayjs.Dayjs | Date, date2: string | number | dayjs.Dayjs | Date): number => {\n const diff1 = dayjs(date1);\n const diff2 = dayjs(date2);\n\n /** diff1 - diff2: 현재: 0 */\n return diff1.diff(diff2, 'day');\n};\n\n/**\n * 입력되어진 생년월일 값이 당일 기준으로 미래시점인 경우 false를 반환합니다. (회원체계 기준 9, 0 일 경우 오류)\n * @param front 주민등록번호 앞 6자리\n * @param back 주민등록번호 뒤 첫자리\n * @returns boolean\n */\nexport const validateBirthdate = (front: string, back: string) => {\n const year = parseInt(front.slice(0, 2));\n const month = parseInt(front.slice(2, 4));\n const day = parseInt(front.slice(4, 6));\n let birthYear = 0;\n\n switch (back) {\n case '1':\n case '2':\n case '5':\n case '6':\n birthYear = 1900 + year;\n break;\n case '3':\n case '4':\n case '7':\n case '8':\n birthYear = 2000 + year;\n break;\n case '9':\n case '0':\n // birthYear = 1800 + year;\n return false;\n default:\n return false;\n }\n\n const birthdate = new Date(birthYear, month - 1, day);\n const currdate = new Date();\n\n return birthdate < currdate;\n};\n\n/**\n * 목표 날짜가 비교 날짜 이후 인지 확인하는 함수 (YYYYMMDD 형식)\n * @param targetDate\n * @param compareDate\n * @returns boolean\n */\nexport function isDateAfter(targetDate: string | number | dayjs.Dayjs | Date, compareDate: string | number | dayjs.Dayjs | Date) {\n const targetDateTime = new Date(convertDateFormat(targetDate, 'YYYY-MM-DD')).getTime();\n const compareDateTime = new Date(convertDateFormat(compareDate, 'YYYY-MM-DD')).getTime();\n\n return targetDateTime > compareDateTime;\n}\n\n/**\n * 날짜를 포맷형태로 리턴\n * @param 20200101 string\n * @param 'YYYY.MM.DD\n * @returns 포맷화된 날짜\n */\nexport const convertDateFormat = (value?: string | number | dayjs.Dayjs | Date, format?: string): string => {\n if (!value) {\n return '';\n }\n\n return dayjs(value).format(format || 'YYYY.MM.DD');\n};\n\n/**\n * 주어진 날짜가 오늘 날짜 이후인지 확인합니다.\n *\n * @param {string} dateString - 확인할 날짜 문자열입니다.\n * @param {dayjs.OptionType} [format] - 날짜 문자열의 형식입니다.\n * @returns {boolean} - 주어진 날짜가 오늘 이후라면 true를 반환합니다.\n */\nexport const isFutureDate = (dateString?: string | number | dayjs.Dayjs | Date, format?: dayjs.OptionType) => {\n if (!dateString) {\n return false;\n }\n\n const today = dayjs().startOf('day');\n const date = dayjs(dateString, format || 'YYYYMMDD', true);\n\n return date.isValid() && date.isAfter(today);\n};\n\n\n\n/**\n * 자주 사용하는 타입들 추가해두었습니다. 필요하신 형태 있으면 추가해주세요.\n */\nexport type DateFormat =\n | 'YYYY-MM-DD'\n | 'YYYY.MM.DD'\n | 'YYYY-MM'\n | 'YYYY-MM-DD HH:mm:ss'\n | 'YYYY.MM.DD HH:mm:ss'\n | 'YYYY-MM-DD HH:mm'\n | 'YYYYMMDD'\n | 'YYYY.M.D'\n | 'YYYY.M'\n | 'YYYY.MM.DD(dd) HH:mm:ss'\n | 'HH:mm:ss'\n | 'YYYY.M.D(dd)'\n | 'HH:mm';\n\ninterface Props {\n /** 날짜 문자열 */\n dateString: string | number | Date | dayjs.Dayjs;\n /** 현재 날짜 포맷 */\n fromFormat?: string;\n /** 컨버팅할 날짜 포맷 */\n toFormat: string;\n}\n\n/**\n * date string 을 입력받고 패턴에 맞게 포맷팅을 변경하는 유틸 함수\n * fromFormat 현재 날짜 포맷\n * toFormat 리턴 날짜 포맷\n */\nexport const convertDateString = ({ dateString, fromFormat, toFormat }: Props) => {\n return dayjs(dateString, fromFormat).format(toFormat);\n};\n\nexport const isDate = (value: unknown) => {\n return value instanceof Date && !isNaN(+value);\n};\n\n\n/**\n * 날짜 유효성 검사\n *\n * @param {string} dateString - 검사할 날짜 문자열.\n * @param {dayjs.OptionType} [format] - 날짜 문자열의 형식입니다.\n * @returns {boolean} - 유효한 날짜이면 true를 반환하고, 그렇지 않으면 false를 반환합니다.\n */\nexport const isValidDate = (dateString?: string | number | dayjs.Dayjs | Date, format?: dayjs.OptionType) => {\n if (!dateString) {\n return false;\n }\n\n const date = dayjs(dateString, format || 'YYYYMMDD', true);\n\n return date.isValid();\n};\n\n\nexport type PeriodType = 'thisWeek' | 'lastWeek' | 'last7Days' | 'thisMonth' | 'lastMonth' | 'last365Days' | 'week' | 'month' | 'today';\n/**\n * @description\n * today 당일\n * week 7일: 오늘 기준 7일 전\n * month 30: 오늘 기준 30일 전\n * thisWeek 이번 주 (일요일 ~ 토요일)\n * lastWeek 지난 주 (일요일 ~ 토요일)\n * last7Days 최근 7일 (오늘 포함)\n * thisMonth 이번 달 (1일 ~ 말일)\n * lastMonth 지난 달 (1일 ~ 말일)\n * last365Days 최근 365일 (오늘 포함)\n * @param periodType \n * @returns \n */\nexport const getPeriodDate = (periodType: PeriodType | 'today') => {\n\n const lastMonth = dayjs().subtract(1, 'M');\n\n const today = new Date();\n today.setHours(0, 0, 0, 0);\n\n const endDate = new Date(today);\n let startDate: Date;\n\n switch (periodType) {\n case 'today':\n // 당일\n startDate = new Date(today);\n\n return { startDate, endDate };\n\n case 'week':\n // 7일: 오늘 기준 7일 전\n startDate = new Date(today);\n startDate.setDate(startDate.getDate() - 6);\n\n return { startDate, endDate };\n case 'month':\n // 30일: 오늘 기준 30일 전\n startDate = new Date(today);\n startDate.setDate(startDate.getDate() - 29);\n\n return { startDate, endDate };\n\n case 'thisWeek':\n // 이번 주 (일요일 ~ 토요일)\n return ({ startDate: dayjs().day(0).toDate(), endDate: dayjs().day(6).toDate() });\n case 'lastWeek':\n // 지난 주 (일요일 ~ 토요일)\n return ({\n startDate: dayjs().subtract(1, 'w').day(0).toDate(),\n endDate: dayjs().subtract(1, 'w').day(6).toDate()\n });\n case 'last7Days':\n // 최근 7일 (오늘 포함)\n return ({ startDate: dayjs().subtract(7, 'd').toDate(), endDate: dayjs().toDate() });\n case 'thisMonth':\n // 이번 달 (1일 ~ 말일)\n return ({\n startDate: dayjs().date(1).toDate(),\n endDate: dayjs().date(dayjs().daysInMonth()).toDate()\n });\n case 'lastMonth':\n // 지난 달 (1일 ~ 말일)\n return ({\n startDate: lastMonth.date(1).toDate(),\n endDate: lastMonth.date(lastMonth.daysInMonth()).toDate()\n });\n case 'last365Days':\n // 최근 365일 (오늘 포함)\n return ({ startDate: dayjs().subtract(365, 'd').toDate(), endDate: dayjs().toDate() });\n default:\n return null;\n }\n\n\n};\n\n\n","import { getLastDay } from './date-utils';\n\ninterface AgeOptions {\n type?: inputType;\n}\n\ninterface AgeProps {\n front: string;\n back?: number;\n options?: AgeOptions;\n}\n\ntype inputType = 'YYYYMMDD' | 'YYMMDD';\nexport class Age {\n /**\n * 주민번호 앞자리만 입력받는 케이스\n * residentNumber: \"880108\"\n *\n * 생년월일 YYYYMMDD 를 입력받는 케이스\n * residentNumber: \"19880108\"\n */\n front: string;\n\n /**\n * 주민번호 뒷자리 첫글자\n */\n back?: string;\n options?: AgeOptions;\n dataType: inputType | 'Unknown';\n\n constructor({ front, back, options }: AgeProps) {\n //정규표현식을 이용하여 숫자형 문자열로 필터링\n this.front = this.filter(front);\n this.back = this.filter(back);\n this.options = options;\n\n const checkDataType = this.findDataType();\n this.invalidType(checkDataType);\n this.dataType = options?.type || checkDataType;\n }\n\n invalidType(checkDataType: inputType | 'Unknown') {\n if (checkDataType === 'Unknown') {\n throw new Error('Invalid resident number');\n }\n }\n filter(val?: number | string) {\n if (!val) {\n return '';\n }\n\n return val.toString().replace(/[^0-9]/g, '');\n }\n\n /**\n * 주민번호의 타입을 찾는 메소드\n * 입력된 타입이 없는 경우, 데이터를 기반으로 유추한다.\n * @returns inputType\n */\n findDataType() {\n if (this.front.length === 8) {\n return 'YYYYMMDD';\n } else if (this.front.length === 6) {\n return 'YYMMDD';\n }\n\n return 'Unknown';\n }\n\n /**\n * 보험나이를 계산하여 리턴한다.\n * 기존 ageUtils를 참고하여 구현\n */\n getInsuranceAge() {\n let yBirth;\n let mBirth;\n let dBirth;\n\n if (this.dataType === 'YYYYMMDD') {\n yBirth = parseFloat(this.front.substring(0, 4));\n mBirth = parseFloat(this.front.substring(4, 6));\n dBirth = parseFloat(this.front.substring(6, 8));\n } else if (this.dataType === 'YYMMDD') {\n if (\n this.front.substring(0, 1) === '0' ||\n this.front.substring(0, 1) === '1' ||\n this.front.substring(0, 1) === '2'\n ) {\n yBirth = parseFloat(this.front.substring(0, 2)) + 2000; //생년월일\n } else {\n yBirth = parseFloat(this.front.substring(0, 2)) + 1900; //생년월일\n }\n mBirth = parseFloat(this.front.substring(2, 4));\n dBirth = parseFloat(this.front.substring(4, 6));\n } else {\n console.error('getInsuranceAge >> 나이 입력 포멧 오류');\n\n return -1;\n }\n\n const curDate = new Date(); // 오늘\n const yToday = curDate.getFullYear(); //getFullYear()는 ie, 파폭, 크롬에서 같은값 호출\n const mToday = curDate.getMonth() + 1;\n const dToday = curDate.getDate();\n\n let yDiff = yToday - yBirth;\n let mDiff = mToday - mBirth - (dToday < dBirth ? 1 : 0);\n\n if (mDiff < 0) {\n mDiff += 12;\n --yDiff;\n }\n if (yDiff < 0) {\n return -1;\n }\n\n if (mDiff === 5 && dToday < dBirth && dToday === getLastDay(yToday, mToday)) {\n ++mDiff;\n }\n\n return yDiff + (6 <= mDiff ? 1 : 0);\n }\n\n /**\n * 입력되어잔 생년월일 값과 주민등록번호 뒤 첫째자리 값을 통해 만나이를 반환합니다.\n * 에러: -1 반환\n * @param front 주민등록번호 앞 6자리\n * @param back 주민등록번호 뒤 첫자리\n * @returns number\n */\n getFullAge() {\n const month = parseInt(this.front.slice(2, 4));\n const day = parseInt(this.front.slice(4, 6));\n\n const birthYear = this.getBirthYear();\n if (!birthYear) {\n console.error('birthYear is not defined');\n\n return -1;\n }\n const currentDate = new Date();\n\n let yDiff = currentDate.getFullYear() - birthYear;\n console.log(yDiff, currentDate.getFullYear(), birthYear);\n let mDiff = currentDate.getMonth() + 1 - month - (currentDate.getDate() < day ? 1 : 0);\n\n if (mDiff < 0) {\n mDiff += 12;\n --yDiff;\n }\n if (yDiff < 0) {\n return -1;\n }\n\n return yDiff;\n }\n\n getBirthYear() {\n if (this.dataType === 'YYMMDD') {\n if (!this.back) {\n console.error('back is not defined');\n\n return -1;\n }\n const year = this.front.slice(0, 2);\n let centuryOffset;\n if (['1', '2', '5', '6'].includes(this.back)) {\n centuryOffset = 1900;\n } else if (['3', '4', '7', '8'].includes(this.back)) {\n centuryOffset = 2000;\n } else if (['9', '0'].includes(this.back)) {\n centuryOffset = 1800;\n } else {\n return -1;\n }\n\n const birthYear = centuryOffset + parseInt(year, 10);\n\n return birthYear;\n } else if (this.dataType === 'YYYYMMDD') {\n return parseInt(this.front.slice(0, 4));\n }\n\n\n }\n\n /**\n * 외국인 여부 판단\n * 주민등록번호 뒷자리의 첫번째 자리값 내려보내고 있어요.\n * 5, 6, 7, 8 -> 외국인\n */\n isForeigner() {\n if (!this.back) {\n console.error('back is not defined');\n\n return -1;\n }\n\n return ['5', '6', '7', '8'].includes(this.back.toString());\n }\n\n\n static isForeigner(value: string | number) {\n const str = String(value);\n const firstChar = str.charAt(0);\n\n return ['5', '6', '7', '8'].includes(firstChar);\n }\n\n\n /**\n * 외국인 여부 판단\n * 주민등록번호 전체로 판단\n * 5, 6, 7, 8 -> 외국인\n */\n static isForeignerFullNumber(regNo: string): boolean {\n if (!regNo) {\n console.error('regNo is not defined');\n\n return false;\n }\n\n // 숫자만 추출\n const cleaned = regNo.replace(/[^0-9]/g, '');\n\n // 최소 7자리 필요\n if (cleaned.length < 7) {\n console.error('cleaned.length < 7');\n\n return false;\n }\n\n const firstOfBack = cleaned[6]; // 뒤 7자리 중 첫 번째 숫자\n if (!firstOfBack) {\n console.error('firstOfBack is not defined');\n\n return false;\n }\n\n // 외국인 구분: 5,6,7,8\n return ['5', '6', '7', '8'].includes(firstOfBack);\n }\n}\n"]}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
interface AgeOptions {
|
|
2
|
+
type?: inputType;
|
|
3
|
+
}
|
|
4
|
+
interface AgeProps {
|
|
5
|
+
front: string;
|
|
6
|
+
back?: number;
|
|
7
|
+
options?: AgeOptions;
|
|
8
|
+
}
|
|
9
|
+
type inputType = 'YYYYMMDD' | 'YYMMDD';
|
|
10
|
+
declare class Age {
|
|
11
|
+
/**
|
|
12
|
+
* 주민번호 앞자리만 입력받는 케이스
|
|
13
|
+
* residentNumber: "880108"
|
|
14
|
+
*
|
|
15
|
+
* 생년월일 YYYYMMDD 를 입력받는 케이스
|
|
16
|
+
* residentNumber: "19880108"
|
|
17
|
+
*/
|
|
18
|
+
front: string;
|
|
19
|
+
/**
|
|
20
|
+
* 주민번호 뒷자리 첫글자
|
|
21
|
+
*/
|
|
22
|
+
back?: string;
|
|
23
|
+
options?: AgeOptions;
|
|
24
|
+
dataType: inputType | 'Unknown';
|
|
25
|
+
constructor({ front, back, options }: AgeProps);
|
|
26
|
+
invalidType(checkDataType: inputType | 'Unknown'): void;
|
|
27
|
+
filter(val?: number | string): string;
|
|
28
|
+
/**
|
|
29
|
+
* 주민번호의 타입을 찾는 메소드
|
|
30
|
+
* 입력된 타입이 없는 경우, 데이터를 기반으로 유추한다.
|
|
31
|
+
* @returns inputType
|
|
32
|
+
*/
|
|
33
|
+
findDataType(): "YYYYMMDD" | "YYMMDD" | "Unknown";
|
|
34
|
+
/**
|
|
35
|
+
* 보험나이를 계산하여 리턴한다.
|
|
36
|
+
* 기존 ageUtils를 참고하여 구현
|
|
37
|
+
*/
|
|
38
|
+
getInsuranceAge(): number;
|
|
39
|
+
/**
|
|
40
|
+
* 입력되어잔 생년월일 값과 주민등록번호 뒤 첫째자리 값을 통해 만나이를 반환합니다.
|
|
41
|
+
* 에러: -1 반환
|
|
42
|
+
* @param front 주민등록번호 앞 6자리
|
|
43
|
+
* @param back 주민등록번호 뒤 첫자리
|
|
44
|
+
* @returns number
|
|
45
|
+
*/
|
|
46
|
+
getFullAge(): number;
|
|
47
|
+
getBirthYear(): number | undefined;
|
|
48
|
+
/**
|
|
49
|
+
* 외국인 여부 판단
|
|
50
|
+
* 주민등록번호 뒷자리의 첫번째 자리값 내려보내고 있어요.
|
|
51
|
+
* 5, 6, 7, 8 -> 외국인
|
|
52
|
+
*/
|
|
53
|
+
isForeigner(): boolean | -1;
|
|
54
|
+
static isForeigner(value: string | number): boolean;
|
|
55
|
+
/**
|
|
56
|
+
* 외국인 여부 판단
|
|
57
|
+
* 주민등록번호 전체로 판단
|
|
58
|
+
* 5, 6, 7, 8 -> 외국인
|
|
59
|
+
*/
|
|
60
|
+
static isForeignerFullNumber(regNo: string): boolean;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
export { Age };
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
interface AgeOptions {
|
|
2
|
+
type?: inputType;
|
|
3
|
+
}
|
|
4
|
+
interface AgeProps {
|
|
5
|
+
front: string;
|
|
6
|
+
back?: number;
|
|
7
|
+
options?: AgeOptions;
|
|
8
|
+
}
|
|
9
|
+
type inputType = 'YYYYMMDD' | 'YYMMDD';
|
|
10
|
+
declare class Age {
|
|
11
|
+
/**
|
|
12
|
+
* 주민번호 앞자리만 입력받는 케이스
|
|
13
|
+
* residentNumber: "880108"
|
|
14
|
+
*
|
|
15
|
+
* 생년월일 YYYYMMDD 를 입력받는 케이스
|
|
16
|
+
* residentNumber: "19880108"
|
|
17
|
+
*/
|
|
18
|
+
front: string;
|
|
19
|
+
/**
|
|
20
|
+
* 주민번호 뒷자리 첫글자
|
|
21
|
+
*/
|
|
22
|
+
back?: string;
|
|
23
|
+
options?: AgeOptions;
|
|
24
|
+
dataType: inputType | 'Unknown';
|
|
25
|
+
constructor({ front, back, options }: AgeProps);
|
|
26
|
+
invalidType(checkDataType: inputType | 'Unknown'): void;
|
|
27
|
+
filter(val?: number | string): string;
|
|
28
|
+
/**
|
|
29
|
+
* 주민번호의 타입을 찾는 메소드
|
|
30
|
+
* 입력된 타입이 없는 경우, 데이터를 기반으로 유추한다.
|
|
31
|
+
* @returns inputType
|
|
32
|
+
*/
|
|
33
|
+
findDataType(): "YYYYMMDD" | "YYMMDD" | "Unknown";
|
|
34
|
+
/**
|
|
35
|
+
* 보험나이를 계산하여 리턴한다.
|
|
36
|
+
* 기존 ageUtils를 참고하여 구현
|
|
37
|
+
*/
|
|
38
|
+
getInsuranceAge(): number;
|
|
39
|
+
/**
|
|
40
|
+
* 입력되어잔 생년월일 값과 주민등록번호 뒤 첫째자리 값을 통해 만나이를 반환합니다.
|
|
41
|
+
* 에러: -1 반환
|
|
42
|
+
* @param front 주민등록번호 앞 6자리
|
|
43
|
+
* @param back 주민등록번호 뒤 첫자리
|
|
44
|
+
* @returns number
|
|
45
|
+
*/
|
|
46
|
+
getFullAge(): number;
|
|
47
|
+
getBirthYear(): number | undefined;
|
|
48
|
+
/**
|
|
49
|
+
* 외국인 여부 판단
|
|
50
|
+
* 주민등록번호 뒷자리의 첫번째 자리값 내려보내고 있어요.
|
|
51
|
+
* 5, 6, 7, 8 -> 외국인
|
|
52
|
+
*/
|
|
53
|
+
isForeigner(): boolean | -1;
|
|
54
|
+
static isForeigner(value: string | number): boolean;
|
|
55
|
+
/**
|
|
56
|
+
* 외국인 여부 판단
|
|
57
|
+
* 주민등록번호 전체로 판단
|
|
58
|
+
* 5, 6, 7, 8 -> 외국인
|
|
59
|
+
*/
|
|
60
|
+
static isForeignerFullNumber(regNo: string): boolean;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
export { Age };
|
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
import dayjs from 'dayjs';
|
|
2
|
+
import customParseFormat from 'dayjs/plugin/customParseFormat.js';
|
|
3
|
+
|
|
4
|
+
var __defProp = Object.defineProperty;
|
|
5
|
+
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
6
|
+
var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
|
|
7
|
+
dayjs.locale("ko");
|
|
8
|
+
dayjs.extend(customParseFormat);
|
|
9
|
+
function getLastDay(year, month) {
|
|
10
|
+
switch (month) {
|
|
11
|
+
case 2:
|
|
12
|
+
return year % 4 === 0 ? 29 : 28;
|
|
13
|
+
case 4:
|
|
14
|
+
case 6:
|
|
15
|
+
case 9:
|
|
16
|
+
case 11:
|
|
17
|
+
return 30;
|
|
18
|
+
default:
|
|
19
|
+
return 31;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
// src/utils/age-utils.ts
|
|
24
|
+
var Age = class {
|
|
25
|
+
constructor({ front, back, options }) {
|
|
26
|
+
/**
|
|
27
|
+
* 주민번호 앞자리만 입력받는 케이스
|
|
28
|
+
* residentNumber: "880108"
|
|
29
|
+
*
|
|
30
|
+
* 생년월일 YYYYMMDD 를 입력받는 케이스
|
|
31
|
+
* residentNumber: "19880108"
|
|
32
|
+
*/
|
|
33
|
+
__publicField(this, "front");
|
|
34
|
+
/**
|
|
35
|
+
* 주민번호 뒷자리 첫글자
|
|
36
|
+
*/
|
|
37
|
+
__publicField(this, "back");
|
|
38
|
+
__publicField(this, "options");
|
|
39
|
+
__publicField(this, "dataType");
|
|
40
|
+
this.front = this.filter(front);
|
|
41
|
+
this.back = this.filter(back);
|
|
42
|
+
this.options = options;
|
|
43
|
+
const checkDataType = this.findDataType();
|
|
44
|
+
this.invalidType(checkDataType);
|
|
45
|
+
this.dataType = options?.type || checkDataType;
|
|
46
|
+
}
|
|
47
|
+
invalidType(checkDataType) {
|
|
48
|
+
if (checkDataType === "Unknown") {
|
|
49
|
+
throw new Error("Invalid resident number");
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
filter(val) {
|
|
53
|
+
if (!val) {
|
|
54
|
+
return "";
|
|
55
|
+
}
|
|
56
|
+
return val.toString().replace(/[^0-9]/g, "");
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* 주민번호의 타입을 찾는 메소드
|
|
60
|
+
* 입력된 타입이 없는 경우, 데이터를 기반으로 유추한다.
|
|
61
|
+
* @returns inputType
|
|
62
|
+
*/
|
|
63
|
+
findDataType() {
|
|
64
|
+
if (this.front.length === 8) {
|
|
65
|
+
return "YYYYMMDD";
|
|
66
|
+
} else if (this.front.length === 6) {
|
|
67
|
+
return "YYMMDD";
|
|
68
|
+
}
|
|
69
|
+
return "Unknown";
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* 보험나이를 계산하여 리턴한다.
|
|
73
|
+
* 기존 ageUtils를 참고하여 구현
|
|
74
|
+
*/
|
|
75
|
+
getInsuranceAge() {
|
|
76
|
+
let yBirth;
|
|
77
|
+
let mBirth;
|
|
78
|
+
let dBirth;
|
|
79
|
+
if (this.dataType === "YYYYMMDD") {
|
|
80
|
+
yBirth = parseFloat(this.front.substring(0, 4));
|
|
81
|
+
mBirth = parseFloat(this.front.substring(4, 6));
|
|
82
|
+
dBirth = parseFloat(this.front.substring(6, 8));
|
|
83
|
+
} else if (this.dataType === "YYMMDD") {
|
|
84
|
+
if (this.front.substring(0, 1) === "0" || this.front.substring(0, 1) === "1" || this.front.substring(0, 1) === "2") {
|
|
85
|
+
yBirth = parseFloat(this.front.substring(0, 2)) + 2e3;
|
|
86
|
+
} else {
|
|
87
|
+
yBirth = parseFloat(this.front.substring(0, 2)) + 1900;
|
|
88
|
+
}
|
|
89
|
+
mBirth = parseFloat(this.front.substring(2, 4));
|
|
90
|
+
dBirth = parseFloat(this.front.substring(4, 6));
|
|
91
|
+
} else {
|
|
92
|
+
console.error("getInsuranceAge >> \uB098\uC774 \uC785\uB825 \uD3EC\uBA67 \uC624\uB958");
|
|
93
|
+
return -1;
|
|
94
|
+
}
|
|
95
|
+
const curDate = /* @__PURE__ */ new Date();
|
|
96
|
+
const yToday = curDate.getFullYear();
|
|
97
|
+
const mToday = curDate.getMonth() + 1;
|
|
98
|
+
const dToday = curDate.getDate();
|
|
99
|
+
let yDiff = yToday - yBirth;
|
|
100
|
+
let mDiff = mToday - mBirth - (dToday < dBirth ? 1 : 0);
|
|
101
|
+
if (mDiff < 0) {
|
|
102
|
+
mDiff += 12;
|
|
103
|
+
--yDiff;
|
|
104
|
+
}
|
|
105
|
+
if (yDiff < 0) {
|
|
106
|
+
return -1;
|
|
107
|
+
}
|
|
108
|
+
if (mDiff === 5 && dToday < dBirth && dToday === getLastDay(yToday, mToday)) {
|
|
109
|
+
++mDiff;
|
|
110
|
+
}
|
|
111
|
+
return yDiff + (6 <= mDiff ? 1 : 0);
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* 입력되어잔 생년월일 값과 주민등록번호 뒤 첫째자리 값을 통해 만나이를 반환합니다.
|
|
115
|
+
* 에러: -1 반환
|
|
116
|
+
* @param front 주민등록번호 앞 6자리
|
|
117
|
+
* @param back 주민등록번호 뒤 첫자리
|
|
118
|
+
* @returns number
|
|
119
|
+
*/
|
|
120
|
+
getFullAge() {
|
|
121
|
+
const month = parseInt(this.front.slice(2, 4));
|
|
122
|
+
const day = parseInt(this.front.slice(4, 6));
|
|
123
|
+
const birthYear = this.getBirthYear();
|
|
124
|
+
if (!birthYear) {
|
|
125
|
+
console.error("birthYear is not defined");
|
|
126
|
+
return -1;
|
|
127
|
+
}
|
|
128
|
+
const currentDate = /* @__PURE__ */ new Date();
|
|
129
|
+
let yDiff = currentDate.getFullYear() - birthYear;
|
|
130
|
+
console.log(yDiff, currentDate.getFullYear(), birthYear);
|
|
131
|
+
let mDiff = currentDate.getMonth() + 1 - month - (currentDate.getDate() < day ? 1 : 0);
|
|
132
|
+
if (mDiff < 0) {
|
|
133
|
+
mDiff += 12;
|
|
134
|
+
--yDiff;
|
|
135
|
+
}
|
|
136
|
+
if (yDiff < 0) {
|
|
137
|
+
return -1;
|
|
138
|
+
}
|
|
139
|
+
return yDiff;
|
|
140
|
+
}
|
|
141
|
+
getBirthYear() {
|
|
142
|
+
if (this.dataType === "YYMMDD") {
|
|
143
|
+
if (!this.back) {
|
|
144
|
+
console.error("back is not defined");
|
|
145
|
+
return -1;
|
|
146
|
+
}
|
|
147
|
+
const year = this.front.slice(0, 2);
|
|
148
|
+
let centuryOffset;
|
|
149
|
+
if (["1", "2", "5", "6"].includes(this.back)) {
|
|
150
|
+
centuryOffset = 1900;
|
|
151
|
+
} else if (["3", "4", "7", "8"].includes(this.back)) {
|
|
152
|
+
centuryOffset = 2e3;
|
|
153
|
+
} else if (["9", "0"].includes(this.back)) {
|
|
154
|
+
centuryOffset = 1800;
|
|
155
|
+
} else {
|
|
156
|
+
return -1;
|
|
157
|
+
}
|
|
158
|
+
const birthYear = centuryOffset + parseInt(year, 10);
|
|
159
|
+
return birthYear;
|
|
160
|
+
} else if (this.dataType === "YYYYMMDD") {
|
|
161
|
+
return parseInt(this.front.slice(0, 4));
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* 외국인 여부 판단
|
|
166
|
+
* 주민등록번호 뒷자리의 첫번째 자리값 내려보내고 있어요.
|
|
167
|
+
* 5, 6, 7, 8 -> 외국인
|
|
168
|
+
*/
|
|
169
|
+
isForeigner() {
|
|
170
|
+
if (!this.back) {
|
|
171
|
+
console.error("back is not defined");
|
|
172
|
+
return -1;
|
|
173
|
+
}
|
|
174
|
+
return ["5", "6", "7", "8"].includes(this.back.toString());
|
|
175
|
+
}
|
|
176
|
+
static isForeigner(value) {
|
|
177
|
+
const str = String(value);
|
|
178
|
+
const firstChar = str.charAt(0);
|
|
179
|
+
return ["5", "6", "7", "8"].includes(firstChar);
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* 외국인 여부 판단
|
|
183
|
+
* 주민등록번호 전체로 판단
|
|
184
|
+
* 5, 6, 7, 8 -> 외국인
|
|
185
|
+
*/
|
|
186
|
+
static isForeignerFullNumber(regNo) {
|
|
187
|
+
if (!regNo) {
|
|
188
|
+
console.error("regNo is not defined");
|
|
189
|
+
return false;
|
|
190
|
+
}
|
|
191
|
+
const cleaned = regNo.replace(/[^0-9]/g, "");
|
|
192
|
+
if (cleaned.length < 7) {
|
|
193
|
+
console.error("cleaned.length < 7");
|
|
194
|
+
return false;
|
|
195
|
+
}
|
|
196
|
+
const firstOfBack = cleaned[6];
|
|
197
|
+
if (!firstOfBack) {
|
|
198
|
+
console.error("firstOfBack is not defined");
|
|
199
|
+
return false;
|
|
200
|
+
}
|
|
201
|
+
return ["5", "6", "7", "8"].includes(firstOfBack);
|
|
202
|
+
}
|
|
203
|
+
};
|
|
204
|
+
|
|
205
|
+
export { Age };
|
|
206
|
+
//# sourceMappingURL=age-utils.js.map
|
|
207
|
+
//# sourceMappingURL=age-utils.js.map
|