@nuka9510/simple-validation 1.1.1 → 1.1.3

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 CHANGED
@@ -32,68 +32,62 @@
32
32
 
33
33
  [top-language]: https://img.shields.io/github/languages/top/nuka9510/simple-validation
34
34
 
35
- # simple-validation
36
- ## Installation
37
- ```
38
- npm i @nuka9510/simple-validation
39
- ```
40
35
  ## Usage
41
- ### js (> 1.1.0)
42
- #### cdn
36
+ ### js (> 1.1.2)
43
37
  ```
44
38
  <script src="https://cdn.jsdelivr.net/npm/@nuka9510/simple-validation/dist/index.min.js"> </script>
39
+ OR
40
+ <script src="https://cdn.jsdelivr.net/npm/@nuka9510/simple-validation@latest/dist/index.min.js"> </script>
41
+ OR
42
+ <script src="https://cdn.jsdelivr.net/npm/@nuka9510/simple-validation@<specific-version>/dist/index.min.js"> </script>
45
43
  ```
46
- or
47
44
  ```
48
- <script src="https://cdn.jsdelivr.net/npm/@nuka9510/simple-validation@latest/dist/index.min.js"> </script>
45
+ <form name="form">
46
+ <input type="text" name="test" data-sv-pattern="test" required="test">
47
+ </form>
48
+ <script type="text/javascript">
49
+ const validation = new simpleValidation.Validation({ regex: { test: /^test/ } });
50
+
51
+ validation.run(form);
52
+
53
+ console.debug(validation.result);
54
+ </script>
49
55
  ```
50
- or
56
+ ### mjs
51
57
  ```
52
- <script src="https://cdn.jsdelivr.net/npm/@nuka9510/simple-validation@<specific-version>/dist/index.min.js"> </script>
58
+ npm i @nuka9510/simple-validation
53
59
  ```
54
- ### module
55
- #### npm
56
60
  ```
57
61
  <script type="importmap">
58
62
  {
59
63
  "imports": {
60
64
  "@nuka9510/js-util": "<path>/node_modules/@nuka9510/js-util/dist/index.mjs",
61
65
  "@nuka9510/simple-validation": "<path>/node_modules/@nuka9510/simple-validation/dist/index.mjs"
62
- }
63
- }
64
- </script>
65
- ```
66
- #### cdn
67
- ```
68
- <script type="importmap">
69
- {
70
- "imports": {
66
+ OR
71
67
  "@nuka9510/js-util": "https://cdn.jsdelivr.net/npm/@nuka9510/js-util/dist/index.mjs",
72
68
  "@nuka9510/simple-validation": "https://cdn.jsdelivr.net/npm/@nuka9510/simple-validation/dist/index.mjs"
73
- }
74
- }
75
- </script>
76
- ```
77
- or
78
- ```
79
- <script type="importmap">
80
- {
81
- "imports": {
69
+ OR
82
70
  "@nuka9510/js-util": "https://cdn.jsdelivr.net/npm/@nuka9510/js-util@latest/dist/index.mjs",
83
71
  "@nuka9510/simple-validation": "https://cdn.jsdelivr.net/npm/@nuka9510/simple-validation@latest/dist/index.mjs"
72
+ OR
73
+ "@nuka9510/js-util": "https://cdn.jsdelivr.net/npm/@nuka9510/js-util@<specific-version>/dist/index.mjs",
74
+ "@nuka9510/simple-validation": "https://cdn.jsdelivr.net/npm/@nuka9510/simple-validation@<specific-version>/dist/index.mjs"
84
75
  }
85
76
  }
86
77
  </script>
87
78
  ```
88
- or
89
79
  ```
90
- <script type="importmap">
91
- {
92
- "imports": {
93
- "@nuka9510/js-util": "https://cdn.jsdelivr.net/npm/@nuka9510/js-util@<specific-version>/dist/index.mjs",
94
- "@nuka9510/simple-validation": "https://cdn.jsdelivr.net/npm/@nuka9510/simple-validation@<specific-version>/dist/index.mjs"
95
- }
96
- }
80
+ <form name="form">
81
+ <input type="text" name="test" data-sv-pattern="test" required="test">
82
+ </form>
83
+ <script type="text/javascript">
84
+ import { SValidation } from "@nuka9510/simple-validation";
85
+
86
+ const validation = new SValidation({ regex: { test: /^test/ } });
87
+
88
+ validation.run(form);
89
+
90
+ console.debug(validation.result);
97
91
  </script>
98
92
  ```
