@sot1986/appsync-precognition 0.5.0 → 0.5.2

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/i18n.d.ts CHANGED
@@ -1,15 +1,9 @@
1
- import { l as ValidationErrors, r as DefinedRecord, s as NestedKeyOf } from "./types-CN3uACtN.js";
1
+ import { l as ValidationErrors, o as LocalizedCtx, r as DefinedRecord, s as NestedKeyOf, t as Ctx } from "./types-5wzYU-oa.js";
2
2
 
3
3
  //#region src/i18n.d.ts
4
- declare function localize<TLocales extends string[], T extends object>(ctx: {
5
- args?: Partial<T>;
6
- request: {
7
- headers: any;
8
- };
9
- stash: Record<string, any>;
10
- }, i18n?: {
11
- errors?: Record<TLocales[number], DefinedRecord<Partial<ValidationErrors>>>;
12
- attributes?: Record<TLocales[number], DefinedRecord<Partial<Record<`:${NestedKeyOf<T>}`, string>>>>;
13
- }): void;
4
+ declare function localize<T extends object>(ctx: Ctx<T>, i18n?: {
5
+ errors?: Record<string, DefinedRecord<Partial<ValidationErrors>>>;
6
+ attributes?: Record<string, DefinedRecord<Partial<Record<`:${NestedKeyOf<T>}`, string>>>>;
7
+ }): asserts ctx is Ctx<T> & LocalizedCtx<T, string>;
14
8
  //#endregion
15
9
  export { localize };
@@ -1 +1 @@
1
- {"version":3,"file":"i18n.d.ts","names":[],"sources":["../src/i18n.ts"],"sourcesContent":[],"mappings":";;;iBAGgB,oCAAhB,UAAgB,MAAA,CAIQ,CAAA,GAAA,EAAA;EAAR,IAAA,CAAA,EAAA,OAAA,CAAQ,CAAR,CAAA;EAA8C,OAAA,EAAA;IAE1C,OAAA,EAAA,GAAA;EAAwC,CAAA;EAAR,KAAA,EAFU,MAEV,CAAA,MAAA,EAAA,GAAA,CAAA;CAAd,EAAA,IACiD,CADjD,EAAA;EAAzB,MAAA,CAAA,EAAA,MAAA,CAAO,QAAP,CAAA,MAAA,CAAA,EAAyB,aAAzB,CAAuC,OAAvC,CAA+C,gBAA/C,CAAA,CAAA,CAAA;EACW,UAAA,CAAA,EAAP,MAAO,CAAA,QAAA,CAAA,MAAA,CAAA,EAAkB,aAAlB,CAAgC,OAAhC,CAAwC,MAAxC,CAAA,IAAmD,WAAnD,CAA+D,CAA/D,CAAA,EAAA,EAAA,MAAA,CAAA,CAAA,CAAA,CAAA;CAA+D,CAAA,EAAA,IAAA"}
1
+ {"version":3,"file":"i18n.d.ts","names":[],"sources":["../src/i18n.ts"],"sourcesContent":[],"mappings":";;;iBAGgB,gCAGT,IAAI,QAAA;WAEE,eAAe,cAAc,QAAQ;EALlD,UAAgB,CAAA,EAMC,MAND,CAAA,MAAA,EAMgB,aANhB,CAM8B,OAN9B,CAMsC,MANtC,CAAA,IAMiD,WANjD,CAM6D,CAN7D,CAAA,EAAA,EAAA,MAAA,CAAA,CAAA,CAAA,CAAA;CAGL,CAAA,EAAA,QAAA,GAAA,IAKO,GALP,CAKW,CALX,CAAA,GAKgB,YALhB,CAK6B,CAL7B,EAAA,MAAA,CAAA"}
package/dist/i18n.js CHANGED
@@ -1 +1 @@
1
- import{getHeader}from"./utils.js";function localize(t,n){const r=getHeader(`Accepted-Language`,t);if(r)t.stash.__i18n={locale:r,errors:n?.errors&&Object.hasOwn(n.errors,r)?n.errors[r]:void 0,attributes:n?.attributes&&Object.hasOwn(n.attributes,r)?n.attributes[r]:void 0}}export{localize};
1
+ import{getHeader}from"./utils.js";function localize(t,n){const r=getHeader(`Accepted-Language`,t);if(r){t.stash.__i18n={locale:r,errors:n?.errors&&Object.hasOwn(n.errors,r)?n.errors[r]:void 0,attributes:n?.attributes&&Object.hasOwn(n.attributes,r)?n.attributes[r]:void 0};return}t.stash.__i18n={locale:`en`,errors:n?.errors?.en,attributes:n?.attributes?.en}}export{localize};
package/dist/i18n.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"i18n.js","names":[],"sources":["../src/i18n.ts"],"sourcesContent":["import type { DefinedRecord, NestedKeyOf, ValidationErrors } from './types'\nimport { getHeader } from './utils'\n\nexport function localize<\n TLocales extends string[],\n T extends object,\n>(\n ctx: { args?: Partial<T>, request: { headers: any }, stash: Record<string, any> },\n i18n?: {\n errors?: Record<TLocales[number], DefinedRecord<Partial<ValidationErrors>>>\n attributes?: Record<TLocales[number], DefinedRecord<Partial<Record<`:${NestedKeyOf<T>}`, string>>>>\n },\n): void {\n const locale = getHeader('Accepted-Language', ctx)\n if (locale) {\n ctx.stash.__i18n = {\n locale,\n errors: i18n?.errors && Object.hasOwn(i18n.errors, locale)\n ? i18n.errors[locale as keyof typeof i18n.errors]\n : undefined,\n attributes: i18n?.attributes && Object.hasOwn(i18n.attributes, locale)\n ? i18n.attributes[locale as keyof typeof i18n.attributes]\n : undefined,\n }\n }\n}\n"],"mappings":"kCAGA,SAAgB,SAId,EACA,EAIM,CACN,MAAM,EAAS,UAAU,oBAAqB,EAAI,CAClD,GAAI,EACF,EAAI,MAAM,OAAS,CACjB,SACA,OAAQ,GAAM,QAAU,OAAO,OAAO,EAAK,OAAQ,EAAO,CACtD,EAAK,OAAO,GACZ,IAAA,GACJ,WAAY,GAAM,YAAc,OAAO,OAAO,EAAK,WAAY,EAAO,CAClE,EAAK,WAAW,GAChB,IAAA,GACL"}
1
+ {"version":3,"file":"i18n.js","names":[],"sources":["../src/i18n.ts"],"sourcesContent":["import type { Ctx, DefinedRecord, LocalizedCtx, NestedKeyOf, ValidationErrors } from './types'\nimport { getHeader } from './utils'\n\nexport function localize<\n T extends object,\n>(\n ctx: Ctx<T>,\n i18n?: {\n errors?: Record<string, DefinedRecord<Partial<ValidationErrors>>>\n attributes?: Record<string, DefinedRecord<Partial<Record<`:${NestedKeyOf<T>}`, string>>>>\n },\n): asserts ctx is Ctx<T> & LocalizedCtx<T, string> {\n const locale = getHeader('Accepted-Language', ctx)\n if (locale) {\n ctx.stash.__i18n = {\n locale,\n errors: i18n?.errors && Object.hasOwn(i18n.errors, locale)\n ? i18n.errors[locale as keyof typeof i18n.errors]\n : undefined,\n attributes: i18n?.attributes && Object.hasOwn(i18n.attributes, locale)\n ? i18n.attributes[locale as keyof typeof i18n.attributes]\n : undefined,\n }\n return\n }\n ctx.stash.__i18n = {\n locale: 'en',\n errors: i18n?.errors?.en,\n attributes: i18n?.attributes?.en,\n }\n}\n"],"mappings":"kCAGA,SAAgB,SAGd,EACA,EAIiD,CACjD,MAAM,EAAS,UAAU,oBAAqB,EAAI,CAClD,GAAI,EAAQ,CACV,EAAI,MAAM,OAAS,CACjB,SACA,OAAQ,GAAM,QAAU,OAAO,OAAO,EAAK,OAAQ,EAAO,CACtD,EAAK,OAAO,GACZ,IAAA,GACJ,WAAY,GAAM,YAAc,OAAO,OAAO,EAAK,WAAY,EAAO,CAClE,EAAK,WAAW,GAChB,IAAA,GACL,CACD,OAEF,EAAI,MAAM,OAAS,CACjB,OAAQ,KACR,OAAQ,GAAM,QAAQ,GACtB,WAAY,GAAM,YAAY,GAC/B"}
package/dist/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { a as FullRule, c as Rule, l as ValidationErrors, n as CustomFullRule, o as LocalizedCtx, r as DefinedRecord, s as NestedKeyOf, t as Ctx } from "./types-CN3uACtN.js";
1
+ import { a as FullRule, c as Rule, l as ValidationErrors, n as CustomFullRule, o as LocalizedCtx, r as DefinedRecord, s as NestedKeyOf, t as Ctx } from "./types-5wzYU-oa.js";
2
2
 
