@zipbul/baker 2.2.0 → 3.0.1

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.
Files changed (86) hide show
  1. package/CHANGELOG.md +263 -0
  2. package/README.md +132 -69
  3. package/dist/index.d.ts +7 -6
  4. package/dist/index.js +10 -321
  5. package/dist/src/collect.d.ts +13 -10
  6. package/dist/src/collect.js +26 -0
  7. package/dist/src/configure.d.ts +8 -6
  8. package/dist/src/configure.js +43 -0
  9. package/dist/src/create-rule.js +41 -0
  10. package/dist/src/decorators/field.d.ts +22 -18
  11. package/dist/src/decorators/field.js +268 -0
  12. package/dist/src/decorators/index.d.ts +1 -0
  13. package/dist/src/decorators/index.js +2 -2
  14. package/dist/src/decorators/recipe.d.ts +17 -0
  15. package/dist/src/decorators/recipe.js +23 -0
  16. package/dist/src/errors.d.ts +27 -17
  17. package/dist/src/errors.js +52 -0
  18. package/dist/src/functions/check-call-options.d.ts +8 -0
  19. package/dist/src/functions/check-call-options.js +51 -0
  20. package/dist/src/functions/deserialize.d.ts +13 -6
  21. package/dist/src/functions/deserialize.js +57 -0
  22. package/dist/src/functions/serialize.d.ts +10 -4
  23. package/dist/src/functions/serialize.js +52 -0
  24. package/dist/src/functions/validate.d.ts +13 -10
  25. package/dist/src/functions/validate.js +49 -0
  26. package/dist/src/interfaces.d.ts +1 -1
  27. package/dist/src/interfaces.js +4 -0
  28. package/dist/src/meta-access.d.ts +19 -0
  29. package/dist/src/meta-access.js +75 -0
  30. package/dist/src/registry.js +8 -0
  31. package/dist/src/rule-metadata.d.ts +11 -0
  32. package/dist/src/rule-metadata.js +17 -0
  33. package/dist/src/rule-plan.d.ts +10 -11
  34. package/dist/src/rule-plan.js +117 -0
  35. package/dist/src/rules/array.d.ts +7 -6
  36. package/dist/src/rules/array.js +96 -0
  37. package/dist/src/rules/common.js +77 -0
  38. package/dist/src/rules/date.js +35 -0
  39. package/dist/src/rules/index.d.ts +2 -4
  40. package/dist/src/rules/index.js +8 -21
  41. package/dist/src/rules/locales.d.ts +5 -4
  42. package/dist/src/rules/locales.js +249 -0
  43. package/dist/src/rules/number.js +79 -0
  44. package/dist/src/rules/object.d.ts +1 -1
  45. package/dist/src/rules/object.js +49 -0
  46. package/dist/src/rules/string.d.ts +83 -80
  47. package/dist/src/rules/string.js +1998 -0
  48. package/dist/src/rules/typechecker.js +143 -0
  49. package/dist/src/seal/circular-analyzer.js +63 -0
  50. package/dist/src/seal/codegen-utils.js +18 -0
  51. package/dist/src/seal/deserialize-builder.d.ts +8 -4
  52. package/dist/src/seal/deserialize-builder.js +1546 -0
  53. package/dist/src/seal/expose-validator.d.ts +3 -2
  54. package/dist/src/seal/expose-validator.js +65 -0
  55. package/dist/src/seal/seal-state.d.ts +10 -0
  56. package/dist/src/seal/seal-state.js +18 -0
  57. package/dist/src/seal/seal.d.ts +22 -21
  58. package/dist/src/seal/seal.js +431 -0
  59. package/dist/src/seal/serialize-builder.d.ts +3 -2
  60. package/dist/src/seal/serialize-builder.js +374 -0
  61. package/dist/src/seal/validate-meta.d.ts +13 -0
  62. package/dist/src/seal/validate-meta.js +61 -0
  63. package/dist/src/symbols.d.ts +1 -1
  64. package/dist/src/symbols.js +13 -2
  65. package/dist/src/transformers/collection.transformer.js +25 -0
  66. package/dist/src/transformers/date.transformer.js +18 -0
  67. package/dist/src/transformers/index.js +6 -2
  68. package/dist/src/transformers/luxon.transformer.d.ts +4 -2
  69. package/dist/src/transformers/luxon.transformer.js +34 -0
  70. package/dist/src/transformers/moment.transformer.d.ts +4 -2
  71. package/dist/src/transformers/moment.transformer.js +32 -0
  72. package/dist/src/transformers/number.transformer.js +8 -0
  73. package/dist/src/transformers/string.transformer.js +12 -0
  74. package/dist/src/types.d.ts +27 -25
  75. package/dist/src/types.js +1 -0
  76. package/dist/src/utils.d.ts +2 -2
  77. package/dist/src/utils.js +10 -0
  78. package/package.json +80 -68
  79. package/dist/index-03cysbck.js +0 -3
  80. package/dist/index-dcbd798a.js +0 -3
  81. package/dist/index-jp2yjd6g.js +0 -3
  82. package/dist/index-mw7met6r.js +0 -3
  83. package/dist/index-xdn55cz3.js +0 -1
  84. package/dist/src/functions/_run-sealed.d.ts +0 -7
  85. package/dist/src/functions/index.d.ts +0 -3
  86. package/dist/src/seal/index.d.ts +0 -5
package/dist/index.d.ts CHANGED
@@ -1,12 +1,13 @@
1
- export { deserialize } from './src/functions/deserialize';
2
- export { validate } from './src/functions/validate';
3
- export { serialize } from './src/functions/serialize';
1
+ export { deserialize, deserializeSync, deserializeAsync } from './src/functions/deserialize';
2
+ export { validate, validateSync, validateAsync } from './src/functions/validate';
3
+ export { serialize, serializeSync, serializeAsync } from './src/functions/serialize';
4
4
  export { configure } from './src/configure';
5
5
  export { createRule } from './src/create-rule';
6
- export { Field, arrayOf } from './src/decorators/index';
6
+ export { seal } from './src/seal/seal';
7
+ export { Field, arrayOf, Recipe } from './src/decorators/index';
7
8
  export type { FieldOptions, ArrayOfMarker } from './src/decorators/index';
8
- export type { BakerError, BakerErrors } from './src/errors';
9
- export { isBakerError, SealError } from './src/errors';
9
+ export type { BakerIssue, BakerIssueSet } from './src/errors';
10
+ export { isBakerIssueSet, BakerError } from './src/errors';
10
11
  export type { EmittableRule, Transformer, TransformParams } from './src/types';
11
12
  export type { BakerConfig } from './src/configure';
12
13
  export type { RuntimeOptions } from './src/interfaces';
