ts-nano-form
Version:
A simple and versatile way to make forms. Lightweight and dependency free.
261 lines (260 loc) • 7.8 kB
JavaScript
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
};