svelte-specma
Version:
Svelte store for data validation using Specma
3 lines (2 loc) • 11.9 kB
JavaScript
import{writable as r,readable as n,derived as e,get as t}from"svelte/store";import i from"fast-deep-equal";function u(){return u=Object.assign?Object.assign.bind():function(r){for(var n=1;n<arguments.length;n++){var e=arguments[n];for(var t in e)({}).hasOwnProperty.call(e,t)&&(r[t]=e[t])}return r},u.apply(null,arguments)}var o=function(r){return r},c=function(){};function a(e,t,i){void 0===e&&(e=[]),void 0===t&&(t=o);var u=e,a=r(e),s=t.length<2,f=n(i,function(r){var n=!1,e=c,i=0,o=new Map,f=new Map;function v(){if(!i){e();var n=u.reduce(function(r,n){return f.has(n)?[].concat(r,[f.get(n)]):r},[]),o=t(n,r);s?r(o):e="function"==typeof o?o:c}}var l=a.subscribe(function(r){(function(r){var n;void 0===r&&(r=[]),void 0===(n=r)&&(n=[]),o.forEach(function(r,e){!n.includes(e)&&r&&r()}),o=new Map(r.map(function(r){return[r,o.get(r)]}))})(r),function(r){void 0===r&&(r=[]),f=new Map(r.map(function(r){return[r,f.get(r)]}))}(r),u=[],r.forEach(function(r,e){u[e]=r,o.get(r)||o.set(r,r.subscribe(function(t){f.set(r,t),i&=~(1<<e),n&&v()},function(){i|=1<<e}))}),n&&v()});return n=!0,v(),function(){l(),o.forEach(function(r){return r&&r()}),e()}});return{exclude:function(){var r=arguments;a.update(function(n){return n.filter(function(n){return![].slice.call(r).includes(n)})})},include:function(){var r=arguments;a.update(function(n){return[].concat(n,[].slice.call(r))})},set:a.set,stores:a,subscribe:f.subscribe,update:a.update}}var s=function(r){return r},f=function(r){return["array","map","object"].includes(v(r))},v=function(r){return{}.toString.call(r).split(" ")[1].slice(0,-1).toLowerCase()};function l(r){var n={array:function(){return r.map(function(r,n){return[n,r]})},map:function(){return Array.from(r.entries())},object:function(){return Object.entries(r)}}[v(r)];return n?n(r):[]}function d(r,n){var e={array:function(){return r.map(function(r){return r[1]})},map:function(){return new Map(r)},object:function(){return Object.fromEntries(r)}}[n];return e?e():d(r,"map")}function p(r){var n={array:function(){return[].concat(r)},map:function(){return Array.from(r.values())},object:function(){return Object.values(r)}}[v(r)];return n?n(r):[]}function m(r){var n={array:function(){return r.map(function(r,n){return n})},map:function(){return Array.from(r.keys())},object:function(){return Object.keys(r)}}[v(r)];return n?n(r):[]}function h(){var r=[].slice.call(arguments).filter(f),n=v(r[0]);if(!r.every(function(r){return v(r)===n})){var e=r.map(v).join(", ");throw new TypeError("Collections must be of same type. Received '"+e+"'.")}var t={array:function(){return r.reduce(function(r,n){return n.length>=r.length?n:[].concat(n,r.slice(n.length))},[])},map:function(){return new Map(r.map(function(r){return r.entries()}))},object:function(){return Object.assign.apply(Object,[{}].concat(r))}}[n];if(!t)throw new Error("'merge' not implemented yet for "+n);return t()}function b(r,n){var e={array:function(){return n[r]},map:function(){return n.get(r)},object:function(){return n[r]}}[v(n)];return e?e(r,n):void 0}function g(r,n){return void 0===r&&(r=[]),r.reduce(function(r,n){return b(n,r)},n)}function y(r,n,e){void 0===e&&(e=P);var t=[r,n].map(e),u=t[0],o=t[1];return u===o||i(u,o)}function P(r){return r instanceof Date?r.valueOf():f(r)?w(r):r}function w(r){return f(r)?d(l(r).reduce(function(r,n){var e=n[1];return void 0===e?r:[].concat(r,[[n[0],w(e)]])},[]),v(r)):r}function j(r){var n=l(r);return{coll:r,collType:v(r),storesEntries:n,keys:n.map(function(r){return r[0]}),stores:n.map(function(r){return r[1]})}}function E(r,n,e){void 0===n&&(n=s);var t=j(r),i=function(r){return d(r.map(function(r,n){return[t.keys[n],r]}),t.collType)},u=a(t.stores,n.length<2?function(r){return n(i(r))}:function(r,e){return n(i(r),e)},e);return{set:function(r){t=j(r),u.set(t.stores)},subscribe:u.subscribe}}var O={valid:!0},M=["and","getMessage","getPred","getSpread","isOpt","validatePred"],A="SvelteSpecma must be configured with a valid Specma version.",S=void 0;function V(){if(!S)throw new TypeError(A)}function q(r){if(!r)throw new TypeError(A);M.forEach(function(n){if("function"!=typeof r[n])throw new TypeError("'"+n+"' must be a function provided by 'specma'")}),S=r}var C=function(){return!0},I=function(r,n){return!y(r,n)},T=function(r){return!function(r){return[void 0,null,""].includes(r)}(r)||S.getMessage("isRequired")};function L(n,o,c){var a=function(r){void 0===r&&(r=!0);try{return N.set(r),Promise.resolve(Promise.resolve()).then(function(){return Promise.resolve(h).then(function(r){return r.valid})})}catch(r){return Promise.reject(r)}},s=void 0===o?{}:o,f=s.changePred,v=void 0===f?I:f,l=s.id,d=s.required,p=s.spec,m=s.onSubmit;void 0===c&&(c={}),V();var h,b=S.and,P=S.validatePred,w=c.getAncestor,j=(0,S.getPred)(p)||C,M=!!d,A=M?b(T,j):j,q={},L=E(q),R=n,N=r(!1),_=r(!1),D=function(n){var e=n,t=r.apply(void 0,[n].concat([].slice.call(arguments,1)));return{set:function(r){i(r,e)||t.set(e=r)},subscribe:t.subscribe}}(R),F=e([N,D,L,_],function(r,n){var i=r[0],o=r[1],c=r[2],a=r[3];h=void 0;var s=k(i&&(void 0!==o||d)?P(A,o,function(r){return q[r]?c[r]:function(r){if(!q[r]){var n,i=w((void 0===(n=r)&&(n=""),(n.match(/\.\.\/|\.\.$/g)||[]).length));if(i){var u=function(r){return void 0===r&&(r=""),r.split("/").reduce(function(r,n){if(!n||n.startsWith("."))return r;var e=parseInt(n,10);return[].concat(r,[isNaN(e)?n:e])},[])}(r);return q[r]=e(i,function(n,e){var t=n.value;if(t){var i=q[r].value,o=g(u,t);y(i,o)||(q[r].value=o,e(o))}}),L.set(q),g(u,t(i).value)}}}(r)}):O),f={active:i,changePred:v,initialValue:R,id:l,result:s,submitting:a,value:o};h=s.promise,n(x(f)),null===s.valid&&s.promise.then(function(r){s.promise===h&&n(x(u({},f,{result:r})))})}),W={id:l,isRequired:M,spec:j,activate:a,reset:function(r){void 0===r&&(r=R),R=r,this.activate(!1),this.set(r)},set:function(r,n){void 0===n&&(n=!1),D.set(r),n&&a()},submit:function(){try{return m?(_.set(!0),Promise.resolve(function(r,n){try{var e=Promise.resolve(a()).then(function(r){if(!r)return!1;var n=t(D);return Promise.resolve(m(n,W)).then(function(){return!0})})}catch(r){return n(!0,r)}return e&&e.then?e.then(n.bind(null,!1),n.bind(null,!0)):n(!1,e)}(0,function(r,n){if(_.set(!1),r)throw n;return n}))):Promise.resolve()}catch(r){return Promise.reject(r)}},subscribe:F.subscribe};return W}function k(r){return u({},r,{promise:r.promise?r.promise.then(function(r){return k(r)}):Promise.resolve(r)})}function x(r){var n=r.active,e=r.id,t=r.initialValue,i=r.result,u=r.submitting,o=r.value,c=(0,r.changePred)(o,t);return{active:n,changed:c,error:!1===i.valid&&i.reason,id:e,initialValue:t,promise:i.promise||Promise.resolve(i),submitting:u,valid:!!i.valid,validating:null===i.valid,value:c?o:t}}function R(n,e,i){var o=this,c=void 0===e?{}:e,s=c.changePred,g=c.fields,y=c.getId,P=c.id,w=c.required,j=c.spec,O=c.onSubmit;void 0===i&&(i={}),V();var M=S.getPred,A=S.getSpread,q=S.isOpt,C=n,I=void 0===C,T=i.getAncestor,k=[g,j,n].find(f),x=v(k),R=w&&!q(w),_=A(y),F=A(j),W=A(g),$=A(w),z=F||W||$||_||"array"===x,B=z?m(n):[],G=new Set(g?[].concat(m(g),B):[].concat(m(j),m(w),B)),H=M(y),J=L(n,{changePred:M(s),id:P,required:R,spec:j},i),K=function(r,n){var e,t=b(r,s)||A(s),o=n,c=b(r,j)||F,a=b(r,y)||_,f=(e=r,H?H(o,e):"array"===x?(1e9*Math.random()).toFixed(0):e),v=b(r,g)||W,l=b(r,w)||$;return[r,u({},i.specable(o,{spec:c,changePred:t,id:f,getId:a,fields:v,required:l},{getAncestor:function(r){return r<=1||!T?J:T(r-1)}}),{id:f})]},Q=d(Array.from(G).map(function(r){return K(r,b(r,n))}),x),U=r(Q),X=r(!1),Y=E(Q,function(r){if(!I){var n=d(l(r).map(function(r){return[r[0],r[1].value]}),x),e=z?n:h(C,n);return I=void 0===e,e}}),Z=function(){return[X,J].concat(p(Q))},rr=a(Z(),function(r){var n=r[0],e=r[1],t=r.slice(2),i=I?e:[e].concat(t).reduce(N);!1!==i.active&&J.activate();var o=e.value,c=e.error,a=Object.fromEntries([["_",e]].concat(I?[]:t.map(function(r){return[r.id,r]}))),s=D(a,P),f=s.filter(function(r){return r.isColl});return u({},i,{id:P,initialValue:e.initialValue,value:o,error:c,errors:s,collErrors:f,details:a,submitting:n})});function nr(r){Q=r,U.set(r),Y.set(r),rr.set(Z())}function er(r){if(r){var n=m(r).map(function(n){return K(n,b(n,r))});nr(d([].concat(l(Q),n),x))}}function tr(r){void 0===r&&(r=[]),r.length<1||nr(d(l(Q).filter(function(n){return!r.includes(n[1].id)}),x))}function ir(r,n){var e=void 0===n?{}:n,t=e.partial,i=void 0!==t&&t,u=e.reset,o=void 0!==u&&u,c=o?"reset":"set";C=o||!i||z?r:h(C,r),I=void 0===C,J[c](C);var a=l(Q);if(a.forEach(function(n){var e=n[1],t=b(n[0],r);i&&void 0===t||e[c](t,i)}),z){var s=m(Q),f=l(r).filter(function(r){return!s.includes(r[0])});if(f.length>0&&er(d(f,x)),!i){var v=m(r);tr(a.reduce(function(r,n){var e=n[1];return v.includes(n[0])?r:[].concat(r,[e.id])},[]))}}}function ur(r){void 0===r&&(r=!0);var n=[J].concat(I?[]:p(Q)).map(function(n){return n.activate(r).then(function(r){if(r)return r;throw r})});return Promise.all(n).then(function(){return!0}).catch(function(){return!1})}var or={id:P,isRequired:R,spec:j,stores:Q,activate:ur,add:function(r){return void 0!==r&&(I=!1),er(r),this},getChild:function(r){void 0===r&&(r=[]);var n=r.reduce(function(r,n){var e=r.children;if(!e)return{res:null};var t=b(n,e);return t?{res:t,children:t.getChildren?t.getChildren():[]}:{res:null}},{children:Q});return n.res},getChildren:function(){return Q},remove:function(r){return void 0===r&&(r=[]),tr(r),this},reset:function(r){return void 0===r&&(r=n),ir(r,{reset:!0}),ur(!1),this},set:function(r,n,e){return void 0===n&&(n=!1),void 0===e&&(e=!1),ir(r,{partial:n}),e&&ur(),this},update:function(r){return nr(r(Q)),o},children:{subscribe:U.subscribe},submit:function(){try{return O?(X.set(!0),Promise.resolve(function(r,n){try{var e=Promise.resolve(ur()).then(function(r){if(!r)return!1;var n=t(J).value;return Promise.resolve(O(n,or)).then(function(){return!0})})}catch(r){return n(!0,r)}return e&&e.then?e.then(n.bind(null,!1),n.bind(null,!0)):n(!1,e)}(0,function(r,n){if(X.set(!1),r)throw n;return n}))):Promise.resolve()}catch(r){return Promise.reject(r)}},subscribe:function(r){var n=Y.subscribe(function(r){return J.set(r)}),e=rr.subscribe(r);return function(){n(),e()}}};return or}function N(r,n){var e=r.validating||n.validating;return{active:r.active===n.active?n.active:null,changed:r.changed||n.changed,valid:e?null:r.valid&&n.valid,validating:e}}var _=function(r){return function(n){var e=n.path,t=n.error,i=function(r,n){if(null==r)return{};var e={};for(var t in r)if({}.hasOwnProperty.call(r,t)){if(-1!==n.indexOf(t))continue;e[t]=r[t]}return e}(n,["path","error"]),o=void 0===r?e:[r].concat(e);return u({},i,{path:o,which:o.join("."),error:t})}};function D(r,n){return Object.entries(r).flatMap(function(n){var e,t,i,u=n[1];return u.details?D(u.details,r.id).map(_(u.id)):u.error?"_"===n[0]?[{path:[],error:u.error,isColl:!0}]:[(e=u,t=e.id,i=e.error,{path:[t],which:t,error:i})]:[]}).map(_(n))}function F(r){return null!=r?r:""}function W(r,n){var e,t=$(n);if(r&&t.store)return o(),{destroy:c,update:function(r){c(),r&&(t=$(r),o())}};function i(){t.store.activate()}function u(r){t.store.set(t.toValue(r.target.value))}function o(){var n=!1;e=t.store.subscribe(function(e){var i=e.value,u=r.value,o=n?t.toInput(i,u):t.toInput(i);n=!0,u!==o&&(r.value=o)}),r.addEventListener("blur",i),r.addEventListener("input",u)}function c(){e(),r.removeEventListener("blur",i),r.removeEventListener("input",u)}}function $(r){if(!r)return{};if(!Array.isArray(r))return{store:r,toInput:F,toValue:s};var n=r[1],e=(n=void 0===n?{}:n).toInput,t=n.toValue;return{store:r[0],toInput:void 0===e?F:e,toValue:void 0===t?s:t}}function z(r,n,e){return void 0===n&&(n={}),(t=r)&&t.subscribe&&function(r){return"function"==typeof r}(t.subscribe)?r:f(n.fields||n.spec||r)?R(r,n,u({},e,{specable:z})):L(r,n,e);var t}export{R as collSpecable,q as configure,L as predSpecable,W as register,z as specable};
//# sourceMappingURL=svelte-specma.cjs.mjs.map