99
93
  ### example
package/dist/index.d.mts CHANGED
@@ -1,2 +1,3 @@
1
1
  import Validation from "./validation.mjs";
2
- export { Validation as SValidation };
2
+ import { JUtil } from "@nuka9510/js-util";
3
+ export { Validation as SValidation, JUtil };
@@ -0,0 +1,3 @@
1
+ import Validation from "./validation.mjs";
2
+ import { JUtil } from "@nuka9510/js-util";
3
+ export { Validation, JUtil };
package/dist/index.js CHANGED
@@ -1,3 +1,4 @@
1
+ var simpleValidation;
1
2
  /******/ (() => { // webpackBootstrap
2
3
  /******/ "use strict";
3
4
  /******/ var __webpack_modules__ = ([
@@ -369,7 +370,7 @@ class Util {
369
370
  */
370
371
  static isNumber(
371
372
  /** 확인할 값 */ arg,
372
- /** `true`일 경우 `arg`의 `type`도 확인 #default `false` */ strict = false) {
373
+ /** `true`일 경우 `arg`의 `type`도 확인 | #default `false` */ strict = false) {
373
374
  let result = !Number.isNaN(Number(arg)) &&
374
375
  ['number', 'string'].includes(typeof arg) &&
375
376
  !/^\s*$/.test(`${arg}`);
@@ -415,10 +416,14 @@ class Util {
415
416
  * ```
416
417
  */
417
418
  static numberFormat(
418
- /** 변환할 숫자 */ num,
419
- /** 소숫점 아래 자리 수 #default `0` */ decimals = 0,
420
- /** 소수점 구분자 #default `'.'` */ decimalSeparator = '.',
421
- /** 천 단위 구분자 #default `','` */ thousandsSeparator = ',') {
419
+ /** 변환할 숫자 - `number` 타입이 아닌경우 `null` 반환 */ num,
420
+ /** 소숫점 아래 자리 수 - `number` 타입이 아닌경우 `null` 반환 | #default `0` */ decimals = 0,
421
+ /** 소수점 구분자 | #default `'.'` */ decimalSeparator = '.',
422
+ /** 천 단위 구분자 | #default `','` */ thousandsSeparator = ',') {
423
+ if (!Util.isNumber(num, true) &&
424
+ !Util.isNumber(decimals, true)) {
425
+ return null;
426
+ }
422
427
  const result = String(num).split('.');
423
428
  result[0] = result[0].replace(/\B(?=(\d{3})+(?!\d))/g, thousandsSeparator);
424
429
  if (!Util.empty(result[1])) {
@@ -515,7 +520,7 @@ class Util {
515
520
  */
516
521
  static equaldate(
517
522
  /** 기준 날짜 */ date1,
518
- /** 비교할 날짜 #default `new Date()` */ date2 = new Date()) { return Util.strftime(date1, '%Y-%m-%d') == Util.strftime(date2, '%Y-%m-%d'); }
523
+ /** 비교할 날짜 | #default `new Date()` */ date2 = new Date()) { return Util.strftime(date1, '%Y-%m-%d') == Util.strftime(date2, '%Y-%m-%d'); }
519
524
  /**
520
525
  * Date객체에서 해당 하는 요일을 반환한다.
521
526
  *
@@ -531,7 +536,7 @@ class Util {
531
536
  */
532
537
  static getWeek(
533
538
  /** 요일을 반환할 `Date` 객체 */ date,
534
- /** 해당 요일의 약어반환 대한 구분 값 `false`일 경우 약어 반환 #default `true` */ flag = true) {
539
+ /** 해당 요일의 약어반환 대한 구분 값 `false`일 경우 약어 반환 | #default `true` */ flag = true) {
535
540
  const week = ['일요일', '월요일', '화요일', '수요일', '목요일', '금요일', '토요일'], result = week[date.getDay()];
536
541
  return (flag) ? result : result.replace(/^([ㄱ-ㅎㅏ-ㅣ가-힣]{1})[ㄱ-ㅎㅏ-ㅣ가-힣]+$/, '$1');
537
542
  }
@@ -631,7 +636,7 @@ class Util {
631
636
  static ratio(
632
637
  /** 비율 */ ratio,
633
638
  /** 기준 숫자 */ num,
634
- /** 비율 적용 기준 #default `true` */ flag = true) {
639
+ /** 비율 적용 기준 | #default `true` */ flag = true) {
635
640
  const index = flag
636
641
  ? [1, 0]
637
642
  : [0, 1];
@@ -659,7 +664,7 @@ class Util {
659
664
  static decimalAdjust(
660
665
  /** 구분 기준 `반올림(round)`, `내림(floor)`, `올림(ceil)` */ type,
661
666
  /** 기준 값 */ value,
662
- /** 소숫점 아래 자리 수 #default `0` */ exp = 0) {
667
+ /** 소숫점 아래 자리 수 | #default `0` */ exp = 0) {
663
668
  const [m, n = '0'] = value.toString().split('e'), adjustValue = Math[type](Number(`${m}e${parseInt(n) + exp}`)), [nm, nn = '0'] = adjustValue.toString().split('e');
664
669
  return Number(`${nm}e${parseInt(nn) - exp}`);
665
670
  }
@@ -798,16 +803,17 @@ var __webpack_exports__ = {};
798
803
  (() => {
799
804
  __webpack_require__.r(__webpack_exports__);
800
805
  /* harmony export */ __webpack_require__.d(__webpack_exports__, {
801
- /* harmony export */ SValidation: () => (/* reexport safe */ _validation_mjs__WEBPACK_IMPORTED_MODULE_0__["default"])
806
+ /* harmony export */ JUtil: () => (/* reexport safe */ _nuka9510_js_util__WEBPACK_IMPORTED_MODULE_1__.JUtil),
807
+ /* harmony export */ Validation: () => (/* reexport safe */ _validation_mjs__WEBPACK_IMPORTED_MODULE_0__["default"])
802
808
  /* harmony export */ });
803
809
  /* harmony import */ var _validation_mjs__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(1);
810
+ /* harmony import */ var _nuka9510_js_util__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(2);
811
+
804
812
 
805
813
 
806
814
 
807
815
  })();
808
816
 
809
- var __webpack_export_target__ = exports;
810
- for(var __webpack_i__ in __webpack_exports__) __webpack_export_target__[__webpack_i__] = __webpack_exports__[__webpack_i__];
811
- if(__webpack_exports__.__esModule) Object.defineProperty(__webpack_export_target__, "__esModule", { value: true });
817
+ simpleValidation = __webpack_exports__;
812
818
  /******/ })()
813
819
  ;
package/dist/index.min.js CHANGED
@@ -1 +1 @@
1
- (()=>{"use strict";var e={d:(t,r)=>{for(var s in r)e.o(r,s)&&!e.o(t,s)&&Object.defineProperty(t,s,{enumerable:!0,get:r[s]})},o:(e,t)=>Object.prototype.hasOwnProperty.call(e,t),r:e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})}},t={};e.r(t),e.d(t,{SValidation:()=>s});class r{static empty(e){let t=[void 0,null,0,""].includes(e);return t||(e.constructor==Object?t=0==Object.keys(e).length&&0==Object.keys(Object.getPrototypeOf(e)).length:(e.constructor==NodeList||Array.isArray(e))&&(t=0==e.length)),t}static isNumber(e,t=!1){let r=!Number.isNaN(Number(e))&&["number","string"].includes(typeof e)&&!/^\s*$/.test(`${e}`);return r&&t&&(r="number"==typeof e),r}static isObject(e){return e?.constructor==Object}static numberFormat(e,t=0,s=".",i=","){const a=String(e).split(".");return a[0]=a[0].replace(/\B(?=(\d{3})+(?!\d))/g,i),r.empty(a[1])||(a[1]=a[1].substring(0,t)),r.empty(a[1])?a[0]:a[0].concat(s,a[1])}static strftime(e,t){const r=["January","February","March","April","May","June","July","August","September","October","November","December"],s=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"];return(t=(t=(t=(t=(t=(t=(t=(t=(t=(t=(t=(t=(t=(t=t.replace(/(%{1})/g,"\\$1")).replace(/(\\%){2}/g,"%")).replace(/\\%Y/g,String(e.getFullYear()))).replace(/\\%y/g,String(e.getFullYear()).replace(/^\d+(\d{2})$/,"$1"))).replace(/\\%B/g,r[e.getMonth()])).replace(/\\%b/g,r[e.getMonth()].replace(/^(\w{3})\w*$/,"$1"))).replace(/\\%m/g,String(e.getMonth()+1).replace(/^(\d{1})$/,"0$1"))).replace(/\\%d/g,String(e.getDate()).replace(/^(\d{1})$/,"0$1"))).replace(/\\%A/g,s[e.getDay()])).replace(/\\%a/g,s[e.getDay()].replace(/^(\w{3})\w*$/,"$1"))).replace(/\\%H/g,String(e.getHours()).replace(/^(\d{1})$/,"0$1"))).replace(/\\%I/g,String(e.getHours()>12?e.getHours()-12:e.getHours()).replace(/^0$/,"12").replace(/^(\d{1})$/,"0$1"))).replace(/\\%p/g,e.getHours()<12?"AM":"PM")).replace(/\\%M/g,String(e.getMinutes()).replace(/^(\d{1})$/,"0$1"))).replace(/\\%S/g,String(e.getSeconds()).replace(/^(\d{1})$/,"0$1"))}static checkdate(e,t,r){const s=new Date(e,t-1,r);return s.getFullYear()==e&&s.getMonth()+1==t&&s.getDate()==r}static equaldate(e,t=new Date){return r.strftime(e,"%Y-%m-%d")==r.strftime(t,"%Y-%m-%d")}static getWeek(e,t=!0){const r=["일요일","월요일","화요일","수요일","목요일","금요일","토요일"][e.getDay()];return t?r:r.replace(/^([ㄱ-ㅎㅏ-ㅣ가-힣]{1})[ㄱ-ㅎㅏ-ㅣ가-힣]+$/,"$1")}static addDate(e,t){return new Date(e.getFullYear()+(r.isNumber(t.year,!0)?t.year:0),e.getMonth()+(r.isNumber(t.month,!0)?t.month:0),e.getDate()+(r.isNumber(t.day,!0)?t.day:0),e.getHours()+(r.isNumber(t.hour,!0)?t.hour:0),e.getMinutes()+(r.isNumber(t.minute,!0)?t.minute:0),e.getSeconds()+(r.isNumber(t.second,!0)?t.second:0),e.getMilliseconds()+(r.isNumber(t.millisecond,!0)?t.millisecond:0))}static subDate(e,t){return new Date(e.getFullYear()-(r.isNumber(t.year,!0)?t.year:0),e.getMonth()-(r.isNumber(t.month,!0)?t.month:0),e.getDate()-(r.isNumber(t.day,!0)?t.day:0),e.getHours()-(r.isNumber(t.hour,!0)?t.hour:0),e.getMinutes()-(r.isNumber(t.minute,!0)?t.minute:0),e.getSeconds()-(r.isNumber(t.second,!0)?t.second:0),e.getMilliseconds()-(r.isNumber(t.millisecond,!0)?t.millisecond:0))}static xor(e,t){return!(e&&t)&&(e||t)}static formDataToJson(e){return JSON.stringify(Object.fromEntries([...new Set(e.keys())].map(((...t)=>[t[0],e.getAll(t[0]).length>1?e.getAll(t[0]):e.get(t[0])]))))}static percentage(e,t){return e*(t/100)}static ratio(e,t,r=!0){const s=r?[1,0]:[0,1];return t*e[s[0]]/e[s[1]]}static arithmeticSequence(e,t,r,s){return e+(s-t)*r}static geometricSequence(e,t,r,s){return e/r**(t-1)*r**(s-1)}static decimalAdjust(e,t,r=0){const[s,i="0"]=t.toString().split("e"),a=Math[e](Number(`${s}e${parseInt(i)+r}`)),[n,l="0"]=a.toString().split("e");return Number(`${n}e${parseInt(l)-r}`)}static encodeHtmlEntity(e){const t=document.createElement("textarea");return t.innerText=e,t.innerHTML}static decodeHtmlEntity(e){const t=document.createElement("textarea");return t.innerHTML=e,t.innerText}static copy(e){if(r.isObject(e)){const t={};for(const s in e)t[s]=r.copy(e[s]);return t}if(Array.isArray(e)){const t=[];for(const s of e)t.push(r.copy(s));return t}return e}static numRange(e,t){let r=t-e;const s=r>0;return r=Math.abs(r)+1,[...new Array(r)].map(((...t)=>t[1]*(s?1:-1)+e))}static arrayChunk(e,t){if(!r.isNumber(t,!0))throw new TypeError("size는 숫자 타입 이어야 합니다.");if(t<=0&&Number.isInteger(t))throw new RangeError("size는 0보다 큰 정수여야 합니다.");const s=[];return r.numRange(0,r.decimalAdjust("ceil",e.length/t)+(e.length>0?-1:0)).forEach(((...r)=>{s.push(e.slice(r[0]*t,(r[0]+1)*t))})),s}}class s{result;#e;#t;#r;constructor(e){this.init(e)}init(e=null){this.#s(),this.#i(),this.#a(),this.#n(e?.regex)}#s(){this.result={flag:!0,alertMsg:null,el:null}}#i(){this.#e={}}#a(){this.#t={}}#n(e=null){this.#r=!r.empty(e)&&r.isObject(e)?{...this.#r,...e}:{...this.#r}}#l(e){const t=e.getAttribute("required");r.empty(t)||("radio"==e.type?this.#u(e):r.empty(e.value)&&(this.result.flag=!1,this.result.alertMsg=`'${t}'을/를 입력해 주세요.`,this.result.el=e))}#c(){for(const e in this.#t){const t=this.#t[e][0];if(!this.#t[e].some(((...e)=>e[0].checked))){this.result.flag=!1,this.result.alertMsg=`'${e}'을/를 선택해주세요.`,this.result.el=t;break}}}#o(e){const t=e.dataset.svPattern,s=e.dataset.svDate;if(r.empty(t)||(r.empty(this.#e.el)&&(this.#e.el=[]),this.#e.el?.push(e)),!r.empty(s)){const t=e.dataset.svDateState;switch(t){case"S":case"E":r.empty(this.#e.date)&&(this.#e.date={}),r.empty(this.#e.date[s])&&(this.#e.date[s]={}),this.#e.date[s][t]=e}}}#u(e){const t=e.getAttribute("required");r.empty(t)||(r.empty(this.#t[t])?this.#t[t]=[e]:this.#t[t].push(e))}#g(){for(const e in this.#e){if(!this.result.flag)break;switch(e){case"date":this.#h(this.#e[e]);break;case"el":this.#d(this.#e[e])}}}#h(e){for(const t in e){if(!this.result.flag)break;{const s=e[t].S.value,i=e[t].E.value;if(!r.empty(s)&&!r.empty(i)){const r=e[t].S.dataset.svInputName||e[t].E.dataset.svInputName,a=e[t].S.getAttribute("required")||e[t].E.getAttribute("required");new Date(s).getTime()>new Date(i).getTime()&&(this.result.flag=!1,this.result.alertMsg=`'${r||a}'의 시작일이 종료일 보다 늦습니다.`,this.result.el=e[t].S)}}}}#d(e){if(Array.isArray(e))for(const t of e){const e=t.dataset.svPattern,s=t.dataset.svInputName,i=t.getAttribute("required"),a=t.value;if(Object.keys(this.#r).includes(e)&&!r.empty(a)&&!this.#r[e].test(a)){this.result.flag=!1,this.result.alertMsg=`'${s||i}'의 형식이 올바르지 않습니다.`,this.result.el=t;break}}else{const t=e.dataset.svPattern,s=e.dataset.svInputName,i=e.getAttribute("required"),a=e.value;Object.keys(this.#r).includes(t)&&(r.empty(a)||this.#r[t].test(a)||(this.result.flag=!1,this.result.alertMsg=`'${s||i}'의 형식이 올바르지 않습니다.`,this.result.el=e))}}#m(){for(const e in this.#e)if("el"==e&&this.result.flag)for(const t of this.#e[e]){const e=t.dataset.svInputName,r=t.getAttribute("required"),s=t.value.length;if(!(t instanceof HTMLSelectElement))if(t.minLength>=0&&t.maxLength>=0){if(s<t.minLength||s>t.maxLength){this.result.flag=!1,this.result.alertMsg=`'${e||r}'은/는 ${t.minLength}~${t.maxLength}자 이내로 입력해주세요.`,this.result.el=t;break}}else if(t.minLength>=0&&t.maxLength<0){if(s<t.minLength){this.result.flag=!1,this.result.alertMsg=`'${e||r}'은/는 ${t.minLength}자 이상으로 입력해주세요.`,this.result.el=t;break}}else if(t.minLength<0&&t.maxLength>=0&&s>t.maxLength){this.result.flag=!1,this.result.alertMsg=`'${e||r}'은/는 ${t.maxLength}자 이하로 입력해주세요.`,this.result.el=t;break}}else if(!this.result.flag)break}run(e){this.init();for(const t of e.elements){if(!this.result.flag)break;["INPUT","SELECT","TEXTAREA"].includes(t.tagName)&&(t.disabled||(this.#l(t),this.#o(t)))}this.result.flag&&this.#c(),this.result.flag&&this.#g(),this.result.flag&&this.#m()}}var i=exports;for(var a in t)i[a]=t[a];t.__esModule&&Object.defineProperty(i,"__esModule",{value:!0})})();
1
+ var simpleValidation;(()=>{"use strict";var e={d:(t,r)=>{for(var s in r)e.o(r,s)&&!e.o(t,s)&&Object.defineProperty(t,s,{enumerable:!0,get:r[s]})},o:(e,t)=>Object.prototype.hasOwnProperty.call(e,t),r:e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})}},t={};e.r(t),e.d(t,{JUtil:()=>r,Validation:()=>s});class r{static empty(e){let t=[void 0,null,0,""].includes(e);return t||(e.constructor==Object?t=0==Object.keys(e).length&&0==Object.keys(Object.getPrototypeOf(e)).length:(e.constructor==NodeList||Array.isArray(e))&&(t=0==e.length)),t}static isNumber(e,t=!1){let r=!Number.isNaN(Number(e))&&["number","string"].includes(typeof e)&&!/^\s*$/.test(`${e}`);return r&&t&&(r="number"==typeof e),r}static isObject(e){return e?.constructor==Object}static numberFormat(e,t=0,s=".",i=","){if(!r.isNumber(e,!0)&&!r.isNumber(t,!0))return null;const a=String(e).split(".");return a[0]=a[0].replace(/\B(?=(\d{3})+(?!\d))/g,i),r.empty(a[1])||(a[1]=a[1].substring(0,t)),r.empty(a[1])?a[0]:a[0].concat(s,a[1])}static strftime(e,t){const r=["January","February","March","April","May","June","July","August","September","October","November","December"],s=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"];return(t=(t=(t=(t=(t=(t=(t=(t=(t=(t=(t=(t=(t=(t=t.replace(/(%{1})/g,"\\$1")).replace(/(\\%){2}/g,"%")).replace(/\\%Y/g,String(e.getFullYear()))).replace(/\\%y/g,String(e.getFullYear()).replace(/^\d+(\d{2})$/,"$1"))).replace(/\\%B/g,r[e.getMonth()])).replace(/\\%b/g,r[e.getMonth()].replace(/^(\w{3})\w*$/,"$1"))).replace(/\\%m/g,String(e.getMonth()+1).replace(/^(\d{1})$/,"0$1"))).replace(/\\%d/g,String(e.getDate()).replace(/^(\d{1})$/,"0$1"))).replace(/\\%A/g,s[e.getDay()])).replace(/\\%a/g,s[e.getDay()].replace(/^(\w{3})\w*$/,"$1"))).replace(/\\%H/g,String(e.getHours()).replace(/^(\d{1})$/,"0$1"))).replace(/\\%I/g,String(e.getHours()>12?e.getHours()-12:e.getHours()).replace(/^0$/,"12").replace(/^(\d{1})$/,"0$1"))).replace(/\\%p/g,e.getHours()<12?"AM":"PM")).replace(/\\%M/g,String(e.getMinutes()).replace(/^(\d{1})$/,"0$1"))).replace(/\\%S/g,String(e.getSeconds()).replace(/^(\d{1})$/,"0$1"))}static checkdate(e,t,r){const s=new Date(e,t-1,r);return s.getFullYear()==e&&s.getMonth()+1==t&&s.getDate()==r}static equaldate(e,t=new Date){return r.strftime(e,"%Y-%m-%d")==r.strftime(t,"%Y-%m-%d")}static getWeek(e,t=!0){const r=["일요일","월요일","화요일","수요일","목요일","금요일","토요일"][e.getDay()];return t?r:r.replace(/^([ㄱ-ㅎㅏ-ㅣ가-힣]{1})[ㄱ-ㅎㅏ-ㅣ가-힣]+$/,"$1")}static addDate(e,t){return new Date(e.getFullYear()+(r.isNumber(t.year,!0)?t.year:0),e.getMonth()+(r.isNumber(t.month,!0)?t.month:0),e.getDate()+(r.isNumber(t.day,!0)?t.day:0),e.getHours()+(r.isNumber(t.hour,!0)?t.hour:0),e.getMinutes()+(r.isNumber(t.minute,!0)?t.minute:0),e.getSeconds()+(r.isNumber(t.second,!0)?t.second:0),e.getMilliseconds()+(r.isNumber(t.millisecond,!0)?t.millisecond:0))}static subDate(e,t){return new Date(e.getFullYear()-(r.isNumber(t.year,!0)?t.year:0),e.getMonth()-(r.isNumber(t.month,!0)?t.month:0),e.getDate()-(r.isNumber(t.day,!0)?t.day:0),e.getHours()-(r.isNumber(t.hour,!0)?t.hour:0),e.getMinutes()-(r.isNumber(t.minute,!0)?t.minute:0),e.getSeconds()-(r.isNumber(t.second,!0)?t.second:0),e.getMilliseconds()-(r.isNumber(t.millisecond,!0)?t.millisecond:0))}static xor(e,t){return!(e&&t)&&(e||t)}static formDataToJson(e){return JSON.stringify(Object.fromEntries([...new Set(e.keys())].map(((...t)=>[t[0],e.getAll(t[0]).length>1?e.getAll(t[0]):e.get(t[0])]))))}static percentage(e,t){return e*(t/100)}static ratio(e,t,r=!0){const s=r?[1,0]:[0,1];return t*e[s[0]]/e[s[1]]}static arithmeticSequence(e,t,r,s){return e+(s-t)*r}static geometricSequence(e,t,r,s){return e/r**(t-1)*r**(s-1)}static decimalAdjust(e,t,r=0){const[s,i="0"]=t.toString().split("e"),a=Math[e](Number(`${s}e${parseInt(i)+r}`)),[n,l="0"]=a.toString().split("e");return Number(`${n}e${parseInt(l)-r}`)}static encodeHtmlEntity(e){const t=document.createElement("textarea");return t.innerText=e,t.innerHTML}static decodeHtmlEntity(e){const t=document.createElement("textarea");return t.innerHTML=e,t.innerText}static copy(e){if(r.isObject(e)){const t={};for(const s in e)t[s]=r.copy(e[s]);return t}if(Array.isArray(e)){const t=[];for(const s of e)t.push(r.copy(s));return t}return e}static numRange(e,t){let r=t-e;const s=r>0;return r=Math.abs(r)+1,[...new Array(r)].map(((...t)=>t[1]*(s?1:-1)+e))}static arrayChunk(e,t){if(!r.isNumber(t,!0))throw new TypeError("size는 숫자 타입 이어야 합니다.");if(t<=0&&Number.isInteger(t))throw new RangeError("size는 0보다 큰 정수여야 합니다.");const s=[];return r.numRange(0,r.decimalAdjust("ceil",e.length/t)+(e.length>0?-1:0)).forEach(((...r)=>{s.push(e.slice(r[0]*t,(r[0]+1)*t))})),s}}class s{result;#e;#t;#r;constructor(e){this.init(e)}init(e=null){this.#s(),this.#i(),this.#a(),this.#n(e?.regex)}#s(){this.result={flag:!0,alertMsg:null,el:null}}#i(){this.#e={}}#a(){this.#t={}}#n(e=null){this.#r=!r.empty(e)&&r.isObject(e)?{...this.#r,...e}:{...this.#r}}#l(e){const t=e.getAttribute("required");r.empty(t)||("radio"==e.type?this.#u(e):r.empty(e.value)&&(this.result.flag=!1,this.result.alertMsg=`'${t}'을/를 입력해 주세요.`,this.result.el=e))}#c(){for(const e in this.#t){const t=this.#t[e][0];if(!this.#t[e].some(((...e)=>e[0].checked))){this.result.flag=!1,this.result.alertMsg=`'${e}'을/를 선택해주세요.`,this.result.el=t;break}}}#o(e){const t=e.dataset.svPattern,s=e.dataset.svDate;if(r.empty(t)||(r.empty(this.#e.el)&&(this.#e.el=[]),this.#e.el?.push(e)),!r.empty(s)){const t=e.dataset.svDateState;switch(t){case"S":case"E":r.empty(this.#e.date)&&(this.#e.date={}),r.empty(this.#e.date[s])&&(this.#e.date[s]={}),this.#e.date[s][t]=e}}}#u(e){const t=e.getAttribute("required");r.empty(t)||(r.empty(this.#t[t])?this.#t[t]=[e]:this.#t[t].push(e))}#g(){for(const e in this.#e){if(!this.result.flag)break;switch(e){case"date":this.#h(this.#e[e]);break;case"el":this.#d(this.#e[e])}}}#h(e){for(const t in e){if(!this.result.flag)break;{const s=e[t].S.value,i=e[t].E.value;if(!r.empty(s)&&!r.empty(i)){const r=e[t].S.dataset.svInputName||e[t].E.dataset.svInputName,a=e[t].S.getAttribute("required")||e[t].E.getAttribute("required");new Date(s).getTime()>new Date(i).getTime()&&(this.result.flag=!1,this.result.alertMsg=`'${r||a}'의 시작일이 종료일 보다 늦습니다.`,this.result.el=e[t].S)}}}}#d(e){if(Array.isArray(e))for(const t of e){const e=t.dataset.svPattern,s=t.dataset.svInputName,i=t.getAttribute("required"),a=t.value;if(Object.keys(this.#r).includes(e)&&!r.empty(a)&&!this.#r[e].test(a)){this.result.flag=!1,this.result.alertMsg=`'${s||i}'의 형식이 올바르지 않습니다.`,this.result.el=t;break}}else{const t=e.dataset.svPattern,s=e.dataset.svInputName,i=e.getAttribute("required"),a=e.value;Object.keys(this.#r).includes(t)&&(r.empty(a)||this.#r[t].test(a)||(this.result.flag=!1,this.result.alertMsg=`'${s||i}'의 형식이 올바르지 않습니다.`,this.result.el=e))}}#m(){for(const e in this.#e)if("el"==e&&this.result.flag)for(const t of this.#e[e]){const e=t.dataset.svInputName,r=t.getAttribute("required"),s=t.value.length;if(!(t instanceof HTMLSelectElement))if(t.minLength>=0&&t.maxLength>=0){if(s<t.minLength||s>t.maxLength){this.result.flag=!1,this.result.alertMsg=`'${e||r}'은/는 ${t.minLength}~${t.maxLength}자 이내로 입력해주세요.`,this.result.el=t;break}}else if(t.minLength>=0&&t.maxLength<0){if(s<t.minLength){this.result.flag=!1,this.result.alertMsg=`'${e||r}'은/는 ${t.minLength}자 이상으로 입력해주세요.`,this.result.el=t;break}}else if(t.minLength<0&&t.maxLength>=0&&s>t.maxLength){this.result.flag=!1,this.result.alertMsg=`'${e||r}'은/는 ${t.maxLength}자 이하로 입력해주세요.`,this.result.el=t;break}}else if(!this.result.flag)break}run(e){this.init();for(const t of e.elements){if(!this.result.flag)break;["INPUT","SELECT","TEXTAREA"].includes(t.tagName)&&(t.disabled||(this.#l(t),this.#o(t)))}this.result.flag&&this.#c(),this.result.flag&&this.#g(),this.result.flag&&this.#m()}}simpleValidation=t})();
package/dist/index.mjs CHANGED
@@ -1,2 +1,3 @@
1
1
  import Validation from "./validation.mjs";
2
- export { Validation as SValidation };
2
+ import { JUtil } from "@nuka9510/js-util";
3
+ export { Validation as SValidation, JUtil };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nuka9510/simple-validation",
3
- "version": "1.1.1",
3
+ "version": "1.1.3",
4
4
  "description": "simple validation util for web front-end",
5
5
  "main": "dist/index.mjs",
6
6
  "scripts": {
@@ -33,6 +33,6 @@
33
33
  "webpack-cli": "^6.0.1"
34
34
  },
35
35
  "dependencies": {
36
- "@nuka9510/js-util": "^1.1.1"
36
+ "@nuka9510/js-util": "^1.1.3"
37
37
  }
38
38
  }
package/src/index.mts CHANGED
@@ -1,3 +1,7 @@
1
1
  import Validation from "./validation.mjs";
2
+ import { JUtil } from "@nuka9510/js-util";
2
3
 
3
- export { Validation as SValidation };
4
+ export {
5
+ Validation as SValidation,
6
+ JUtil
7
+ };
package/src/index.ts ADDED
@@ -0,0 +1,7 @@
1
+ import Validation from "./validation.mjs";
2
+ import { JUtil } from "@nuka9510/js-util";
3
+
4
+ export {
5
+ Validation,
6
+ JUtil
7
+ };
package/tsconfig.json CHANGED
@@ -11,5 +11,8 @@
11
11
  "declaration": true,
12
12
  "outDir": "dist"
13
13
  },
14
- "include": ["src/index.mts"]
14
+ "include": [
15
+ "src/index.mts",
16
+ "src/index.ts"
17
+ ]
15
18
  }