package/dist/index.js CHANGED
@@ -1,321 +1,10 @@
1
- // @bun
2
- import"./index-xdn55cz3.js";import{i as qJ}from"./index-dcbd798a.js";import{j as v,k as i,l as TJ,m as HQ,n as jQ}from"./index-03cysbck.js";import{o as K,p as h}from"./index-jp2yjd6g.js";import"./index-mw7met6r.js";import{isErr as AJ}from"@zipbul/result";var JJ=Symbol.for("baker:error");function IJ(X){return X!=null&&typeof X==="object"&&JJ in X}function g(X){return{[JJ]:!0,errors:X}}class O extends Error{constructor(X){super(X);this.name="SealError"}}var QJ={};function bJ(X){if(XJ())throw new O("[baker] configure() called after auto-seal. Already-sealed classes are not affected. Call configure() before the first deserialize/serialize/validate.");QJ={enableImplicitConversion:X.autoConvert??!1,exposeDefaultValues:X.allowClassDefaults??!1,stopAtFirstError:X.stopAtFirstError??!1,whitelist:X.forbidUnknown??!1,debug:X.debug??!1}}function d(){return QJ}import{err as GJ,isErr as VJ}from"@zipbul/result";function I(X){return X.replace(/[^a-zA-Z0-9_]/g,(J)=>`$${J.charCodeAt(0)}$`)}function y(X,J,U){return U.map((Y)=>{let W=JSON.stringify(Y);return`(${X}===${W} || (${J} && ${J}.has(${W})))`}).join(" || ")}var $={field:"__bk$f_",index:"__bk$i_",setIdx:"__bk$si_",setVal:"__bk$sv_",mapIdx:"__bk$mi_",mapVal:"__bk$mv_",mark:"__bk$mark_",skip:"__bk$skip_",result:"__bk$r_",errors:"__bk$re_",arr:"__bk$arr_",disc:"__bk$dt_",nestedIdx:"__bk$j_",out:"__bk$out",errList:"__bk$errors",groups:"__bk$groups",group0:"__bk$group0",groupsSet:"__bk$groupsSet",key:"__bk$k"};function C(X,J,U,Z){return`if(${U}.message===undefined&&${U}.context===undefined){${X}.push({path:${J},code:${U}.code});}
3
- else{var ${Z}={path:${J},code:${U}.code};
4
- if(${U}.message!==undefined)${Z}.message=${U}.message;
5
- if(${U}.context!==undefined)${Z}.context=${U}.context;
6
- ${X}.push(${Z});}
7
- `}function N(X,J,U,Z){let Y=(W)=>Z?`return ${W};
8
- `:`return _err(${W});
9
- `;return`if(${J}.message===undefined&&${J}.context===undefined)${Y(`[{path:${X},code:${J}.code}]`)} var ${U}={path:${X},code:${J}.code};
10
- if(${J}.message!==undefined)${U}.message=${J}.message;
11
- if(${J}.context!==undefined)${U}.context=${J}.context;
12
- ${Y(`[${U}]`)}`}function gJ(X,J){return $.field+(J||"")+I(X)}function HJ(X,J){let U=J.find((Y)=>Y.deserializeOnly&&Y.name);if(U)return U.name;let Z=J.find((Y)=>!Y.deserializeOnly&&!Y.serializeOnly&&Y.name);if(Z)return Z.name;return X}function jJ(X){let J=X.filter((Z)=>!Z.serializeOnly);if(J.length===0)return;if(J.some((Z)=>!Z.groups||Z.groups.length===0))return;let U=new Set;for(let Z of J)for(let Y of Z.groups)U.add(Y);return[...U]}function t(X,J,U,Z,Y,W=!1){let F=U?.stopAtFirstError??!1,Q=!F,q=U?.exposeDefaultValues??!1,B=[],M=[],j=[],P=W?(L)=>L:(L)=>`_err(${L})`,z=`'use strict';
13
- `;if(W){if(q)z+=`var __bk$defs = new _Cls();
14
- `}else z+=q?`var ${$.out} = new _Cls();
15
- `:`var ${$.out} = Object.create(_Cls.prototype);
16
- `;if(Q)z+=`var ${$.errList} = [];
17
- `;z+=`if (input == null || typeof input !== 'object' || Array.isArray(input)) return ${P("[{path:'',code:'invalidInput'}]")};
18
- `;let H=-1;if(Z)M.push(new WeakSet),H=M.length-1,z+=`if (_refs[${H}].has(input)) return ${P("[{path:'',code:'circular'}]")};
19
- `,z+=`_refs[${H}].add(input);
20
- `,z+=`try {
21
- `;if(U?.whitelist){let L=new Set;for(let[T,S]of Object.entries(J)){let b=HJ(T,S.expose);L.add(b)}let A=M.length;if(M.push(L),Q)z+=`for (var ${$.key} of Object.keys(input)) { if (!_refs[${A}].has(${$.key})) ${$.errList}.push({path:${$.key},code:'whitelistViolation'}); }
22
- `;else z+=`for (var ${$.key} of Object.keys(input)) { if (!_refs[${A}].has(${$.key})) return ${P(`[{path:${$.key},code:'whitelistViolation'}]`)}; }
23
- `}if(Object.values(J).some((L)=>{let A=jJ(L.expose);if(A&&A.length>0)return!0;if(L.validation.some((T)=>T.groups&&T.groups.length>0))return!0;return!1}))z+=`var ${$.groups} = _opts && _opts.groups;
24
- `,z+=`var ${$.group0} = ${$.groups} && ${$.groups}.length === 1 ? ${$.groups}[0] : null;
25
- `,z+=`var ${$.groupsSet} = ${$.groups} && ${$.groups}.length > 1 ? new Set(${$.groups}) : null;
26
- `;for(let[L,A]of Object.entries(J)){let T=WJ(L,A,{stopAtFirstError:F,collectErrors:Q,exposeDefaultValues:q,isAsync:Y,regexes:B,refs:M,execs:j,options:U,validateOnly:W});z+=T}if(Q)z+=`if (${$.errList}.length) return ${W?$.errList:`_err(${$.errList})`};
27
- `;if(z+=`return ${W?"null":$.out};
28
- `,Z)z+=`} finally { _refs[${H}].delete(input); }
29
- `;return z+=`//# sourceURL=baker://${X.name}/${W?"validate":"deserialize"}
30
- `,Function("_Cls","_re","_refs","_execs","_err","_isErr",`return ${Y?"async function":"function"}(input, _opts) { `+z+" }")(X,B,M,j,GJ,VJ)}function FJ(X,J,U,Z,Y){return t(X,J,U,Z,Y,!0)}function kJ(X,J,U){if(X&&J)return"nullable+optional";if(X)return"nullable";if(U)return"defined";if(J)return"optional";return"default"}var KJ={"nullable+optional"({varName:X,assignNull:J,validationCode:U}){let Z=`if (${X} === null) { ${J}}
31
- `;return Z+=`else if (${X} !== undefined) {
32
- `,Z+=U,Z+=`}
33
- `,Z},nullable({varName:X,emitCtx:J,assignNull:U,validationCode:Z}){let Y=`if (${X} === undefined) ${J.fail("isDefined")};
34
- `;return Y+=`else if (${X} !== null) {
35
- `,Y+=Z,Y+=`} else { ${U}}
36
- `,Y},defined({varName:X,emitCtx:J,validationCode:U}){let Z=`if (${X} === undefined) ${J.fail("isDefined")};
37
- `;return Z+=U,Z},optional({varName:X,validationCode:J}){let U=`if (${X} !== undefined && ${X} !== null) {
38
- `;return U+=J,U+=`}
39
- `,U},default({varName:X,emitCtx:J,validationCode:U}){let Z=`if (${X} === undefined || ${X} === null) ${J.fail("isDefined")};
40
- `;return Z+=`else {
41
- `,Z+=U,Z+=`}
42
- `,Z}};function WJ(X,J,U){let{collectErrors:Z,exposeDefaultValues:Y}=U;if(J.exclude){if(!J.exclude.serializeOnly){if(U.options?.debug){let S=J.exclude.deserializeOnly?"deserializeOnly":"bidirectional";return`// [baker] field "${X}" excluded (${S} @Exclude)
43
- `}return""}}if(J.expose.length>0&&J.expose.every((S)=>S.serializeOnly)){if(U.options?.debug)return`// [baker] field "${X}" excluded (all @Expose entries are serializeOnly)
44
- `;return""}let W=gJ(X,U.varPrefix),F=HJ(X,J.expose),Q=jJ(J.expose),q=U.inputExpr||"input",B=lJ(X,U),M="",j=null;if(J.flags.validateIf)j=U.refs.length,U.refs.push(J.flags.validateIf);let P;if(Y&&!J.flags.isOptional){let S=U.validateOnly?"__bk$defs":$.out;P=`var ${W} = (${JSON.stringify(F)} in ${q}) ? ${q}[${JSON.stringify(F)}] : ${S}[${JSON.stringify(X)}];
45
- `}else P=`var ${W} = ${q}[${JSON.stringify(F)}];
46
- `;let z="",H="";if(Q&&Q.length>0)z=`if ((${$.group0} !== null || ${$.groupsSet}) && (${y($.group0,$.groupsSet,Q)})) {
47
- `,H=`}
48
- `;let R=P,_=!!(J.flags.isOptional&&!J.flags.isDefined),D=J.flags.isNullable===!0,L=EJ(X,W,J,U,B,Q),A=U.validateOnly?"":`${$.out}[${JSON.stringify(X)}] = null;
49
- `,T=kJ(D,_,J.flags.isDefined??!1);if(R+=KJ[T]({varName:W,emitCtx:B,assignNull:A,validationCode:L}),j!==null)M+=z+`if (_refs[${j}](${q})) {
50
- `+R+`}
51
- `+H;else M+=z+R+H;return M}function EJ(X,J,U,Z,Y,W){let{collectErrors:F,execs:Q}=Z,q="",B=U.transform.filter((M)=>!M.options?.serializeOnly);if(B.length>0)if(B.length===1){let M=B[0],j=Z.refs.length;Z.refs.push(M.fn);let P=`_refs[${j}]({value:${J},key:${JSON.stringify(X)},obj:${Z.inputExpr||"input"}})`;q+=`${J} = ${M.isAsync?"await ":""}${P};
52
- `}else if(B.length===2){let M=B[0],j=B[1],P=Z.refs.length;Z.refs.push(M.fn);let z=Z.refs.length;Z.refs.push(j.fn);let H=`_refs[${P}]({value:${J},key:${JSON.stringify(X)},obj:${Z.inputExpr||"input"}})`,R=M.isAsync?`await ${H}`:H,_=`_refs[${z}]({value:${R},key:${JSON.stringify(X)},obj:${Z.inputExpr||"input"}})`;q+=`${J} = ${j.isAsync?"await ":""}${_};
53
- `}else for(let M of B){let j=Z.refs.length;Z.refs.push(M.fn);let P=`_refs[${j}]({value:${J},key:${JSON.stringify(X)},obj:${Z.inputExpr||"input"}})`;q+=`${J} = ${M.isAsync?"await ":""}${P};
54
- `}if(U.type?.collection)return q+=Z.validateOnly?iJ(X,J,U,Z,Y):mJ(X,J,U,Z,Y),q;if(U.flags.validateNested&&U.type?.fn)return q+=Z.validateOnly?oJ(X,J,U,Z,Y):cJ(X,J,U,Z,Y),q;if(U.validation.length===0){if(!Z.validateOnly)q+=`${$.out}[${JSON.stringify(X)}] = ${J};
55
- `;return q}return q+=nJ(X,J,U.validation,F,Y,Z,U,W),q}function r(X,J,U,Z){let Y="";if(typeof X.message==="string")Y+=`,message:${JSON.stringify(X.message)}`;else if(typeof X.message==="function"){let W=Z.refs.length;Z.refs.push(X.message);let F=Z.refs.length;Z.refs.push(X.rule.constraints??{}),Y+=`,message:_refs[${W}]({property:${JSON.stringify(J)},value:${U},constraints:_refs[${F}]})`}if(X.context!==void 0){let W=Z.refs.length;Z.refs.push(X.context),Y+=`,context:_refs[${W}]`}return Y}function BJ(X,J,U,Z,Y){let W=r(Z,J,U,Y);if(!W)return X;let F=X._pathExpr??JSON.stringify(J);return{...X,fail(Q){if(X.collectErrors)return`${$.errList}.push({path:${F},code:${JSON.stringify(Q)}${W}})`;else if(Y.validateOnly)return`return [{path:${F},code:${JSON.stringify(Q)}${W}}]`;else return`return _err([{path:${F},code:${JSON.stringify(Q)}${W}}])`}}}function E(X,J,U,Z,Y,W,F,Q){let q="",B=U.filter((H)=>p(H.groups,F)),M=B.filter((H)=>H.rule.plan?.cacheKey==="length").length,j=B.filter((H)=>H.rule.plan?.cacheKey==="time").length,P=M>1?`${$.arr}${I(X)}_len`:null,z=j>1?`${$.arr}${I(X)}_time`:null;if(P)q+=`${W}var ${P} = ${J}.length;
56
- `;if(z)q+=`${W}var ${z} = ${J}.getTime();
57
- `;for(let H of U){let R=BJ(Z,X,J,H,Y),_=Q?{...R,insideTypeGate:!0}:R,D=p(H.groups,F)&&H.rule.plan&&(P||z)?qJ(J,_,H.rule.ruleName,H.rule.plan,{length:H.rule.plan.cacheKey==="length"?P??void 0:void 0,time:H.rule.plan.cacheKey==="time"?z??void 0:void 0},Q):H.rule.emit(J,_);if(!D)continue;let L=p(H.groups,F)?D:CJ(H,D);q+=W+L.replace(/\n/g,`
58
- `+W)+`
59
- `}return q}function CJ(X,J){if(!X.groups||X.groups.length===0)return J;return`if ((${$.group0} === null && !${$.groupsSet}) || ${y($.group0,$.groupsSet,X.groups)}) {
60
- ${J}
61
- }
62
- `}function p(X,J){if(!X||X.length===0)return!J||J.length===0;if(!J||X.length!==J.length)return!1;for(let U=0;U<X.length;U++)if(X[U]!==J[U])return!1;return!0}function ZJ(X,J,U,Z,Y,W){let F=Y?`${W.fail("conversionFailed")}; ${Z} = true;`:W.fail("conversionFailed")+";";switch(X){case"string":return` ${J} = String(${J});
63
- `;case"number":return` ${J} = Number(${J});
64
- if (isNaN(${J})) { ${F} }
65
- `;case"boolean":return` if (${J} === 'true' || ${J} === '1' || ${J} === 1) ${J} = true;
66
- else if (${J} === 'false' || ${J} === '0' || ${J} === 0) ${J} = false;
67
- else { ${F} }
68
- `;case"date":return` ${J} = new Date(${J});
69
- if (isNaN(${J}.getTime())) { ${F} }
70
- `;default:throw new O(`Unknown implicit conversion type: "${X}" for field "${U}"`)}}var NJ={Number:"number",Boolean:"boolean",String:"string",Date:"date"},$J={isString:"string",isNumber:"number",isBoolean:"boolean",isDate:"date",isInt:"number",isArray:"array",isObject:"object"},vJ=new Set(["isString","isBoolean","isDate","isArray","isObject"]);function uJ(X,J){let U=J.filter((P)=>P.each),Z=J.filter((P)=>!P.each),Y=Z.filter((P)=>P.rule.requiresType==="string"),W=Z.filter((P)=>P.rule.requiresType==="number"),F=Z.filter((P)=>P.rule.requiresType==="boolean"),Q=Z.filter((P)=>P.rule.requiresType==="date"),q=Z.filter((P)=>P.rule.requiresType==="array"),B=Z.filter((P)=>P.rule.requiresType==="object"),M=Z.filter((P)=>!P.rule.requiresType),j=[{type:"string",deps:Y},{type:"number",deps:W},{type:"boolean",deps:F},{type:"date",deps:Q},{type:"array",deps:q},{type:"object",deps:B}].filter((P)=>P.deps.length>0);if(j.length>1)throw new O(`Field "${X}" has conflicting requiresType: ${j.map((P)=>P.type).join(", ")}`);return{each:U,generalRules:M,typedDeps:j.length>0?j[0]:void 0}}function yJ(X,J,U,Z){let{generalRules:Y,typedDeps:W}=J,F=!!W,Q=W?.type??null,q=W?.deps??[],B=-1;if(Q)B=Y.findIndex((H)=>$J[H.rule.ruleName]===Q);let M=!!Z.options?.enableImplicitConversion&&!U?.transform.some((H)=>!H.options?.serializeOnly),j=null;if(!F&&M&&B<0)for(let H=0;H<Y.length;H++){let R=$J[Y[H].rule.ruleName];if(R){B=H,j=R;break}}let P=B>=0?Y[B]:void 0,z=null;if(!F&&!j&&M&&U?.type?.fn)try{let H=U.type.fn(),R=Array.isArray(H)?H[0]:H;z=R?NJ[R.name]??null:null}catch(H){throw new O(`field "${X}": @Field type function threw: ${H.message}`)}return{effectiveGateType:Q??j??z,gateDeps:q,typeAsserterIdx:B,typeAsserter:P,enableConversion:M,asserterInferredGate:j,typeHintGate:z}}function fJ(X,J,U,Z,Y,W,F){let Q="",{effectiveGateType:q,gateCondition:B,gateErrorCode:M,gateEmitCtx:j,otherGeneral:P,gateDeps:z,typeAsserter:H,enableConversion:R}=W,_=(D)=>{let L=[];if(H&&!vJ.has(H.rule.ruleName))L.push(H);return L.push(...P,...z),E(X,J,L,Z,Y,D,F,!0)};if(U)if(R&&(q==="string"||q==="number"||q==="boolean"||q==="date")){let L=`${$.skip}${I(X)}`;if(Q+=`var ${L} = false;
71
- `,Q+=`if (${B}) {
72
- `,Q+=ZJ(q,J,X,L,!0,Z),Q+=`}
73
- `,Q+=`if (!${L}) {
74
- `,Y.validateOnly)Q+=_(" ");else{let A=`${$.mark}${I(X)}`;Q+=` var ${A} = ${$.errList}.length;
75
- `,Q+=_(" "),Q+=` if (${$.errList}.length === ${A}) ${$.out}[${JSON.stringify(X)}] = ${J};
76
- `}Q+=`}
77
- `}else{if(Q+=`if (${B}) ${j.fail(M)};
78
- `,Q+=`else {
79
- `,Y.validateOnly)Q+=_(" ");else{let L=`${$.mark}${I(X)}`;Q+=` var ${L} = ${$.errList}.length;
80
- `,Q+=_(" "),Q+=` if (${$.errList}.length === ${L}) ${$.out}[${JSON.stringify(X)}] = ${J};
81
- `}Q+=`}
82
- `}else if(R&&(q==="string"||q==="number"||q==="boolean"||q==="date")){if(Q+=`if (${B}) {
83
- `,Q+=ZJ(q,J,X,null,!1,Z),Q+=`}
84
- `,Q+=_(""),!Y.validateOnly)Q+=`${$.out}[${JSON.stringify(X)}] = ${J};
85
- `}else if(Q+=`if (${B}) ${j.fail(M)};
86
- `,Q+=_(""),!Y.validateOnly)Q+=`${$.out}[${JSON.stringify(X)}] = ${J};
87
- `;return Q}function pJ(X,J,U,Z,Y,W,F){let Q="";if(Z)if(U.length===0){if(!W.validateOnly)Q+=`${$.out}[${JSON.stringify(X)}] = ${J};
88
- `}else if(W.validateOnly)Q+=E(X,J,U,Y,W,"",F);else{let q=`${$.mark}${I(X)}`;Q+=`var ${q} = ${$.errList}.length;
89
- `,Q+=E(X,J,U,Y,W,"",F),Q+=`if (${$.errList}.length === ${q}) ${$.out}[${JSON.stringify(X)}] = ${J};
90
- `}else if(Q+=E(X,J,U,Y,W,"",F),!W.validateOnly)Q+=`${$.out}[${JSON.stringify(X)}] = ${J};
91
- `;return Q}function xJ(X,J,U,Z,Y,W,F){let Q="";for(let q of U){let B=JSON.stringify(X),M=I(X),j=`${$.index}${M}`,P=`${$.setIdx}${M}`,z=`${$.setVal}${M}`,H=`${$.mapIdx}${M}`,R=`${$.mapVal}${M}`,_=r(q,X,J,W),D=q.groups&&q.groups.length>0&&!p(q.groups,F)?`if ((${$.group0} === null && !${$.groupsSet}) || ${y($.group0,$.groupsSet,q.groups)}) {
92
- `:"",L=q.groups&&q.groups.length>0&&!p(q.groups,F)?`}
93
- `:"",A=[{guard:`Array.isArray(${J})`,idxVar:j,elemExpr:`${J}[${j}]`,loopHeader:`for (var ${j}=0; ${j}<${J}.length; ${j}++)`,counterDecl:"",counterInc:""},{guard:`${J} instanceof Set`,idxVar:P,elemExpr:z,loopHeader:`for (var ${z} of ${J})`,counterDecl:`var ${P} = 0;
94
- `,counterInc:`${P}++;
95
- `},{guard:`${J} instanceof Map`,idxVar:H,elemExpr:R,loopHeader:`for (var ${R} of ${J}.values())`,counterDecl:`var ${H} = 0;
96
- `,counterInc:`${H}++;
97
- `}],T=(S)=>{let b=`__bk$ep_${I(S.idxVar)}`,G={...Y,fail:(k)=>Z?`${$.errList}.push({path:${b}+${S.idxVar}+']',code:${JSON.stringify(k)}${_}})`:W.validateOnly?`return [{path:${b}+${S.idxVar}+']',code:${JSON.stringify(k)}${_}}]`:`return _err([{path:${b}+${S.idxVar}+']',code:${JSON.stringify(k)}${_}}])`},V="";if(V+=` var ${b} = ${B}+'[';
98
- `,V+=` ${S.counterDecl}`,V+=` ${S.loopHeader} {
99
- `,V+=" "+q.rule.emit(S.elemExpr,G)+`
100
- `,S.counterInc)V+=` ${S.counterInc}`;return V+=` }
101
- `,V};if(Q+=D,Z)Q+=`if (${A[0].guard}) {
102
- `,Q+=T(A[0]),Q+=`} else if (${A[1].guard}) {
103
- `,Q+=T(A[1]),Q+=`} else if (${A[2].guard}) {
104
- `,Q+=T(A[2]),Q+=`} else { ${$.errList}.push({path:${B},code:'isArray'}); }
105
- `;else Q+=`if (!${A[0].guard} && !(${J} instanceof Set) && !(${J} instanceof Map)) ${Y.fail("isArray")};
106
- `,Q+=`if (${A[0].guard}) {
107
- `,Q+=T(A[0]),Q+=`} else if (${A[1].guard}) {
108
- `,Q+=T(A[1]),Q+=`} else if (${A[2].guard}) {
109
- `,Q+=T(A[2]),Q+=`}
110
- `;Q+=L}return Q}function nJ(X,J,U,Z,Y,W,F,Q){let q=uJ(X,U),B=yJ(X,q,F,W),M="";if(!!q.typedDeps||B.asserterInferredGate||B.typeHintGate){let P=B.typeAsserter?q.generalRules.filter((_,D)=>D!==B.typeAsserterIdx):q.generalRules,z,H;if(B.typeAsserter)H=B.typeAsserter.rule.ruleName;else if(B.gateDeps.length>0)H=B.gateDeps[0].rule.ruleName;else H="conversionFailed";if(B.effectiveGateType==="date")z=`!(${J} instanceof Date) || isNaN(${J}.getTime())`;else if(B.effectiveGateType==="array")z=`!Array.isArray(${J})`;else if(B.effectiveGateType==="object")z=`typeof ${J} !== 'object' || ${J} === null || Array.isArray(${J})`;else if(B.effectiveGateType==="number")z=`typeof ${J} !== 'number' || isNaN(${J})`;else z=`typeof ${J} !== '${B.effectiveGateType}'`;let R=B.typeAsserter?BJ(Y,X,J,B.typeAsserter,W):Y;M+=fJ(X,J,Z,Y,W,{effectiveGateType:B.effectiveGateType,gateCondition:z,gateErrorCode:H,gateEmitCtx:R,otherGeneral:P,gateDeps:B.gateDeps,typeAsserter:B.typeAsserter,enableConversion:B.enableConversion},Q)}else M+=pJ(X,J,q.generalRules,Z,Y,W,Q);return M+=xJ(X,J,q.each,Z,Y,W,Q),M}function mJ(X,J,U,Z,Y){let{collectErrors:W,execs:F}=Z,Q=I(X),q=U.type.collection,B=Z.isAsync?"await ":"",M=-1;if(U.type.resolvedCollectionValue){let P=U.type.resolvedCollectionValue[h];M=F.length,F.push(P)}let j="";if(q==="Set"){j+=`if (Array.isArray(${J})) {
111
- `;let P=U.validation.filter((H)=>!H.each);if(j+=E(X,J,P,Y,Z," "),M>=0){let H=`${$.index}${Q}`;if(j+=` var ${$.arr}${Q} = new Set();
112
- `,j+=` for (var ${H}=0; ${H}<${J}.length; ${H}++) {
113
- `,j+=` var ${$.result}${Q} = ${B}_execs[${M}]._deserialize(${J}[${H}], _opts);
114
- `,j+=` if (_isErr(${$.result}${Q})) {
115
- `,W)j+=` var ${$.errors}${Q} = ${$.result}${Q}.data;
116
- `,j+=` var __bk$pp${Q} = ${JSON.stringify(X)}+'['+${H}+'].';
117
- `,j+=` for (var ${$.nestedIdx}${Q}=0; ${$.nestedIdx}${Q}<${$.errors}${Q}.length; ${$.nestedIdx}${Q}++) {
118
- `,j+=" "+C($.errList,`__bk$pp${Q}+${$.errors}${Q}[${$.nestedIdx}${Q}].path`,`${$.errors}${Q}[${$.nestedIdx}${Q}]`,`__ne${Q}`),j+=` }
119
- `;else j+=` var ${$.errors}${Q} = ${$.result}${Q}.data;
120
- `,j+=` var __bk$pp${Q} = ${JSON.stringify(X)}+'['+${H}+'].';
121
- `,j+=" "+N(`__bk$pp${Q}+${$.errors}${Q}[0].path`,`${$.errors}${Q}[0]`,`__ne${Q}`);j+=` } else { ${$.arr}${Q}.add(${$.result}${Q}); }
122
- `,j+=` }
123
- `,j+=` ${$.out}[${JSON.stringify(X)}] = ${$.arr}${Q};
124
- `}else j+=` ${$.out}[${JSON.stringify(X)}] = new Set(${J});
125
- `;let z=U.validation.filter((H)=>H.each);if(z.length>0){let H=`${$.setIdx}${Q}`,R=`${$.setVal}${Q}`;j+=` var ${H} = 0;
126
- `,j+=` for (var ${R} of ${$.out}[${JSON.stringify(X)}]) {
127
- `;for(let _ of z){let L={...Y,fail:(A)=>W?`${$.errList}.push({path:${JSON.stringify(X)}+'['+${H}+']',code:${JSON.stringify(A)}})`:`return _err([{path:${JSON.stringify(X)}+'['+${H}+']',code:${JSON.stringify(A)}}])`};j+=` ${_.rule.emit(R,L)}
128
- `}j+=` ${H}++;
129
- `,j+=` }
130
- `}j+=`} else { ${Y.fail("isArray")}; }
131
- `}else{if(j+=`if (${J} != null && typeof ${J} === 'object' && !Array.isArray(${J})) {
132
- `,M>=0){let P=`${$.key}${Q}`;if(j+=` var ${$.arr}${Q} = new Map();
133
- `,j+=` for (var ${P} in ${J}) {
134
- `,j+=` if (!Object.prototype.hasOwnProperty.call(${J}, ${P})) continue;
135
- `,j+=` var ${$.result}${Q} = ${B}_execs[${M}]._deserialize(${J}[${P}], _opts);
136
- `,j+=` if (_isErr(${$.result}${Q})) {
137
- `,W)j+=` var ${$.errors}${Q} = ${$.result}${Q}.data;
138
- `,j+=` var __bk$pp${Q} = ${JSON.stringify(X)}+'['+${P}+'].';
139
- `,j+=` for (var ${$.nestedIdx}${Q}=0; ${$.nestedIdx}${Q}<${$.errors}${Q}.length; ${$.nestedIdx}${Q}++) {
140
- `,j+=" "+C($.errList,`__bk$pp${Q}+${$.errors}${Q}[${$.nestedIdx}${Q}].path`,`${$.errors}${Q}[${$.nestedIdx}${Q}]`,`__ne${Q}`),j+=` }
141
- `;else j+=` var ${$.errors}${Q} = ${$.result}${Q}.data;
142
- `,j+=` var __bk$pp${Q} = ${JSON.stringify(X)}+'['+${P}+'].';
143
- `,j+=" "+N(`__bk$pp${Q}+${$.errors}${Q}[0].path`,`${$.errors}${Q}[0]`,`__ne${Q}`);j+=` } else { ${$.arr}${Q}.set(${P}, ${$.result}${Q}); }
144
- `,j+=` }
145
- `,j+=` ${$.out}[${JSON.stringify(X)}] = ${$.arr}${Q};
146
- `}else j+=` var ${$.arr}${Q} = new Map();
147
- `,j+=` for (var ${$.key}${Q} in ${J}) {
148
- `,j+=` if (Object.prototype.hasOwnProperty.call(${J}, ${$.key}${Q})) ${$.arr}${Q}.set(${$.key}${Q}, ${J}[${$.key}${Q}]);
149
- `,j+=` }
150
- `,j+=` ${$.out}[${JSON.stringify(X)}] = ${$.arr}${Q};
151
- `;j+=`} else { ${Y.fail("isObject")}; }
152
- `}return j}function cJ(X,J,U,Z,Y){let{collectErrors:W,execs:F}=Z;if(!U.type)return`${$.out}[${JSON.stringify(X)}] = ${J};
153
- `;let Q="",q=I(X);if(U.type.discriminator){let B=JSON.stringify(U.type.discriminator.property);Q+=`var ${$.disc}${q} = ${J} && ${J}[${B}];
154
- `,Q+=`switch (${$.disc}${q}) {
155
- `;for(let M of U.type.discriminator.subTypes){let j=M.value[h],P=F.length;F.push(j);let z=Z.isAsync?"await ":"";Q+=` case ${JSON.stringify(M.name)}:
156
- `,Q+=` var ${$.result}${q} = ${z}_execs[${P}]._deserialize(${J}, _opts);
157
- `,Q+=UJ(X,`${$.result}${q}`,W),Q+=` break;
158
- `}if(Q+=` default: ${Y.fail("invalidDiscriminator")};
159
- `,Q+=`}
160
- `,U.type.keepDiscriminatorProperty)Q+=`if (${$.out}[${JSON.stringify(X)}] != null) ${$.out}[${JSON.stringify(X)}][${B}] = ${$.disc}${q};
161
- `}else{let M=(U.type.resolvedClass??U.type.fn())[h],j=F.length;if(F.push(M),U.type?.isArray||U.flags.validateNestedEach||U.validation.some((z)=>z.each)){let z=`${$.index}${q}`,H=Z.isAsync?"await ":"";Q+=`if (Array.isArray(${J})) {
162
- `;let R=U.validation.filter((_)=>!_.each);if(Q+=E(X,J,R,Y,Z," "),Q+=` var ${$.arr}${q} = [];
163
- `,Q+=` for (var ${z}=0; ${z}<${J}.length; ${z}++) {
164
- `,Q+=` var ${$.result}${q} = ${H}_execs[${j}]._deserialize(${J}[${z}], _opts);
165
- `,Q+=` if (_isErr(${$.result}${q})) {
166
- `,W)Q+=` var ${$.errors}${q} = ${$.result}${q}.data;
167
- `,Q+=` var __bk$pp${q} = ${JSON.stringify(X)}+'['+${z}+'].';
168
- `,Q+=` for (var ${$.nestedIdx}${q}=0; ${$.nestedIdx}${q}<${$.errors}${q}.length; ${$.nestedIdx}${q}++) {
169
- `,Q+=" "+C($.errList,`__bk$pp${q}+${$.errors}${q}[${$.nestedIdx}${q}].path`,`${$.errors}${q}[${$.nestedIdx}${q}]`,`__ne${q}`),Q+=` }
170
- `;else Q+=` var ${$.errors}${q} = ${$.result}${q}.data;
171
- `,Q+=` var __bk$pp${q} = ${JSON.stringify(X)}+'['+${z}+'].';
172
- `,Q+=" "+N(`__bk$pp${q}+${$.errors}${q}[0].path`,`${$.errors}${q}[0]`,`__ne${q}`);Q+=` } else { ${$.arr}${q}.push(${$.result}${q}); }
173
- `,Q+=` }
174
- `,Q+=` ${$.out}[${JSON.stringify(X)}] = ${$.arr}${q};
175
- `,Q+=`} else { ${Y.fail("isArray")}; }
176
- `}else{let z=Z.isAsync?"await ":"";Q+=`if (${J} != null && typeof ${J} === 'object') {
177
- `,Q+=` var ${$.result}${q} = ${z}_execs[${j}]._deserialize(${J}, _opts);
178
- `,Q+=UJ(X,`${$.result}${q}`,W),Q+=`} else { ${Y.fail("isObject")}; }
179
- `}}return Q}function UJ(X,J,U){let Z=I(X);if(U){let Y=`${$.errors}${Z}[${$.nestedIdx}${Z}]`;return` if (_isErr(${J})) {
180
- var ${$.errors}${Z} = ${J}.data;
181
- var __bk$pp${Z} = ${JSON.stringify(X+".")};
182
- for (var ${$.nestedIdx}${Z}=0; ${$.nestedIdx}${Z}<${$.errors}${Z}.length; ${$.nestedIdx}${Z}++) {
183
- `+C($.errList,`__bk$pp${Z}+${Y}.path`,Y,`__ne${Z}`)+` }
184
- } else { ${$.out}[${JSON.stringify(X)}] = ${J}; }
185
- `}else{let Y=`${$.errors}${Z}[0]`;return` if (_isErr(${J})) {
186
- var ${$.errors}${Z} = ${J}.data;
187
- var __bk$pp${Z} = ${JSON.stringify(X+".")};
188
- `+N(`__bk$pp${Z}+${Y}.path`,Y,`__ne${Z}`)+` } else { ${$.out}[${JSON.stringify(X)}] = ${J}; }
189
- `}}function s(X,J,U){if(U.has(J))return!1;return!0}function x(X,J,U,Z,Y,W){let F=W.inlineNestedClasses;F.add(J);let Q={...W,pathPrefix:Z,varPrefix:Y,inputExpr:U,exposeDefaultValues:!1},q="";for(let[B,M]of Object.entries(X))q+=WJ(B,M,Q);return F.delete(J),q}function oJ(X,J,U,Z,Y){let{collectErrors:W,execs:F}=Z;if(!U.type)return"";let Q=(Z.varPrefix||"")+I(X),q="";if(!Z.inlineNestedClasses)Z.inlineNestedClasses=new Set;if(U.type.discriminator){let B=JSON.stringify(U.type.discriminator.property);q+=`var ${$.disc}${Q} = ${J} && ${J}[${B}];
190
- `,q+=`switch (${$.disc}${Q}) {
191
- `;for(let M of U.type.discriminator.subTypes){let j=M.value[h],P=j._merged,z=P&&s(P,M.value,Z.inlineNestedClasses);if(q+=` case ${JSON.stringify(M.name)}:
192
- `,z){let H=Z.pathPrefix?`${Z.pathPrefix}+${JSON.stringify(X+".")}`:JSON.stringify(X+"."),R=`${Q}_d${I(M.name)}_`;q+=x(P,M.value,J,H,R,Z)}else{let H=F.length;F.push(j);let R=Z.isAsync?"await ":"";q+=` var ${$.result}${Q} = ${R}_execs[${H}]._validate(${J}, _opts);
193
- `,q+=YJ(X,`${$.result}${Q}`,W)}q+=` break;
194
- `}q+=` default: ${Y.fail("invalidDiscriminator")};
195
- `,q+=`}
196
- `}else{let B=U.type.resolvedClass??U.type.fn(),M=B[h],j=M._merged,P=U.type?.isArray||U.flags.validateNestedEach||U.validation.some((H)=>H.each),z=j&&s(j,B,Z.inlineNestedClasses);if(P){let H=`${$.index}${Q}`;q+=`if (Array.isArray(${J})) {
197
- `;let R=U.validation.filter((_)=>!_.each);if(q+=E(X,J,R,Y,Z," "),q+=` for (var ${H}=0; ${H}<${J}.length; ${H}++) {
198
- `,z){let _=`__il$${Q}_item`,D=Z.pathPrefix?`${Z.pathPrefix}+${JSON.stringify(X)}+'['+${H}+'].'`:`${JSON.stringify(X)}+'['+${H}+'].'`,L=`${Q}${H}_`;q+=` var ${_} = ${J}[${H}];
199
- `;let A=Z.pathPrefix?`${Z.pathPrefix}+${JSON.stringify(X)}+'['+${H}+'].'`:`${JSON.stringify(X)}+'['+${H}+'].'`;if(q+=` if (${_} == null || typeof ${_} !== 'object' || Array.isArray(${_})) `,W)q+=`${$.errList}.push({path:${A},code:'invalidInput'});
200
- `;else q+=`return [{path:${A},code:'invalidInput'}];
201
- `;q+=` else {
202
- `,q+=x(j,B,_,D,L,Z),q+=` }
203
- `}else{let _=F.length;F.push(M);let D=Z.isAsync?"await ":"";q+=` var ${$.result}${Q} = ${D}_execs[${_}]._validate(${J}[${H}], _opts);
204
- `,q+=` if (${$.result}${Q} !== null) {
205
- `;let L=`__bk$pp${Q}`;if(q+=` var ${L} = ${JSON.stringify(X)}+'['+${H}+'].';
206
- `,W)q+=` for (var ${$.nestedIdx}${Q}=0; ${$.nestedIdx}${Q}<${$.result}${Q}.length; ${$.nestedIdx}${Q}++) {
207
- `,q+=" "+C($.errList,`${L}+${$.result}${Q}[${$.nestedIdx}${Q}].path`,`${$.result}${Q}[${$.nestedIdx}${Q}]`,`__ne${Q}`),q+=` }
208
- `;else q+=" "+N(`${L}+${$.result}${Q}[0].path`,`${$.result}${Q}[0]`,`__ne${Q}`,!0);q+=` }
209
- `}q+=` }
210
- `,q+=`} else { ${Y.fail("isArray")}; }
211
- `}else{if(q+=`if (${J} != null && typeof ${J} === 'object') {
212
- `,z){let H=Z.pathPrefix?`${Z.pathPrefix}+${JSON.stringify(X+".")}`:JSON.stringify(X+"."),R=`${Q}_`;q+=x(j,B,J,H,R,Z)}else{let H=F.length;F.push(M);let R=Z.isAsync?"await ":"";q+=` var ${$.result}${Q} = ${R}_execs[${H}]._validate(${J}, _opts);
213
- `,q+=YJ(X,`${$.result}${Q}`,W)}q+=`} else { ${Y.fail("isObject")}; }
214
- `}}return q}function YJ(X,J,U){let Z=I(X),Y=`__bk$pp${Z}`;if(U){let W=`${J}[${$.nestedIdx}${Z}]`;return` if (${J} !== null) {
215
- var ${Y} = ${JSON.stringify(X+".")};
216
- for (var ${$.nestedIdx}${Z}=0; ${$.nestedIdx}${Z}<${J}.length; ${$.nestedIdx}${Z}++) {
217
- `+C($.errList,`${Y}+${W}.path`,W,`__ne${Z}`)+` }
218
- }
219
- `}else{let W=`${J}[0]`;return` if (${J} !== null) {
220
- var ${Y} = ${JSON.stringify(X+".")};
221
- `+N(`${Y}+${W}.path`,W,`__ne${Z}`,!0)+` }
222
- `}}function iJ(X,J,U,Z,Y){let{collectErrors:W,execs:F}=Z,Q=(Z.varPrefix||"")+I(X),q=U.type.collection,B=Z.isAsync?"await ":"";if(!Z.inlineNestedClasses)Z.inlineNestedClasses=new Set;let M,j,P;if(U.type.resolvedCollectionValue)M=U.type.resolvedCollectionValue,j=M[h],P=j._merged;let z=M&&P&&s(P,M,Z.inlineNestedClasses),H="";if(q==="Set"){H+=`if (Array.isArray(${J})) {
223
- `;let R=U.validation.filter((D)=>!D.each);if(H+=E(X,J,R,Y,Z," "),j){let D=`${$.index}${Q}`;if(H+=` for (var ${D}=0; ${D}<${J}.length; ${D}++) {
224
- `,z){let L=`__il$${Q}_ci`,A=Z.pathPrefix?`${Z.pathPrefix}+${JSON.stringify(X)}+'['+${D}+'].'`:`${JSON.stringify(X)}+'['+${D}+'].'`,T=`${Q}c${D}_`,S=Z.pathPrefix?`${Z.pathPrefix}+${JSON.stringify(X)}+'['+${D}+'].'`:`${JSON.stringify(X)}+'['+${D}+'].'`;if(H+=` var ${L} = ${J}[${D}];
225
- `,H+=` if (${L} == null || typeof ${L} !== 'object' || Array.isArray(${L})) `,W)H+=`${$.errList}.push({path:${S},code:'invalidInput'});
226
- `;else H+=`return [{path:${S},code:'invalidInput'}];
227
- `;H+=` else {
228
- `,H+=x(P,M,L,A,T,Z),H+=` }
229
- `}else{let L=F.length;F.push(j),H+=` var ${$.result}${Q} = ${B}_execs[${L}]._validate(${J}[${D}], _opts);
230
- `,H+=` if (${$.result}${Q} !== null) {
231
- `;let A=`__bk$pp${Q}`;if(H+=` var ${A} = ${JSON.stringify(X)}+'['+${D}+'].';
232
- `,W)H+=` for (var ${$.nestedIdx}${Q}=0; ${$.nestedIdx}${Q}<${$.result}${Q}.length; ${$.nestedIdx}${Q}++) {
233
- `,H+=" "+C($.errList,`${A}+${$.result}${Q}[${$.nestedIdx}${Q}].path`,`${$.result}${Q}[${$.nestedIdx}${Q}]`,`__ne${Q}`),H+=` }
234
- `;else H+=" "+N(`${A}+${$.result}${Q}[0].path`,`${$.result}${Q}[0]`,`__ne${Q}`,!0);H+=` }
235
- `}H+=` }
236
- `}let _=U.validation.filter((D)=>D.each);if(_.length>0){let D=`${$.index}${Q}_e`;H+=` for (var ${D}=0; ${D}<${J}.length; ${D}++) {
237
- `;for(let L of _){let A=`__bk$ep_${Q}`,T=r(L,X,J,Z),b={...Y,fail:(u)=>W?`${$.errList}.push({path:${A}+${D}+']',code:${JSON.stringify(u)}${T}})`:`return [{path:${A}+${D}+']',code:${JSON.stringify(u)}${T}}]`};if(!H.includes(`var ${A}`))H+=` var ${A} = ${JSON.stringify(X)}+'[';
238
- `;H+=` ${L.rule.emit(`${J}[${D}]`,b)}
239
- `}H+=` }
240
- `}H+=`} else { ${Y.fail("isArray")}; }
241
- `}else{if(H+=`if (${J} != null && typeof ${J} === 'object' && !Array.isArray(${J})) {
242
- `,j){let R=`${$.key}${Q}`;if(H+=` for (var ${R} in ${J}) {
243
- `,H+=` if (!Object.prototype.hasOwnProperty.call(${J}, ${R})) continue;
244
- `,z){let _=`__il$${Q}_mi`,D=Z.pathPrefix?`${Z.pathPrefix}+${JSON.stringify(X)}+'['+${R}+'].'`:`${JSON.stringify(X)}+'['+${R}+'].'`,L=`${Q}m${R}_`,A=D;if(H+=` var ${_} = ${J}[${R}];
245
- `,H+=` if (${_} == null || typeof ${_} !== 'object' || Array.isArray(${_})) `,W)H+=`${$.errList}.push({path:${A},code:'invalidInput'});
246
- `;else H+=`return [{path:${A},code:'invalidInput'}];
247
- `;H+=` else {
248
- `,H+=x(P,M,_,D,L,Z),H+=` }
249
- `}else{let _=F.length;F.push(j),H+=` var ${$.result}${Q} = ${B}_execs[${_}]._validate(${J}[${R}], _opts);
250
- `,H+=` if (${$.result}${Q} !== null) {
251
- `;let D=`__bk$pp${Q}`;if(H+=` var ${D} = ${JSON.stringify(X)}+'['+${R}+'].';
252
- `,W)H+=` for (var ${$.nestedIdx}${Q}=0; ${$.nestedIdx}${Q}<${$.result}${Q}.length; ${$.nestedIdx}${Q}++) {
253
- `,H+=" "+C($.errList,`${D}+${$.result}${Q}[${$.nestedIdx}${Q}].path`,`${$.result}${Q}[${$.nestedIdx}${Q}]`,`__ne${Q}`),H+=` }
254
- `;else H+=" "+N(`${D}+${$.result}${Q}[0].path`,`${$.result}${Q}[0]`,`__ne${Q}`,!0);H+=` }
255
- `}H+=` }
256
- `}H+=`} else { ${Y.fail("isObject")}; }
257
- `}return H}function lJ(X,J){let{collectErrors:U,regexes:Z,refs:Y,execs:W,validateOnly:F,pathPrefix:Q}=J,q=Q?`${Q}+${JSON.stringify(X)}`:JSON.stringify(X);return{addRegex(B){return Z.push(B),Z.length-1},addRef(B){return Y.push(B),Y.length-1},addExecutor(B){return W.push(B),W.length-1},fail(B){if(U)return`${$.errList}.push({path:${q},code:${JSON.stringify(B)}})`;else if(F)return`return [{path:${q},code:${JSON.stringify(B)}}]`;else return`return _err([{path:${q},code:${JSON.stringify(B)}}])`},collectErrors:U,_pathExpr:q}}var w={out:"__bk$out",fieldVal:"__bk$fv_",groups:"__bk$groups",group0:"__bk$group0",groupsSet:"__bk$groupsSet",setArr:"__bk$sa",setItem:"__bk$si",mapObj:"__bk$m",mapEntry:"__bk$me",serResult:"__bk$sr",outItem:"__bk$out_item",discArr:"__bk$da",discIdx:"__bk$di",nestedArr:"__bk$na",nestedIdx:"__bk$ni",nestedItem:"__bk$nitem"};function dJ(X,J){let U=J.find((Y)=>Y.serializeOnly&&Y.name);if(U)return U.name;let Z=J.find((Y)=>!Y.deserializeOnly&&!Y.serializeOnly&&Y.name);if(Z)return Z.name;return X}function LJ(X){let J=X.filter((Z)=>!Z.deserializeOnly);if(J.length===0)return;if(J.some((Z)=>!Z.groups||Z.groups.length===0))return;let U=new Set;for(let Z of J)for(let Y of Z.groups)U.add(Y);return[...U]}function PJ(X,J,U,Z){if(U.length===0)return null;if(U.length===1){let F=U[0],Q=Z.length;Z.push(F.fn);let q=`_refs[${Q}]({value:${X},key:${JSON.stringify(J)},obj:instance})`;return F.isAsync?`(await ${q})`:q}if(U.length===2){let F=U[1],Q=U[0],q=Z.length;Z.push(F.fn);let B=Z.length;Z.push(Q.fn);let M=`_refs[${q}]({value:${X},key:${JSON.stringify(J)},obj:instance})`,j=F.isAsync?`(await ${M})`:M,P=`_refs[${B}]({value:${j},key:${JSON.stringify(J)},obj:instance})`;return Q.isAsync?`(await ${P})`:P}let Y=[...U].reverse(),W=X;for(let F of Y){let Q=Z.length;Z.push(F.fn);let q=`_refs[${Q}]({value:${W},key:${JSON.stringify(J)},obj:instance})`;W=F.isAsync?`(await ${q})`:q}return W}function MJ(X,J,U,Z){let Y=PJ(X,J,U,Z);return Y?`
258
- ${X} = ${Y};`:""}function zJ(X,J,U,Z){let Y=[],W=[],F=`'use strict';
259
- `;if(F+=`var ${w.out} = {};
260
- `,Object.values(J).some((M)=>{let j=LJ(M.expose);return j&&j.length>0}))F+=`var ${w.groups} = _opts && _opts.groups;
261
- `,F+=`var ${w.group0} = ${w.groups} && ${w.groups}.length === 1 ? ${w.groups}[0] : null;
262
- `,F+=`var ${w.groupsSet} = ${w.groups} && ${w.groups}.length > 1 ? new Set(${w.groups}) : null;
263
- `;for(let[M,j]of Object.entries(J))F+=sJ(M,j,Y,W,Z,U);return F+=`return ${w.out};
264
- `,F+=`//# sourceURL=baker://${X.name}/serialize
265
- `,Function("_refs","_execs",`return ${Z?"async function":"function"}(instance, _opts) { `+F+" }")(Y,W)}function sJ(X,J,U,Z,Y,W){if(J.exclude){if(!J.exclude.deserializeOnly){if(W?.debug){let _=J.exclude.serializeOnly?"serializeOnly":"bidirectional";return`// [baker] field "${X}" excluded (${_} @Exclude)
266
- `}return""}}if(J.expose.length>0&&J.expose.every((_)=>_.deserializeOnly)){if(W?.debug)return`// [baker] field "${X}" excluded (all @Expose entries are deserializeOnly)
267
- `;return""}let F=dJ(X,J.expose),Q=LJ(J.expose),q=I(X),B=`${w.fieldVal}${q}`,M="";M+=`var ${B} = instance[${JSON.stringify(X)}];
268
- `;let j="",P="";if(Q&&Q.length>0)j=`if ((${w.group0} !== null || ${w.groupsSet}) && (${y(w.group0,w.groupsSet,Q)})) {
269
- `,P=`}
270
- `;let z="",H=J.flags.isOptional,R=J.transform.filter((_)=>!_.options?.deserializeOnly);if(J.type?.collection){let _=`${w.out}[${JSON.stringify(F)}]`,D=J.type.collection,L;if(D==="Set")if(J.type.resolvedCollectionValue){let A=J.type.resolvedCollectionValue[h],T=Z.length;if(Z.push(A),Y)L=`${_} = await Promise.all(Array.from(${B}).map(async function(__ser_item) { return __ser_item == null ? __ser_item : await _execs[${T}]._serialize(__ser_item, _opts); }));`;else L=`var ${w.setArr} = [];
271
- `,L+=` for (var ${w.setItem} of ${B}) {
272
- `,L+=` ${w.setArr}.push(${w.setItem} == null ? ${w.setItem} : _execs[${T}]._serialize(${w.setItem}, _opts));
273
- `,L+=` }
274
- `,L+=` ${_} = ${w.setArr};`}else L=`${_} = Array.from(${B});`;else if(J.type.resolvedCollectionValue){let A=J.type.resolvedCollectionValue[h],T=Z.length;Z.push(A);let S=Y?"await ":"";L=`var ${w.mapObj} = {};
275
- `,L+=` for (var ${w.mapEntry} of ${B}) {
276
- `,L+=` ${w.mapObj}[${w.mapEntry}[0]] = ${w.mapEntry}[1] == null ? ${w.mapEntry}[1] : ${S}_execs[${T}]._serialize(${w.mapEntry}[1], _opts);
277
- `,L+=` }
278
- `,L+=` ${_} = ${w.mapObj};`}else L=`${_} = Object.fromEntries(${B});`;if(L+=MJ(_,X,R,U),H)z=`if (${B} !== undefined && ${B} !== null) {
279
- ${L}
280
- } else if (${B} === null) {
281
- ${_} = null;
282
- }
283
- `;else z=`if (${B} != null) {
284
- ${L}
285
- } else {
286
- ${_} = ${B};
287
- }
288
- `;return M+=j+z+P,M}if(J.type?.resolvedClass||J.type?.discriminator||J.type?.fn&&J.flags.validateNested){let _=J.type?.isArray||J.flags.validateNestedEach||J.validation.some((A)=>A.each),D=`${w.out}[${JSON.stringify(F)}]`,L;if(J.type.discriminator){let{property:A,subTypes:T}=J.type.discriminator,S=J.type.keepDiscriminatorProperty!==!1,b=[...T].sort((G,V)=>{if(G.value.prototype instanceof V.value)return-1;if(V.value.prototype instanceof G.value)return 1;return 0}),u=(G,V)=>{let k="";for(let m=0;m<b.length;m++){let l=b[m],SJ=l.value[h],OJ=Z.length;Z.push(SJ);let hJ=U.length;if(U.push(l.value),k+=`${m===0?"if":"} else if"} (${G} instanceof _refs[${hJ}]) {
289
- `,k+=` var ${w.serResult} = ${V}_execs[${OJ}]._serialize(${G}, _opts);
290
- `,S)k+=` ${w.serResult}[${JSON.stringify(A)}] = ${JSON.stringify(l.name)};
291
- `;k+=` ${w.outItem} = ${w.serResult};
292
- `}return k+=`} else { ${w.outItem} = `+G+`; }
293
- `,k};if(_){let G=Y?"await ":"";if(Y)L=`${D} = await Promise.all(${B}.map(async function(__ser_item) {
294
- `;else L=`var ${w.discArr} = [];
295
- `,L+=` for (var ${w.discIdx}=0; ${w.discIdx}<${B}.length; ${w.discIdx}++) {
296
- `,L+=` var __ser_item = ${B}[${w.discIdx}];
297
- `;if(L+=` var ${w.outItem};
298
- `,L+=u("__ser_item",G),Y)L+=` return ${w.outItem};
299
- `,L+="}));";else L+=` ${w.discArr}.push(${w.outItem});
300
- `,L+=` }
301
- `,L+=` ${D} = ${w.discArr};`}else{let G=Y?"await ":"";L=`var ${w.outItem};
302
- `,L+=u(B,G),L+=`${D} = ${w.outItem};`}}else{let T=(J.type.resolvedClass??J.type.fn())[h],S=Z.length;if(Z.push(T),_)if(Y)L=`${D} = await Promise.all(${B}.map(async function(__ser_item) { return __ser_item == null ? __ser_item : await _execs[${S}]._serialize(__ser_item, _opts); }));`;else L=`var ${w.nestedArr} = [];
303
- `,L+=` for (var ${w.nestedIdx}=0; ${w.nestedIdx}<${B}.length; ${w.nestedIdx}++) {
304
- `,L+=` var ${w.nestedItem} = ${B}[${w.nestedIdx}];
305
- `,L+=` ${w.nestedArr}.push(${w.nestedItem} == null ? ${w.nestedItem} : _execs[${S}]._serialize(${w.nestedItem}, _opts));
306
- `,L+=` }
307
- `,L+=` ${D} = ${w.nestedArr};`;else L=`${D} = ${Y?"await ":""}_execs[${S}]._serialize(${B}, _opts);`}if(L+=MJ(D,X,R,U),H)z=`if (${B} !== undefined && ${B} !== null) {
308
- ${L}
309
- } else if (${B} === null) {
310
- ${D} = null;
311
- }
312
- `;else z=`if (${B} != null) {
313
- ${L}
314
- } else {
315
- ${D} = ${B};
316
- }
317
- `}else{let _=tJ(X,F,B,J,U,Y);if(H)z+=`if (${B} !== undefined) {
318
- `,z+=" "+_+`
319
- `,z+=`}
320
- `;else z+=_+`
321
- `}return M+=j+z+P,M}function tJ(X,J,U,Z,Y,W){let F=`${w.out}[${JSON.stringify(J)}]`,Q=Z.transform.filter((q)=>!q.options?.deserializeOnly);if(Q.length>0){let q=PJ(U,X,Q,Y);return`${F} = ${q};`}return`${F} = ${U};`}function _J(X){let J=new Set;function U(Z){if(J.has(Z))return!0;J.add(Z);let Y=Z[K];if(Y)for(let W of Object.values(Y)){if(W.type?.fn){let F;try{F=W.type.fn()}catch(q){throw new O(`${Z.name}: type function threw: ${q.message}`)}let Q=Array.isArray(F)?F[0]:F;if(U(Q))return!0}if(W.type?.discriminator){for(let F of W.type.discriminator.subTypes)if(U(F.value))return!0}}return J.delete(Z),!1}return U(X)}function wJ(X,J){let U=J?`${J}.`:"";for(let[Z,Y]of Object.entries(X)){for(let Q of Y.expose)if(Q.deserializeOnly&&Q.serializeOnly)throw new O(`Invalid @Expose on field '${U}${Z}': cannot have both deserializeOnly:true and serializeOnly:true on the same @Expose entry. Use separate @Expose decorators for each direction.`);let W=Y.expose.filter((Q)=>!Q.serializeOnly),F=Y.expose.filter((Q)=>!Q.deserializeOnly);DJ(U+Z,W,"deserialize"),DJ(U+Z,F,"serialize")}}function DJ(X,J,U){for(let Z=0;Z<J.length;Z++)for(let Y=Z+1;Y<J.length;Y++){let W=J[Z].groups??[],F=J[Y].groups??[];if(rJ(W,F)){let Q=new Set(F),q=W.length===0?[]:W.filter((B)=>Q.has(B));throw new O(`@Expose conflict on '${X}': 2 @Expose stacks with '${U}' direction and overlapping groups [${q.join(", ")}]. Each direction must have at most one @Expose per group set.`)}}}function rJ(X,J){if(X.length===0&&J.length===0)return!0;if(X.length===0||J.length===0)return!1;return X.some((U)=>J.includes(U))}var aJ=new Set(["__proto__","constructor","prototype"]),RJ=new Set([Number,String,Boolean,Date]);function eJ(X){let J=`Circular dependency during seal: ${X} is still being sealed`;return{_deserialize(){throw new O(J)},_serialize(){throw new O(J)},_validate(){throw new O(J)},_isAsync:!1,_isSerializeAsync:!1}}function o(X,J,U){let Z=U??new Set;for(let Y of Object.values(X)){if(J==="deserialize"&&Y.validation.some((F)=>F.rule.isAsync))return!0;if((J==="deserialize"?Y.transform.filter((F)=>!F.options?.serializeOnly):Y.transform.filter((F)=>!F.options?.deserializeOnly)).some((F)=>F.isAsync??i(F.fn)))return!0;if(Y.type?.resolvedClass){let F=Y.type.resolvedClass;if(!Z.has(F)){Z.add(F);let Q=e(F);if(o(Q,J,Z))return!0}}if(Y.type?.discriminator){for(let F of Y.type.discriminator.subTypes)if(!Z.has(F.value)){Z.add(F.value);let Q=e(F.value);if(o(Q,J,Z))return!0}}}return!1}var a=!1;function XJ(){return a}var c=new Set;function JQ(){if(a)return;let X=d();try{for(let J of v)n(J,X)}catch(J){for(let U of v)if(Object.hasOwn(U,h))delete U[h];throw J}for(let J of v)c.add(J),Object.freeze(J[K]);v.clear(),a=!0}function QQ(X){if(Object.hasOwn(X,h))return;if(!Object.hasOwn(X,K))return;let J=new Set(c),U=d();n(X,U),c.add(X),Object.freeze(X[K]),v.delete(X);let Z=[...v].filter((Y)=>Object.hasOwn(Y,h)&&!J.has(Y));for(let Y of Z)c.add(Y),Object.freeze(Y[K]),v.delete(Y)}function f(X){let J=X[h];if(!J)JQ(),J=X[h];if(!J)QQ(X),J=X[h];if(!J)throw new O(`${X.name} has no @Field decorators`);return J}function n(X,J){if(Object.hasOwn(X,h))return;let U=eJ(X.name);X[h]=U;let Z=e(X);for(let M of Object.keys(Z))if(aJ.has(M))throw new O(`${X.name}: field name '${M}' is not allowed (reserved property name)`);for(let[M,j]of Object.entries(Z)){if(!j.type?.fn)continue;let P=j.type.fn();if(P===Map||P===Set){let _=P===Map?"Map":"Set",D={...j.type,collection:_,isArray:!1};if(j.type.collectionValue){let L=j.type.collectionValue();if(L!=null&&typeof L==="function"&&!RJ.has(L))D.resolvedCollectionValue=L}Z[M]={...j,type:D};continue}let z=Array.isArray(P),H=z?P[0]:P;if(H==null||typeof H!=="function")throw new O(`${X.name}: @Type/@Field type must return a constructor or [constructor], got ${String(H)}`);let R={...j.type,isArray:z};if(!RJ.has(H)){if(R.resolvedClass=H,!j.flags.validateNested||!j.flags.validateNestedEach){if(j.flags={...j.flags},!j.flags.validateNested)j.flags.validateNested=!0;if(z&&!j.flags.validateNestedEach)j.flags.validateNestedEach=!0}}Z[M]={...j,type:R}}wJ(Z,X.name);let Y=_J(X);for(let M of Object.values(Z)){if(M.type?.resolvedClass)n(M.type.resolvedClass,J);if(M.type?.resolvedCollectionValue)n(M.type.resolvedCollectionValue,J);if(M.type?.discriminator)for(let j of M.type.discriminator.subTypes)n(j.value,J)}let W=o(Z,"deserialize"),F=o(Z,"serialize"),Q=t(X,Z,J,Y,W),q=FJ(X,Z,J,Y,W),B=zJ(X,Z,J,F);Object.assign(U,{_deserialize:Q,_serialize:B,_validate:q,_isAsync:W,_isSerializeAsync:F,_merged:Z})}function e(X){let J=[],U=X;while(U&&U!==Object){if(Object.hasOwn(U,K))J.push(U);let Y=Object.getPrototypeOf(U);U=Y===U?null:Y}let Z=Object.create(null);for(let Y of J){let W=Y[K];for(let[F,Q]of Object.entries(W))if(!Z[F])Z[F]={validation:[...Q.validation],transform:[...Q.transform],expose:[...Q.expose],exclude:Q.exclude,type:Q.type,flags:{...Q.flags}};else{let q=Z[F],B=Q;for(let P of B.validation)if(!q.validation.some((z)=>z.rule===P.rule))q.validation.push(P);if(q.transform.length===0&&B.transform.length>0)q.transform=[...B.transform];if(q.expose.length===0&&B.expose.length>0)q.expose=[...B.expose];if(q.exclude===null&&B.exclude!==null)q.exclude=B.exclude;if(q.type===null&&B.type!==null)q.type=B.type;let M=q.flags,j=B.flags;if(j.isOptional!==void 0&&M.isOptional===void 0)M.isOptional=j.isOptional;if(j.isDefined!==void 0&&M.isDefined===void 0)M.isDefined=j.isDefined;if(j.validateIf!==void 0&&M.validateIf===void 0)M.validateIf=j.validateIf;if(j.isNullable!==void 0&&M.isNullable===void 0)M.isNullable=j.isNullable;if(j.validateNested!==void 0&&M.validateNested===void 0)M.validateNested=j.validateNested;if(j.validateNestedEach!==void 0&&M.validateNestedEach===void 0)M.validateNestedEach=j.validateNestedEach}}return Z}function XQ(X,J,U){let Z=f(X);if(Z._isAsync)return Z._deserialize(J,U).then((W)=>{if(AJ(W))return g(W.data);return W});let Y=Z._deserialize(J,U);if(AJ(Y))return g(Y.data);return Y}function ZQ(X,...J){if(typeof X==="function"&&J.length>=1){let U=J[0];if(!(U!=null&&typeof U==="function"&&("emit"in U)&&("ruleName"in U))){let Y=f(X),W=J[1];if(Y._isAsync)return Y._validate(U,W).then((Q)=>Q===null?!0:g(Q));let F=Y._validate(U,W);return F===null?!0:g(F)}}return $Q(X,J)}function $Q(X,J){if(J.length===0)return!0;if(J.some((Y)=>Y.isAsync))return UQ(X,J);if(J.length===1){let Y=J[0];return Y(X)?!0:g([{path:"",code:Y.ruleName}])}if(J.length===2){let Y=J[0],W=J[1],F=Y(X),Q=W(X);if(F&&Q)return!0;let q=[];if(!F)q.push({path:"",code:Y.ruleName});if(!Q)q.push({path:"",code:W.ruleName});return g(q)}if(J.length===3){let Y=J[0],W=J[1],F=J[2],Q=Y(X),q=W(X),B=F(X);if(Q&&q&&B)return!0;let M=[];if(!Q)M.push({path:"",code:Y.ruleName});if(!q)M.push({path:"",code:W.ruleName});if(!B)M.push({path:"",code:F.ruleName});return g(M)}let Z=[];for(let Y of J)if(!Y(X))Z.push({path:"",code:Y.ruleName});return Z.length?g(Z):!0}async function UQ(X,J){let U=[];for(let Z of J)if(!await Z(X))U.push({path:"",code:Z.ruleName});return U.length?g(U):!0}function YQ(X,J){if(X==null||typeof X!=="object")throw new O("serialize: expected a class instance, got "+(X===null?"null":typeof X));let U=X.constructor;if(typeof U!=="function")throw new O("serialize: instance has no constructor");let Z=f(U);if(Z._isSerializeAsync)return Z._serialize(X,J);return Z._serialize(X,J)}function qQ(X,J){let U=typeof X==="string"?X:X.name,Z=typeof X==="string"?J:X.validate,Y=typeof X==="object"?X.constraints:void 0,W=typeof X==="object"?X.requiresType:void 0,F=i(Z),Q=function(q){let B=Z(q);if(!F&&TJ(B))throw Error(`createRule(${U}): sync rule returned Promise. Declare the validator with async if it is asynchronous.`);return B};if(Q.emit=function(q,B){let M=B.addRef(Q);return`if(!(${F?"await ":""}_refs[${M}](${q}))) ${B.fail(U)};`},Q.ruleName=U,Q.isAsync=F,Y)Q.constraints=Y;if(W)Q.requiresType=W;return Q}export{ZQ as validate,YQ as serialize,IJ as isBakerError,XQ as deserialize,qQ as createRule,bJ as configure,HQ as arrayOf,O as SealError,jQ as Field};
1
+ // Public API — Core
2
+ export { deserialize, deserializeSync, deserializeAsync } from './src/functions/deserialize.js';
3
+ export { validate, validateSync, validateAsync } from './src/functions/validate.js';
4
+ export { serialize, serializeSync, serializeAsync } from './src/functions/serialize.js';
5
+ export { configure } from './src/configure.js';
6
+ export { createRule } from './src/create-rule.js';
7
+ export { seal } from './src/seal/seal.js';
8
+ // Decorators
9
+ export { Field, arrayOf, Recipe } from './src/decorators/index.js';
10
+ export { isBakerIssueSet, BakerError } from './src/errors.js';
@@ -1,12 +1,15 @@
1
- import type { RawPropertyMeta, RuleDef, TransformDef, ExposeDef, ExcludeDef, TypeDef } from './types';
1
+ import type { RawClassMeta, RawPropertyMeta } from './types';
2
+ import { RAW } from './symbols';
3
+ type MetaObject = Record<PropertyKey, unknown> & {
4
+ [RAW]?: RawClassMeta;
5
+ };
2
6
  /**
3
- * Returns the RawPropertyMeta for the given propertyKey on ctor.
4
- * - Creates with default values if it doesn't exist.
5
- * - Automatically registers ctor in the global registry (registered if at least one decorator exists).
7
+ * Returns the RawPropertyMeta for the given propertyKey on the class's decorator metadata.
8
+ * Creates the RAW slot and the per-key default meta if absent.
9
+ *
10
+ * The own-RAW check is required: a subclass's metadata inherits the parent's RAW via the
11
+ * metadata prototype chain, so a bare assignment would pollute the parent. Creating a fresh
12
+ * own RAW (null prototype) keeps child fields isolated.
6
13
  */
