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