@resk/core
Version:
An innovative TypeScript framework that empowers developers to build applications with a fully decorator-based architecture for efficient resource management. By combining the power of decorators with a resource-oriented design, DecorRes enhances code cla
1 lines • 6.36 kB
JavaScript
;var index=require('../utils/index'),i18n=require('../i18n'),decorators=require('../resources/decorators');var U=Object.defineProperty,Y=Object.defineProperties;var q=Object.getOwnPropertyDescriptors;var x=Object.getOwnPropertySymbols;var j=Object.prototype.hasOwnProperty,k=Object.prototype.propertyIsEnumerable;var w=(o,e,t)=>e in o?U(o,e,{enumerable:true,configurable:true,writable:true,value:t}):o[e]=t,c=(o,e)=>{for(var t in e||(e={}))j.call(e,t)&&w(o,t,e[t]);if(x)for(var t of x(e))k.call(e,t)&&w(o,t,e[t]);return o},m=(o,e)=>Y(o,q(e));var b=(o,e)=>{var t={};for(var a in o)j.call(o,a)&&e.indexOf(a)<0&&(t[a]=o[a]);if(o!=null&&x)for(var a of x(o))e.indexOf(a)<0&&k.call(o,a)&&(t[a]=o[a]);return t};var K=(o,e,t)=>new Promise((a,l)=>{var i=p=>{try{u(t.next(p));}catch(R){l(R);}},s=p=>{try{u(t.throw(p));}catch(R){l(R);}},u=p=>p.done?a(p.value):Promise.resolve(p.value).then(i,s);u((t=t.apply(o,e)).next());});const L=Symbol("validatorTargetRules"),z=Symbol("validatorTargetOptions"),d=class d{static registerRule(e,t){if(!index.isNonNullString(e))throw new Error("Rule name must be a non-empty string");if(typeof t!="function")throw new Error("Rule handler must be a function");const a=d.getRules(),l=m(c({},a),{[e]:t});Reflect.defineMetadata(d.RULES_METADATA_KEY,l,d);}static getRules(){const e=Reflect.getMetadata(d.RULES_METADATA_KEY,d);return index.isObj(e)?c({},e):{}}static getErrorMessageSeparators(){const e=Object.assign({},i18n.i18n.getNestedTranslation("validator.separators"));return {multiple:index.defaultStr(e.multiple,", "),single:index.defaultStr(e.single,", ")}}static findRegisteredRule(e){return index.isNonNullString(e)?d.getRules()[e]:void 0}static parseAndValidateRules(e){const t=[],a=this.getRules(),l=[],i=Array.isArray(e)?e:[];for(const s of i)if(typeof s=="function")t.push(s);else if(index.isNonNullString(s)){const u=this.parseStringRule(s,a);u?t.push(u):l.push(s);}else if(index.isObj(s)&&typeof s=="object"){const u=this.parseObjectRules(s,a);t.push(...u.valid),l.push(...u.invalid);}return {sanitizedRules:t,invalidRules:l}}static parseStringRule(e,t){let a=String(e).trim();const l=[];if(a.indexOf("[")>-1){const s=a.rtrim("]").split("[");a=s[0].trim();const p=String(s[1]).split(",");for(let R=0;R<p.length;R++)l.push(p[R].replace("]","").trim());}const i=t[a];return typeof i=="function"?{ruleName:a,params:l,ruleFunction:i,rawRuleName:String(e)}:null}static parseObjectRules(e,t){const a=[],l=[];for(const i in e)if(Object.hasOwnProperty.call(e,i)){const s=e[i],u=t[i];typeof u=="function"?a.push({ruleName:i,params:Array.isArray(s)?s:[],ruleFunction:u,rawRuleName:String(i)}):l.push(i);}return {valid:a,invalid:l}}static validate(l){var i=l,{rules:e,value:t}=i,a=b(i,["rules","value"]);const{sanitizedRules:s,invalidRules:u}=d.parseAndValidateRules(e),p=d.getErrorMessageSeparators();if(u.length){const T=u.map(f=>i18n.i18n.t("validator.invalidRule",{rule:index.isNonNullString(f)?f:"unnamed rule"})).join(p.multiple);return Promise.reject(m(c({rules:e,value:t},a),{message:T}))}if(!s.length)return Promise.resolve(c({rules:e,value:t},a));a.fieldName=a.propertyName=index.defaultStr(a.fieldName,a.propertyName);const R=m(c({},a),{value:t,rules:e});return new Promise((T,f)=>{setTimeout(()=>{let N=-1;const O=s.length,S=function(){return K(this,null,function*(){if(N++,N>=O)return T(c({value:t,rules:e},a));const r=s[N];let y,g,A=[],h=typeof r=="function"?r:void 0;typeof r=="object"&&index.isObj(r)&&(h=r.ruleFunction,A=Array.isArray(r.params)?r.params:[],y=r.ruleName,g=r.rawRuleName);const v=c({value:t,status:"error",rule:r,ruleName:y,rawRuleName:g,ruleParams:A,rules:e},a),C=m(c({},R),{rule:index.defaultStr(y),ruleName:y,rawRuleName:g,ruleParams:A}),M=n=>(n=typeof n=="string"?index.isNonNullString(n)?n:i18n.i18n.t("validator.invalidMessage",C):n,n===false?f(m(c({},v),{message:i18n.i18n.t("validator.invalidMessage",C)})):index.isNonNullString(n)?f(m(c({},v),{message:n})):n instanceof Error?f(m(c({},v),{message:index.stringify(n)})):S());if(typeof h!="function")return f(m(c({},v),{message:i18n.i18n.t("validator.invalidRule",C)}));try{const n=yield h(m(c({},a),{ruleName:y,rawRuleName:g,rules:e,ruleParams:A,value:t}));return M(n)}catch(n){return M(typeof n=="string"?n:(n==null?void 0:n.message)||(n==null?void 0:n.toString())||index.stringify(n))}})};return S()},0);})}static validateTarget(e,t,a){const l=d.getTargetRules(e),i=d.getErrorMessageSeparators(),S=index.extendObj({},d.getValidateTargetOptions(e),a),{context:s,errorMessageBuilder:u}=S,p=b(S,["context","errorMessageBuilder"]);t=Object.assign({},t);const R=typeof u=="function"?u:(r,y)=>`[${String(r)}] : ${y}`,T=[],f=[];let N=0;const O=i18n.i18n.translateTarget(e,{data:t});for(const r in l){const y=index.isNonNullString(O[r])?O[r]:r;f.push(d.validate(m(c({context:s},p),{value:t[r],data:t,translatedPropertyName:y,fieldName:r,propertyName:r,rules:l[r]})).catch(g=>{const A=index.stringify(index.defaultVal(g==null?void 0:g.message,g));N++;const h=R(y,A,m(c({},Object.assign({},g)),{separators:i,data:t,propertyName:r,translatedPropertyName:y}));T.push({fieldName:r,propertyName:r,message:h});}));}return new Promise((r,y)=>Promise.all(f).then(()=>{!T.length?r({data:t}):y({status:"error",message:i18n.i18n.translate("validator.failedForNFields",{count:N}),errors:T,success:false});}))}static getTargetRules(e){return decorators.getDecoratedProperties(e,L)}static getValidateTargetOptions(e){return Object.assign({},Reflect.getMetadata(z,e)||{})}static createRuleDecorator(e){return function(t){const a=function(l){const i=Object.assign({},l);return i.ruleParams=Array.isArray(t)?t:[t],e(i)};return d.createPropertyDecorator(a)}}static createPropertyDecorator(e){return decorators.createPropertyDecorator(L,t=>[...Array.isArray(t)?t:[],...Array.isArray(e)?e:[e]])}};d.RULES_METADATA_KEY=Symbol("validationRules");let I=d;const ue=I.createPropertyDecorator(["Number"]),ce=I.createPropertyDecorator(["Required"]),de=I.createPropertyDecorator(["Email"]),pe=I.createPropertyDecorator(["Url"]),ye=I.createPropertyDecorator(["FileName"]),me=I.createPropertyDecorator(["NonNullString"]);function Re(o){return function(e){Reflect.defineMetadata(z,o,e);}}exports.IsEmail=de;exports.IsFileName=ye;exports.IsNonNullString=me;exports.IsNumber=ue;exports.IsRequired=ce;exports.IsUrl=pe;exports.ValidationTargetOptions=Re;exports.Validator=I;