UNPKG

@jdlien/validator-utils

Version:

Validation and sanitization functions used by @jdlien/Validator.

475 lines (474 loc) 14.7 kB
//#region src/validator-utils.ts var e = /^(?:[a-z+]+:)?\/\//i, t = /^(?:[-a-z+]+:)?\/\//i, n = /^\d{5}(-\d{4})?$/, r = /^[ABCEGHJKLMNPRSTVXY][0-9][ABCEGHJKLMNPRSTVWXYZ] ?[0-9][ABCEGHJKLMNPRSTVWXYZ][0-9]$/, i = /^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]*[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]*[a-zA-Z0-9])?)*\.[a-zA-Z]{2,}$/, a = /^\d{3}-\d{3}-\d{4}$/, o = /^-?\d*$/, s = /^-?\d*\.?\d*$/, c = { midnight: 0, noon: 12, midday: 12 }; function l(e) { let t = e.trim().toLowerCase().replace(/\.+$/g, ""); if (t === "now") { let e = /* @__PURE__ */ new Date(); return { hour: e.getHours(), minute: e.getMinutes(), second: e.getSeconds() }; } if (t in c) return { hour: c[t], minute: 0, second: 0 }; t = t.replace(/\s+/g, "").replace(/\.+$/g, ""); let n = t.replace(/^(\d{1,2})(\d{2})([ap]?m?\.?)$/i, "$1:$2$3").match(/^(\d{1,2})(?::(\d{1,2}))?(?::(\d{1,2}))?\s*([ap])?\.?m?\.?$/i); if (!n) return null; let r = +n[1], i = +(n[2] || 0), a = +(n[3] || 0), o = n[4]?.toLowerCase(); return o === "p" && r < 12 && (r += 12), o === "a" && r === 12 && (r = 0), r > 23 || i > 59 || a > 59 ? null : { hour: r, minute: i, second: a }; } function u(e) { return l(e) !== null; } function d(e) { return /^[ap]\.?m?\.?$/i.test(e.replace(/\s/g, "")); } var f = RegExp("(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)[a-z]*", "i"); function p(e) { return (/* @__PURE__ */ new Date(`1 ${e} 2000`)).getMonth(); } function m(e) { if (typeof e == "string" && (e = parseInt(e.replace(/\D/g, ""))), e > 99) return e; let t = ((/* @__PURE__ */ new Date()).getFullYear() + 20) % 100; return e + (e < t ? 2e3 : 1900); } function h(e) { if (e instanceof Date) return e; let t = e.trim().toLowerCase(), n = new Date((/* @__PURE__ */ new Date()).setHours(0, 0, 0, 0)); if (/^(now|today)$/.test(t)) return n; if (t === "yesterday") return new Date(n.setDate(n.getDate() - 1)); if (t === "tomorrow") return new Date((/* @__PURE__ */ new Date()).setHours(0, 0, 0, 0) + 864e5); let r = e.match(/(\d{2,4})\s*[年년]\s*(\d{1,2})\s*[月월]\s*(\d{1,2})\s*[日일]?/); if (r) return new Date(m(+r[1]), r[2] - 1, +r[3], 0, 0, 0); t = t.replace(/\b(mon|tue|wed|thu|fri|sat|sun|lun|mar(?:di|tes)|mer|jeu|ven|sam|dim|dom)[a-z]*\.?\b/gi, "").trim(); let i = 0, a = 0, o = 0, s = t.match(/(\d{1,2}:\d{2}(?::\d{2})?\s*[ap]?\.?m?\.?)/i); if (s) { let e = l(s[1]); if (e && ({hour: i, minute: a, second: o} = e), t = t.replace(s[0], "").trim(), !t || t.length <= 2) { let e = /* @__PURE__ */ new Date(); return new Date(e.getFullYear(), e.getMonth(), e.getDate(), i, a, o); } } if (/^\d{8}$/.test(t)) return new Date(+t.slice(0, 4), t.slice(4, 6) - 1, +t.slice(6, 8), i, a, o); if (/^\d{6}$/.test(t)) return new Date(m(+t.slice(0, 2)), t.slice(2, 4) - 1, +t.slice(4, 6), i, a, o); let c = t.match(f), u = -1, d = 0, h = 0; c && (u = p(c[1]), t = t.replace(c[0], " ").trim()); let g = t.match(/'(\d{2})\b/); g && (d = m(+g[1]), t = t.replace(g[0], " ").trim()); let _ = t.match(/\d+/g)?.map(Number) || []; if (u >= 0) _.length >= 2 ? _[0] > 99 ? (d = _[0], h = _[1]) : _[1] > 99 ? (d = _[1], h = _[0]) : _[0] > 31 ? (h = _[1], d = m(_[0])) : _[1] > 31 ? (h = _[0], d = m(_[1])) : (h = _[0], d ||= m(_[1])) : _.length === 1 && (h = _[0], d ||= (/* @__PURE__ */ new Date()).getFullYear()); else if (_.length >= 3) { let [e, t, n] = _; e > 31 ? (d = e, u = t - 1, h = n) : e > 12 && n > 12 ? (h = e, u = t - 1, d = n > 31 ? n : m(n)) : n > 31 || n > 12 ? (u = e - 1, h = t, d = n > 31 ? n : m(n)) : (u = e - 1, h = t, d = m(n)); } else _.length === 2 && (u = _[0] - 1, h = _[1], d ||= (/* @__PURE__ */ new Date()).getFullYear()); return d && u >= 0 && h && h >= 1 && h <= 31 ? new Date(d > 99 ? d : m(d), u, h, i, a, o) : /* @__PURE__ */ new Date(""); } function g(e) { if (e instanceof Date) return e; let t = e.trim(); if (t.length < 3) return null; if (t = t.replace(/(\d)T(\d)/i, "$1 $2"), t = t.replace(/(^|[\sT])(\d{1,2})\.(\d{1,2})(?:\.(\d{1,2}))?(?=\s*[ap]\.?m?\.?\b|(?:\s|$))/gi, (e, t, n, r, i) => `${t}${i ? `${n}:${r}:${i}` : `${n}:${r}`}`), /^now$/i.test(t)) { let e = /* @__PURE__ */ new Date(); return e.setMilliseconds(0), e; } if (/^(noon|midday)$/i.test(t)) { let e = /* @__PURE__ */ new Date(); return new Date(e.getFullYear(), e.getMonth(), e.getDate(), 12, 0, 0); } if (/^midnight$/i.test(t)) { let e = /* @__PURE__ */ new Date(); return new Date(e.getFullYear(), e.getMonth(), e.getDate(), 0, 0, 0); } let n = null, r = t; for (let e of [ /\bmidnight\b/i, /\bmidday\b/i, /(\d{1,2}:\d{1,2}(?::\d{2})?)\s*([ap]\.?m?\.?)?/i, /\b(\d{1,2})\s*([ap]\.?m?\.?)\b/i, /\b(\d{3,4})([ap])m?\b/i ]) { let i = t.match(e); if (i) { let e = l(i[0]); if (e) { n = e, r = t.replace(i[0], " ").replace(/[\s.]+$/g, "").replace(/\s+/g, " ").trim(); break; } } } if (!n) { let e = r.match(/^(\d{4}[\-\/\.\s]\d{1,2}[\-\/\.\s]\d{1,2}|\d{8})\s+(\d{1,6})(\s*[ap]\.?m?\.?)?(?:\s*(?:z|utc|gmt|[+-]\d{2}:?\d{2})\b)?$/i); if (e) { let t = e[2], i = (e[3] || "").replace(/\s+/g, ""), a = t + i; t.length === 6 && (a = `${t.slice(0, 2)}:${t.slice(2, 4)}:${t.slice(4, 6)}${i}`); let o = l(a); o && (n = o, r = e[1]); } } if (!n) { let e = r.match(/^(.+?)\s+(\d{1,2})(\s*[ap]\.?m?\.?)?$/i); if (e) { let t = l(e[2] + (e[3] || "")); t && f.test(e[1]) && (n = t, r = e[1]); } } if (n && (!r || /^,?\s*$/.test(r))) { let e = /* @__PURE__ */ new Date(); return new Date(e.getFullYear(), e.getMonth(), e.getDate(), n.hour, n.minute, n.second); } let i = h(r); if (isNaN(i.getTime())) return null; let a = n || { hour: 0, minute: 0, second: 0 }; return new Date(i.getFullYear(), i.getMonth(), i.getDate(), a.hour, a.minute, a.second); } function _(e, t = "YYYY-MM-DD") { if (typeof e == "string" && (e = h(e)), isNaN(e.getTime())) return ""; let n = e.getFullYear(), r = e.getMonth(), i = e.getDate(), a = e.getDay(), o = e.getHours(), s = e.getMinutes(), c = e.getSeconds(), l = e.getMilliseconds(), u = (e, t = 2) => String(e).padStart(t, "0"), d = o % 12 || 12, f = o < 12 ? "AM" : "PM", p = [ "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" ], m = [ "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" ], g = { YYYY: n, YY: String(n).slice(-2), MMMM: p[r], MMM: p[r].slice(0, 3), MM: u(r + 1), M: r + 1, DD: u(i), D: i, dddd: m[a], ddd: m[a].slice(0, 3), dd: m[a].slice(0, 2), d: a, HH: u(o), H: o, hh: u(d), h: d, mm: u(s), m: s, ss: u(c), s: c, SSS: u(l, 3), A: f, a: f.toLowerCase() }; return t.replace(/\[([^\]]+)]|YYYY|YY|MMMM|MMM|MM|M|DD|D|dddd|ddd|dd|d|HH|H|hh|h|mm|m|ss|s|SSS|A|a/g, (e, t) => t ?? String(g[e])); } var v = { YYYY: "Y", YY: "y", MMMM: "F", MMM: "M", MM: "m", M: "n", DD: "d", D: "j", dddd: "l", ddd: "D", dd: "D", d: "w", HH: "H", H: "G", hh: "h", mm: "i", m: "i", ss: "S", s: "s", A: "K", a: "K" }, y = /YYYY|YY|MMMM|MMM|MM|M|DD|D|dddd|ddd|dd|d|HH|H|hh|mm|m|ss|s|A|a/g; function b(e) { return e.replace(y, (e) => v[e]); } function x(e) { return typeof e != "string" && !(e instanceof Date) ? !1 : !isNaN(h(e).getTime()); } function S(e) { if (typeof e != "string" && !(e instanceof Date)) return !1; let t = g(e); return t !== null && !isNaN(t.getTime()); } function C(e, t = "YYYY-MMM-DD") { let n = h(e); return isNaN(n.getTime()) ? "" : _(n, t); } function w(e, t = "YYYY-MMM-DD h:mm A") { let n = g(e); return n && !isNaN(n.getTime()) ? _(n, t) : ""; } function T(e, t = "h:mm A") { let n = l(e); if (!n) return ""; let r = /* @__PURE__ */ new Date(); return r.setHours(n.hour, n.minute, n.second, 0), _(r, t); } var E = { ja: 0, en: 0, fe: 1, fé: 1, ap: 3, ab: 3, av: 3, mai: 4, juin: 5, juil: 6, au: 7, ag: 7, ao: 7, se: 8, o: 9, n: 10, d: 11 }; function D(e) { if (typeof e == "number") return e - 1; let t = parseInt(e); if (!isNaN(t)) return t - 1; let n = (/* @__PURE__ */ new Date(`1 ${e} 2000`)).getMonth(); if (!isNaN(n)) return n; let r = e.toLowerCase(); for (let e in E) if (r.startsWith(e)) return E[e]; throw Error("Invalid month name: " + e); } function O(e) { let t = e.match(/^([+-])?(\d+)([dwmy])$/i); if (!t) return null; let [, n, r, i] = t, a = parseInt(r) * (n === "-" ? -1 : 1), o = /* @__PURE__ */ new Date(); switch (o.setHours(0, 0, 0, 0), i.toLowerCase()) { case "d": o.setDate(o.getDate() + a); break; case "w": o.setDate(o.getDate() + a * 7); break; case "m": o.setMonth(o.getMonth() + a); break; case "y": o.setFullYear(o.getFullYear() + a); break; } return o; } var k = /(\d{1,2}:\d{2}|\d{1,2}\.\d{2}|\b\d{1,2}\s*[ap]\b|\b[ap]\.?m\.?\b|\bnoon\b|\bmidday\b|\bmidnight\b|\bnow\b|T\d{1,2})/i, A = /(\d{1,2}[-/.]\d{1,2}(?:[-/.]\d{2,4})?|\b\d{4}\b|\b\d{6,8}\b|\b(?:jan|feb|mar|apr|may|jun|jul|aug|sep|sept|oct|nov|dec)\b|\btoday\b|\btomorrow\b|\byesterday\b)/i; function j(e, t) { if (t === "past") return e <= /* @__PURE__ */ new Date(); if (t === "future") return e.getTime() >= (/* @__PURE__ */ new Date()).setHours(0, 0, 0, 0); if (t === "today") { let t = /* @__PURE__ */ new Date(); return e.getFullYear() === t.getFullYear() && e.getMonth() === t.getMonth() && e.getDate() === t.getDate(); } let n = (e) => { let t = e.trim(); if (!t) return { date: null, hasTime: !1, valid: !0 }; let n = O(t); if (n) return { date: n, hasTime: !1, valid: !0 }; let r = t.search(A); if (r === -1) return { date: null, hasTime: !1, valid: !1 }; let i = t.search(k); if (i !== -1 && i < r) return { date: null, hasTime: !1, valid: !1 }; let a = g(t); return a && !isNaN(a.getTime()) ? { date: a, hasTime: k.test(t), valid: !0 } : { date: null, hasTime: !1, valid: !1 }; }, r = null; if (t.includes(":")) for (let e = 0; e < t.length; e += 1) { if (t[e] !== ":") continue; let i = n(t.slice(0, e)), a = n(t.slice(e + 1)); if (i.valid && a.valid) { r = { start: i, end: a }; break; } } if (!r) { let r = n(t); return r.valid && r.date ? r.hasTime ? e.getTime() === r.date.getTime() : e.getFullYear() === r.date.getFullYear() && e.getMonth() === r.date.getMonth() && e.getDate() === r.date.getDate() : !0; } let i = r.start, a = r.end, o = i.hasTime || a.hasTime ? e.getTime() : new Date(e.getFullYear(), e.getMonth(), e.getDate()).getTime(), s = null; i.date && (s = i.hasTime ? i.date.getTime() : new Date(i.date.getFullYear(), i.date.getMonth(), i.date.getDate()).getTime()); let c = null; return a.date && (c = a.hasTime ? a.date.getTime() : new Date(a.date.getFullYear(), a.date.getMonth(), a.date.getDate(), 23, 59, 59, 999).getTime()), !(s !== null && o < s || c !== null && o > c); } function M(e) { return e instanceof HTMLInputElement || e instanceof HTMLSelectElement || e instanceof HTMLTextAreaElement; } function N(e, t) { return typeof t == "string" && (t = [t]), t.includes(e.dataset.type || "") || t.includes(e.type); } function P(e) { return e.length <= 255 && i.test(e); } function F(e) { return e.replace(/^[^2-90]+/g, "").replace(/(\d\d\d).*?(\d\d\d).*?(\d\d\d\d)(.*)/, "$1-$2-$3$4"); } function I(e) { return a.test(e); } function L(e) { return e.replace(/[^0-9]/g, ""); } function R(e) { return o.test(e); } function z(e) { let t = e.replace(/[^\-0-9.]/g, ""), n = "", r = !1, i = !1; for (let e = 0; e < t.length; e += 1) { let a = t[e]; if (a === "-") { !i && n.length === 0 && (n += "-", i = !0); continue; } if (a === ".") { r ||= (n += ".", !0); continue; } n += a; } return n; } function B(e) { return s.test(e); } var V = { "": 1, K: 1e3, M: 1e6, G: 1e9, T: 0xe8d4a51000 }, H = { "": 1, K: 1024, M: 1024 ** 2, G: 1024 ** 3, T: 1024 ** 4 }; function U(e) { let t = e.trim().match(/^(\d+(?:\.\d*)?|\.\d+)\s*(B|Ki?B?|Mi?B?|Gi?B?|Ti?B?)?$/i); if (!t) return NaN; let n = Number.parseFloat(t[1]), r = t[2]?.toUpperCase() || "", i = r.includes("I"), a = r.replace(/I?B$/i, "").replace(/I$/i, "") || ""; return n * (i ? H : V)[a]; } function W(e, t = !0) { let n = t ? 1e3 : 1024, r = [ "B", "KB", "MB", "GB", "TB" ]; if (e < n) return `${e} B`; let i = 0, a = e; for (; a >= n && i < r.length - 1;) a /= n, i++; let o = Math.round(a * 10) / 10; return o >= n && i < r.length - 1 && (o = 1, i++), `${o % 1 == 0 ? o.toFixed(0) : o.toFixed(1)} ${r[i]}`; } function G(t) { return t = t.trim(), e.test(t) ? t : "https://" + t; } function K(e) { return t.test(e); } function q(e) { return e = e.replace(/[^0-9]/g, "").replace(/(.{5})(.*)/, "$1-$2").trim(), e.length === 6 ? e.replace(/-/, "") : e; } function J(e) { return n.test(e); } function Y(e) { return e.toUpperCase().replace(/[^A-Z0-9]/g, "").replace(/(.{3})\s*(.*)/, "$1 $2").trim(); } function X(e) { return r.test(e); } function Z(e) { return ["transparent", "currentColor"].includes(e) ? !0 : !e.trim() || typeof CSS > "u" || !CSS.supports ? !1 : CSS.supports("color", e); } var Q = null, $ = /* @__PURE__ */ new Map(); function ee(e) { if (e = e.trim().toLowerCase(), ["transparent", "currentcolor"].includes(e)) return e; if ($.has(e)) return $.get(e); Q || (Q = document.createElement("canvas"), Q.willReadFrequently = !0); let t = Q.getContext("2d"); t.fillStyle = e, t.fillRect(0, 0, 1, 1); let n = t.getImageData(0, 0, 1, 1).data, r = "#" + ("000000" + (n[0] << 16 | n[1] << 8 | n[2]).toString(16)).slice(-6); return $.set(e, r), r; } function te(e) { if (typeof e == "boolean") return { valid: e, error: !1, messages: [] }; if (typeof e == "string") return { valid: !1, error: !1, messages: [e] }; let t = { valid: e.valid, error: e.error ?? !1, messages: [] }; return typeof e.message == "string" ? t.messages = [e.message] : typeof e.messages == "string" ? t.messages = [e.messages] : Array.isArray(e.messages) && (t.messages = e.messages), t; } //#endregion export { W as formatBytes, _ as formatDateTime, Z as isColor, x as isDate, j as isDateInRange, S as isDateTime, P as isEmail, M as isFormControl, R as isInteger, d as isMeridiem, I as isNANPTel, B as isNumber, X as isPostalCA, u as isTime, N as isType, K as isUrl, J as isZip, b as momentToFPFormat, D as monthToNumber, te as normalizeValidationResult, U as parseBytes, ee as parseColor, h as parseDate, g as parseDateTime, w as parseDateTimeToString, C as parseDateToString, L as parseInteger, F as parseNANPTel, z as parseNumber, Y as parsePostalCA, O as parseRelativeDate, l as parseTime, T as parseTimeToString, G as parseUrl, q as parseZip, m as yearToFull };