3
3
  //#region src/index.d.ts
4
4
  declare function validate<T extends object>(obj: Partial<T>, checks: Partial<Record<NestedKeyOf<T>, (FullRule | CustomFullRule | Omit<Rule<T>, "value">)[]>>, options?: {
@@ -20,7 +20,7 @@ declare function assertValidated<T extends object>(ctx: Ctx<T>): asserts ctx is
20
20
  __validated: T;
21
21
  };
22
22
  };
23
- declare function isLocalized<T extends object>(ctx: Ctx<T>): ctx is LocalizedCtx<T>;
24
- declare function assertLocalized<T extends object>(ctx: Ctx<T>): asserts ctx is LocalizedCtx<T>;
23
+ declare function isLocalized<T extends object, TLocale extends string>(ctx: Ctx<T>, locale?: TLocale): ctx is LocalizedCtx<T, TLocale>;
24
+ declare function assertLocalized<T extends object, TLocale extends string>(ctx: Ctx<T>, locale?: TLocale): asserts ctx is LocalizedCtx<T, TLocale>;
25
25
  //#endregion
26
26
  export { assertLocalized, assertValidated, formatAttributeName, isLocalized, precognitiveValidation, validate };
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","names":[],"sources":["../src/index.ts"],"sourcesContent":[],"mappings":";;;iBAagB,gCACT,QAAQ,YACL,QAAQ,OAAO,YAAY,KAAK,WAAW,iBAAiB,KAAK,KAAK,0BAA3C;;EAFrC,gBAAgB,CAAA,EAAA,OAAA;EACD,MAAA,CAAA,EAKF,aALE,CAKY,OALZ,CAKoB,gBALpB,CAAA,CAAA;EAAR,UAAA,CAAA,EAMU,aANV,CAMwB,OANxB,CAMgC,MANhC,CAAA,IAM2C,WAN3C,CAMuD,CANvD,CAAA,EAAA,EAAA,MAAA,CAAA,CAAA,CAAA;CAC8B,CAAA,EAOlC,CAPkC;AAAZ,iBA6ET,sBA7ES,CAAA,UAAA,MAAA,CAAA,CAAA,GAAA,EAgFlB,GAhFkB,CAgFd,CAhFc,CAAA,EAAA,MAAA,EAiFf,OAjFe,CAiFP,MAjFO,CAiFA,WAjFA,CAiFY,CAjFZ,CAAA,EAAA,CAiFiB,QAjFjB,GAiF4B,cAjF5B,GAiF6C,IAjF7C,CAiFkD,CAjFlD,CAAA,CAAA,EAAA,CAAA,CAAA,EAAA,OAAP,CAAO,EAAA;EAAiB,IAAA,CAAA,EAAA,OAAA;EAAW,gBAAA,CAAA,EAAA,OAAA;EAA2B,MAAA,CAAA,EAAA,KAAA,GAAA,MAAA;EAAL,MAAA,CAAA,EAsF9D,aAtF8D,CAsFhD,OAtFgD,CAsFxC,gBAtFwC,CAAA,CAAA;EAAL,UAAA,CAAA,EAuFrD,aAvFqD,CAuFvC,OAvFuC,CAuF/B,MAvF+B,CAAA,IAuFpB,WAvFoB,CAuFR,CAvFQ,CAAA,EAAA,EAAA,MAAA,CAAA,CAAA,CAAA;CAApD,CAAA,EAyFf,CAzFe;AAAR,iBAyIM,mBAAA,CAzIN,IAAA,EAAA,MAAA,CAAA,EAAA,MAAA;AAIyB,iBAqJnB,eArJmB,CAAA,UAAA,MAAA,CAAA,CAAA,GAAA,EAsJ5B,GAtJ4B,CAsJxB,CAtJwB,CAAA,CAAA,EAAA,QAAA,GAAA,IAuJjB,GAvJiB,CAuJb,CAvJa,CAAA,GAAA;EAAR,KAAA,EAAA;IAAd,WAAA,EAwJW,CAxJX;EACiD,CAAA;CAAZ;AAAX,iBA8JvB,WA9JuB,CAAA,UAAA,MAAA,CAAA,CAAA,GAAA,EA+JhC,GA/JgC,CA+J5B,CA/J4B,CAAA,CAAA,EAAA,GAAA,IAgK7B,YAhK6B,CAgKhB,CAhKgB,CAAA;AAAR,iBAoKf,eApKe,CAAA,UAAA,MAAA,CAAA,CAAA,GAAA,EAqKxB,GArKwB,CAqKpB,CArKoB,CAAA,CAAA,EAAA,QAAA,GAAA,IAsKb,YAtKa,CAsKA,CAtKA,CAAA"}
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../src/index.ts"],"sourcesContent":[],"mappings":";;;iBAagB,gCACT,QAAQ,YACL,QAAQ,OAAO,YAAY,KAAK,WAAW,iBAAiB,KAAK,KAAK,0BAA3C;;EAFrC,gBAAgB,CAAA,EAAA,OAAA;EACD,MAAA,CAAA,EAKF,aALE,CAKY,OALZ,CAKoB,gBALpB,CAAA,CAAA;EAAR,UAAA,CAAA,EAMU,aANV,CAMwB,OANxB,CAMgC,MANhC,CAAA,IAM2C,WAN3C,CAMuD,CANvD,CAAA,EAAA,EAAA,MAAA,CAAA,CAAA,CAAA;CAC8B,CAAA,EAOlC,CAPkC;AAAZ,iBAwFT,sBAxFS,CAAA,UAAA,MAAA,CAAA,CAAA,GAAA,EA2FlB,GA3FkB,CA2Fd,CA3Fc,CAAA,EAAA,MAAA,EA4Ff,OA5Fe,CA4FP,MA5FO,CA4FA,WA5FA,CA4FY,CA5FZ,CAAA,EAAA,CA4FiB,QA5FjB,GA4F4B,cA5F5B,GA4F6C,IA5F7C,CA4FkD,CA5FlD,CAAA,CAAA,EAAA,CAAA,CAAA,EAAA,OAAP,CAAO,EAAA;EAAiB,IAAA,CAAA,EAAA,OAAA;EAAW,gBAAA,CAAA,EAAA,OAAA;EAA2B,MAAA,CAAA,EAAA,KAAA,GAAA,MAAA;EAAL,MAAA,CAAA,EAiG9D,aAjG8D,CAiGhD,OAjGgD,CAiGxC,gBAjGwC,CAAA,CAAA;EAAL,UAAA,CAAA,EAkGrD,aAlGqD,CAkGvC,OAlGuC,CAkG/B,MAlG+B,CAAA,IAkGpB,WAlGoB,CAkGR,CAlGQ,CAAA,EAAA,EAAA,MAAA,CAAA,CAAA,CAAA;CAApD,CAAA,EAoGf,CApGe;AAAR,iBA4IM,mBAAA,CA5IN,IAAA,EAAA,MAAA,CAAA,EAAA,MAAA;AAIyB,iBAwJnB,eAxJmB,CAAA,UAAA,MAAA,CAAA,CAAA,GAAA,EAyJ5B,GAzJ4B,CAyJxB,CAzJwB,CAAA,CAAA,EAAA,QAAA,GAAA,IA0JjB,GA1JiB,CA0Jb,CA1Ja,CAAA,GAAA;EAAR,KAAA,EAAA;IAAd,WAAA,EA2JW,CA3JX;EACiD,CAAA;CAAZ;AAAX,iBAiKvB,WAjKuB,CAAR,UAAA,MAAA,EAAd,gBAAA,MAAA,CAEd,CAAA,GAAA,EAgKI,GAhKJ,CAgKQ,CAhKR,CAAA,EAAA,MAAA,CAAA,EAiKQ,OAjKR,CAAA,EAAA,GAAA,IAkKO,YAlKP,CAkKoB,CAlKpB,EAkKuB,OAlKvB,CAAA;AAAA,iBA2Ka,eA3Kb,CAiFH,UAAgB,MAAA,EAGL,gBAAA,MAAA,CAAJ,CAAA,GAAA,EAwFA,GAxFA,CAwFI,CAxFJ,CAAA,EAAA,MAAA,CAAA,EAyFI,OAzFJ,CAAA,EAAA,QAAA,GAAA,IA0FW,YA1FX,CA0FwB,CA1FxB,EA0F2B,OA1F3B,CAAA"}
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,k){const[N,...P]=typeof k===`string`?[k,void 0]:isArray(k)?[k[0],...k.slice(1)]:typeof k.rule===`string`?[k.rule,void 0]:[k.rule[0],...k.rule.slice(1)];switch(N){case`required`:return requiredRule(c);case`nullable`:return nullableRule(c);case`sometimes`:return sometimesRule(c);case`min`:case`bigger`:return betweenRule(c,P[0],void 0,N===`bigger`);case`max`:case`lower`:return betweenRule(c,void 0,P[0],N===`lower`);case`between`:case`within`:return betweenRule(c,P[0],P[1],N===`within`);case`regex`:return regexRule(c,...P);case`in`:return inRule(c,...P);case`notIn`:return notInRule(c,...P);case`before`:case`beforeOrEqual`:return beforeRule(c,P[0],N===`before`);case`after`:case`afterOrEqual`:return afterRule(c,P[0],N===`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,N)}}function betweenRule({value:c,msg:k,errors:A},j=-Infinity,M=Infinity,N=false){const[P,F]=[M===Infinity,j===-Infinity];const L={check:false,msg:k??P?N?A.biggerNumber:A.minNumber:F?N?A.lowerNumber:A.maxNumber:N?A.withinNumber:A.betweenNumber,value:c,params:{":min":`${j}`,":max":`${M}`}};if(typeof c===`number`)L.check=N?c>j&&c<M:c>=j&&c<=M;if(typeof c===`string`){L.check=c.length>=j&&c.length<=M;L.msg=k??P?A.minString:F?A.maxString:A.betweenString}if(isArray(c)){L.check=c.length>=j&&c.length<=M;L.msg=k??P?A.minArray:F?A.maxArray:A.betweenArray}return L}function regexRule({value:c,msg:k,errors:A},...j){const M={check:false,msg:k??(j.length===1?A.regex:A.regex_patterns),value:c,params:j.length===1?{":pattern":j[0]}:{":patterns":j.join(`, `)}};if(typeof c===`string`)M.check=j.some(k=>util.matches(k,c));if(typeof c===`number`)M.check=j.some(k=>util.matches(k,`${c}`));return M}function inRule({value:c,msg:k,errors:A},...j){return{check:j.includes(c),msg:k??A.in,value:c,params:{":in":j.join(`, `)}}}function notInRule({value:c,msg:k,errors:A},...j){return{check:!j.includes(c),msg:k??A.notIn,value:c,params:{":notIn":j.join(`, `)}}}function requiredRule({value:c,msg:k,errors:A}){const j={check:true,msg:k??A.required,value:c,skipNext:true};if(typeof c===`string`)j.check=c.length>0;if(isArray(c))j.check=c.length>0;if(typeof c===`number`)j.check=true;if(typeof c===`boolean`)j.check=true;if(typeof c===`object`&&!j.value)j.check=false;if(typeof c===`undefined`)j.check=false;j.skipNext=!j.check;return j}function nullableRule({value:c,msg:k,errors:A}){return{check:true,msg:k??A.nullable,value:c,skipNext:typeof c===`undefined`||c===null}}function sometimesRule({value:c,msg:k,errors:A}){const j={check:true,msg:k??A.sometimes,value:c};if(typeof c===`undefined`){j.skipNext=true;return j}if(typeof c===`object`&&!j.value){j.check=false;j.skipNext=true;return j}return requiredRule({value:c,msg:k,errors:A})}function typeRule({value:c,msg:k,errors:A},j){const M={check:false,msg:k??A.type,value:c,params:{":type":j}};switch(j){case`array`:M.check=isArray(c);break;case`object`:M.check=typeof c===`object`&&!!c&&!isArray(c)&&Object.keys(c).length>0;break;case`boolean`:M.check=typeof c===`boolean`;break;case`number`:M.check=typeof c===`number`;break;default:M.check=typeof c===`string`}return M}function beforeRule({value:c,msg:k,errors:A},j,M=false){const N={check:false,msg:k??A.before,value:c,params:M?{":before":j}:{":beforeOrEqual":j}};const P=util.time.parseISO8601ToEpochMilliSeconds(j);const F=typeof c===`string`?util.time.parseISO8601ToEpochMilliSeconds(c):c;if(typeof F===`number`)N.check=M?F<P:F<=P;return N}function afterRule({value:c,msg:k,errors:A},j,M=false){const N={check:false,msg:k??M?A.after:A.afterOrEqual,value:c,params:M?{":after":j}:{":afterOrEqual":j}};const P=util.time.parseISO8601ToEpochMilliSeconds(j);const F=typeof c===`string`?util.time.parseISO8601ToEpochMilliSeconds(c):c;if(typeof F===`number`)N.check=M?F>P:F>=P;return N}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(A,j,M){let N={};const F={...baseErrors,...M?.errors};Object.keys(j).forEach(c=>{const k=c.split(`.`);k.forEach((M,N)=>{if(M!==`*`||N===0)return;const F=getNestedValue(A,k.slice(0,N).join(`.`));if(!isArray(F))return;F.forEach((A,M)=>{const P=[...k];P[N]=`${M}`;j[P.join(`.`)]=j[c]});delete j[c]})});Object.keys(j).forEach(c=>{let I=getNestedValue(A,c);if(typeof I===`string`){I=cleanString(I,M);setNestedValue(A,c,I)}let L=false;j[c]?.forEach(k=>{if(L)return;const A=isRule(k)?{...k,value:I,msg:k.msg??F.invalid}:isCustomFullRule(k)?parse({value:I,msg:k.msg,errors:F},k.rule):parse({value:I,errors:F},k);L=!!A.skipNext||!A.check;if(A.check)return;if(N.msg)util.appendError(N.msg,N.errorType,N.data,N.errorInfo);A.params=A.params??{};if(util.matches(`:attr`,A.msg))A.params[`:attr`]=M?.attributes?.[`:${c}`]??formatAttributeName(c);N={msg:parseErrorMessage(A.msg,A.params),errorType:`ValidationError`,data:null,errorInfo:{path:c,value:I}}})});if(!N.msg)return A;util.error(N.msg,N.errorType,N.data,N.errorInfo)}function precognitiveValidation(c,k,A){const{errors:j,attributes:M}=isLocalized(c)?{errors:{...c.stash.__i18n.errors,...A?.errors},attributes:{...c.stash.__i18n.attributes,...A?.attributes}}:{errors:A?.errors,attributes:A?.attributes};if(getHeader(`precognition`,c)!==`true`){c.stash.__validated=validate(c.args,k,{...A,errors:j,attributes:M});return c.stash.__validated}const P=getHeader(`Precognition-Validate-Only`,c)?.split(`,`).map(c=>c.trim());util.http.addResponseHeader(`Precognition`,`true`);if(!P){c.stash.__validated=validate(c.args,k,{...A,errors:j,attributes:M});util.http.addResponseHeader(`Precognition-Success`,`true`);runtime.earlyReturn(null)}util.http.addResponseHeader(`Precognition-Validate-Only`,P.join(`,`));const F={};P.forEach(c=>{F[c]=k[c]});c.stash.__validated=validate(c.args,F,{...A,errors:j,attributes:M});util.http.addResponseHeader(`Precognition-Success`,`true`);runtime.earlyReturn(null,{skipTo:A?.skipTo??`END`})}function formatAttributeName(c){return c.split(`.`).reduce((c,k)=>{if(util.matches(`^\\d+$`,k))return c;let A=``;k.split(``).forEach((c,k)=>{if(k!==0&&util.matches(`[A-Z]`,c))A+=` `;A+=c.toLowerCase()});return c?`${c} ${A}`:A},``)}function assertValidated(c){if(Object.hasOwn(c.stash,`__validated`))return;util.error(`Context arguements have not been validated`)}function isLocalized(c){return Object.hasOwn(c.stash,`__i18n`)&&typeof c.stash?.__i18n.locale===`string`}function assertLocalized(c){if(isLocalized(c))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};sanitizeNestedArray(j,M);if(N?.attributes)sanitizeNestedArray(j,N.attributes);Object.keys(M).forEach(c=>{let L=getNestedValue(j,c);if(typeof L===`string`){L=cleanString(L,N);setNestedValue(j,c,L)}let R=false;M[c]?.forEach(A=>{if(R)return;const j=isRule(A)?{...A,value:L,msg:A.msg??I.invalid}:isCustomFullRule(A)?parse({value:L,msg:A.msg,errors:I},A.rule):parse({value:L,errors:I},A);R=!!j.skipNext||!j.check;if(j.check)return;if(P.msg)util.appendError(P.msg,P.errorType,P.data,P.errorInfo);j.params=j.params??{};if(util.matches(`:attr`,j.msg))j.params[`:attr`]=N?.attributes?.[`:${c}`]??formatAttributeName(c);P={msg:parseErrorMessage(j.msg,j.params),errorType:`ValidationError`,data:null,errorInfo:{path:c,value:L}}})});if(!P.msg)return j;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=I.startsWith(`:`)?getNestedValue(c,I.replace(`:`,``)):getNestedValue(c,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`});return c.stash.__validated}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 arguements 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","result: ParsedRule<T>","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, DefinedRecord, FullRule, LocalizedCtx, NestedKeyOf, ParsedRule, 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<T>(rule: FullRule | CustomFullRule | Omit<Rule<T>, 'value'>): rule is Omit<Rule<T>, 'value'> {\n return typeof rule === 'object' && !!rule && Object.hasOwn(rule, 'check')\n}\n\nfunction isCustomFullRule<T>(rule: FullRule | CustomFullRule | Omit<Rule<T>, 'value'>): rule is CustomFullRule {\n return typeof rule === 'object' && !!rule && Object.hasOwn(rule, 'rule')\n}\n\nexport function validate<T extends object>(\n obj: Partial<T>,\n checks: Partial<Record<NestedKeyOf<T>, (FullRule | CustomFullRule | Omit<Rule<T>, 'value'>)[]>>,\n options?: {\n trim?: boolean\n allowEmptyString?: boolean\n errors?: DefinedRecord<Partial<ValidationErrors>>\n attributes?: DefinedRecord<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 // Replace all array generic checks '*' with numbered checks\n Object.keys(checks).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(obj, parentPath as NestedKeyOf<T>)\n if (!isArray(parentValue))\n return\n\n parentValue.forEach((_, i) => {\n const idxPath = [...keys]\n idxPath[idx] = `${i}`\n checks[idxPath.join('.') as NestedKeyOf<T>] = checks[path as NestedKeyOf<T>]\n })\n delete checks[path as NestedKeyOf<T>]\n })\n })\n\n Object.keys(checks).forEach((path) => {\n let value = getNestedValue(obj, path as NestedKeyOf<T>)\n if (typeof value === 'string') {\n value = cleanString(value, options)\n setNestedValue(obj, path as NestedKeyOf<T>, value)\n }\n\n let skip = false\n checks[path as NestedKeyOf<T>]?.forEach((rule) => {\n if (skip)\n return\n\n const result: ParsedRule<T> = isRule(rule)\n ? { ...rule, value, msg: rule.msg ?? errors.invalid }\n : isCustomFullRule(rule)\n ? rules.parse<T>({ value, msg: rule.msg, errors }, rule.rule)\n : rules.parse<T>({ 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 if (util.matches(':attr', result.msg))\n result.params[':attr'] = options?.attributes?.[`:${path}`] ?? 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 obj as T\n }\n\n util.error(error.msg, error.errorType, error.data, error.errorInfo)\n}\n\nexport function precognitiveValidation<\n T extends object,\n>(\n ctx: Ctx<T>,\n checks: Partial<Record<NestedKeyOf<T>, (FullRule | CustomFullRule | Rule<T>)[]>>,\n options?: {\n trim?: boolean\n allowEmptyString?: boolean\n skipTo?: 'END' | 'NEXT'\n errors?: DefinedRecord<Partial<ValidationErrors>>\n attributes?: DefinedRecord<Partial<Record<`:${NestedKeyOf<T>}`, string>>>\n },\n): T {\n const { errors, attributes } = isLocalized(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 } as {\n errors: DefinedRecord<Partial<ValidationErrors>>\n attributes: DefinedRecord<Partial<Record<`:${NestedKeyOf<T>}`, string>>>\n }\n : { errors: options?.errors, attributes: options?.attributes } as {\n errors: DefinedRecord<Partial<ValidationErrors>>\n attributes: DefinedRecord<Partial<Record<`:${NestedKeyOf<T>}`, string>>>\n }\n if (getHeader('precognition', ctx) !== 'true') {\n ctx.stash.__validated = validate<T>(\n ctx.args,\n checks,\n { ...options, errors, attributes },\n )\n return ctx.stash.__validated\n }\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 NestedKeyOf<T>] = checks[key as NestedKeyOf<T>]\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<T extends object>(\n ctx: Ctx<T>,\n): asserts ctx is Ctx<T> & {\n stash: { __validated: T }\n} {\n if (Object.hasOwn(ctx.stash, '__validated'))\n return\n util.error('Context arguements have not been validated')\n}\n\nexport function isLocalized<T extends object>(\n ctx: Ctx<T>,\n): ctx is LocalizedCtx<T> {\n return Object.hasOwn(ctx.stash, '__i18n') && typeof ctx.stash?.__i18n.locale === 'string'\n}\n\nexport function assertLocalized<T extends object>(\n ctx: Ctx<T>,\n): asserts ctx is LocalizedCtx<T> {\n if (isLocalized(ctx))\n return\n util.error('Context arguements have not been localized')\n}\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","result: ParsedRule<T>","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, DefinedRecord, FullRule, LocalizedCtx, NestedKeyOf, ParsedRule, 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<T>(rule: FullRule | CustomFullRule | Omit<Rule<T>, 'value'>): rule is Omit<Rule<T>, 'value'> {\n return typeof rule === 'object' && !!rule && Object.hasOwn(rule, 'check')\n}\n\nfunction isCustomFullRule<T>(rule: FullRule | CustomFullRule | Omit<Rule<T>, 'value'>): rule is CustomFullRule {\n return typeof rule === 'object' && !!rule && Object.hasOwn(rule, 'rule')\n}\n\nexport function validate<T extends object>(\n obj: Partial<T>,\n checks: Partial<Record<NestedKeyOf<T>, (FullRule | CustomFullRule | Omit<Rule<T>, 'value'>)[]>>,\n options?: {\n trim?: boolean\n allowEmptyString?: boolean\n errors?: DefinedRecord<Partial<ValidationErrors>>\n attributes?: DefinedRecord<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 Object.keys(checks).forEach((path) => {\n let value = getNestedValue(obj, path as NestedKeyOf<T>)\n if (typeof value === 'string') {\n value = cleanString(value, options)\n setNestedValue(obj, path as NestedKeyOf<T>, value)\n }\n\n let skip = false\n checks[path as NestedKeyOf<T>]?.forEach((rule) => {\n if (skip)\n return\n\n const result: ParsedRule<T> = isRule(rule)\n ? { ...rule, value, msg: rule.msg ?? errors.invalid }\n : isCustomFullRule(rule)\n ? rules.parse<T>({ value, msg: rule.msg, errors }, rule.rule)\n : rules.parse<T>({ 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}`] ?? 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 obj as T\n }\n\n util.error(error.msg, error.errorType, error.data, error.errorInfo)\n}\n\nfunction sanitizeNestedArray<T extends object>(\n obj: T,\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 = parentPath.startsWith(':')\n ? getNestedValue(obj, parentPath.replace(':', '') as NestedKeyOf<T>)\n : getNestedValue(obj, parentPath as NestedKeyOf<T>)\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<\n T extends object,\n>(\n ctx: Ctx<T>,\n checks: Partial<Record<NestedKeyOf<T>, (FullRule | CustomFullRule | Rule<T>)[]>>,\n options?: {\n trim?: boolean\n allowEmptyString?: boolean\n skipTo?: 'END' | 'NEXT'\n errors?: DefinedRecord<Partial<ValidationErrors>>\n attributes?: DefinedRecord<Partial<Record<`:${NestedKeyOf<T>}`, string>>>\n },\n): T {\n const { errors, attributes } = (isLocalized(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: DefinedRecord<Partial<ValidationErrors>>\n attributes: DefinedRecord<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 NestedKeyOf<T>] = checks[key as NestedKeyOf<T>]\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 return ctx.stash.__validated\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<T extends object>(\n ctx: Ctx<T>,\n): asserts ctx is Ctx<T> & {\n stash: { __validated: T }\n} {\n if (Object.hasOwn(ctx.stash, '__validated'))\n return\n util.error('Context arguements have not been validated')\n}\n\nexport function isLocalized<T extends object, TLocale extends string>(\n ctx: Ctx<T>,\n locale?: TLocale,\n): ctx is LocalizedCtx<T, TLocale> {\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<T extends object, TLocale extends string>(\n ctx: Ctx<T>,\n locale?: TLocale,\n): asserts ctx is LocalizedCtx<T, TLocale> {\n if (isLocalized(ctx, locale))\n return\n util.error('Context arguements have not been localized')\n}\n"],"mappings":"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"}
@@ -92,20 +92,21 @@ interface Ctx<T extends object> {
92
92
  args: T;
93
93
  stash: Record<string, any>;
94
94
  }
95
+ interface I18n<T extends object, TLocale extends string> {
96
+ locale: TLocale;
97
+ errors?: Record<string, DefinedRecord<Partial<ValidationErrors>>>;
98
+ attributes?: Record<string, DefinedRecord<Partial<Record<`:${NestedKeyOf<T>}`, string>>>>;
99
+ }
100
+ type LocalizedCtx<T extends object, TLocale extends string> = Ctx<T> & {
101
+ stash: {
102
+ __i18n: I18n<T, TLocale>;
103
+ };
104
+ };
95
105
  type ArrayKeys<T extends unknown[]> = T extends [unknown, ...unknown[]] ? T extends Record<infer Index, unknown> ? Index extends `${number}` ? Index | "*" : never : never : `${number}` | "*";
96
106
  type ObjectKeys<T extends object> = T extends unknown[] ? ArrayKeys<T> : keyof T & string;
97
107
  interface HasConstructor {
98
108
  new (...args: unknown[]): unknown;
99
109
  }
100
- type NestedKeyOf<T> = T extends Record<infer Key, unknown> ? T extends HasConstructor ? never : T extends CallableFunction ? never : Key extends string | number ? (ObjectKeys<T> | (T[Key] extends object ? `${ObjectKeys<Pick<T, Key>>}.${NestedKeyOf<T[Key]>}` : T extends unknown[] ? T extends [unknown, ...unknown[]] ? never : T[number] extends object ? `${number}.${NestedKeyOf<T[number]>}` : never : never)) : never : never;
101
- type LocalizedCtx<T extends object> = Ctx<T> & {
102
- stash: {
103
- __i18n: {
104
- locale: string;
105
- errors?: DefinedRecord<Partial<ValidationErrors>>;
106
- attributes?: DefinedRecord<Partial<Record<`:${NestedKeyOf<T>}`, string>>>;
107
- };
108
- };
109
- };
110
+ type NestedKeyOf<T> = T extends Record<infer Key, unknown> ? T extends HasConstructor ? never : T extends CallableFunction ? never : Key extends string | number ? (ObjectKeys<T> | (T[Key] extends object ? `${ObjectKeys<Pick<T, Key>>}.${NestedKeyOf<T[Key]>}` : T extends unknown[] ? T extends [unknown, ...unknown[]] ? never : T[number] extends object ? `${number}.${NestedKeyOf<T[number]>}` | `*.${NestedKeyOf<T[number]>}` : never : never)) : never : never;
110
111
  //#endregion
111
112
  export { FullRule as a, Rule as c, ErrorMsgParams as i, ValidationErrors as l, CustomFullRule as n, LocalizedCtx as o, DefinedRecord as r, NestedKeyOf as s, Ctx as t };
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types-5wzYU-oa.d.ts","names":[],"sources":["../src/types.ts"],"sourcesContent":[],"mappings":"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"}
package/dist/utils.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { i as ErrorMsgParams, l as ValidationErrors, s as NestedKeyOf } from "./types-CN3uACtN.js";
1
+ import { i as ErrorMsgParams, l as ValidationErrors, s as NestedKeyOf } from "./types-5wzYU-oa.js";
2
2
 
3
3
  //#region src/utils.d.ts
4
4
  declare function isArray(value: unknown): value is unknown[];
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@sot1986/appsync-precognition",
3
3
  "type": "module",
4
- "version": "0.5.0",
4
+ "version": "0.5.2",
5
5
  "description": "JavaScript resolver validation utilities for AWS AppSync",
6
6
  "author": "sot1986",
7
7
  "license": "MIT",
@@ -1 +0,0 @@
1
- {"version":3,"file":"types-CN3uACtN.d.ts","names":[],"sources":["../src/types.ts"],"sourcesContent":[],"mappings":";AAEY,KAAA,aAAA,CAAA,UAAwB,OAAxB,CAAgC,MAAhC,CAAA,MAAA,EAAA,GAAA,CAAA,CAAA,CAAA,GAAwD,CAAxD,GAA4D,MAA5D,CAAA,MAAA,EAAA,MAAA,CAAA;AAAgC,KAEhC,QAAA,GAFgC,UAAA,GAAA,UAAA,GAAA,WAAA,GAAA,QAAA,GAAA,SAAA,GAAA,QAAA,GAAA,OAAA,GAAA,QAAA,GAAA,KAAA,GAAA,OAAA,GAAA,MAAA,GAAA,MAAA,GAAA,MAAA,GAAA,UAAA,GAAA,MAAA,GAAA,SAAA,GAAA,SAAA,GAAA,OAAA,GAAA,CAAA,KAAA,EAAA,MAAA,CAAA,GAAA,CAAA,KAAA,EAAA,MAAA,CAAA,GAAA,CAAA,QAAA,EAAA,MAAA,CAAA,GAAA,CAAA,OAAA,EAAA,MAAA,CAAA,GAAA,CAAA,SAAA,EAAA,MAAA,EAAA,MAAA,CAAA,GAAA,CAAA,QAAA,EAAA,MAAA,EAAA,MAAA,CAAA,GAAA,CAAA,OAAA,EAAA,GAAA,MAAA,EAAA,CAAA,GAAA,CAAA,IAAA,EAAA,GAAA,CAAA,MAAA,GAAA,MAAA,GAAA,OAAA,GAAA,IAAA,CAAA,EAAA,CAAA,GAAA,CAAA,OAAA,EAAA,GAAA,CAAA,MAAA,GAAA,MAAA,GAAA,OAAA,GAAA,IAAA,CAAA,EAAA,CAAA,GAAA,CAAA,OAAA,EAAA,MAAA,CAAA,GAAA,CAAA,QAAA,EAAA,MAAA,CAAA,GAAA,CAAA,cAAA,EAAA,MAAA,CAAA,GAAA,CAAA,eAAA,EAAA,MAAA,CAAA;AAAR,UAmCnB,cAAA,CAnCmB;EAAgC,IAAA,EAoC5D,QApC4D;EAAI,GAAA,CAAA,EAAA,MAAA;EAAA,QAAA,CAAA,EAAA,OAAA;AAExE;AAiCiB,UAMA,IANA,CAAA,IAAA,OACT,CAAA,CAAA;EAKR,KAAiB,EAAA,OAAA;EAOjB,KAAY,EALH,CAKG;EAUZ,GAAiB,CAAA,EAAA,MAAA;EA+EjB,QAAiB,CAAA,EAAA,OAAA;;AAOb,KAhGQ,cAAA,GAAiB,MAgGzB,CAAA,IAAA,MAAA,EAAA,EAAA,MAAA,CAAA;AAUE,UAhGW,gBAAA,CAgGX;EACM;EAAA,SAAA,EAAA,MAAA;EAAA;EAMZ,SAAY,EAAA,MAAA;EAAiB;EAAU,aAAA,EAAA,MAAA;EACnC;EAAU,YAAA,EAAA,MAAA;EAER;EAAU,WAAA,EAAA,MAAA;EAGM;EAAX,YAAA,EAAA,MAAA;EAAiB;EAAE,SAAA,EAAA,MAAA;EACG;EAAG,SAAA,EAAA,MAAA;EAAR;EAAX,aAAA,EAAA,MAAA;EAAwC;EAAE,QAAA,EAAA,MAAA;EAAd;EAC/B,QAAA,EAAA,MAAA;EACE;EAEE,YAAA,EAAA,MAAA;EAC2B;EAAZ,EAAA,EAAA,MAAA;EAAA;EAMjC,KAAY,EAAA,MAAA;EAAqC;EAAJ,KAAA,EAAA,MAAA;EAIR;EAAR,KAAA,EAAA,MAAA;EAAd;EACiD,GAAA,EAAA,MAAA;EAAZ;EAAX,IAAA,EAAA,MAAA;EAAR;EAAd,IAAA,EAAA,MAAA;EAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;UA/CF;;;;QAET;SACC;;KAGJ,iCACD,oCACE,UAAU,2DAEN;KAKL,+BACD,sBACE,UAAU,WACJ;UAEF,cAAA;;;KAIE,iBAAiB,UAAU,6BACnC,UAAU,yBAER,UAAU,0DAGL,WAAW,MAAM,EAAE,yBACb,WAAW,KAAK,GAAG,SAAS,YAAY,EAAE,UAC7C,sBACE,4CAEE,wCACe,YAAY;KAMjC,iCAAiC,IAAI;;;;eAIlC,cAAc,QAAQ;mBAClB,cAAc,QAAQ,WAAW,YAAY"}