@sot1986/appsync-precognition 0.5.9 → 0.5.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.ts CHANGED
@@ -1,13 +1,13 @@
1
1
  import { a as I18n, c as ValidationErrors, i as FullRule, n as CustomFullRule, o as NestedKeyOf, s as Rule, t as Ctx } from "./types-VxM9TxGV.js";
2
2
 
3
3
  //#region src/index.d.ts
4
- declare function validate<T extends { [key in keyof T & string]: T[key] }>(obj: Readonly<Partial<T>>, checks: Partial<{ [key in NestedKeyOf<T>]: Array<FullRule | CustomFullRule | Omit<Rule<T>, "value">> }>, options?: {
4
+ declare function validate<T>(obj: Readonly<Partial<T>>, checks: Partial<{ [key in NestedKeyOf<T>]: Array<FullRule | CustomFullRule | Omit<Rule<T>, "value">> }>, options?: {
5
5
  trim?: boolean;
6
6
  allowEmptyString?: boolean;
7
7
  errors?: Partial<ValidationErrors>;
8
8
  attributes?: Partial<Record<`:${NestedKeyOf<T>}`, string>>;
9
9
  }): T;
10
- declare function precognitiveValidation<T extends { [key in keyof T & string]: T[key] }>(ctx: Ctx<Partial<T>>, checks: Partial<{ [key in NestedKeyOf<T>]: Array<FullRule | CustomFullRule | Omit<Rule, "value">> }>, options?: {
10
+ declare function precognitiveValidation<T>(ctx: Ctx<Partial<T>>, checks: Partial<{ [key in NestedKeyOf<T>]: Array<FullRule | CustomFullRule | Omit<Rule, "value">> }>, options?: {
11
11
  trim?: boolean;
12
12
  allowEmptyString?: boolean;
13
13
  skipTo?: "END" | "NEXT";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","names":[],"sources":["../src/index.ts"],"sourcesContent":[],"mappings":";;;iBAagB,mCAAmC,aAAa,EAAE,aAC3D,SAAS,QAAQ,aACd,kBACE,YAAY,KAAK,MACrB,WACA,iBACA,KAAK,KAAK,yBANgD;;EAAlE,gBAAgB,CAAA,EAAA,OAAA;EAAmC,MAAA,CAAA,EAWtC,OAXsC,CAW9B,gBAX8B,CAAA;EAAa,UAAA,CAAA,EAY/C,OAZ+C,CAYvC,MAZuC,CAAA,IAY5B,WAZ4B,CAYhB,CAZgB,CAAA,EAAA,EAAA,MAAA,CAAA,CAAA;CAAE,CAAA,EAc/D,CAd+D;AAC1C,iBAiGR,sBAjGQ,CAAA,UAAA,UAAA,MAiGyC,CAjGzC,GAAA,MAAA,GAiGsD,CAjGtD,CAiGwD,GAjGxD,CAAA,EAAA,CAAA,CAAA,GAAA,EAkGjB,GAlGiB,CAkGb,OAlGa,CAkGL,CAlGK,CAAA,CAAA,EAAA,MAAA,EAmGd,OAnGc,CAAA,UAoGZ,WApGY,CAoGA,CApGA,CAAA,GAoGK,KApGL,CAqGhB,QArGgB,GAsGhB,cAtGgB,GAuGhB,IAvGgB,CAuGX,IAvGW,EAAA,OAAA,CAAA,CAAA,EAAA,CAAA,EAAA,OAIhB,CAJgB,EAAA;EAAR,IAAA,CAAA,EAAA,OAAA;EAAT,gBAAA,CAAA,EAAA,OAAA;EAEiB,MAAA,CAAA,EAAA,KAAA,GAAA,MAAA;EAAZ,MAAA,CAAA,EA2GC,OA3GD,CA2GS,gBA3GT,CAAA;EACJ,UAAA,CAAA,EA2GS,OA3GT,CA2GiB,MA3GjB,CAAA,IA2G4B,WA3G5B,CA2GwC,CA3GxC,CAAA,EAAA,EAAA,MAAA,CAAA,CAAA;CACA,CAAA,EA4GL,CA5GK;AACU,iBAkJF,mBAAA,CAlJE,IAAA,EAAA,MAAA,CAAA,EAAA,MAAA;AAAL,iBAkKG,eAlKH,CAAA,UAAA,UAAA,MAmKe,CAnKf,GAmKmB,CAnKnB,CAmKqB,GAnKrB,CAAA,EAAA,CAAA,CAAA,GAAA,EAqKN,GArKM,CAqKF,OArKE,CAqKM,CArKN,CAAA,CAAA,CAAA,EAAA,QAAA,GAAA,IAAA,OAsKY,GAtKZ,GAAA;EAAL,KAAA,EAAA;IAHqB,WAAA,EA0KL,CA1KK;EADnB,CAAA;CASW;AAAR,iBAyKG,WAzKH,CACmC,UAAA,UAAA,MAyKpB,CAzKoB,GAyKhB,CAzKgB,CAyKd,GAzKc,CAAA,EAAA,EAAZ,gBAAA,MAAA,CAAX,CAAA,GAAA,EA4KlB,GA5KkB,CA4Kd,OA5Kc,CA4KN,CA5KM,CAAA,CAAA,EAAA,MAAA,CAAA,EA6Kd,OA7Kc,CAAA,EAAA,GAAA,IAAA,OA8KR,GA9KQ,GAAA;EAAR,KAAA,EAAA,OA+KD,GAAA,CAAI,KA/KH,GAAA;IAEd,MAAA,EA8KS,IA9KT,CA8Kc,CA9Kd,EAAA,MAAA,CAAA;EAAA,CAAA;AAoFH,CAAA;AAAiE,iBAqGjD,eArGiD,CAAa,UAAA,UAAA,MAsGlD,CAtGkD,GAsG9C,CAtG8C,CAsG5C,GAtG4C,CAAA,EAAA,EAAE,gBAAA,MAAA,CAC7D,CAAA,GAAA,EAwGZ,GAxGY,CAwGR,OAxGQ,CAwGA,CAxGA,CAAA,CAAA,EAAA,MAAA,CAAA,EAyGR,OAzGQ,CAAA,EAAA,QAAA,GAAA,IAAA,OA0GM,GA1GN,GAAA;EAAR,KAAA,EAAA,OA2GK,GAAA,CAAI,KA3GT,GAAA;IAAJ,MAAA,EA4GK,IA5GL,CA4GU,CA5GV,EAAA,MAAA,CAAA;EAEiB,CAAA;CAAZ"}
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../src/index.ts"],"sourcesContent":[],"mappings":";;;iBAagB,iBACT,SAAS,QAAQ,aACd,kBACE,YAAY,KAAK,MACrB,WACA,iBACA,KAAK,KAAK,yBALX;;EADP,gBAAgB,CAAA,EAAA,OAAA;EACQ,MAAA,CAAA,EAUX,OAVW,CAUH,gBAVG,CAAA;EAAR,UAAA,CAAA,EAWC,OAXD,CAWS,MAXT,CAAA,IAWoB,WAXpB,CAWgC,CAXhC,CAAA,EAAA,EAAA,MAAA,CAAA,CAAA;CAAT,CAAA,EAaJ,CAbI;AAEiB,iBA4GR,sBA5GQ,CAAA,CAAA,CAAA,CAAA,GAAA,EA6GjB,GA7GiB,CA6Gb,OA7Ga,CA6GL,CA7GK,CAAA,CAAA,EAAA,MAAA,EA8Gd,OA9Gc,CAAA,UA+GZ,WA/GY,CA+GA,CA/GA,CAAA,GA+GK,KA/GL,CAgHhB,QAhHgB,GAiHhB,cAjHgB,GAkHhB,IAlHgB,CAkHX,IAlHW,EAAA,OAAA,CAAA,CAAA,EAAA,CAAA,EAAA,OAGhB,CAHgB,EAAA;EAAZ,IAAA,CAAA,EAAA,OAAA;EACJ,gBAAA,CAAA,EAAA,OAAA;EACA,MAAA,CAAA,EAAA,KAAA,GAAA,MAAA;EACU,MAAA,CAAA,EAqHL,OArHK,CAqHG,gBArHH,CAAA;EAAL,UAAA,CAAA,EAsHI,OAtHJ,CAsHY,MAtHZ,CAAA,IAsHuB,WAtHvB,CAsHmC,CAtHnC,CAAA,EAAA,EAAA,MAAA,CAAA,CAAA;CAAL,CAAA,EAwHL,CAxHK;AAHqB,iBAkKb,mBAAA,CAlKa,IAAA,EAAA,MAAA,CAAA,EAAA,MAAA;AADnB,iBAmLM,eAnLN,CAAA,UAAA,UAAA,MAoLkB,CApLlB,GAoLsB,CApLtB,CAoLwB,GApLxB,CAAA,EAAA,CAAA,CAAA,GAAA,EAsLH,GAtLG,CAsLC,OAtLD,CAsLS,CAtLT,CAAA,CAAA,CAAA,EAAA,QAAA,GAAA,IAAA,OAuLe,GAvLf,GAAA;EASW,KAAA,EAAA;IAAR,WAAA,EA+KW,CA/KX;EACmC,CAAA;CAAZ;AAAX,iBAqLT,WArLS,CAAR,UAAA,UAAA,MAsLW,CAtLX,GAsLe,CAtLf,CAsLiB,GAtLjB,CAAA,EAAA,EAEd,gBAAA,MAAA,CAAA,CAAA,GAAA,EAuLI,GAvLJ,CAuLQ,OAvLR,CAuLgB,CAvLhB,CAAA,CAAA,EAAA,MAAA,CAAA,EAwLQ,OAxLR,CAAA,EAAA,GAAA,IAAA,OAyLc,GAzLd,GAAA;EAiGH,KAAgB,EAAA,OAyFA,GAAA,CAAI,KAzFJ,GAAA;IACG,MAAA,EAyFP,IAzFO,CAyFF,CAzFE,EAAA,MAAA,CAAA;EAAR,CAAA;CAAJ;AAEiB,iBAkGR,eAlGQ,CAAZ,UAAA,UAAA,MAmGgB,CAnGhB,GAmGoB,CAnGpB,CAmGsB,GAnGtB,CAAA,EAAA,EACJ,gBAAA,MAAA,CACA,CAAA,GAAA,EAoGD,GApGC,CAoGG,OApGH,CAoGW,CApGX,CAAA,CAAA,EAAA,MAAA,CAAA,EAqGG,OArGH,CAAA,EAAA,QAAA,GAAA,IAAA,OAsGiB,GAtGjB,GAAA;EACK,KAAA,EAAA,OAsGG,GAAA,CAAI,KAtGP,GAAA;IAAL,MAAA,EAuGI,IAvGJ,CAuGS,CAvGT,EAAA,MAAA,CAAA;EAHqB,CAAA;CADnB"}
package/dist/index.js CHANGED
@@ -1 +1 @@
1
- import{baseErrors,cleanString,date,datetime,email,getHeader,getNestedValue,integer,isArray,numeric,parseErrorMessage,phone,setNestedValue,time,ulid,url,uuid}from"./utils.js";import{runtime,util}from"@aws-appsync/utils";function parse(c,A){const[P,...F]=typeof A===`string`?[A,void 0]:isArray(A)?[A[0],...A.slice(1)]:typeof A.rule===`string`?[A.rule,void 0]:[A.rule[0],...A.rule.slice(1)];switch(P){case`required`:return requiredRule(c);case`nullable`:return nullableRule(c);case`sometimes`:return sometimesRule(c);case`min`:case`bigger`:return betweenRule(c,F[0],void 0,P===`bigger`);case`max`:case`lower`:return betweenRule(c,void 0,F[0],P===`lower`);case`between`:case`within`:return betweenRule(c,F[0],F[1],P===`within`);case`regex`:return regexRule(c,...F);case`in`:return inRule(c,...F);case`notIn`:return notInRule(c,...F);case`before`:case`beforeOrEqual`:return beforeRule(c,F[0],P===`before`);case`after`:case`afterOrEqual`:return afterRule(c,F[0],P===`after`);case`email`:return regexRule({...c,msg:c.msg??c.errors.email},email);case`phone`:return regexRule({...c,msg:c.msg??c.errors.phone},phone);case`url`:return regexRule({...c,msg:c.msg??c.errors.url},url);case`uuid`:return regexRule({...c,msg:c.msg??c.errors.uuid},uuid);case`ulid`:return regexRule({...c,msg:c.msg??c.errors.ulid},ulid);case`integer`:return regexRule({...c,msg:c.msg??c.errors.integer},integer);case`date`:return regexRule({...c,msg:c.msg??c.errors.date},date);case`time`:return regexRule({...c,msg:c.msg??c.errors.time},time);case`datetime`:return regexRule({...c,msg:c.msg??c.errors.datetime},datetime);case`numeric`:return regexRule({...c,msg:c.msg??c.errors.numeric},numeric);default:return typeRule(c,P)}}function betweenRule({value:c,msg:A,errors:j},M=-Infinity,N=Infinity,P=false){const[F,I]=[N===Infinity,M===-Infinity];const R={check:false,msg:A??F?P?j.biggerNumber:j.minNumber:I?P?j.lowerNumber:j.maxNumber:P?j.withinNumber:j.betweenNumber,value:c,params:{":min":`${M}`,":max":`${N}`}};if(typeof c===`number`)R.check=P?c>M&&c<N:c>=M&&c<=N;if(typeof c===`string`){R.check=c.length>=M&&c.length<=N;R.msg=A??F?j.minString:I?j.maxString:j.betweenString}if(isArray(c)){R.check=c.length>=M&&c.length<=N;R.msg=A??F?j.minArray:I?j.maxArray:j.betweenArray}return R}function regexRule({value:c,msg:A,errors:j},...M){const N={check:false,msg:A??(M.length===1?j.regex:j.regex_patterns),value:c,params:M.length===1?{":pattern":M[0]}:{":patterns":M.join(`, `)}};if(typeof c===`string`)N.check=M.some(A=>util.matches(A,c));if(typeof c===`number`)N.check=M.some(A=>util.matches(A,`${c}`));return N}function inRule({value:c,msg:A,errors:j},...M){return{check:M.includes(c),msg:A??j.in,value:c,params:{":in":M.join(`, `)}}}function notInRule({value:c,msg:A,errors:j},...M){return{check:!M.includes(c),msg:A??j.notIn,value:c,params:{":notIn":M.join(`, `)}}}function requiredRule({value:c,msg:A,errors:j}){const M={check:true,msg:A??j.required,value:c,skipNext:true};if(typeof c===`string`)M.check=c.length>0;if(isArray(c))M.check=c.length>0;if(typeof c===`number`)M.check=true;if(typeof c===`boolean`)M.check=true;if(typeof c===`object`&&!M.value)M.check=false;if(typeof c===`undefined`)M.check=false;M.skipNext=!M.check;return M}function nullableRule({value:c,msg:A,errors:j}){return{check:true,msg:A??j.nullable,value:c,skipNext:typeof c===`undefined`||c===null}}function sometimesRule({value:c,msg:A,errors:j}){const M={check:true,msg:A??j.sometimes,value:c};if(typeof c===`undefined`){M.skipNext=true;return M}if(typeof c===`object`&&!M.value){M.check=false;M.skipNext=true;return M}return requiredRule({value:c,msg:A,errors:j})}function typeRule({value:c,msg:A,errors:j},M){const N={check:false,msg:A??j.type,value:c,params:{":type":M}};switch(M){case`array`:N.check=isArray(c);break;case`object`:N.check=typeof c===`object`&&!!c&&!isArray(c)&&Object.keys(c).length>0;break;case`boolean`:N.check=typeof c===`boolean`;break;case`number`:N.check=typeof c===`number`;break;default:N.check=typeof c===`string`}return N}function beforeRule({value:c,msg:A,errors:j},M,N=false){const P={check:false,msg:A??j.before,value:c,params:N?{":before":M}:{":beforeOrEqual":M}};const F=util.time.parseISO8601ToEpochMilliSeconds(M);const I=typeof c===`string`?util.time.parseISO8601ToEpochMilliSeconds(c):c;if(typeof I===`number`)P.check=N?I<F:I<=F;return P}function afterRule({value:c,msg:A,errors:j},M,N=false){const P={check:false,msg:A??N?j.after:j.afterOrEqual,value:c,params:N?{":after":M}:{":afterOrEqual":M}};const F=util.time.parseISO8601ToEpochMilliSeconds(M);const I=typeof c===`string`?util.time.parseISO8601ToEpochMilliSeconds(c):c;if(typeof I===`number`)P.check=N?I>F:I>=F;return P}function isRule(c){return typeof c===`object`&&!!c&&Object.hasOwn(c,`check`)}function isCustomFullRule(c){return typeof c===`object`&&!!c&&Object.hasOwn(c,`rule`)}function validate(j,M,N){let P={};const I={...baseErrors,...N?.errors};sanitizeNestedArray(j,M);if(N?.attributes)sanitizeNestedArray(j,N.attributes);const L=JSON.parse(JSON.stringify(j));Object.keys(M).forEach(c=>{let j=getNestedValue(L,c);if(typeof j===`string`){j=cleanString(j,N);setNestedValue(L,c,j)}let R=false;M[c]?.forEach(A=>{if(R)return;const M=isRule(A)?{...A,value:j,msg:A.msg??I.invalid}:isCustomFullRule(A)?parse({value:j,msg:A.msg,errors:I},A.rule):parse({value:j,errors:I},A);R=!!M.skipNext||!M.check;if(M.check)return;if(P.msg)util.appendError(P.msg,P.errorType,P.data,P.errorInfo);M.params=M.params??{};if(util.matches(`:attr`,M.msg))M.params[`:attr`]=N?.attributes?.[`:${c}`]??formatAttributeName(c);P={msg:parseErrorMessage(M.msg,M.params),errorType:`ValidationError`,data:null,errorInfo:{path:c,value:j}}})});if(!P.msg)return L;util.error(P.msg,P.errorType,P.data,P.errorInfo)}function sanitizeNestedArray(c,A){Object.keys(A).forEach(j=>{const M=j.split(`.`);M.forEach((N,P)=>{if(N!==`*`||P===0)return;const I=M.slice(0,P).join(`.`);const R=getNestedValue(c,I.startsWith(`:`)?I.slice(1):I);if(!isArray(R))return;R.forEach((c,N)=>{const F=[...M];F[P]=`${N}`;A[F.join(`.`)]=A[j]});delete A[j]})})}function precognitiveValidation(c,A,j){const{errors:M,attributes:N}=isLocalized(c)?{errors:{...c.stash.__i18n.errors,...j?.errors},attributes:{...c.stash.__i18n.attributes,...j?.attributes}}:{errors:j?.errors,attributes:j?.attributes};if(getHeader(`precognition`,c)!==`true`)return c.stash.__validated=validate(c.args,A,{...j,errors:M,attributes:N});const F=getHeader(`Precognition-Validate-Only`,c)?.split(`,`).map(c=>c.trim());util.http.addResponseHeader(`Precognition`,`true`);if(!F){c.stash.__validated=validate(c.args,A,{...j,errors:M,attributes:N});util.http.addResponseHeader(`Precognition-Success`,`true`);runtime.earlyReturn(null)}util.http.addResponseHeader(`Precognition-Validate-Only`,F.join(`,`));const I={};F.forEach(c=>{I[c]=A[c]});c.stash.__validated=validate(c.args,I,{...j,errors:M,attributes:N});util.http.addResponseHeader(`Precognition-Success`,`true`);runtime.earlyReturn(null,{skipTo:j?.skipTo??`END`})}function formatAttributeName(c){return c.split(`.`).reduce((c,A)=>{if(util.matches(`^\\d+$`,A))return c;let j=``;A.split(``).forEach((c,A)=>{if(A!==0&&util.matches(`[A-Z]`,c))j+=` `;j+=c.toLowerCase()});return c?`${c} ${j}`:j},``)}function assertValidated(c){if(Object.hasOwn(c.stash,`__validated`))return;util.error(`Context arguments have not been validated`)}function isLocalized(c,A){if(Object.hasOwn(c.stash,`__i18n`)&&typeof c.stash?.__i18n.locale===`string`)return A?c.stash.__i18n.locale===A:true;return false}function assertLocalized(c,A){if(isLocalized(c,A))return;util.error(`Context arguements have not been localized`)}export{assertLocalized,assertValidated,formatAttributeName,isLocalized,precognitiveValidation,validate};
1
+ import{baseErrors,cleanString,date,datetime,email,getHeader,getNestedValue,integer,isArray,numeric,parseErrorMessage,phone,setNestedValue,time,ulid,url,uuid}from"./utils.js";import{runtime,util}from"@aws-appsync/utils";function parse(c,A){const[P,...F]=typeof A===`string`?[A,void 0]:isArray(A)?[A[0],...A.slice(1)]:typeof A.rule===`string`?[A.rule,void 0]:[A.rule[0],...A.rule.slice(1)];switch(P){case`required`:return requiredRule(c);case`nullable`:return nullableRule(c);case`sometimes`:return sometimesRule(c);case`min`:case`bigger`:return betweenRule(c,F[0],void 0,P===`bigger`);case`max`:case`lower`:return betweenRule(c,void 0,F[0],P===`lower`);case`between`:case`within`:return betweenRule(c,F[0],F[1],P===`within`);case`regex`:return regexRule(c,...F);case`in`:return inRule(c,...F);case`notIn`:return notInRule(c,...F);case`before`:case`beforeOrEqual`:return beforeRule(c,F[0],P===`before`);case`after`:case`afterOrEqual`:return afterRule(c,F[0],P===`after`);case`email`:return regexRule({...c,msg:c.msg??c.errors.email},email);case`phone`:return regexRule({...c,msg:c.msg??c.errors.phone},phone);case`url`:return regexRule({...c,msg:c.msg??c.errors.url},url);case`uuid`:return regexRule({...c,msg:c.msg??c.errors.uuid},uuid);case`ulid`:return regexRule({...c,msg:c.msg??c.errors.ulid},ulid);case`integer`:return regexRule({...c,msg:c.msg??c.errors.integer},integer);case`date`:return regexRule({...c,msg:c.msg??c.errors.date},date);case`time`:return regexRule({...c,msg:c.msg??c.errors.time},time);case`datetime`:return regexRule({...c,msg:c.msg??c.errors.datetime},datetime);case`numeric`:return regexRule({...c,msg:c.msg??c.errors.numeric},numeric);default:return typeRule(c,P)}}function betweenRule({value:c,msg:A,errors:j},M=-Infinity,N=Infinity,P=false){const[F,I]=[N===Infinity,M===-Infinity];const R={check:false,msg:A??F?P?j.biggerNumber:j.minNumber:I?P?j.lowerNumber:j.maxNumber:P?j.withinNumber:j.betweenNumber,value:c,params:{":min":`${M}`,":max":`${N}`}};if(typeof c===`number`)R.check=P?c>M&&c<N:c>=M&&c<=N;if(typeof c===`string`){R.check=c.length>=M&&c.length<=N;R.msg=A??F?j.minString:I?j.maxString:j.betweenString}if(isArray(c)){R.check=c.length>=M&&c.length<=N;R.msg=A??F?j.minArray:I?j.maxArray:j.betweenArray}return R}function regexRule({value:c,msg:A,errors:j},...M){const N={check:false,msg:A??(M.length===1?j.regex:j.regex_patterns),value:c,params:M.length===1?{":pattern":M[0]}:{":patterns":M.join(`, `)}};if(typeof c===`string`)N.check=M.some(A=>util.matches(A,c));if(typeof c===`number`)N.check=M.some(A=>util.matches(A,`${c}`));return N}function inRule({value:c,msg:A,errors:j},...M){return{check:M.includes(c),msg:A??j.in,value:c,params:{":in":M.join(`, `)}}}function notInRule({value:c,msg:A,errors:j},...M){return{check:!M.includes(c),msg:A??j.notIn,value:c,params:{":notIn":M.join(`, `)}}}function requiredRule({value:c,msg:A,errors:j}){const M={check:true,msg:A??j.required,value:c,skipNext:true};if(typeof c===`string`)M.check=c.length>0;if(isArray(c))M.check=c.length>0;if(typeof c===`number`)M.check=true;if(typeof c===`boolean`)M.check=true;if(typeof c===`object`&&!M.value)M.check=false;if(typeof c===`undefined`)M.check=false;M.skipNext=!M.check;return M}function nullableRule({value:c,msg:A,errors:j}){return{check:true,msg:A??j.nullable,value:c,skipNext:typeof c===`undefined`||c===null}}function sometimesRule({value:c,msg:A,errors:j}){const M={check:true,msg:A??j.sometimes,value:c};if(typeof c===`undefined`){M.skipNext=true;return M}if(typeof c===`object`&&!M.value){M.check=false;M.skipNext=true;return M}return requiredRule({value:c,msg:A,errors:j})}function typeRule({value:c,msg:A,errors:j},M){const N={check:false,msg:A??j.type,value:c,params:{":type":M}};switch(M){case`array`:N.check=isArray(c);break;case`object`:N.check=typeof c===`object`&&!!c&&!isArray(c)&&Object.keys(c).length>0;break;case`boolean`:N.check=typeof c===`boolean`;break;case`number`:N.check=typeof c===`number`;break;default:N.check=typeof c===`string`}return N}function beforeRule({value:c,msg:A,errors:j},M,N=false){const P={check:false,msg:A??j.before,value:c,params:N?{":before":M}:{":beforeOrEqual":M}};const F=util.time.parseISO8601ToEpochMilliSeconds(M);const I=typeof c===`string`?util.time.parseISO8601ToEpochMilliSeconds(c):c;if(typeof I===`number`)P.check=N?I<F:I<=F;return P}function afterRule({value:c,msg:A,errors:j},M,N=false){const P={check:false,msg:A??N?j.after:j.afterOrEqual,value:c,params:N?{":after":M}:{":afterOrEqual":M}};const F=util.time.parseISO8601ToEpochMilliSeconds(M);const I=typeof c===`string`?util.time.parseISO8601ToEpochMilliSeconds(c):c;if(typeof I===`number`)P.check=N?I>F:I>=F;return P}function isRule(c){return typeof c===`object`&&!!c&&Object.hasOwn(c,`check`)}function isCustomFullRule(c){return typeof c===`object`&&!!c&&Object.hasOwn(c,`rule`)}function validate(j,M,N){let P={};const I={...baseErrors,...N?.errors};if(typeof j!==`object`)util.error(`Object expected`);sanitizeNestedArray(j,M);if(N?.attributes)sanitizeNestedArray(j,N.attributes);const L=JSON.parse(JSON.stringify(j));Object.keys(M).forEach(c=>{let j=getNestedValue(L,c);if(typeof j===`string`){j=cleanString(j,N);setNestedValue(L,c,j)}let R=false;M[c]?.forEach(A=>{if(R)return;const M=isRule(A)?{...A,value:j,msg:A.msg??I.invalid}:isCustomFullRule(A)?parse({value:j,msg:A.msg,errors:I},A.rule):parse({value:j,errors:I},A);R=!!M.skipNext||!M.check;if(M.check)return;if(P.msg)util.appendError(P.msg,P.errorType,P.data,P.errorInfo);M.params=M.params??{};if(util.matches(`:attr`,M.msg))M.params[`:attr`]=N?.attributes?.[`:${c}`]??formatAttributeName(c);P={msg:parseErrorMessage(M.msg,M.params),errorType:`ValidationError`,data:null,errorInfo:{path:c,value:j}}})});if(!P.msg)return L;util.error(P.msg,P.errorType,P.data,P.errorInfo)}function sanitizeNestedArray(c,A){let j=[];Object.keys(A).forEach(c=>{const A=c.split(`.`).filter(c=>c===`*`);if(A.length>j.length)j=[...A]});j.forEach(()=>{Object.keys(A).forEach(j=>{const M=j.split(`.`);const N=M.indexOf(`*`,1);if(N<1)return;const P=M.slice(0,N).join(`.`);const I=getNestedValue(c,P.startsWith(`:`)?P.slice(1):P);if(!isArray(I))return;I.forEach((c,P)=>{const F=[...M];F[N]=`${P}`;A[F.join(`.`)]=A[j]});delete A[j]})})}function precognitiveValidation(c,A,j){const{errors:M,attributes:N}=isLocalized(c)?{errors:{...c.stash.__i18n.errors,...j?.errors},attributes:{...c.stash.__i18n.attributes,...j?.attributes}}:{errors:j?.errors,attributes:j?.attributes};if(getHeader(`precognition`,c)!==`true`)return c.stash.__validated=validate(c.args,A,{...j,errors:M,attributes:N});const F=getHeader(`Precognition-Validate-Only`,c)?.split(`,`).map(c=>c.trim());util.http.addResponseHeader(`Precognition`,`true`);if(!F){c.stash.__validated=validate(c.args,A,{...j,errors:M,attributes:N});util.http.addResponseHeader(`Precognition-Success`,`true`);runtime.earlyReturn(null)}util.http.addResponseHeader(`Precognition-Validate-Only`,F.join(`,`));const I={};F.forEach(c=>{I[c]=A[c]});c.stash.__validated=validate(c.args,I,{...j,errors:M,attributes:N});util.http.addResponseHeader(`Precognition-Success`,`true`);runtime.earlyReturn(null,{skipTo:j?.skipTo??`END`})}function formatAttributeName(c){return c.split(`.`).reduce((c,A)=>{if(util.matches(`^\\d+$`,A))return c;let j=``;A.split(``).forEach((c,A)=>{if(A!==0&&util.matches(`[A-Z]`,c))j+=` `;j+=c.toLowerCase()});return c?`${c} ${j}`:j},``)}function assertValidated(c){if(Object.hasOwn(c.stash,`__validated`))return;util.error(`Context arguments have not been validated`)}function isLocalized(c,A){if(Object.hasOwn(c.stash,`__i18n`)&&typeof c.stash?.__i18n.locale===`string`)return A?c.stash.__i18n.locale===A:true;return false}function assertLocalized(c,A){if(isLocalized(c,A))return;util.error(`Context arguements have not been localized`)}export{assertLocalized,assertValidated,formatAttributeName,isLocalized,precognitiveValidation,validate};
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["result: ParsedRule<T>","error: { msg?: string, errorType?: string, data?: any, errorInfo?: any }","errors: ValidationErrors","validated: T","skip: boolean","rules.parse"],"sources":["../src/rules.ts","../src/index.ts"],"sourcesContent":["import type { CustomFullRule, FullRule, ParsedRule, ParseOptions } from './types'\nimport { util } from '@aws-appsync/utils'\nimport { date, datetime, email, integer, isArray, numeric, phone, time, ulid, url, uuid } from './utils'\n\nexport function parse<T>(\n opt: ParseOptions<T>,\n rule: FullRule | CustomFullRule,\n): ParsedRule<T> {\n const [n, ...p] = typeof rule === 'string'\n ? [rule, undefined]\n : isArray(rule)\n ? [rule[0], ...rule.slice(1)]\n : typeof rule.rule === 'string'\n ? [rule.rule, undefined]\n : [rule.rule[0], ...rule.rule.slice(1)]\n\n switch (n) {\n case 'required':\n return requiredRule(opt)\n case 'nullable':\n return nullableRule(opt)\n case 'sometimes':\n return sometimesRule(opt)\n case 'min':\n case 'bigger':\n return betweenRule(opt, (p[0]! as number), undefined, n === 'bigger')\n case 'max':\n case 'lower':\n return betweenRule(opt, undefined, (p[0] as number), n === 'lower')\n case 'between':\n case 'within':\n return betweenRule(opt, (p[0] as number), p[1] as number, n === 'within')\n case 'regex':\n return regexRule(opt, ...p as string[])\n case 'in':\n return inRule(opt, ...p)\n case 'notIn':\n return notInRule(opt, ...p)\n case 'before':\n case 'beforeOrEqual':\n return beforeRule(opt, p[0] as string, n === 'before')\n case 'after':\n case 'afterOrEqual':\n return afterRule(opt, p[0] as string, n === 'after')\n case 'email':\n return regexRule({ ...opt, msg: opt.msg ?? opt.errors.email }, email)\n case 'phone':\n return regexRule({ ...opt, msg: opt.msg ?? opt.errors.phone }, phone)\n case 'url':\n return regexRule({ ...opt, msg: opt.msg ?? opt.errors.url }, url)\n case 'uuid':\n return regexRule({ ...opt, msg: opt.msg ?? opt.errors.uuid }, uuid)\n case 'ulid':\n return regexRule({ ...opt, msg: opt.msg ?? opt.errors.ulid }, ulid)\n case 'integer':\n return regexRule({ ...opt, msg: opt.msg ?? opt.errors.integer }, integer)\n case 'date':\n return regexRule({ ...opt, msg: opt.msg ?? opt.errors.date }, date)\n case 'time':\n return regexRule({ ...opt, msg: opt.msg ?? opt.errors.time }, time)\n case 'datetime':\n return regexRule({ ...opt, msg: opt.msg ?? opt.errors.datetime }, datetime)\n case 'numeric':\n return regexRule({ ...opt, msg: opt.msg ?? opt.errors.numeric }, numeric)\n default:\n return typeRule(opt, n)\n }\n}\n\nfunction betweenRule<T>(\n { value, msg, errors }: ParseOptions<T>,\n minV: number = -Infinity,\n maxV: number = Infinity,\n strict = false,\n): ParsedRule<T> {\n const [min, max] = [maxV === Infinity, minV === -Infinity]\n const result: ParsedRule<T> = {\n check: false,\n msg: msg ?? min\n ? strict\n ? errors.biggerNumber\n : errors.minNumber\n : max\n ? strict\n ? errors.lowerNumber\n : errors.maxNumber\n : strict\n ? errors.withinNumber\n : errors.betweenNumber,\n value,\n params: {\n ':min': `${minV}`,\n ':max': `${maxV}`,\n },\n }\n if (typeof value === 'number')\n result.check = strict ? value > minV && value < maxV : value >= minV && value <= maxV\n\n if (typeof value === 'string') {\n result.check = value.length >= minV && value.length <= maxV\n result.msg = msg ?? min\n ? errors.minString\n : max\n ? errors.maxString\n : errors.betweenString\n }\n if (isArray(value)) {\n result.check = value.length >= minV && value.length <= maxV\n result.msg = msg ?? min\n ? errors.minArray\n : max\n ? errors.maxArray\n : errors.betweenArray\n }\n return result\n}\n\nfunction regexRule<T>({ value, msg, errors }: ParseOptions<T>, ...p: string[]): ParsedRule<T> {\n const result: ParsedRule<T> = {\n check: false,\n msg: msg ?? (p.length === 1 ? errors.regex : errors.regex_patterns),\n value,\n params: p.length === 1\n ? { ':pattern': p[0]! }\n : { ':patterns': p.join(', ') },\n }\n if (typeof value === 'string')\n result.check = p.some(pt => util.matches(pt, value))\n\n if (typeof value === 'number')\n result.check = p.some(pt => util.matches(pt, `${value}`))\n\n return result\n}\n\nfunction inRule<T>({ value, msg, errors }: ParseOptions<T>, ...p: unknown[]): ParsedRule<T> {\n return {\n check: p.includes(value),\n msg: msg ?? errors.in,\n value,\n params: { ':in': p.join(', ') },\n }\n}\n\nfunction notInRule<T>({ value, msg, errors }: ParseOptions<T>, ...p: unknown[]): ParsedRule<T> {\n return {\n check: !p.includes(value),\n msg: msg ?? errors.notIn,\n value,\n params: { ':notIn': p.join(', ') },\n }\n}\n\nexport function requiredRule<T>({ value, msg, errors }: ParseOptions<T>): ParsedRule<T> {\n const result: ParsedRule<T> = {\n check: true,\n msg: msg ?? errors.required,\n value,\n skipNext: true,\n }\n if (typeof value === 'string')\n result.check = value.length > 0\n if (isArray(value))\n result.check = value.length > 0\n if (typeof value === 'number')\n result.check = true\n if (typeof value === 'boolean')\n result.check = true\n if (typeof value === 'object' && !result.value) {\n result.check = false\n }\n if (typeof value === 'undefined')\n result.check = false\n result.skipNext = !result.check\n return result\n}\n\nfunction nullableRule<T>({ value, msg, errors }: ParseOptions<T>): ParsedRule<T> {\n const result: ParsedRule<T> = {\n check: true,\n msg: msg ?? errors.nullable,\n value,\n skipNext: typeof value === 'undefined' || value === null,\n }\n return result\n}\n\nfunction sometimesRule<T>({ value, msg, errors }: ParseOptions<T>): ParsedRule<T> {\n const result: ParsedRule<T> = {\n check: true,\n msg: msg ?? errors.sometimes,\n value,\n }\n if (typeof value === 'undefined') {\n result.skipNext = true\n return result\n }\n if (typeof value === 'object' && !result.value) {\n result.check = false\n result.skipNext = true\n return result\n }\n return requiredRule({ value, msg, errors })\n}\n\nfunction typeRule<T>({ value, msg, errors }: ParseOptions<T>, type: 'boolean' | 'object' | 'array' | 'number' | 'string'): ParsedRule<T> {\n const result: ParsedRule<T> = {\n check: false,\n msg: msg ?? errors.type,\n value,\n params: { ':type': type },\n }\n switch (type) {\n case 'array':\n result.check = isArray(value)\n break\n case 'object':\n result.check = typeof value === 'object' && !!value && !isArray(value) && Object.keys(value).length > 0\n break\n case 'boolean':\n result.check = typeof value === 'boolean'\n break\n case 'number':\n result.check = typeof value === 'number'\n break\n default:\n result.check = typeof value === 'string'\n }\n return result\n}\n\nfunction beforeRule<T>({ value, msg, errors }: ParseOptions<T>, start: string, strict = false): ParsedRule<T> {\n const result: ParsedRule<T> = {\n check: false,\n msg: msg ?? errors.before,\n value,\n params: strict\n ? { ':before': start }\n : { ':beforeOrEqual': start },\n }\n const startValue = util.time.parseISO8601ToEpochMilliSeconds(start)\n const numDate = typeof value === 'string'\n ? util.time.parseISO8601ToEpochMilliSeconds(value)\n : value\n if (typeof numDate === 'number')\n result.check = strict ? numDate < startValue : numDate <= startValue\n return result\n}\n\nfunction afterRule<T>({ value, msg, errors }: ParseOptions<T>, p: string, strict = false): ParsedRule<T> {\n const result: ParsedRule<T> = {\n check: false,\n msg: msg ?? strict ? errors.after : errors.afterOrEqual,\n value,\n params: strict\n ? { ':after': p }\n : { ':afterOrEqual': p },\n }\n const e = util.time.parseISO8601ToEpochMilliSeconds(p)\n const numDate = typeof value === 'string'\n ? util.time.parseISO8601ToEpochMilliSeconds(value)\n : value\n if (typeof numDate === 'number')\n result.check = strict ? numDate > e : numDate >= e\n\n return result\n}\n","import type { Ctx, CustomFullRule, FullRule, I18n, NestedKeyOf, Rule, ValidationErrors } from './types'\nimport { runtime, util } from '@aws-appsync/utils'\nimport * as rules from './rules'\nimport { baseErrors, cleanString, getHeader, getNestedValue, isArray, parseErrorMessage, setNestedValue } from './utils'\n\nfunction isRule(rule: FullRule | CustomFullRule | Omit<Rule, 'value'>): rule is Omit<Rule, 'value'> {\n return typeof rule === 'object' && !!rule && Object.hasOwn(rule, 'check')\n}\n\nfunction isCustomFullRule(rule: FullRule | CustomFullRule | Omit<Rule, 'value'>): rule is CustomFullRule {\n return typeof rule === 'object' && !!rule && Object.hasOwn(rule, 'rule')\n}\n\nexport function validate<T extends { [key in keyof T & string]: T[key] }>(\n obj: Readonly<Partial<T>>,\n checks: Partial<{\n [key in NestedKeyOf<T>]: Array<\n | FullRule\n | CustomFullRule\n | Omit<Rule<T>, 'value'>\n > }>,\n options?: {\n trim?: boolean\n allowEmptyString?: boolean\n errors?: Partial<ValidationErrors>\n attributes?: Partial<Record<`:${NestedKeyOf<T>}`, string>>\n },\n): T {\n let error: { msg?: string, errorType?: string, data?: any, errorInfo?: any } = {}\n const errors: ValidationErrors = { ...baseErrors, ...options?.errors }\n\n sanitizeNestedArray(obj, checks)\n if (options?.attributes)\n sanitizeNestedArray(obj, options.attributes)\n\n const validated: T = JSON.parse(JSON.stringify(obj))\n Object.keys(checks).forEach((path) => {\n let value = getNestedValue(validated, path as NestedKeyOf<T>)\n if (typeof value === 'string') {\n value = cleanString(value, options)\n setNestedValue(validated, path as NestedKeyOf<T>, value)\n }\n\n let skip: boolean = false\n checks[path as keyof typeof checks]?.forEach((rule) => {\n if (skip)\n return\n\n const result = isRule(rule)\n ? { ...rule, value, msg: rule.msg ?? errors.invalid }\n : isCustomFullRule(rule)\n ? rules.parse({ value, msg: rule.msg, errors }, rule.rule)\n : rules.parse({ value, errors }, rule)\n\n skip = !!result.skipNext || !result.check\n\n if (result.check)\n return\n\n if (error.msg)\n util.appendError(error.msg, error.errorType, error.data, error.errorInfo)\n\n result.params = result.params ?? {}\n\n if (util.matches(':attr', result.msg))\n result.params[':attr'] = options?.attributes?.[`:${path as NestedKeyOf<T>}`] ?? formatAttributeName(path as NestedKeyOf<T>)\n\n error = {\n msg: parseErrorMessage(result.msg, result.params),\n errorType: 'ValidationError',\n data: null,\n errorInfo: { path, value },\n }\n })\n })\n\n if (!error.msg) {\n return validated as T\n }\n\n util.error(error.msg, error.errorType, error.data, error.errorInfo)\n}\n\nfunction sanitizeNestedArray(\n obj: object,\n nested: object,\n): void {\n Object.keys(nested).forEach((path) => {\n const keys = path.split('.')\n keys.forEach((k, idx) => {\n if (k !== '*' || idx === 0)\n return\n const parentPath = keys.slice(0, idx).join('.')\n const parentValue = getNestedValue(\n obj,\n parentPath.startsWith(':') ? parentPath.slice(1) : parentPath,\n )\n\n if (!isArray(parentValue))\n return\n\n parentValue.forEach((_, i) => {\n const idxPath = [...keys]\n idxPath[idx] = `${i}`\n nested[idxPath.join('.') as keyof typeof nested] = nested[path as keyof typeof nested]\n })\n delete nested[path as keyof typeof nested]\n })\n })\n}\n\nexport function precognitiveValidation<T extends { [key in keyof T & string]: T[key] }>(\n ctx: Ctx<Partial<T>>,\n checks: Partial<{\n [key in NestedKeyOf<T>]: Array<\n | FullRule\n | CustomFullRule\n | Omit<Rule, 'value'>\n > }>,\n options?: {\n trim?: boolean\n allowEmptyString?: boolean\n skipTo?: 'END' | 'NEXT'\n errors?: Partial<ValidationErrors>\n attributes?: Partial<Record<`:${NestedKeyOf<T>}`, string>>\n },\n): T {\n const { errors, attributes } = (isLocalized<T, string>(ctx)\n ? {\n errors: {\n ...ctx.stash.__i18n.errors,\n ...options?.errors,\n },\n attributes: {\n ...ctx.stash.__i18n.attributes,\n ...options?.attributes,\n },\n }\n : { errors: options?.errors, attributes: options?.attributes }) as {\n errors: Partial<ValidationErrors>\n attributes: Partial<Record<`:${NestedKeyOf<T>}`, string>>\n }\n if (getHeader('precognition', ctx) !== 'true')\n return ctx.stash.__validated = validate<T>(ctx.args, checks, { ...options, errors, attributes })\n\n const validationKeys = getHeader('Precognition-Validate-Only', ctx)?.split(',').map(key => key.trim())\n util.http.addResponseHeader('Precognition', 'true')\n\n if (!validationKeys) {\n ctx.stash.__validated = validate(ctx.args, checks, { ...options, errors, attributes })\n util.http.addResponseHeader('Precognition-Success', 'true')\n runtime.earlyReturn(null)\n }\n\n util.http.addResponseHeader('Precognition-Validate-Only', validationKeys.join(','))\n const precognitionChecks = {} as Partial<typeof checks>\n validationKeys.forEach((key) => {\n precognitionChecks[key as keyof typeof precognitionChecks] = checks[key as keyof typeof checks]\n })\n\n ctx.stash.__validated = validate(ctx.args, precognitionChecks, { ...options, errors, attributes })\n util.http.addResponseHeader('Precognition-Success', 'true')\n runtime.earlyReturn(null, { skipTo: options?.skipTo ?? 'END' })\n}\n\nexport function formatAttributeName(path: string): string {\n return path.split('.').reduce((acc, part) => {\n if (util.matches('^\\\\d+$', part)) {\n return acc\n }\n let words = ''\n part.split('').forEach((char, idx) => {\n if (idx !== 0 && util.matches('[A-Z]', char)) {\n words += ' '\n }\n words += char.toLowerCase()\n })\n return acc ? `${acc} ${words}` : words\n }, '')\n}\n\nexport function assertValidated<\n T extends { [key in keyof T]: T[key] },\n>(\n ctx: Ctx<Partial<T>>,\n): asserts ctx is typeof ctx & {\n stash: { __validated: T }\n} {\n if (Object.hasOwn(ctx.stash, '__validated'))\n return\n util.error('Context arguments have not been validated')\n}\n\nexport function isLocalized<\n T extends { [key in keyof T]: T[key] },\n TLocale extends string,\n>(\n ctx: Ctx<Partial<T>>,\n locale?: TLocale,\n): ctx is typeof ctx & {\n stash: typeof ctx.stash & {\n __i18n: I18n<T, string>\n }\n} {\n if (Object.hasOwn(ctx.stash, '__i18n') && typeof ctx.stash?.__i18n.locale === 'string') {\n return locale\n ? ctx.stash.__i18n.locale === locale\n : true\n }\n return false\n}\n\nexport function assertLocalized<\n T extends { [key in keyof T]: T[key] },\n TLocale extends string,\n>(\n ctx: Ctx<Partial<T>>,\n locale?: TLocale,\n): asserts ctx is typeof ctx & {\n stash: typeof ctx.stash & {\n __i18n: I18n<T, string>\n }\n} {\n if (isLocalized<T, TLocale>(ctx, locale))\n return\n util.error('Context arguements have not been localized')\n}\n\nexport type { CustomFullRule, FullRule, I18n, Rule, ValidationErrors } from './types'\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":["result: ParsedRule<T>","error: { msg?: string, errorType?: string, data?: any, errorInfo?: any }","errors: ValidationErrors","validated: T & object","skip: boolean","rules.parse","maxKeys: string[]"],"sources":["../src/rules.ts","../src/index.ts"],"sourcesContent":["import type { CustomFullRule, FullRule, ParsedRule, ParseOptions } from './types'\nimport { util } from '@aws-appsync/utils'\nimport { date, datetime, email, integer, isArray, numeric, phone, time, ulid, url, uuid } from './utils'\n\nexport function parse<T>(\n opt: ParseOptions<T>,\n rule: FullRule | CustomFullRule,\n): ParsedRule<T> {\n const [n, ...p] = typeof rule === 'string'\n ? [rule, undefined]\n : isArray(rule)\n ? [rule[0], ...rule.slice(1)]\n : typeof rule.rule === 'string'\n ? [rule.rule, undefined]\n : [rule.rule[0], ...rule.rule.slice(1)]\n\n switch (n) {\n case 'required':\n return requiredRule(opt)\n case 'nullable':\n return nullableRule(opt)\n case 'sometimes':\n return sometimesRule(opt)\n case 'min':\n case 'bigger':\n return betweenRule(opt, (p[0]! as number), undefined, n === 'bigger')\n case 'max':\n case 'lower':\n return betweenRule(opt, undefined, (p[0] as number), n === 'lower')\n case 'between':\n case 'within':\n return betweenRule(opt, (p[0] as number), p[1] as number, n === 'within')\n case 'regex':\n return regexRule(opt, ...p as string[])\n case 'in':\n return inRule(opt, ...p)\n case 'notIn':\n return notInRule(opt, ...p)\n case 'before':\n case 'beforeOrEqual':\n return beforeRule(opt, p[0] as string, n === 'before')\n case 'after':\n case 'afterOrEqual':\n return afterRule(opt, p[0] as string, n === 'after')\n case 'email':\n return regexRule({ ...opt, msg: opt.msg ?? opt.errors.email }, email)\n case 'phone':\n return regexRule({ ...opt, msg: opt.msg ?? opt.errors.phone }, phone)\n case 'url':\n return regexRule({ ...opt, msg: opt.msg ?? opt.errors.url }, url)\n case 'uuid':\n return regexRule({ ...opt, msg: opt.msg ?? opt.errors.uuid }, uuid)\n case 'ulid':\n return regexRule({ ...opt, msg: opt.msg ?? opt.errors.ulid }, ulid)\n case 'integer':\n return regexRule({ ...opt, msg: opt.msg ?? opt.errors.integer }, integer)\n case 'date':\n return regexRule({ ...opt, msg: opt.msg ?? opt.errors.date }, date)\n case 'time':\n return regexRule({ ...opt, msg: opt.msg ?? opt.errors.time }, time)\n case 'datetime':\n return regexRule({ ...opt, msg: opt.msg ?? opt.errors.datetime }, datetime)\n case 'numeric':\n return regexRule({ ...opt, msg: opt.msg ?? opt.errors.numeric }, numeric)\n default:\n return typeRule(opt, n)\n }\n}\n\nfunction betweenRule<T>(\n { value, msg, errors }: ParseOptions<T>,\n minV: number = -Infinity,\n maxV: number = Infinity,\n strict = false,\n): ParsedRule<T> {\n const [min, max] = [maxV === Infinity, minV === -Infinity]\n const result: ParsedRule<T> = {\n check: false,\n msg: msg ?? min\n ? strict\n ? errors.biggerNumber\n : errors.minNumber\n : max\n ? strict\n ? errors.lowerNumber\n : errors.maxNumber\n : strict\n ? errors.withinNumber\n : errors.betweenNumber,\n value,\n params: {\n ':min': `${minV}`,\n ':max': `${maxV}`,\n },\n }\n if (typeof value === 'number')\n result.check = strict ? value > minV && value < maxV : value >= minV && value <= maxV\n\n if (typeof value === 'string') {\n result.check = value.length >= minV && value.length <= maxV\n result.msg = msg ?? min\n ? errors.minString\n : max\n ? errors.maxString\n : errors.betweenString\n }\n if (isArray(value)) {\n result.check = value.length >= minV && value.length <= maxV\n result.msg = msg ?? min\n ? errors.minArray\n : max\n ? errors.maxArray\n : errors.betweenArray\n }\n return result\n}\n\nfunction regexRule<T>({ value, msg, errors }: ParseOptions<T>, ...p: string[]): ParsedRule<T> {\n const result: ParsedRule<T> = {\n check: false,\n msg: msg ?? (p.length === 1 ? errors.regex : errors.regex_patterns),\n value,\n params: p.length === 1\n ? { ':pattern': p[0]! }\n : { ':patterns': p.join(', ') },\n }\n if (typeof value === 'string')\n result.check = p.some(pt => util.matches(pt, value))\n\n if (typeof value === 'number')\n result.check = p.some(pt => util.matches(pt, `${value}`))\n\n return result\n}\n\nfunction inRule<T>({ value, msg, errors }: ParseOptions<T>, ...p: unknown[]): ParsedRule<T> {\n return {\n check: p.includes(value),\n msg: msg ?? errors.in,\n value,\n params: { ':in': p.join(', ') },\n }\n}\n\nfunction notInRule<T>({ value, msg, errors }: ParseOptions<T>, ...p: unknown[]): ParsedRule<T> {\n return {\n check: !p.includes(value),\n msg: msg ?? errors.notIn,\n value,\n params: { ':notIn': p.join(', ') },\n }\n}\n\nexport function requiredRule<T>({ value, msg, errors }: ParseOptions<T>): ParsedRule<T> {\n const result: ParsedRule<T> = {\n check: true,\n msg: msg ?? errors.required,\n value,\n skipNext: true,\n }\n if (typeof value === 'string')\n result.check = value.length > 0\n if (isArray(value))\n result.check = value.length > 0\n if (typeof value === 'number')\n result.check = true\n if (typeof value === 'boolean')\n result.check = true\n if (typeof value === 'object' && !result.value) {\n result.check = false\n }\n if (typeof value === 'undefined')\n result.check = false\n result.skipNext = !result.check\n return result\n}\n\nfunction nullableRule<T>({ value, msg, errors }: ParseOptions<T>): ParsedRule<T> {\n const result: ParsedRule<T> = {\n check: true,\n msg: msg ?? errors.nullable,\n value,\n skipNext: typeof value === 'undefined' || value === null,\n }\n return result\n}\n\nfunction sometimesRule<T>({ value, msg, errors }: ParseOptions<T>): ParsedRule<T> {\n const result: ParsedRule<T> = {\n check: true,\n msg: msg ?? errors.sometimes,\n value,\n }\n if (typeof value === 'undefined') {\n result.skipNext = true\n return result\n }\n if (typeof value === 'object' && !result.value) {\n result.check = false\n result.skipNext = true\n return result\n }\n return requiredRule({ value, msg, errors })\n}\n\nfunction typeRule<T>({ value, msg, errors }: ParseOptions<T>, type: 'boolean' | 'object' | 'array' | 'number' | 'string'): ParsedRule<T> {\n const result: ParsedRule<T> = {\n check: false,\n msg: msg ?? errors.type,\n value,\n params: { ':type': type },\n }\n switch (type) {\n case 'array':\n result.check = isArray(value)\n break\n case 'object':\n result.check = typeof value === 'object' && !!value && !isArray(value) && Object.keys(value).length > 0\n break\n case 'boolean':\n result.check = typeof value === 'boolean'\n break\n case 'number':\n result.check = typeof value === 'number'\n break\n default:\n result.check = typeof value === 'string'\n }\n return result\n}\n\nfunction beforeRule<T>({ value, msg, errors }: ParseOptions<T>, start: string, strict = false): ParsedRule<T> {\n const result: ParsedRule<T> = {\n check: false,\n msg: msg ?? errors.before,\n value,\n params: strict\n ? { ':before': start }\n : { ':beforeOrEqual': start },\n }\n const startValue = util.time.parseISO8601ToEpochMilliSeconds(start)\n const numDate = typeof value === 'string'\n ? util.time.parseISO8601ToEpochMilliSeconds(value)\n : value\n if (typeof numDate === 'number')\n result.check = strict ? numDate < startValue : numDate <= startValue\n return result\n}\n\nfunction afterRule<T>({ value, msg, errors }: ParseOptions<T>, p: string, strict = false): ParsedRule<T> {\n const result: ParsedRule<T> = {\n check: false,\n msg: msg ?? strict ? errors.after : errors.afterOrEqual,\n value,\n params: strict\n ? { ':after': p }\n : { ':afterOrEqual': p },\n }\n const e = util.time.parseISO8601ToEpochMilliSeconds(p)\n const numDate = typeof value === 'string'\n ? util.time.parseISO8601ToEpochMilliSeconds(value)\n : value\n if (typeof numDate === 'number')\n result.check = strict ? numDate > e : numDate >= e\n\n return result\n}\n","import type { Ctx, CustomFullRule, FullRule, I18n, NestedKeyOf, Rule, ValidationErrors } from './types'\nimport { runtime, util } from '@aws-appsync/utils'\nimport * as rules from './rules'\nimport { baseErrors, cleanString, getHeader, getNestedValue, isArray, parseErrorMessage, setNestedValue } from './utils'\n\nfunction isRule(rule: FullRule | CustomFullRule | Omit<Rule, 'value'>): rule is Omit<Rule, 'value'> {\n return typeof rule === 'object' && !!rule && Object.hasOwn(rule, 'check')\n}\n\nfunction isCustomFullRule(rule: FullRule | CustomFullRule | Omit<Rule, 'value'>): rule is CustomFullRule {\n return typeof rule === 'object' && !!rule && Object.hasOwn(rule, 'rule')\n}\n\nexport function validate<T>(\n obj: Readonly<Partial<T>>,\n checks: Partial<{\n [key in NestedKeyOf<T>]: Array<\n | FullRule\n | CustomFullRule\n | Omit<Rule<T>, 'value'>\n > }>,\n options?: {\n trim?: boolean\n allowEmptyString?: boolean\n errors?: Partial<ValidationErrors>\n attributes?: Partial<Record<`:${NestedKeyOf<T>}`, string>>\n },\n): T {\n let error: { msg?: string, errorType?: string, data?: any, errorInfo?: any } = {}\n const errors: ValidationErrors = { ...baseErrors, ...options?.errors }\n if (typeof obj !== 'object')\n util.error('Object expected')\n\n sanitizeNestedArray(obj, checks)\n if (options?.attributes)\n sanitizeNestedArray(obj, options.attributes)\n\n const validated: T & object = JSON.parse(JSON.stringify(obj))\n Object.keys(checks).forEach((path) => {\n let value = getNestedValue(validated, path)\n if (typeof value === 'string') {\n value = cleanString(value, options)\n setNestedValue(validated, path as NestedKeyOf<T>, value)\n }\n\n let skip: boolean = false\n checks[path as keyof typeof checks]?.forEach((rule) => {\n if (skip)\n return\n\n const result = isRule(rule)\n ? { ...rule, value, msg: rule.msg ?? errors.invalid }\n : isCustomFullRule(rule)\n ? rules.parse({ value, msg: rule.msg, errors }, rule.rule)\n : rules.parse({ value, errors }, rule)\n\n skip = !!result.skipNext || !result.check\n\n if (result.check)\n return\n\n if (error.msg)\n util.appendError(error.msg, error.errorType, error.data, error.errorInfo)\n\n result.params = result.params ?? {}\n\n if (util.matches(':attr', result.msg))\n result.params[':attr'] = options?.attributes?.[`:${path as NestedKeyOf<T>}`] ?? formatAttributeName(path as NestedKeyOf<T>)\n\n error = {\n msg: parseErrorMessage(result.msg, result.params),\n errorType: 'ValidationError',\n data: null,\n errorInfo: { path, value },\n }\n })\n })\n\n if (!error.msg) {\n return validated as T\n }\n\n util.error(error.msg, error.errorType, error.data, error.errorInfo)\n}\n\nfunction sanitizeNestedArray(\n obj: object,\n nested: object,\n): void {\n let maxKeys: string[] = []\n Object.keys(nested).forEach((path: string) => {\n const currentKeys = path.split('.').filter(k => k === '*')\n if (currentKeys.length > maxKeys.length) {\n maxKeys = [...currentKeys]\n }\n })\n\n maxKeys.forEach(() => {\n Object.keys(nested).forEach((path) => {\n const keys = path.split('.')\n const wildcardIdx = keys.indexOf('*', 1)\n\n if (wildcardIdx < 1)\n return\n\n const parentPath = keys.slice(0, wildcardIdx).join('.')\n const parentValue = getNestedValue(\n obj,\n parentPath.startsWith(':') ? parentPath.slice(1) : parentPath,\n )\n\n if (!isArray(parentValue))\n return\n\n parentValue.forEach((_, i) => {\n const idxPath = [...keys]\n idxPath[wildcardIdx] = `${i}`\n nested[idxPath.join('.') as keyof typeof nested] = nested[path as keyof typeof nested]\n })\n delete nested[path as keyof typeof nested]\n })\n })\n}\n\nexport function precognitiveValidation<T>(\n ctx: Ctx<Partial<T>>,\n checks: Partial<{\n [key in NestedKeyOf<T>]: Array<\n | FullRule\n | CustomFullRule\n | Omit<Rule, 'value'>\n > }>,\n options?: {\n trim?: boolean\n allowEmptyString?: boolean\n skipTo?: 'END' | 'NEXT'\n errors?: Partial<ValidationErrors>\n attributes?: Partial<Record<`:${NestedKeyOf<T>}`, string>>\n },\n): T {\n const { errors, attributes } = (isLocalized<T, string>(ctx)\n ? {\n errors: {\n ...ctx.stash.__i18n.errors,\n ...options?.errors,\n },\n attributes: {\n ...ctx.stash.__i18n.attributes,\n ...options?.attributes,\n },\n }\n : { errors: options?.errors, attributes: options?.attributes }) as {\n errors: Partial<ValidationErrors>\n attributes: Partial<Record<`:${NestedKeyOf<T>}`, string>>\n }\n if (getHeader('precognition', ctx) !== 'true')\n return ctx.stash.__validated = validate<T>(ctx.args, checks, { ...options, errors, attributes })\n\n const validationKeys = getHeader('Precognition-Validate-Only', ctx)?.split(',').map(key => key.trim())\n util.http.addResponseHeader('Precognition', 'true')\n\n if (!validationKeys) {\n ctx.stash.__validated = validate(ctx.args, checks, { ...options, errors, attributes })\n util.http.addResponseHeader('Precognition-Success', 'true')\n runtime.earlyReturn(null)\n }\n\n util.http.addResponseHeader('Precognition-Validate-Only', validationKeys.join(','))\n const precognitionChecks = {} as Partial<typeof checks>\n validationKeys.forEach((key) => {\n precognitionChecks[key as keyof typeof precognitionChecks] = checks[key as keyof typeof checks]\n })\n\n ctx.stash.__validated = validate(ctx.args, precognitionChecks, { ...options, errors, attributes })\n util.http.addResponseHeader('Precognition-Success', 'true')\n runtime.earlyReturn(null, { skipTo: options?.skipTo ?? 'END' })\n}\n\nexport function formatAttributeName(path: string): string {\n return path.split('.').reduce((acc, part) => {\n if (util.matches('^\\\\d+$', part)) {\n return acc\n }\n let words = ''\n part.split('').forEach((char, idx) => {\n if (idx !== 0 && util.matches('[A-Z]', char)) {\n words += ' '\n }\n words += char.toLowerCase()\n })\n return acc ? `${acc} ${words}` : words\n }, '')\n}\n\nexport function assertValidated<\n T extends { [key in keyof T]: T[key] },\n>(\n ctx: Ctx<Partial<T>>,\n): asserts ctx is typeof ctx & {\n stash: { __validated: T }\n} {\n if (Object.hasOwn(ctx.stash, '__validated'))\n return\n util.error('Context arguments have not been validated')\n}\n\nexport function isLocalized<\n T extends { [key in keyof T]: T[key] },\n TLocale extends string,\n>(\n ctx: Ctx<Partial<T>>,\n locale?: TLocale,\n): ctx is typeof ctx & {\n stash: typeof ctx.stash & {\n __i18n: I18n<T, string>\n }\n} {\n if (Object.hasOwn(ctx.stash, '__i18n') && typeof ctx.stash?.__i18n.locale === 'string') {\n return locale\n ? ctx.stash.__i18n.locale === locale\n : true\n }\n return false\n}\n\nexport function assertLocalized<\n T extends { [key in keyof T]: T[key] },\n TLocale extends string,\n>(\n ctx: Ctx<Partial<T>>,\n locale?: TLocale,\n): asserts ctx is typeof ctx & {\n stash: typeof ctx.stash & {\n __i18n: I18n<T, string>\n }\n} {\n if (isLocalized<T, TLocale>(ctx, locale))\n return\n util.error('Context arguements have not been localized')\n}\n\nexport type { CustomFullRule, FullRule, I18n, Rule, ValidationErrors } from './types'\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"utils.d.ts","names":["baseErrors: ValidationErrors"],"sources":["../src/utils.ts"],"sourcesContent":[],"mappings":";;;iBAGgB,OAAA;iBAIA,cAAA;AAJA,iBAUA,cAAA,CAVA,GAAA,EAAA,MAAA,EAAA,IAAA,EAAA,MAAA,EAAA,KAAA,EAAA,OAAA,CAAA,EAAA,IAAA;AAIA,iBAmBA,SAAA,CAnBA,IAAA,EAAA,MAAA,EAAA,GAAA,EAAA;EAMhB,OAAgB,EAAA;IAahB,OAAgB,EAAA,GAAA;EAMhB,CAAA;AAYA,CAAA,CAAA,EAAgB,MAAA,GAAA,IAAA;AAWH,iBAvBG,WAAA,CAuBH,KAAA,EAAA,MAAA,EAAA,OAGb,CAHa,EAAA;EACb,IAAa,CAAA,EAAA,OAAA;EACb,gBAAa,CAAA,EAAA,OAAA;AACb,CAAA,CAAA,EAAa,MAAA,GAAA,IAAA;AACA,iBAfG,QAAA,CAeH,KAAA,EAAA,MAAA,CAAA,EAAA,MAAA;AACA,cALA,IAAA,GAKA,gEAAA;AACA,cALA,IAAA,GAKA,0CAAA;AACA,cALA,GAAA,GAKA,qMAAA;AACA,cALA,KAAA,GAKA,mDAAA;AACA,cALA,KAAA,GAKA,qBAAA;AAEAA,cANA,IAAA,GAMY,iDAAA;AAsCT,cA3CH,IAAA,GA2CG,sDAAwC;cA1C3C,QAAA;cACA,OAAA;cACA,OAAA;cAEAA,YAAY;iBAsCT,iBAAA,uBAAwC"}
1
+ {"version":3,"file":"utils.d.ts","names":["baseErrors: ValidationErrors"],"sources":["../src/utils.ts"],"sourcesContent":[],"mappings":";;;iBAGgB,OAAA;iBAIA,cAAA;AAJA,iBAYA,cAAA,CAZA,GAAA,EAAA,MAAA,EAAA,IAAA,EAAA,MAAA,EAAA,KAAA,EAAA,OAAA,CAAA,EAAA,IAAA;AAIA,iBAqBA,SAAA,CArBA,IAAA,EAAA,MAAA,EAAA,GAAA,EAAA;EAQhB,OAAgB,EAAA;IAahB,OAAgB,EAAA,GAAA;EAMhB,CAAA;AAYA,CAAA,CAAA,EAAgB,MAAA,GAAA,IAAA;AAWH,iBAvBG,WAAA,CAuBH,KAAA,EAAA,MAAA,EAAA,OAGb,CAHa,EAAA;EACb,IAAa,CAAA,EAAA,OAAA;EACb,gBAAa,CAAA,EAAA,OAAA;AACb,CAAA,CAAA,EAAa,MAAA,GAAA,IAAA;AACA,iBAfG,QAAA,CAeH,KAAA,EAAA,MAAA,CAAA,EAAA,MAAA;AACA,cALA,IAAA,GAKA,gEAAA;AACA,cALA,IAAA,GAKA,0CAAA;AACA,cALA,GAAA,GAKA,qMAAA;AACA,cALA,KAAA,GAKA,mDAAA;AACA,cALA,KAAA,GAKA,qBAAA;AAEAA,cANA,IAAA,GAMY,iDAAA;AAsCT,cA3CH,IAAA,GA2CG,sDAAwC;cA1C3C,QAAA;cACA,OAAA;cACA,OAAA;cAEAA,YAAY;iBAsCT,iBAAA,uBAAwC"}
package/dist/utils.js CHANGED
@@ -1 +1 @@
1
- import{util}from"@aws-appsync/utils";function isArray(e){return typeof e===`object`&&!!e&&typeof e?.length===`number`}function getNestedValue(p,m){return m.split(`.`).reduce((p,m)=>util.matches(`^\\d+$`,m)?p[toNumber(m)]:p[m],p)}function setNestedValue(e,p,h){const g=p.split(`.`);if(g.length===1){e[g[0]]=h;return}const _=g.pop();const v=getNestedValue(e,g.join(`.`));if(typeof v===`object`&&!!v)v[_]=h}function getHeader(e,p){const m=e.toLowerCase();const h=Object.keys(p.request.headers).find(e=>e.toLowerCase()===m);return h?p.request.headers[h]:null}function cleanString(e,p){if(p?.trim===false)return e;const m=e.trim();if(p?.allowEmptyString)return m;return m===``?null:m}function toNumber(p){switch(true){case util.matches(`^(-|\\+)?\\d+(\\.\\d+)?$`,p):return+p;case util.matches(`^(-|\\+)?Infinity$`,p):return+p;default:util.error(`Invalid number: ${p}`)}}const uuid=`^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$`;const ulid=`^[0123456789ABCDEFGHJKMNPQRSTVWXYZ]{26}$`;const url=`^https?:\\/\\/(www\\.)?[-a-zA-Z0-9@:%._\\+~#=]{1,256}\\.[a-zA-Z0-9()]{1,6}\\b([-a-zA-Z0-9()@:%_\\+.~#?&//=]*)$|^https?:\\/\\/(localhost|\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3})(:\\d+)?(\\/.*)?$`;const email=`^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$`;const phone=`^\\+[1-9]\\d{1,20}$`;const date=`^\\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01])$`;const time=`^([01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(\\.\\d{1,6})?Z?$`;const datetime=`^\\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01])T([01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(\\.\\d{1,6})?Z$`;const numeric=`^-?\\d+(\\.\\d+)?$`;const integer=`^-?\\d+$`;const baseErrors={maxNumber:`:attr max value is :max`,minNumber:`:attr min value is :min`,betweenNumber:`:attr value must be between :min and :max`,biggerNumber:`:attr must be bigger than :min`,lowerNumber:`:attr must be lower than :max`,withinNumber:`:attr must be within :min and :max`,maxString:`:attr must not exceed :max characters`,minString:`:attr must have at least :min characters`,betweenString:`:attr must have between :min and :max characters`,minArray:`:attr must have at least :min elements`,maxArray:`:attr must have at most :max elements`,betweenArray:`:attr must have between :min and :max elements`,in:`:attr must be one of the specified values: :in`,notIn:`:attr must not be one of this list: :notIn`,email:`:attr must be a valid email address (name@domain.com)`,phone:`:attr must be a valid phone number (+123...)`,url:`:attr must be a valid URL (:pattern)`,uuid:`:attr must be a valid UUID (:pattern)`,ulid:`:attr must be a valid ULID (:pattern)`,date:`:attr must be a valid date (:pattern)`,time:`:attr must be a valid time (:pattern)`,datetime:`:attr must be a valid datetime (:pattern)`,numeric:`:attr must be a valid number (:pattern)`,integer:`:attr must be a valid integer (:pattern)`,type:`:attr is not valid :type`,regex:`:attr must match :pattern`,regex_patterns:`attr: must match any of :patterns`,required:`:attr is required`,nullable:`:attr is nullable`,sometimes:`:attr cannot be null`,before:`:attr must be before :before`,beforeOrEqual:`:attr must be before or equal to :beforeOrEqual`,after:`:attr must be after :after`,afterOrEqual:`:attr must be after or equal to :afterOrEqual`,invalid:`:attr is not valid`};function parseErrorMessage(e,p){let m=e;Object.entries(p??{}).forEach(([e,p])=>{m=m.replaceAll(e,p)});return m}export{baseErrors,cleanString,date,datetime,email,getHeader,getNestedValue,integer,isArray,numeric,parseErrorMessage,phone,setNestedValue,time,toNumber,ulid,url,uuid};
1
+ import{util}from"@aws-appsync/utils";function isArray(e){return typeof e===`object`&&!!e&&typeof e?.length===`number`}function getNestedValue(p,m){return m.split(`.`).reduce((p,m)=>{return util.matches(`^\\d+$`,m)?p[toNumber(m)]:p[m]},p)}function setNestedValue(e,p,h){const g=p.split(`.`);if(g.length===1){e[g[0]]=h;return}const _=g.pop();const v=getNestedValue(e,g.join(`.`));if(typeof v===`object`&&!!v)v[_]=h}function getHeader(e,p){const m=e.toLowerCase();const h=Object.keys(p.request.headers).find(e=>e.toLowerCase()===m);return h?p.request.headers[h]:null}function cleanString(e,p){if(p?.trim===false)return e;const m=e.trim();if(p?.allowEmptyString)return m;return m===``?null:m}function toNumber(p){switch(true){case util.matches(`^(-|\\+)?\\d+(\\.\\d+)?$`,p):return+p;case util.matches(`^(-|\\+)?Infinity$`,p):return+p;default:util.error(`Invalid number: ${p}`)}}const uuid=`^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$`;const ulid=`^[0123456789ABCDEFGHJKMNPQRSTVWXYZ]{26}$`;const url=`^https?:\\/\\/(www\\.)?[-a-zA-Z0-9@:%._\\+~#=]{1,256}\\.[a-zA-Z0-9()]{1,6}\\b([-a-zA-Z0-9()@:%_\\+.~#?&//=]*)$|^https?:\\/\\/(localhost|\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3})(:\\d+)?(\\/.*)?$`;const email=`^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$`;const phone=`^\\+[1-9]\\d{1,20}$`;const date=`^\\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01])$`;const time=`^([01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(\\.\\d{1,6})?Z?$`;const datetime=`^\\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01])T([01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(\\.\\d{1,6})?Z$`;const numeric=`^-?\\d+(\\.\\d+)?$`;const integer=`^-?\\d+$`;const baseErrors={maxNumber:`:attr max value is :max`,minNumber:`:attr min value is :min`,betweenNumber:`:attr value must be between :min and :max`,biggerNumber:`:attr must be bigger than :min`,lowerNumber:`:attr must be lower than :max`,withinNumber:`:attr must be within :min and :max`,maxString:`:attr must not exceed :max characters`,minString:`:attr must have at least :min characters`,betweenString:`:attr must have between :min and :max characters`,minArray:`:attr must have at least :min elements`,maxArray:`:attr must have at most :max elements`,betweenArray:`:attr must have between :min and :max elements`,in:`:attr must be one of the specified values: :in`,notIn:`:attr must not be one of this list: :notIn`,email:`:attr must be a valid email address (name@domain.com)`,phone:`:attr must be a valid phone number (+123...)`,url:`:attr must be a valid URL (:pattern)`,uuid:`:attr must be a valid UUID (:pattern)`,ulid:`:attr must be a valid ULID (:pattern)`,date:`:attr must be a valid date (:pattern)`,time:`:attr must be a valid time (:pattern)`,datetime:`:attr must be a valid datetime (:pattern)`,numeric:`:attr must be a valid number (:pattern)`,integer:`:attr must be a valid integer (:pattern)`,type:`:attr is not valid :type`,regex:`:attr must match :pattern`,regex_patterns:`attr: must match any of :patterns`,required:`:attr is required`,nullable:`:attr is nullable`,sometimes:`:attr cannot be null`,before:`:attr must be before :before`,beforeOrEqual:`:attr must be before or equal to :beforeOrEqual`,after:`:attr must be after :after`,afterOrEqual:`:attr must be after or equal to :afterOrEqual`,invalid:`:attr is not valid`};function parseErrorMessage(e,p){let m=e;Object.entries(p??{}).forEach(([e,p])=>{m=m.replaceAll(e,p)});return m}export{baseErrors,cleanString,date,datetime,email,getHeader,getNestedValue,integer,isArray,numeric,parseErrorMessage,phone,setNestedValue,time,toNumber,ulid,url,uuid};
package/dist/utils.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","names":["parsed: string | null","baseErrors: ValidationErrors"],"sources":["../src/utils.ts"],"sourcesContent":["import type { ErrorMsgParams, ValidationErrors } from './types'\nimport { util } from '@aws-appsync/utils'\n\nexport function isArray(value: unknown): value is unknown[] {\n return typeof value === 'object' && !!value && typeof (value as unknown[] | undefined)?.length === 'number'\n}\n\nexport function getNestedValue(obj: object, path: string): any {\n return path.split('.').reduce<unknown>((current, key) => util.matches('^\\\\d+$', key)\n ? (current as unknown[])[toNumber(key)]\n : (current as Record<string, unknown>)[key], obj)\n}\n\nexport function setNestedValue(obj: object, path: string, value: unknown): void {\n const keys = path.split('.')\n if (keys.length === 1) {\n (obj as any)[keys[0] as keyof typeof obj] = value as any\n return\n }\n const lastKey = keys.pop() as string\n const parentObject = getNestedValue(obj, keys.join('.'))\n if (typeof parentObject === 'object' && !!parentObject) {\n parentObject[lastKey] = value\n }\n}\n\nexport function getHeader(name: string, ctx: { request: { headers: any } }): string | null {\n const lowerCaseName = name.toLowerCase()\n const key = Object.keys(ctx.request.headers).find(h => h.toLowerCase() === lowerCaseName)\n return key ? ctx.request.headers[key] : null\n}\n\nexport function cleanString(value: string, options?: {\n trim?: boolean\n allowEmptyString?: boolean\n}): string | null {\n if (options?.trim === false)\n return value\n const parsed: string | null = value.trim()\n if (options?.allowEmptyString)\n return parsed\n return parsed === '' ? null : parsed\n}\n\nexport function toNumber(value: string): number {\n switch (true) {\n case util.matches('^(-|\\\\+)?\\\\d+(\\\\.\\\\d+)?$', value):\n return +value\n case util.matches('^(-|\\\\+)?Infinity$', value):\n return +value\n default:\n util.error(`Invalid number: ${value}`)\n }\n}\n\nexport const uuid = `^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$`\nexport const ulid = '^[0123456789ABCDEFGHJKMNPQRSTVWXYZ]{26}$'\nexport const url = '^https?:\\\\/\\\\/(www\\\\.)?[-a-zA-Z0-9@:%._\\\\+~#=]{1,256}\\\\.[a-zA-Z0-9()]{1,6}\\\\b([-a-zA-Z0-9()@:%_\\\\+.~#?&//=]*)$|^https?:\\\\/\\\\/(localhost|\\\\d{1,3}\\\\.\\\\d{1,3}\\\\.\\\\d{1,3}\\\\.\\\\d{1,3})(:\\\\d+)?(\\\\/.*)?$'\nexport const email = '^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\\\.[a-zA-Z]{2,}$'\nexport const phone = '^\\\\+[1-9]\\\\d{1,20}$'\nexport const date = '^\\\\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\\\\d|3[01])$'\nexport const time = '^([01]\\\\d|2[0-3]):[0-5]\\\\d:[0-5]\\\\d(\\\\.\\\\d{1,6})?Z?$'\nexport const datetime = '^\\\\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\\\\d|3[01])T([01]\\\\d|2[0-3]):[0-5]\\\\d:[0-5]\\\\d(\\\\.\\\\d{1,6})?Z$'\nexport const numeric = '^-?\\\\d+(\\\\.\\\\d+)?$'\nexport const integer = '^-?\\\\d+$'\n\nexport const baseErrors: ValidationErrors = {\n maxNumber: ':attr max value is :max',\n minNumber: ':attr min value is :min',\n betweenNumber: ':attr value must be between :min and :max',\n biggerNumber: ':attr must be bigger than :min',\n lowerNumber: ':attr must be lower than :max',\n withinNumber: ':attr must be within :min and :max',\n maxString: ':attr must not exceed :max characters',\n minString: ':attr must have at least :min characters',\n betweenString: ':attr must have between :min and :max characters',\n minArray: ':attr must have at least :min elements',\n maxArray: ':attr must have at most :max elements',\n betweenArray: ':attr must have between :min and :max elements',\n in: ':attr must be one of the specified values: :in',\n notIn: ':attr must not be one of this list: :notIn',\n email: ':attr must be a valid email address (name@domain.com)',\n phone: ':attr must be a valid phone number (+123...)',\n url: ':attr must be a valid URL (:pattern)',\n uuid: ':attr must be a valid UUID (:pattern)',\n ulid: ':attr must be a valid ULID (:pattern)',\n date: ':attr must be a valid date (:pattern)',\n time: ':attr must be a valid time (:pattern)',\n datetime: ':attr must be a valid datetime (:pattern)',\n numeric: ':attr must be a valid number (:pattern)',\n integer: ':attr must be a valid integer (:pattern)',\n type: ':attr is not valid :type',\n regex: ':attr must match :pattern',\n regex_patterns: 'attr: must match any of :patterns',\n required: ':attr is required',\n nullable: ':attr is nullable',\n sometimes: ':attr cannot be null',\n before: ':attr must be before :before',\n beforeOrEqual: ':attr must be before or equal to :beforeOrEqual',\n after: ':attr must be after :after',\n afterOrEqual: ':attr must be after or equal to :afterOrEqual',\n invalid: ':attr is not valid',\n}\n\nexport function parseErrorMessage(msg: string, params?: ErrorMsgParams): string {\n let parsedMsg = msg\n Object.entries(params ?? {}).forEach(([key, value]) => {\n parsedMsg = parsedMsg.replaceAll(key, value)\n })\n return parsedMsg\n}\n"],"mappings":"qCAGA,SAAgB,QAAQ,EAAoC,CAC1D,OAAO,OAAO,IAAU,UAAY,CAAC,CAAC,GAAS,OAAQ,GAAiC,SAAW,SAGrG,SAAgB,eAAe,EAAa,EAAmB,CAC7D,OAAO,EAAK,MAAM,IAAI,CAAC,QAAiB,EAAS,IAAQ,KAAK,QAAQ,SAAU,EAAI,CAC/E,EAAsB,SAAS,EAAI,EACnC,EAAoC,GAAM,EAAI,CAGrD,SAAgB,eAAe,EAAa,EAAc,EAAsB,CAC9E,MAAM,EAAO,EAAK,MAAM,IAAI,CAC5B,GAAI,EAAK,SAAW,EAAG,CACpB,EAAY,EAAK,IAA0B,EAC5C,OAEF,MAAM,EAAU,EAAK,KAAK,CAC1B,MAAM,EAAe,eAAe,EAAK,EAAK,KAAK,IAAI,CAAC,CACxD,GAAI,OAAO,IAAiB,UAAY,CAAC,CAAC,EACxC,EAAa,GAAW,EAI5B,SAAgB,UAAU,EAAc,EAAmD,CACzF,MAAM,EAAgB,EAAK,aAAa,CACxC,MAAM,EAAM,OAAO,KAAK,EAAI,QAAQ,QAAQ,CAAC,KAAK,GAAK,EAAE,aAAa,GAAK,EAAc,CACzF,OAAO,EAAM,EAAI,QAAQ,QAAQ,GAAO,KAG1C,SAAgB,YAAY,EAAe,EAGzB,CAChB,GAAI,GAAS,OAAS,MACpB,OAAO,EACT,MAAMA,EAAwB,EAAM,MAAM,CAC1C,GAAI,GAAS,iBACX,OAAO,EACT,OAAO,IAAW,GAAK,KAAO,EAGhC,SAAgB,SAAS,EAAuB,CAC9C,OAAQ,KAAR,CACE,KAAK,KAAK,QAAQ,2BAA4B,EAAM,CAClD,MAAO,CAAC,EACV,KAAK,KAAK,QAAQ,qBAAsB,EAAM,CAC5C,MAAO,CAAC,EACV,QACE,KAAK,MAAM,mBAAmB,IAAQ,EAI5C,MAAa,KAAO,iEACpB,MAAa,KAAO,2CACpB,MAAa,IAAM,sMACnB,MAAa,MAAQ,oDACrB,MAAa,MAAQ,sBACrB,MAAa,KAAO,kDACpB,MAAa,KAAO,uDACpB,MAAa,SAAW,oGACxB,MAAa,QAAU,qBACvB,MAAa,QAAU,WAEvB,MAAaC,WAA+B,CAC1C,UAAW,0BACX,UAAW,0BACX,cAAe,4CACf,aAAc,iCACd,YAAa,gCACb,aAAc,qCACd,UAAW,wCACX,UAAW,2CACX,cAAe,mDACf,SAAU,yCACV,SAAU,wCACV,aAAc,iDACd,GAAI,iDACJ,MAAO,6CACP,MAAO,wDACP,MAAO,+CACP,IAAK,uCACL,KAAM,wCACN,KAAM,wCACN,KAAM,wCACN,KAAM,wCACN,SAAU,4CACV,QAAS,0CACT,QAAS,2CACT,KAAM,2BACN,MAAO,4BACP,eAAgB,oCAChB,SAAU,oBACV,SAAU,oBACV,UAAW,uBACX,OAAQ,+BACR,cAAe,kDACf,MAAO,6BACP,aAAc,gDACd,QAAS,qBACV,CAED,SAAgB,kBAAkB,EAAa,EAAiC,CAC9E,IAAI,EAAY,EAChB,OAAO,QAAQ,GAAU,EAAE,CAAC,CAAC,SAAS,CAAC,EAAK,KAAW,CACrD,EAAY,EAAU,WAAW,EAAK,EAAM,EAC5C,CACF,OAAO"}
1
+ {"version":3,"file":"utils.js","names":["parsed: string | null","baseErrors: ValidationErrors"],"sources":["../src/utils.ts"],"sourcesContent":["import type { ErrorMsgParams, ValidationErrors } from './types'\nimport { util } from '@aws-appsync/utils'\n\nexport function isArray(value: unknown): value is unknown[] {\n return typeof value === 'object' && !!value && typeof (value as unknown[] | undefined)?.length === 'number'\n}\n\nexport function getNestedValue(obj: object, path: string): any {\n return path.split('.').reduce<unknown>((current, key) => {\n return util.matches('^\\\\d+$', key)\n ? (current as unknown[])[toNumber(key)]\n : (current as Record<string, unknown>)[key]\n }, obj)\n}\n\nexport function setNestedValue(obj: object, path: string, value: unknown): void {\n const keys = path.split('.')\n if (keys.length === 1) {\n (obj as any)[keys[0] as keyof typeof obj] = value as any\n return\n }\n const lastKey = keys.pop() as string\n const parentObject = getNestedValue(obj, keys.join('.'))\n if (typeof parentObject === 'object' && !!parentObject) {\n parentObject[lastKey] = value\n }\n}\n\nexport function getHeader(name: string, ctx: { request: { headers: any } }): string | null {\n const lowerCaseName = name.toLowerCase()\n const key = Object.keys(ctx.request.headers).find(h => h.toLowerCase() === lowerCaseName)\n return key ? ctx.request.headers[key] : null\n}\n\nexport function cleanString(value: string, options?: {\n trim?: boolean\n allowEmptyString?: boolean\n}): string | null {\n if (options?.trim === false)\n return value\n const parsed: string | null = value.trim()\n if (options?.allowEmptyString)\n return parsed\n return parsed === '' ? null : parsed\n}\n\nexport function toNumber(value: string): number {\n switch (true) {\n case util.matches('^(-|\\\\+)?\\\\d+(\\\\.\\\\d+)?$', value):\n return +value\n case util.matches('^(-|\\\\+)?Infinity$', value):\n return +value\n default:\n util.error(`Invalid number: ${value}`)\n }\n}\n\nexport const uuid = `^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$`\nexport const ulid = '^[0123456789ABCDEFGHJKMNPQRSTVWXYZ]{26}$'\nexport const url = '^https?:\\\\/\\\\/(www\\\\.)?[-a-zA-Z0-9@:%._\\\\+~#=]{1,256}\\\\.[a-zA-Z0-9()]{1,6}\\\\b([-a-zA-Z0-9()@:%_\\\\+.~#?&//=]*)$|^https?:\\\\/\\\\/(localhost|\\\\d{1,3}\\\\.\\\\d{1,3}\\\\.\\\\d{1,3}\\\\.\\\\d{1,3})(:\\\\d+)?(\\\\/.*)?$'\nexport const email = '^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\\\.[a-zA-Z]{2,}$'\nexport const phone = '^\\\\+[1-9]\\\\d{1,20}$'\nexport const date = '^\\\\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\\\\d|3[01])$'\nexport const time = '^([01]\\\\d|2[0-3]):[0-5]\\\\d:[0-5]\\\\d(\\\\.\\\\d{1,6})?Z?$'\nexport const datetime = '^\\\\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\\\\d|3[01])T([01]\\\\d|2[0-3]):[0-5]\\\\d:[0-5]\\\\d(\\\\.\\\\d{1,6})?Z$'\nexport const numeric = '^-?\\\\d+(\\\\.\\\\d+)?$'\nexport const integer = '^-?\\\\d+$'\n\nexport const baseErrors: ValidationErrors = {\n maxNumber: ':attr max value is :max',\n minNumber: ':attr min value is :min',\n betweenNumber: ':attr value must be between :min and :max',\n biggerNumber: ':attr must be bigger than :min',\n lowerNumber: ':attr must be lower than :max',\n withinNumber: ':attr must be within :min and :max',\n maxString: ':attr must not exceed :max characters',\n minString: ':attr must have at least :min characters',\n betweenString: ':attr must have between :min and :max characters',\n minArray: ':attr must have at least :min elements',\n maxArray: ':attr must have at most :max elements',\n betweenArray: ':attr must have between :min and :max elements',\n in: ':attr must be one of the specified values: :in',\n notIn: ':attr must not be one of this list: :notIn',\n email: ':attr must be a valid email address (name@domain.com)',\n phone: ':attr must be a valid phone number (+123...)',\n url: ':attr must be a valid URL (:pattern)',\n uuid: ':attr must be a valid UUID (:pattern)',\n ulid: ':attr must be a valid ULID (:pattern)',\n date: ':attr must be a valid date (:pattern)',\n time: ':attr must be a valid time (:pattern)',\n datetime: ':attr must be a valid datetime (:pattern)',\n numeric: ':attr must be a valid number (:pattern)',\n integer: ':attr must be a valid integer (:pattern)',\n type: ':attr is not valid :type',\n regex: ':attr must match :pattern',\n regex_patterns: 'attr: must match any of :patterns',\n required: ':attr is required',\n nullable: ':attr is nullable',\n sometimes: ':attr cannot be null',\n before: ':attr must be before :before',\n beforeOrEqual: ':attr must be before or equal to :beforeOrEqual',\n after: ':attr must be after :after',\n afterOrEqual: ':attr must be after or equal to :afterOrEqual',\n invalid: ':attr is not valid',\n}\n\nexport function parseErrorMessage(msg: string, params?: ErrorMsgParams): string {\n let parsedMsg = msg\n Object.entries(params ?? {}).forEach(([key, value]) => {\n parsedMsg = parsedMsg.replaceAll(key, value)\n })\n return parsedMsg\n}\n"],"mappings":"qCAGA,SAAgB,QAAQ,EAAoC,CAC1D,OAAO,OAAO,IAAU,UAAY,CAAC,CAAC,GAAS,OAAQ,GAAiC,SAAW,SAGrG,SAAgB,eAAe,EAAa,EAAmB,CAC7D,OAAO,EAAK,MAAM,IAAI,CAAC,QAAiB,EAAS,IAAQ,CACvD,OAAO,KAAK,QAAQ,SAAU,EAAI,CAC7B,EAAsB,SAAS,EAAI,EACnC,EAAoC,IACxC,EAAI,CAGT,SAAgB,eAAe,EAAa,EAAc,EAAsB,CAC9E,MAAM,EAAO,EAAK,MAAM,IAAI,CAC5B,GAAI,EAAK,SAAW,EAAG,CACpB,EAAY,EAAK,IAA0B,EAC5C,OAEF,MAAM,EAAU,EAAK,KAAK,CAC1B,MAAM,EAAe,eAAe,EAAK,EAAK,KAAK,IAAI,CAAC,CACxD,GAAI,OAAO,IAAiB,UAAY,CAAC,CAAC,EACxC,EAAa,GAAW,EAI5B,SAAgB,UAAU,EAAc,EAAmD,CACzF,MAAM,EAAgB,EAAK,aAAa,CACxC,MAAM,EAAM,OAAO,KAAK,EAAI,QAAQ,QAAQ,CAAC,KAAK,GAAK,EAAE,aAAa,GAAK,EAAc,CACzF,OAAO,EAAM,EAAI,QAAQ,QAAQ,GAAO,KAG1C,SAAgB,YAAY,EAAe,EAGzB,CAChB,GAAI,GAAS,OAAS,MACpB,OAAO,EACT,MAAMA,EAAwB,EAAM,MAAM,CAC1C,GAAI,GAAS,iBACX,OAAO,EACT,OAAO,IAAW,GAAK,KAAO,EAGhC,SAAgB,SAAS,EAAuB,CAC9C,OAAQ,KAAR,CACE,KAAK,KAAK,QAAQ,2BAA4B,EAAM,CAClD,MAAO,CAAC,EACV,KAAK,KAAK,QAAQ,qBAAsB,EAAM,CAC5C,MAAO,CAAC,EACV,QACE,KAAK,MAAM,mBAAmB,IAAQ,EAI5C,MAAa,KAAO,iEACpB,MAAa,KAAO,2CACpB,MAAa,IAAM,sMACnB,MAAa,MAAQ,oDACrB,MAAa,MAAQ,sBACrB,MAAa,KAAO,kDACpB,MAAa,KAAO,uDACpB,MAAa,SAAW,oGACxB,MAAa,QAAU,qBACvB,MAAa,QAAU,WAEvB,MAAaC,WAA+B,CAC1C,UAAW,0BACX,UAAW,0BACX,cAAe,4CACf,aAAc,iCACd,YAAa,gCACb,aAAc,qCACd,UAAW,wCACX,UAAW,2CACX,cAAe,mDACf,SAAU,yCACV,SAAU,wCACV,aAAc,iDACd,GAAI,iDACJ,MAAO,6CACP,MAAO,wDACP,MAAO,+CACP,IAAK,uCACL,KAAM,wCACN,KAAM,wCACN,KAAM,wCACN,KAAM,wCACN,SAAU,4CACV,QAAS,0CACT,QAAS,2CACT,KAAM,2BACN,MAAO,4BACP,eAAgB,oCAChB,SAAU,oBACV,SAAU,oBACV,UAAW,uBACX,OAAQ,+BACR,cAAe,kDACf,MAAO,6BACP,aAAc,gDACd,QAAS,qBACV,CAED,SAAgB,kBAAkB,EAAa,EAAiC,CAC9E,IAAI,EAAY,EAChB,OAAO,QAAQ,GAAU,EAAE,CAAC,CAAC,SAAS,CAAC,EAAK,KAAW,CACrD,EAAY,EAAU,WAAW,EAAK,EAAM,EAC5C,CACF,OAAO"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@sot1986/appsync-precognition",
3
3
  "type": "module",
4
- "version": "0.5.9",
4
+ "version": "0.5.11",
5
5
  "description": "JavaScript resolver validation utilities for AWS AppSync",
6
6
  "author": "sot1986",
7
7
  "license": "MIT",