UNPKG

ts-nano-form

Version:

A simple and versatile way to make forms. Lightweight and dependency free.

261 lines (260 loc) 7.8 kB
const P = { showLogErrors: !0 }, z = { thousands: ".", decimal: ",", precision: 2, allowNegative: !1 }, Z = { map: /* @__PURE__ */ new Map([ ["0", { pattern: /\d/ }], ["A", { pattern: /[a-zA-Z0-9]/ }], ["S", { pattern: /[A-Za-z]/ }], [ "X", { pattern: /[A-Za-z]/, transform: (t, e) => ({ prevValue: t, newChar: e.toLocaleUpperCase() }) } ], [ "x", { pattern: /[A-Za-z]/, transform: (t, e) => ({ prevValue: t, newChar: e.toLocaleLowerCase() }) } ], [ "Z", { pattern: /[a-zA-Z0-9]/, transform: (t, e) => ({ prevValue: t, newChar: e.toLocaleUpperCase() }) } ], [ "z", { pattern: /[a-zA-Z0-9]/, transform: (t, e) => ({ prevValue: t, newChar: e.toLocaleLowerCase() }) } ] ]) }, p = (t) => { let e = t, n = []; const s = (l) => (n = [...n, l], () => { n = n.filter((a) => a !== l); }), r = (l, a) => { for (const i of n) i(l, a); }; return { subscribe: s, emit: r, get: () => e, set: (l) => { const a = e; e = l, r(l, a); } }; }, M = (t, e = "") => { const n = {}; for (const s in t) if (Object.prototype.hasOwnProperty.call(t, s)) { const r = e ? `${e}.${s}` : s; typeof t[s] == "object" && t[s] !== null && !Array.isArray(t[s]) ? Object.assign(n, M(t[s], r)) : Array.isArray(t[s]) ? t[s].forEach((c, f) => { typeof c == "object" && c !== null ? Object.assign(n, M(c, `${r}.${f}`)) : n[`${r}.${f}`] = c; }) : n[r] = t[s]; } return n; }, L = (t) => { const e = {}; for (const n in t) if (Object.prototype.hasOwnProperty.call(t, n)) { const s = n.split("."); let r = e; for (let c = 0; c < s.length; c++) { const f = s[c], l = c === s.length - 1, a = /^\d+$/.test(s[c + 1]); l ? r[f] = t[n] : (r[f] || (r[f] = a ? [] : {}), r = r[f]); } } return e; }, C = (t, e) => !t || t === "0" ? `0${e === 0 ? "" : ".".padEnd(e + 1, "0")}` : Number( t.match( new RegExp("^-?\\d+(?:.\\d{0," + (e || -1) + "})?") )[0] ).toFixed(e), S = (t) => t.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"), v = (t) => (t || "").replace(/[^0-9]/g, ""), T = (t) => t % 1 != 0, D = (t) => (typeof t == "number" || typeof t == "string" && t.trim() !== "") && !isNaN(t), u = (t) => String(t || ""), U = (t, e) => { var n, s; return e.allowNegative && ((n = t.match(/-/g)) == null ? void 0 : n.length) === 1 && ((s = t.match(/\+/g)) == null ? void 0 : s.length) !== 1 ? "-" : ""; }, I = (t, e, n) => { if (n != null && n.transform) { const { prevValue: s, newChar: r } = n.transform(e, t); return s + r; } return e + t; }, R = (t, e, n) => { let s = 0; return [...e].reduce((r, c) => { const f = t[s]; if (!f) return r; if (f === c) return ++s, r + c; const l = n.map.get(c); return l ? l.pattern.test(f) ? (++s, I(f, r, l)) : (s = -1, r) : r + c; }, ""); }, K = (t, e) => new RegExp( t === 0 ? "(\\d{1,3})(?=(\\d{3})+(?!\\d))" : `(\\d)(?=(\\d{3})+${S(e)})`, "g" ), X = (t, e, n) => `${e}${n.prefix || ""}${t.replace(".", n.decimal).replace( K(n.precision, n.decimal), `$1${n.thousands}` )}`, x = (t, e) => D(t) && T(Number(t)) ? C(t, e) : C( `${Number(v(t)) / +`1${"".padEnd(e, "0")}`}`, e ), Y = (t, e, n) => Array.isArray(e) ? e.sort((s, r) => s.length - r.length).find( (s) => b(s, n).length >= b(t, n).length ) || e[e.length - 1] || "" : e, h = (t, e, n) => { const s = n.beforeMask ? n.beforeMask(t) : t, r = R( s, Y(t, e, n), n ); return n.afterMask ? n.afterMask(r) : r; }, b = (t, e) => { const n = [...e.map.values()].map((s) => s.pattern); return t.replace( new RegExp( `${[...t].filter((s) => !n.find((r) => r.test(s))).map((s) => S(s)).join("|")}`, "g" ), "" ); }, E = (t, e) => { const n = U(t, e), s = x(t, e.precision), r = e.beforeMask ? e.beforeMask(s) : s, c = X(r, n, e); return e.afterMask ? e.afterMask(c) : c; }, w = (t, e) => t ? `${U(t, e)}${x(t, e.precision)}` : "0", q = (t, e) => [...t].reduce((n, s) => e.map.get(s) ? n + "_" : n + s, ""), B = (t, e, n, s) => { const r = t(), c = e(), f = () => r.get(), l = () => u(c.get()); return { getValue: f, getValueStore: t, getMasked: (g) => h( b(u(r.get()), n), g, n ), getUnmasked: () => b(u(r.get()), n), getMoneyMasked: () => E(u(r.get()), s), getMoneyUnmasked: () => w(u(r.get()), s), getError: l, getErrorStore: e, setError: (g) => (c.set(g), u(l())), setValue: (g) => (r.set(g), f()), setUnmasked: (g) => (r.set(b(g, n)), f()), setMasked: (g, o) => (r.set(h(b(g, n), o, n)), u(f())), setMoney: (g) => (r.set(w(g, s)), u(f())), setMoneyMasked: (g) => (r.set(E(g, s)), u(f())), subscribeValue: (g) => r.subscribe(g), subscribeError: (g) => c.subscribe(g) }; }, G = (t) => { const e = M((t == null ? void 0 : t.initialValues) || {}), n = Object.fromEntries( Object.entries(e).map(([o, d]) => [ o, p(d) ]) ), s = Object.fromEntries( Object.entries(e).map(([o]) => [o, p()]) ), { formOptions: r, maskOptions: c, moneyOptions: f } = t.options; let l = !1; const a = () => L( Object.fromEntries( Object.entries(n).map(([o, d]) => [o, d.get()]) ) ), i = () => L( Object.fromEntries( Object.entries(s).map(([o, d]) => [o, d.get()]) ) ), m = (o) => o in n ? n[o] : n[o] = p(), O = (o) => o in s ? s[o] : s[o] = p(), V = (o) => Object.values(n).map((d) => d.subscribe(o)), _ = (o) => Object.values(s).map((d) => d.subscribe(o)), $ = () => Object.keys(n).map((o) => n[o].set(void 0)), A = (o) => Object.keys(o).map((d) => m(d).set(o[d])), F = () => Object.keys(n).map( (o) => n[o].set(e[o] ?? void 0) ), k = () => Object.values(s).map((o) => o.set(void 0)), N = (o) => { const d = a(); return j(d), l ? o(d) : r.showLogErrors && console.log(i()); }, j = (o) => { const d = ((t == null ? void 0 : t.resolver) && t.resolver(o)) ?? {}; l = !0, k(), Object.keys(d).map((y) => { d[y] && (l = !1, O(y).set(d[y])); }); }, g = () => l; return { name: t.name, getIsValid: g, getValues: a, getErrors: i, subscribeAllValues: V, subscribeAllErrors: _, clearValues: $, reset: A, resetValues: F, resetErrors: k, field: (o) => B( () => m(o), () => O(o), c, f ), submit: N }; }, H = (t) => t ? { ...t, precision: !t.precision || t.precision < 0 ? 0 : t.precision, decimal: t.decimal ? t.decimal : ".", allowNegative: !!(t != null && t.allowNegative) } : z, J = (t) => { const e = [], n = (t == null ? void 0 : t.formOptions) ?? P, s = (t == null ? void 0 : t.maskOptions) ?? Z, r = H(t == null ? void 0 : t.moneyOptions), c = (a) => { e.find((i) => i.name === a.name) || e.push(a); }; return { mask: (a, i, m) => h(a, i, m || s), unmask: (a, i) => b(a, i || s), maskMoney: (a, i) => E(a, i || r), unmaskMoney: (a, i) => w(a, i || r), getPlaceholder: (a, i) => q(a, i || s), createForm: (a) => { const i = G({ ...a, options: { formOptions: n, maskOptions: s, moneyOptions: r } }); return c(i), i; }, getForm: (a) => { const i = e.find((m) => m.name === a); if (i) return i; throw new Error("Form not found, check if the name of this form exists"); } }; }; export { P as DEFAULT_FORM_OPTIONS, Z as DEFAULT_MASK_OPTIONS, z as DEFAULT_MONEY_OPTIONS, p as createStore, J as default };