7
- export declare function ensureMeta(ctor: Function, key: string): RawPropertyMeta;
8
- export declare function collectValidation(target: object, key: string, ruleDef: RuleDef): void;
9
- export declare function collectTransform(target: object, key: string, transformDef: TransformDef): void;
10
- export declare function collectExpose(target: object, key: string, exposeDef: ExposeDef): void;
11
- export declare function collectExclude(target: object, key: string, excludeDef: ExcludeDef): void;
12
- export declare function collectType(target: object, key: string, typeDef: TypeDef): void;
14
+ export declare function ensureMeta(metadata: MetaObject, key: string): RawPropertyMeta;
15
+ export {};
@@ -0,0 +1,26 @@
1
+ import { RAW } from './symbols.js';
2
+ // ─────────────────────────────────────────────────────────────────────────────
3
+ // ensureMeta — Internal utility (§3.1)
4
+ // ─────────────────────────────────────────────────────────────────────────────
5
+ /**
6
+ * Returns the RawPropertyMeta for the given propertyKey on the class's decorator metadata.
7
+ * Creates the RAW slot and the per-key default meta if absent.
8
+ *
9
+ * The own-RAW check is required: a subclass's metadata inherits the parent's RAW via the
10
+ * metadata prototype chain, so a bare assignment would pollute the parent. Creating a fresh
11
+ * own RAW (null prototype) keeps child fields isolated.
12
+ */
13
+ export function ensureMeta(metadata, key) {
14
+ if (!Object.hasOwn(metadata, RAW)) {
15
+ metadata[RAW] = Object.create(null);
16
+ }
17
+ const raw = metadata[RAW];
18
+ return (raw[key] ??= {
19
+ validation: [],
20
+ transform: [],
21
+ expose: [],
22
+ exclude: null,
23
+ type: null,
24
+ flags: {},
25
+ });
26
+ }
@@ -1,5 +1,5 @@
1
1
  import type { SealOptions } from './interfaces';
2
- export interface BakerConfig {
2
+ interface BakerConfig {
3
3
  /** Automatic type conversion ("123" → 123). @default false */
4
4
  autoConvert?: boolean;
5
5
  /** Use class default values when key is missing from input. @default false */
@@ -12,11 +12,13 @@ export interface BakerConfig {
12
12
  debug?: boolean;
13
13
  }
14
14
  /**
15
- * Baker global configuration. Call before the first auto-seal.
15
+ * Baker global configuration. Call before `seal()`.
16
16
  * If not called, defaults are applied.
17
17
  */
18
- export declare function configure(config: BakerConfig): void;
19
- /** @internal — used by seal */
20
- export declare function _getGlobalOptions(): SealOptions;
18
+ declare function configure(config: BakerConfig): void;
19
+ /** @internal — used by seal. Returns the frozen global options; the only way to change them is configure(). */
20
+ declare function getGlobalOptions(): SealOptions;
21
21
  /** @internal — reset to defaults on unseal */
22
- export declare function _resetConfigForTesting(): void;
22
+ declare function resetConfigForTesting(): void;
23
+ export { configure, getGlobalOptions, resetConfigForTesting };
24
+ export type { BakerConfig };
@@ -0,0 +1,43 @@
1
+ import { BakerError } from './errors.js';
2
+ import { isSealed } from './seal/seal-state.js';
3
+ const BAKER_CONFIG_KEYS = new Set([
4
+ 'autoConvert',
5
+ 'allowClassDefaults',
6
+ 'stopAtFirstError',
7
+ 'forbidUnknown',
8
+ 'debug',
9
+ ]);
10
+ let globalOptionsState = Object.freeze({});
11
+ /**
12
+ * Baker global configuration. Call before `seal()`.
13
+ * If not called, defaults are applied.
14
+ */
15
+ function configure(config) {
16
+ if (isSealed()) {
17
+ throw new BakerError('[baker] configure() called after seal(). Already-sealed classes are not affected. Call configure() before seal().');
18
+ }
19
+ if (config === null || typeof config !== 'object' || Array.isArray(config)) {
20
+ throw new BakerError(`[baker] configure() requires a plain object. Received: ${config === null ? 'null' : Array.isArray(config) ? 'array' : typeof config}.`);
21
+ }
22
+ for (const key of Object.keys(config)) {
23
+ if (!BAKER_CONFIG_KEYS.has(key)) {
24
+ throw new BakerError(`[baker] configure(): unknown key '${key}'. ` + `Valid keys: ${[...BAKER_CONFIG_KEYS].join(', ')}.`);
25
+ }
26
+ }
27
+ globalOptionsState = Object.freeze({
28
+ enableImplicitConversion: config.autoConvert ?? false,
29
+ exposeDefaultValues: config.allowClassDefaults ?? false,
30
+ stopAtFirstError: config.stopAtFirstError ?? false,
31
+ whitelist: config.forbidUnknown ?? false,
32
+ debug: config.debug ?? false,
33
+ });
34
+ }
35
+ /** @internal — used by seal. Returns the frozen global options; the only way to change them is configure(). */
36
+ function getGlobalOptions() {
37
+ return globalOptionsState;
38
+ }
39
+ /** @internal — reset to defaults on unseal */
40
+ function resetConfigForTesting() {
41
+ globalOptionsState = Object.freeze({});
42
+ }
43
+ export { configure, getGlobalOptions, resetConfigForTesting };
@@ -0,0 +1,41 @@
1
+ import { BakerError } from './errors.js';
2
+ import { defineRuleMetadata } from './rule-metadata.js';
3
+ import { isAsyncFunction, isPromiseLike } from './utils.js';
4
+ export function createRule(nameOrOptions, validateFn) {
5
+ const name = typeof nameOrOptions === 'string' ? nameOrOptions : nameOrOptions.name;
6
+ const validate = typeof nameOrOptions === 'string' ? validateFn : nameOrOptions.validate;
7
+ // The overloads require `validate`; guard the untyped-JS path instead of asserting with `!`,
8
+ // so misuse fails clearly at creation rather than as a confusing TypeError at validation time.
9
+ if (typeof validate !== 'function') {
10
+ throw new BakerError(`createRule(${name}): a validate function is required.`);
11
+ }
12
+ const constraints = typeof nameOrOptions === 'object' ? nameOrOptions.constraints : undefined;
13
+ const requiresType = typeof nameOrOptions === 'object' ? nameOrOptions.requiresType : undefined;
14
+ const isAsyncFn = isAsyncFunction(validate);
15
+ // Validation function wrapper — enforces that sync rules stay sync.
16
+ const fn = function (value) {
17
+ const result = validate(value);
18
+ if (!isAsyncFn && isPromiseLike(result)) {
19
+ throw new BakerError(`createRule(${name}): sync rule returned Promise. Declare the validator with async if it is asynchronous.`);
20
+ }
21
+ return result;
22
+ };
23
+ // .emit() — generates function call code via the refs array
24
+ fn.emit = function (varName, ctx) {
25
+ const i = ctx.addRef(fn);
26
+ return `if(!(${isAsyncFn ? 'await ' : ''}refs[${i}](${varName}))) ${ctx.fail(name)};`;
27
+ };
28
+ const meta = {
29
+ emit: fn.emit,
30
+ ruleName: name,
31
+ isAsync: isAsyncFn,
32
+ };
33
+ if (constraints !== undefined) {
34
+ meta.constraints = constraints;
35
+ }
36
+ if (requiresType !== undefined) {
37
+ meta.requiresType = requiresType;
38
+ }
39
+ defineRuleMetadata(fn, meta);
40
+ return fn;
41
+ }