@zipbul/baker 0.1.2 → 1.0.0

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 (40) hide show
  1. package/README.ko.md +368 -280
  2. package/README.md +369 -281
  3. package/dist/index-57gr0v18.js +6 -0
  4. package/dist/index-aegrb1kn.js +6 -0
  5. package/dist/index-xdn55cz3.js +4 -0
  6. package/dist/index.d.ts +6 -5
  7. package/dist/index.js +151 -152
  8. package/dist/src/configure.d.ts +33 -0
  9. package/dist/src/create-rule.d.ts +6 -15
  10. package/dist/src/decorators/field.d.ts +74 -0
  11. package/dist/src/decorators/index.d.ts +2 -14
  12. package/dist/src/decorators/index.js +2 -2
  13. package/dist/src/functions/deserialize.d.ts +2 -1
  14. package/dist/src/functions/serialize.d.ts +2 -2
  15. package/dist/src/functions/to-json-schema.d.ts +6 -0
  16. package/dist/src/interfaces.d.ts +5 -26
  17. package/dist/src/registry.d.ts +0 -8
  18. package/dist/src/rules/index.d.ts +2 -0
  19. package/dist/src/rules/index.js +11 -2
  20. package/dist/src/seal/circular-analyzer.d.ts +2 -6
  21. package/dist/src/seal/index.d.ts +1 -1
  22. package/dist/src/seal/seal.d.ts +21 -6
  23. package/dist/src/symbols.js +2 -2
  24. package/dist/src/types.d.ts +7 -7
  25. package/dist/src/utils.d.ts +2 -0
  26. package/package.json +1 -1
  27. package/dist/index-3gcf6hkv.js +0 -5
  28. package/dist/index-mx6gnk4h.js +0 -6
  29. package/dist/index-wy5sh2nx.js +0 -15
  30. package/dist/src/decorators/array.d.ts +0 -13
  31. package/dist/src/decorators/common.d.ts +0 -39
  32. package/dist/src/decorators/date.d.ts +0 -5
  33. package/dist/src/decorators/locales.d.ts +0 -9
  34. package/dist/src/decorators/nested.d.ts +0 -17
  35. package/dist/src/decorators/number.d.ts +0 -15
  36. package/dist/src/decorators/object.d.ts +0 -9
  37. package/dist/src/decorators/schema.d.ts +0 -13
  38. package/dist/src/decorators/string.d.ts +0 -72
  39. package/dist/src/decorators/transform.d.ts +0 -68
  40. package/dist/src/decorators/typechecker.d.ts +0 -18
@@ -0,0 +1,6 @@
1
+ // @bun
2
+ import{e as J}from"./index-aegrb1kn.js";var Q=new Set;function T(b,w){if(!Object.prototype.hasOwnProperty.call(b,J))b[J]=Object.create(null),Q.add(b);let j=b[J];return j[w]??={validation:[],transform:[],expose:[],exclude:null,type:null,flags:{},schema:null}}function U(b){return b[Symbol.toStringTag]==="AsyncFunction"}var Z=Symbol.for("baker:arrayOf");function d(...b){let w={rules:b};return w[Z]=!0,w}function $(b){return typeof b==="object"&&b!==null&&b[Z]===!0}var K=new Set(["type","discriminator","keepDiscriminatorProperty","rules","optional","nullable","name","deserializeName","serializeName","exclude","groups","when","schema","transform","transformDirection"]);function X(b){if(typeof b==="function")return!1;if(typeof b!=="object"||b===null)return!1;if($(b))return!1;let w=Object.keys(b);if(w.length===0)return!0;return w.some((j)=>K.has(j))}function N(b){if(b.length===0)return{rules:[],options:{}};if(b.length===1&&X(b[0])){let j=b[0];return{rules:j.rules??[],options:j}}let w=b[b.length-1];if(X(w)){let j=w,B=b.slice(0,-1);if(j.rules)B=[...B,...j.rules];return{rules:B,options:j}}return{rules:b,options:{}}}function P(b,w,j){for(let B of w)if($(B))for(let G of B.rules)b.validation.push({rule:G,each:!0,groups:j.groups});else b.validation.push({rule:B,groups:j.groups})}function S(b,w){if(w.name)b.expose.push({name:w.name,groups:w.groups});else if(w.deserializeName||w.serializeName){if(w.deserializeName)b.expose.push({name:w.deserializeName,deserializeOnly:!0,groups:w.groups});if(w.serializeName)b.expose.push({name:w.serializeName,serializeOnly:!0,groups:w.groups})}else if(w.groups)b.expose.push({groups:w.groups});else b.expose.push({})}function V(b,w){if(!w.transform)return;let j=w.transform,G=U(j)?async(z)=>j({value:z.value,key:z.key,obj:z.obj,direction:z.type}):(z)=>j({value:z.value,key:z.key,obj:z.obj,direction:z.type});if(w.transformDirection&&w.transformDirection!=="deserializeOnly"&&w.transformDirection!=="serializeOnly")throw Error(`Invalid transformDirection: "${w.transformDirection}". Expected 'deserializeOnly' or 'serializeOnly'.`);let q={};if(w.transformDirection==="deserializeOnly")q.deserializeOnly=!0;if(w.transformDirection==="serializeOnly")q.serializeOnly=!0;b.transform.push({fn:G,options:Object.keys(q).length>0?q:void 0})}function F(...b){return(w,j)=>{let B=w.constructor,q=T(B,j),{rules:z,options:v}=N(b);if(P(q,z,v),v.optional)q.flags.isOptional=!0;if(v.nullable)q.flags.isNullable=!0;if(v.when)q.flags.validateIf=v.when;if(v.type)q.type={fn:v.type,discriminator:v.discriminator,keepDiscriminatorProperty:v.keepDiscriminatorProperty};if(S(q,v),v.exclude){if(v.exclude===!0)q.exclude={};else if(v.exclude==="deserializeOnly")q.exclude={deserializeOnly:!0};else if(v.exclude==="serializeOnly")q.exclude={serializeOnly:!0}}if(V(q,v),v.schema)if(typeof q.schema==="function");else q.schema={...q.schema??{},...v.schema}}}
3
+ export{Q as a,U as b,d as c,F as d};
4
+
5
+ //# debugId=3AECA7367D7355B264756E2164756E21
6
+ //# sourceMappingURL=index-57gr0v18.js.map
@@ -0,0 +1,6 @@
1
+ // @bun
2
+ var b=Symbol.for("baker:raw"),d=Symbol.for("baker:sealed"),f=Symbol.for("baker:rawClassSchema");
3
+ export{b as e,d as f,f as g};
4
+
5
+ //# debugId=BEECA922A80577C664756E2164756E21
6
+ //# sourceMappingURL=index-aegrb1kn.js.map
@@ -0,0 +1,4 @@
1
+ // @bun
2
+
3
+ //# debugId=029AE51BD364B21F64756E2164756E21
4
+ //# sourceMappingURL=index-xdn55cz3.js.map
package/dist/index.d.ts CHANGED
@@ -1,12 +1,13 @@
1
- export { seal } from './src/seal/seal';
2
1
  export { deserialize } from './src/functions/deserialize';
3
2
  export { serialize } from './src/functions/serialize';
4
3
  export { toJsonSchema } from './src/functions/to-json-schema';
4
+ export { configure } from './src/configure';
5
5
  export { createRule } from './src/create-rule';
6
- export { unregister } from './src/registry';
7
- export * from './src/decorators/index';
6
+ export { Field, arrayOf } from './src/decorators/index';
7
+ export type { FieldOptions, FieldTransformParams, JsonSchemaOverride, ArrayOfMarker } from './src/decorators/index';
8
8
  export type { BakerError } from './src/errors';
9
9
  export { BakerValidationError, SealError } from './src/errors';
10
- export type { JsonSchema202012 } from './src/types';
11
- export type { ValidationOptions, SealOptions, RuntimeOptions } from './src/interfaces';
10
+ export type { JsonSchema202012, EmittableRule } from './src/types';
11
+ export type { BakerConfig, ConfigureResult } from './src/configure';
12
+ export type { RuntimeOptions } from './src/interfaces';
12
13
  export type { ToJsonSchemaOptions } from './src/functions/to-json-schema';
package/dist/index.js CHANGED
@@ -1,172 +1,171 @@
1
1
  // @bun
2
- import{$ as A0,$a as A1,A as e2,Aa as e0,B as J0,Ba as J1,C as Q0,Ca as Q1,D as X0,Da as X1,E as Z0,Ea as Z1,F as $0,Fa as $1,G as j0,Ga as j1,H as q0,Ha as q1,I as Y0,Ia as Y1,J as B0,Ja as B1,K as U0,Ka as U1,L as W0,La as W1,M as H0,Ma as H1,N as F0,Na as F1,O as M0,Oa as M1,P as P0,Pa as P1,Q as L0,Qa as L1,R as O0,Ra as O1,S as _0,Sa as _1,T as w0,Ta as w1,U as z0,Ua as z1,V as D0,Va as D1,W as T0,Wa as T1,X as I0,Xa as I1,Y as R0,Ya as R1,Z as G0,Za as G1,_ as V0,_a as V1,a as PJ,aa as b0,ab as b1,b as mJ,ba as S0,bb as S1,c as t,ca as k0,cb as k1,d as R,da as h0,db as h1,e as g2,ea as g0,eb as g1,f as E2,fa as E0,fb as E1,g as N2,ga as N0,gb as N1,h as K2,ha as K0,hb as K1,i as v2,ia as v0,ib as v1,j as u2,ja as u0,k as C2,ka as C0,l as f2,la as f0,m as p2,ma as p0,n as x2,na as x0,o as y2,oa as y0,p as n2,pa as n0,q as l2,qa as l0,r as o2,ra as o0,s as c2,sa as c0,t as m2,ta as m0,u as i2,ua as i0,v as d2,va as d0,w as s2,wa as s0,x as r2,xa as r0,y as t2,ya as t0,z as a2,za as a0}from"./index-3gcf6hkv.js";import"./index-wy5sh2nx.js";import{dd as C,ed as A,fd as _J}from"./index-mx6gnk4h.js";import{err as IJ,isErr as RJ}from"@zipbul/result";function V(J){return J.replace(/[^a-zA-Z0-9_]/g,(Q)=>`$${Q.charCodeAt(0)}$`)}function GJ(J){return"__bk$f_"+V(J)}function jJ(J,Q){let Z=Q.find((X)=>X.deserializeOnly&&X.name);if(Z)return Z.name;let $=Q.find((X)=>!X.deserializeOnly&&!X.serializeOnly&&X.name);if($)return $.name;return J}function qJ(J){return J.find((Z)=>!Z.serializeOnly)?.groups}function YJ(J,Q,Z,$,X){let q=Z?.stopAtFirstError??!1,B=!q,Y=Z?.exposeDefaultValues??!1,U=[],j=[],H=[],W=`'use strict';
3
- `;if(W+=`var __bk$out = new _Cls();
4
- `,B)W+=`var __bk$errors = [];
5
- `;if(W+=`if (input == null || typeof input !== 'object' || Array.isArray(input)) return _err([{path:'',code:'invalidInput'}]);
6
- `,$){j.push(new WeakSet);let L=j.length-1;W+=`if (_refs[${L}].has(input)) return _err([{path:'',code:'circular'}]);
7
- `,W+=`_refs[${L}].add(input);
8
- `}if(Z?.whitelist){let L=new Set;for(let[z,k]of Object.entries(Q)){let g=jJ(z,k.expose);L.add(g)}let w=j.length;if(j.push(L),B)W+=`for (var __bk$k of Object.keys(input)) { if (!_refs[${w}].has(__bk$k)) __bk$errors.push({path:__bk$k,code:'whitelistViolation'}); }
9
- `;else W+=`for (var __bk$k of Object.keys(input)) { if (!_refs[${w}].has(__bk$k)) return _err([{path:__bk$k,code:'whitelistViolation'}]); }
10
- `}if(Object.values(Q).some((L)=>{let w=qJ(L.expose);if(w&&w.length>0)return!0;if(L.validation.some((z)=>z.groups&&z.groups.length>0))return!0;return!1}))W+=`var __bk$groups = _opts && _opts.groups;
11
- `,W+=`var __bk$groupsSet = __bk$groups ? new Set(__bk$groups) : null;
12
- `;for(let[L,w]of Object.entries(Q)){let z=VJ(L,w,{stopAtFirstError:q,collectErrors:B,exposeDefaultValues:Y,isAsync:X,regexes:U,refs:j,execs:H,options:Z});W+=z}if(B)W+=`if (__bk$errors.length) return _err(__bk$errors);
13
- `;W+=`return __bk$out;
14
- `,W+=`//# sourceURL=baker://${J.name}/deserialize
15
- `;let P=Function("_Cls","_re","_refs","_execs","_err","_isErr",`return ${X?"async function":"function"}(input, _opts) { `+W+" }")(J,U,j,H,IJ,RJ);if(Z?.debug)P.__bakerSource=W;return P}function VJ(J,Q,Z){let{collectErrors:$,exposeDefaultValues:X}=Z;if(Q.exclude){if(!Q.exclude.serializeOnly)return""}if(Q.expose.length>0&&Q.expose.every((g)=>g.serializeOnly))return"";let q=GJ(J),B=jJ(J,Q.expose),Y=qJ(Q.expose),U=hJ(J,Z),j="",H=null;if(Q.flags.validateIf)H=Z.refs.length,Z.refs.push(Q.flags.validateIf);let W;if(X&&!Q.flags.isOptional)W=`var ${q} = (${JSON.stringify(B)} in input) ? input[${JSON.stringify(B)}] : __bk$out[${JSON.stringify(J)}];
16
- `;else W=`var ${q} = input[${JSON.stringify(B)}];
17
- `;let M="",O="";if(Y&&Y.length>0)M=`if (__bk$groupsSet && ${JSON.stringify(Y)}.some(function(g){return __bk$groupsSet.has(g);})) {
18
- `,O=`}
19
- `;let P=W,L=Q.flags.isOptional&&!Q.flags.isDefined,w=Q.flags.isNullable===!0,z=AJ(J,q,Q,Z,U),k=`__bk$out[${JSON.stringify(J)}] = null;
20
- `;if(w&&L)P+=`if (${q} === null) { ${k}}
21
- `,P+=`else if (${q} !== undefined) {
22
- `,P+=z,P+=`}
23
- `;else if(w)P+=`if (${q} === undefined) ${U.fail("isDefined")};
24
- `,P+=`else if (${q} !== null) {
25
- `,P+=z,P+=`} else { ${k}}
26
- `;else if(Q.flags.isDefined)P+=`if (${q} === undefined) ${U.fail("isDefined")};
27
- `,P+=z;else if(L)P+=`if (${q} !== undefined && ${q} !== null) {
28
- `,P+=z,P+=`}
29
- `;else P+=`if (${q} === undefined || ${q} === null) ${U.fail("isDefined")};
30
- `,P+=`else {
31
- `,P+=z,P+=`}
32
- `;if(H!==null)j+=M+`if (_refs[${H}](input)) {
33
- `+P+`}
34
- `+O;else j+=M+P+O;return j}function AJ(J,Q,Z,$,X){let{collectErrors:q,execs:B}=$,Y="",U=Z.transform.filter((j)=>!j.options?.serializeOnly);if(U.length>0)for(let j of U){let H=$.refs.length;$.refs.push(j.fn);let W=$.isAsync&&j.fn.constructor?.name==="AsyncFunction",M=`_refs[${H}]({value:${Q},key:${JSON.stringify(J)},obj:input,type:'deserialize'})`;Y+=`${Q} = ${W?"await ":""}${M};
35
- `}if(Z.flags.validateNested&&Z.type?.fn)return Y+=kJ(J,Q,Z,$,X),Y;if(Z.validation.length===0)return Y+=`__bk$out[${JSON.stringify(J)}] = ${Q};
36
- `,Y;return Y+=SJ(J,Q,Z.validation,q,X,$,Z),Y}function s(J,Q,Z,$){let X="";if(typeof J.message==="string")X+=`,message:${JSON.stringify(J.message)}`;else if(typeof J.message==="function"){let q=$.refs.length;$.refs.push(J.message);let B=$.refs.length;$.refs.push(J.rule.constraints??{}),X+=`,message:_refs[${q}]({property:${JSON.stringify(Q)},value:${Z},constraints:_refs[${B}]})`}if(J.context!==void 0){let q=$.refs.length;$.refs.push(J.context),X+=`,context:_refs[${q}]`}return X}function v(J,Q,Z,$,X){let q=s($,Q,Z,X);if(!q)return J;return{...J,fail(B){if(J.collectErrors)return`__bk$errors.push({path:${JSON.stringify(Q)},code:${JSON.stringify(B)}${q}})`;else return`return _err([{path:${JSON.stringify(Q)},code:${JSON.stringify(B)}${q}}])`}}}function u(J,Q){if(!J.groups||J.groups.length===0)return Q;return`if (!__bk$groupsSet || ${JSON.stringify(J.groups)}.some(function(g){return __bk$groupsSet.has(g);})) {
2
+ import"./index-xdn55cz3.js";import{a as G,b as S,c as aJ,d as eJ}from"./index-57gr0v18.js";import{e as b,f as V,g as MJ}from"./index-aegrb1kn.js";import{isErr as nJ}from"@zipbul/result";class u extends Error{errors;className;constructor(J,Q){let X=Q?`Validation failed for ${Q}`:"Validation failed";super(`${X}: ${J.length} error(s)`);this.name="BakerValidationError",this.errors=J,this.className=Q}}class T extends Error{constructor(J){super(J);this.name="SealError"}}var l={};function LJ(J){let Q=[];if(d())Q.push("[baker] configure() called after auto-seal. Already-sealed classes are not affected. Call configure() before the first deserialize/serialize."),console.warn("[baker] configure() called after auto-seal. Already-sealed classes are not affected. Call configure() before the first deserialize/serialize.");return l={enableImplicitConversion:J.autoConvert??!1,exposeDefaultValues:J.allowClassDefaults??!1,stopAtFirstError:J.stopAtFirstError??!1,whitelist:J.forbidUnknown??J.stripUnknown??!1,debug:J.debug??!1},{warnings:Q}}function y(){return l}import{err as zJ,isErr as _J}from"@zipbul/result";var H={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",groupsSet:"__bk$groupsSet",key:"__bk$k"};function h(J){return J.replace(/[^a-zA-Z0-9_]/g,(Q)=>`$${Q.charCodeAt(0)}$`)}function wJ(J){return H.field+h(J)}function a(J,Q){let X=Q.find(($)=>$.deserializeOnly&&$.name);if(X)return X.name;let Z=Q.find(($)=>!$.deserializeOnly&&!$.serializeOnly&&$.name);if(Z)return Z.name;return J}function e(J){let Q=J.filter((Z)=>!Z.serializeOnly);if(Q.length===0)return;if(Q.some((Z)=>!Z.groups||Z.groups.length===0))return;let X=new Set;for(let Z of Q)for(let $ of Z.groups)X.add($);return[...X]}function JJ(J,Q,X,Z,$){let U=X?.stopAtFirstError??!1,j=!U,Y=X?.exposeDefaultValues??!1,q=[],M=[],B=[],P=`'use strict';
3
+ `;if(P+=`var ${H.out} = new _Cls();
4
+ `,j)P+=`var ${H.errList} = [];
5
+ `;if(P+=`if (input == null || typeof input !== 'object' || Array.isArray(input)) return _err([{path:'',code:'invalidInput'}]);
6
+ `,Z){M.push(new WeakSet);let L=M.length-1;P+=`if (_refs[${L}].has(input)) return _err([{path:'',code:'circular'}]);
7
+ `,P+=`_refs[${L}].add(input);
8
+ `}if(X?.whitelist){let L=new Set;for(let[D,w]of Object.entries(Q)){let I=a(D,w.expose);L.add(I)}let _=M.length;if(M.push(L),j)P+=`for (var ${H.key} of Object.keys(input)) { if (!_refs[${_}].has(${H.key})) ${H.errList}.push({path:${H.key},code:'whitelistViolation'}); }
9
+ `;else P+=`for (var ${H.key} of Object.keys(input)) { if (!_refs[${_}].has(${H.key})) return _err([{path:${H.key},code:'whitelistViolation'}]); }
10
+ `}if(Object.values(Q).some((L)=>{let _=e(L.expose);if(_&&_.length>0)return!0;if(L.validation.some((D)=>D.groups&&D.groups.length>0))return!0;return!1}))P+=`var ${H.groups} = _opts && _opts.groups;
11
+ `,P+=`var ${H.groupsSet} = ${H.groups} ? new Set(${H.groups}) : null;
12
+ `;for(let[L,_]of Object.entries(Q)){let D=TJ(L,_,{stopAtFirstError:U,collectErrors:j,exposeDefaultValues:Y,isAsync:$,regexes:q,refs:M,execs:B,options:X});P+=D}if(j)P+=`if (${H.errList}.length) return _err(${H.errList});
13
+ `;return P+=`return ${H.out};
14
+ `,P+=`//# sourceURL=baker://${J.name}/deserialize
15
+ `,Function("_Cls","_re","_refs","_execs","_err","_isErr",`return ${$?"async function":"function"}(input, _opts) { `+P+" }")(J,q,M,B,zJ,_J)}function DJ(J,Q,X){if(J&&Q)return"nullable+optional";if(J)return"nullable";if(X)return"defined";if(Q)return"optional";return"default"}var IJ={"nullable+optional"({varName:J,assignNull:Q,validationCode:X}){let Z=`if (${J} === null) { ${Q}}
16
+ `;return Z+=`else if (${J} !== undefined) {
17
+ `,Z+=X,Z+=`}
18
+ `,Z},nullable({varName:J,emitCtx:Q,assignNull:X,validationCode:Z}){let $=`if (${J} === undefined) ${Q.fail("isDefined")};
19
+ `;return $+=`else if (${J} !== null) {
20
+ `,$+=Z,$+=`} else { ${X}}
21
+ `,$},defined({varName:J,emitCtx:Q,validationCode:X}){let Z=`if (${J} === undefined) ${Q.fail("isDefined")};
22
+ `;return Z+=X,Z},optional({varName:J,validationCode:Q}){let X=`if (${J} !== undefined && ${J} !== null) {
23
+ `;return X+=Q,X+=`}
24
+ `,X},default({varName:J,emitCtx:Q,validationCode:X}){let Z=`if (${J} === undefined || ${J} === null) ${Q.fail("isDefined")};
25
+ `;return Z+=`else {
26
+ `,Z+=X,Z+=`}
27
+ `,Z}};function TJ(J,Q,X){let{collectErrors:Z,exposeDefaultValues:$}=X;if(Q.exclude){if(!Q.exclude.serializeOnly){if(X.options?.debug){let O=Q.exclude.deserializeOnly?"deserializeOnly":"bidirectional";return`// [baker] field "${J}" excluded (${O} @Exclude)
28
+ `}return""}}if(Q.expose.length>0&&Q.expose.every((O)=>O.serializeOnly)){if(X.options?.debug)return`// [baker] field "${J}" excluded (all @Expose entries are serializeOnly)
29
+ `;return""}let U=wJ(J),j=a(J,Q.expose),Y=e(Q.expose),q=KJ(J,X),M="",B=null;if(Q.flags.validateIf)B=X.refs.length,X.refs.push(Q.flags.validateIf);let P;if($&&!Q.flags.isOptional)P=`var ${U} = (${JSON.stringify(j)} in input) ? input[${JSON.stringify(j)}] : ${H.out}[${JSON.stringify(J)}];
30
+ `;else P=`var ${U} = input[${JSON.stringify(j)}];
31
+ `;let z="",W="";if(Y&&Y.length>0){let O=JSON.stringify(Y);z=`if (${H.groupsSet} && ${O}.some(function(g){return ${H.groupsSet}.has(g);})) {
32
+ `,W=`}
33
+ `}let F=P,L=!!(Q.flags.isOptional&&!Q.flags.isDefined),_=Q.flags.isNullable===!0,D=VJ(J,U,Q,X,q),w=`${H.out}[${JSON.stringify(J)}] = null;
34
+ `,I=DJ(_,L,Q.flags.isDefined??!1);if(F+=IJ[I]({varName:U,emitCtx:q,assignNull:w,validationCode:D}),B!==null)M+=z+`if (_refs[${B}](input)) {
35
+ `+F+`}
36
+ `+W;else M+=z+F+W;return M}function VJ(J,Q,X,Z,$){let{collectErrors:U,execs:j}=Z,Y="",q=X.transform.filter((M)=>!M.options?.serializeOnly);if(q.length>0)for(let M of q){let B=Z.refs.length;Z.refs.push(M.fn);let P=Z.isAsync&&S(M.fn),z=`_refs[${B}]({value:${Q},key:${JSON.stringify(J)},obj:input,type:'deserialize'})`;Y+=`${Q} = ${P?"await ":""}${z};
37
+ `}if(X.flags.validateNested&&X.type?.fn)return Y+=gJ(J,Q,X,Z,$),Y;if(X.validation.length===0)return Y+=`${H.out}[${JSON.stringify(J)}] = ${Q};
38
+ `,Y;return Y+=GJ(J,Q,X.validation,U,$,Z,X),Y}function QJ(J,Q,X,Z){let $="";if(typeof J.message==="string")$+=`,message:${JSON.stringify(J.message)}`;else if(typeof J.message==="function"){let U=Z.refs.length;Z.refs.push(J.message);let j=Z.refs.length;Z.refs.push(J.rule.constraints??{}),$+=`,message:_refs[${U}]({property:${JSON.stringify(Q)},value:${X},constraints:_refs[${j}]})`}if(J.context!==void 0){let U=Z.refs.length;Z.refs.push(J.context),$+=`,context:_refs[${U}]`}return $}function K(J,Q,X,Z,$){let U=QJ(Z,Q,X,$);if(!U)return J;return{...J,fail(j){if(J.collectErrors)return`${H.errList}.push({path:${JSON.stringify(Q)},code:${JSON.stringify(j)}${U}})`;else return`return _err([{path:${JSON.stringify(Q)},code:${JSON.stringify(j)}${U}}])`}}}function v(J,Q){if(!J.groups||J.groups.length===0)return Q;let X=JSON.stringify(J.groups);return`if (!${H.groupsSet} || ${X}.some(function(g){return ${H.groupsSet}.has(g);})) {
37
39
  ${Q}
38
40
  }
39
- `}function ZJ(J,Q,Z,$,X,q){let B=X?`__bk$errors.push({path:${JSON.stringify(Z)},code:'conversionFailed'}); ${$} = true;`:q.fail("conversionFailed")+";";switch(J){case"string":return` ${Q} = String(${Q});
41
+ `}function s(J,Q,X,Z,$,U){let j=$?`${H.errList}.push({path:${JSON.stringify(X)},code:'conversionFailed'}); ${Z} = true;`:U.fail("conversionFailed")+";";switch(J){case"string":return` ${Q} = String(${Q});
40
42
  `;case"number":return` ${Q} = Number(${Q});
41
- if (isNaN(${Q})) { ${B} }
43
+ if (isNaN(${Q})) { ${j} }
42
44
  `;case"boolean":return` if (${Q} === 'true' || ${Q} === '1' || ${Q} === 1) ${Q} = true;
43
45
  else if (${Q} === 'false' || ${Q} === '0' || ${Q} === 0) ${Q} = false;
44
- else { ${B} }
46
+ else { ${j} }
45
47
  `;case"date":return` ${Q} = new Date(${Q});
46
- if (isNaN(${Q}.getTime())) { ${B} }
47
- `;default:return""}}var bJ={Number:"number",Boolean:"boolean",String:"string",Date:"date"};function SJ(J,Q,Z,$,X,q,B){let Y=Z.filter((F)=>F.each),U=Z.filter((F)=>!F.each),j="",H=U.filter((F)=>F.rule.requiresType==="string"),W=U.filter((F)=>F.rule.requiresType==="number"),M=U.filter((F)=>F.rule.requiresType==="boolean"),O=U.filter((F)=>F.rule.requiresType==="date"),P=U.filter((F)=>!F.rule.requiresType),L=[{type:"string",deps:H},{type:"number",deps:W},{type:"boolean",deps:M},{type:"date",deps:O}].filter((F)=>F.deps.length>0);if(L.length>1)throw new R(`Field "${J}" has conflicting requiresType: ${L.map((F)=>F.type).join(", ")}`);let w={isString:"string",isNumber:"number",isBoolean:"boolean",isDate:"date",isInt:"number"},z=new Set(["isString","isBoolean"]),k=L.length>0,g=k?L[0]:void 0,l=g?.type??null,o=g?.deps??[],E=-1;if(l)E=P.findIndex((F)=>w[F.rule.ruleName]===l);let p=!!q.options?.enableImplicitConversion&&!B?.transform.some((F)=>!F.options?.serializeOnly),x=null;if(!k&&p&&E<0)for(let F=0;F<P.length;F++){let _=w[P[F].rule.ruleName];if(_){E=F,x=_;break}}let S=E>=0?P[E]:void 0,c=null;if(!k&&!x&&p&&B?.type?.fn)try{let F=B.type.fn();c=bJ[F.name]??null}catch{}let y=l??x??c;if(k||x||c){let F=S?P.filter((D,G)=>G!==E):P,_,T;if(S)T=S.rule.ruleName;else if(o.length>0)T=o[0].rule.ruleName;else T="conversionFailed";if(y==="date")_=`!(${Q} instanceof Date)`;else _=`typeof ${Q} !== '${y}'`;let N=S?v(X,J,Q,S,q):X,h=(D)=>{let G="";if(S&&!z.has(S.rule.ruleName)){let I=u(S,S.rule.emit(Q,v(X,J,Q,S,q)));G+=D+I.replace(/\n/g,`
48
- `+D)+`
49
- `}for(let I of F){let K=u(I,I.rule.emit(Q,v(X,J,Q,I,q)));G+=D+K.replace(/\n/g,`
50
- `+D)+`
51
- `}for(let I of o){let K=u(I,I.rule.emit(Q,v(X,J,Q,I,q)));G+=D+K.replace(/\n/g,`
52
- `+D)+`
53
- `}return G};if($)if(p){let D=`__bk$skip_${V(J)}`;j+=`var ${D} = false;
54
- `,j+=`if (${_}) {
55
- `,j+=ZJ(y,Q,J,D,!0,X),j+=`}
56
- `,j+=`if (!${D}) {
57
- `;let G=`__bk$mark_${V(J)}`;j+=` var ${G} = __bk$errors.length;
58
- `,j+=h(" "),j+=` if (__bk$errors.length === ${G}) __bk$out[${JSON.stringify(J)}] = ${Q};
48
+ if (isNaN(${Q}.getTime())) { ${j} }
49
+ `;default:throw new T(`Unknown implicit conversion type: "${J}" for field "${X}"`)}}var OJ={Number:"number",Boolean:"boolean",String:"string",Date:"date"},r={isString:"string",isNumber:"number",isBoolean:"boolean",isDate:"date",isInt:"number"},RJ=new Set(["isString","isBoolean"]);function AJ(J,Q){let X=Q.filter((B)=>B.each),Z=Q.filter((B)=>!B.each),$=Z.filter((B)=>B.rule.requiresType==="string"),U=Z.filter((B)=>B.rule.requiresType==="number"),j=Z.filter((B)=>B.rule.requiresType==="boolean"),Y=Z.filter((B)=>B.rule.requiresType==="date"),q=Z.filter((B)=>!B.rule.requiresType),M=[{type:"string",deps:$},{type:"number",deps:U},{type:"boolean",deps:j},{type:"date",deps:Y}].filter((B)=>B.deps.length>0);if(M.length>1)throw new T(`Field "${J}" has conflicting requiresType: ${M.map((B)=>B.type).join(", ")}`);return{each:X,generalRules:q,typedDeps:M.length>0?M[0]:void 0}}function bJ(J,Q,X,Z){let{generalRules:$,typedDeps:U}=Q,j=!!U,Y=U?.type??null,q=U?.deps??[],M=-1;if(Y)M=$.findIndex((F)=>r[F.rule.ruleName]===Y);let B=!!Z.options?.enableImplicitConversion&&!X?.transform.some((F)=>!F.options?.serializeOnly),P=null;if(!j&&B&&M<0)for(let F=0;F<$.length;F++){let L=r[$[F].rule.ruleName];if(L){M=F,P=L;break}}let z=M>=0?$[M]:void 0,W=null;if(!j&&!P&&B&&X?.type?.fn)try{let F=X.type.fn(),L=Array.isArray(F)?F[0]:F;W=L?OJ[L.name]??null:null}catch(F){throw new T(`field "${J}": @Field type function threw: ${F.message}`)}return{effectiveGateType:Y??P??W,gateDeps:q,typeAsserterIdx:M,typeAsserter:z,enableConversion:B,asserterInferredGate:P,typeHintGate:W}}function kJ(J,Q,X,Z,$,U){let j="",{effectiveGateType:Y,gateCondition:q,gateErrorCode:M,gateEmitCtx:B,otherGeneral:P,gateDeps:z,typeAsserter:W,enableConversion:F}=U,L=(_)=>{let D="";if(W&&!RJ.has(W.rule.ruleName)){let w=v(W,W.rule.emit(Q,K(Z,J,Q,W,$)));D+=_+w.replace(/\n/g,`
50
+ `+_)+`
51
+ `}for(let w of P){let I=v(w,w.rule.emit(Q,K(Z,J,Q,w,$)));D+=_+I.replace(/\n/g,`
52
+ `+_)+`
53
+ `}for(let w of z){let I=v(w,w.rule.emit(Q,K(Z,J,Q,w,$)));D+=_+I.replace(/\n/g,`
54
+ `+_)+`
55
+ `}return D};if(X)if(F){let _=`${H.skip}${h(J)}`;j+=`var ${_} = false;
56
+ `,j+=`if (${q}) {
57
+ `,j+=s(Y,Q,J,_,!0,Z),j+=`}
58
+ `,j+=`if (!${_}) {
59
+ `;let D=`${H.mark}${h(J)}`;j+=` var ${D} = ${H.errList}.length;
60
+ `,j+=L(" "),j+=` if (${H.errList}.length === ${D}) ${H.out}[${JSON.stringify(J)}] = ${Q};
59
61
  `,j+=`}
60
- `}else{j+=`if (${_}) ${N.fail(T)};
62
+ `}else{j+=`if (${q}) ${B.fail(M)};
61
63
  `,j+=`else {
62
- `;let D=`__bk$mark_${V(J)}`;j+=` var ${D} = __bk$errors.length;
63
- `,j+=h(" "),j+=` if (__bk$errors.length === ${D}) __bk$out[${JSON.stringify(J)}] = ${Q};
64
+ `;let _=`${H.mark}${h(J)}`;j+=` var ${_} = ${H.errList}.length;
65
+ `,j+=L(" "),j+=` if (${H.errList}.length === ${_}) ${H.out}[${JSON.stringify(J)}] = ${Q};
64
66
  `,j+=`}
65
- `}else if(p)j+=`if (${_}) {
66
- `,j+=ZJ(y,Q,J,null,!1,X),j+=`}
67
- `,j+=h(""),j+=`__bk$out[${JSON.stringify(J)}] = ${Q};
68
- `;else j+=`if (${_}) ${N.fail(T)};
69
- `,j+=h(""),j+=`__bk$out[${JSON.stringify(J)}] = ${Q};
70
- `}else if($)if(P.length===0)j+=`__bk$out[${JSON.stringify(J)}] = ${Q};
71
- `;else{let F=`__bk$mark_${V(J)}`;j+=`var ${F} = __bk$errors.length;
72
- `;for(let _ of P)j+=u(_,_.rule.emit(Q,v(X,J,Q,_,q)))+`
73
- `;j+=`if (__bk$errors.length === ${F}) __bk$out[${JSON.stringify(J)}] = ${Q};
74
- `}else{for(let F of P)j+=u(F,F.rule.emit(Q,v(X,J,Q,F,q)))+`
75
- `;j+=`__bk$out[${JSON.stringify(J)}] = ${Q};
76
- `}for(let F of Y){let _=JSON.stringify(J),T=`__bk$i_${V(J)}`,N=`__bk$si_${V(J)}`,h=`__bk$sv_${V(J)}`,D=`__bk$mi_${V(J)}`,G=`__bk$mv_${V(J)}`,I=s(F,J,Q,q),K=F.groups&&F.groups.length>0?`if (!__bk$groupsSet || ${JSON.stringify(F.groups)}.some(function(g){return __bk$groupsSet.has(g);})) {
77
- `:"",XJ=F.groups&&F.groups.length>0?`}
78
- `:"";if($){let m={...X,fail:(b)=>`__bk$errors.push({path:${_}+'['+${T}+']',code:${JSON.stringify(b)}${I}})`},i={...X,fail:(b)=>`__bk$errors.push({path:${_}+'['+${N}+']',code:${JSON.stringify(b)}${I}})`},d={...X,fail:(b)=>`__bk$errors.push({path:${_}+'['+${D}+']',code:${JSON.stringify(b)}${I}})`};j+=K,j+=`if (Array.isArray(${Q})) {
79
- `,j+=` for (var ${T}=0; ${T}<${Q}.length; ${T}++) {
80
- `,j+=" "+F.rule.emit(`${Q}[${T}]`,m)+`
81
- `,j+=` }
82
- `,j+=`} else if (${Q} instanceof Set) {
83
- `,j+=` var ${N} = 0;
84
- `,j+=` for (var ${h} of ${Q}) {
85
- `,j+=" "+F.rule.emit(h,i)+`
86
- `,j+=` ${N}++;
87
- `,j+=` }
88
- `,j+=`} else if (${Q} instanceof Map) {
89
- `,j+=` var ${D} = 0;
90
- `,j+=` for (var ${G} of ${Q}.values()) {
91
- `,j+=" "+F.rule.emit(G,d)+`
92
- `,j+=` ${D}++;
93
- `,j+=` }
94
- `,j+=`} else { __bk$errors.push({path:${_},code:'isArray'}); }
95
- `,j+=XJ}else{j+=K,j+=`if (!Array.isArray(${Q}) && !(${Q} instanceof Set) && !(${Q} instanceof Map)) ${X.fail("isArray")};
96
- `;let m={...X,fail:(b)=>`return _err([{path:${_}+'['+${T}+']',code:${JSON.stringify(b)}${I}}])`};j+=`if (Array.isArray(${Q})) {
97
- `,j+=` for (var ${T}=0; ${T}<${Q}.length; ${T}++) {
98
- `,j+=" "+F.rule.emit(`${Q}[${T}]`,m)+`
99
- `,j+=` }
100
- `,j+=`} else if (${Q} instanceof Set) {
101
- `,j+=` for (var ${h} of ${Q}) {
102
- `;let i={...X,fail:(b)=>`return _err([{path:${_},code:${JSON.stringify(b)}${I}}])`};j+=" "+F.rule.emit(h,i)+`
103
- `,j+=` }
104
- `,j+=`} else if (${Q} instanceof Map) {
105
- `,j+=` for (var ${G} of ${Q}.values()) {
106
- `;let d={...X,fail:(b)=>`return _err([{path:${_},code:${JSON.stringify(b)}${I}}])`};j+=" "+F.rule.emit(G,d)+`
107
- `,j+=` }
108
- `,j+=`}
109
- `,j+=XJ}}return j}function kJ(J,Q,Z,$,X){let{collectErrors:q,execs:B}=$;if(!Z.type)return`__bk$out[${JSON.stringify(J)}] = ${Q};
110
- `;let Y="",U=V(J);if(Z.type.discriminator){let j=JSON.stringify(Z.type.discriminator.property);Y+=`var __bk$dt_${U} = ${Q} && ${Q}[${j}];
111
- `,Y+=`switch (__bk$dt_${U}) {
112
- `;for(let H of Z.type.discriminator.subTypes){let W=H.value[A],M=B.length;B.push(W);let O=$.isAsync?"await ":"";Y+=` case ${JSON.stringify(H.name)}:
113
- `,Y+=` var __bk$r_${U} = ${O}_execs[${M}]._deserialize(${Q}, _opts);
114
- `,Y+=$J(J,Q,`__bk$r_${U}`,q),Y+=` break;
115
- `}if(Y+=` default: ${X.fail("invalidDiscriminator")};
67
+ `}else if(F)j+=`if (${q}) {
68
+ `,j+=s(Y,Q,J,null,!1,Z),j+=`}
69
+ `,j+=L(""),j+=`${H.out}[${JSON.stringify(J)}] = ${Q};
70
+ `;else j+=`if (${q}) ${B.fail(M)};
71
+ `,j+=L(""),j+=`${H.out}[${JSON.stringify(J)}] = ${Q};
72
+ `;return j}function hJ(J,Q,X,Z,$,U){let j="";if(Z)if(X.length===0)j+=`${H.out}[${JSON.stringify(J)}] = ${Q};
73
+ `;else{let Y=`${H.mark}${h(J)}`;j+=`var ${Y} = ${H.errList}.length;
74
+ `;for(let q of X)j+=v(q,q.rule.emit(Q,K($,J,Q,q,U)))+`
75
+ `;j+=`if (${H.errList}.length === ${Y}) ${H.out}[${JSON.stringify(J)}] = ${Q};
76
+ `}else{for(let Y of X)j+=v(Y,Y.rule.emit(Q,K($,J,Q,Y,U)))+`
77
+ `;j+=`${H.out}[${JSON.stringify(J)}] = ${Q};
78
+ `}return j}function SJ(J,Q,X,Z,$,U){let j="";for(let Y of X){let q=JSON.stringify(J),M=h(J),B=`${H.index}${M}`,P=`${H.setIdx}${M}`,z=`${H.setVal}${M}`,W=`${H.mapIdx}${M}`,F=`${H.mapVal}${M}`,L=QJ(Y,J,Q,U),_=Y.groups&&Y.groups.length>0?`if (!${H.groupsSet} || ${JSON.stringify(Y.groups)}.some(function(g){return ${H.groupsSet}.has(g);})) {
79
+ `:"",D=Y.groups&&Y.groups.length>0?`}
80
+ `:"",w=[{guard:`Array.isArray(${Q})`,idxVar:B,elemExpr:`${Q}[${B}]`,loopHeader:`for (var ${B}=0; ${B}<${Q}.length; ${B}++)`,counterDecl:"",counterInc:""},{guard:`${Q} instanceof Set`,idxVar:P,elemExpr:z,loopHeader:`for (var ${z} of ${Q})`,counterDecl:`var ${P} = 0;
81
+ `,counterInc:`${P}++;
82
+ `},{guard:`${Q} instanceof Map`,idxVar:W,elemExpr:F,loopHeader:`for (var ${F} of ${Q}.values())`,counterDecl:`var ${W} = 0;
83
+ `,counterInc:`${W}++;
84
+ `}],I=(O)=>{let k={...$,fail:(g)=>Z?`${H.errList}.push({path:${q}+'['+${O.idxVar}+']',code:${JSON.stringify(g)}${L}})`:`return _err([{path:${q}+'['+${O.idxVar}+']',code:${JSON.stringify(g)}${L}}])`},R="";if(R+=` ${O.counterDecl}`,R+=` ${O.loopHeader} {
85
+ `,R+=" "+Y.rule.emit(O.elemExpr,k)+`
86
+ `,O.counterInc)R+=` ${O.counterInc}`;return R+=` }
87
+ `,R};if(j+=_,Z)j+=`if (${w[0].guard}) {
88
+ `,j+=I(w[0]),j+=`} else if (${w[1].guard}) {
89
+ `,j+=I(w[1]),j+=`} else if (${w[2].guard}) {
90
+ `,j+=I(w[2]),j+=`} else { ${H.errList}.push({path:${q},code:'isArray'}); }
91
+ `;else j+=`if (!${w[0].guard} && !(${Q} instanceof Set) && !(${Q} instanceof Map)) ${$.fail("isArray")};
92
+ `,j+=`if (${w[0].guard}) {
93
+ `,j+=I(w[0]),j+=`} else if (${w[1].guard}) {
94
+ `,j+=I(w[1]),j+=`} else if (${w[2].guard}) {
95
+ `,j+=I(w[2]),j+=`}
96
+ `;j+=D}return j}function GJ(J,Q,X,Z,$,U,j){let Y=AJ(J,X),q=bJ(J,Y,j,U),M="";if(!!Y.typedDeps||q.asserterInferredGate||q.typeHintGate){let P=q.typeAsserter?Y.generalRules.filter((L,_)=>_!==q.typeAsserterIdx):Y.generalRules,z,W;if(q.typeAsserter)W=q.typeAsserter.rule.ruleName;else if(q.gateDeps.length>0)W=q.gateDeps[0].rule.ruleName;else W="conversionFailed";if(q.effectiveGateType==="date")z=`!(${Q} instanceof Date)`;else z=`typeof ${Q} !== '${q.effectiveGateType}'`;let F=q.typeAsserter?K($,J,Q,q.typeAsserter,U):$;M+=kJ(J,Q,Z,$,U,{effectiveGateType:q.effectiveGateType,gateCondition:z,gateErrorCode:W,gateEmitCtx:F,otherGeneral:P,gateDeps:q.gateDeps,typeAsserter:q.typeAsserter,enableConversion:q.enableConversion})}else M+=hJ(J,Q,Y.generalRules,Z,$,U);return M+=SJ(J,Q,Y.each,Z,$,U),M}function gJ(J,Q,X,Z,$){let{collectErrors:U,execs:j}=Z;if(!X.type)return`${H.out}[${JSON.stringify(J)}] = ${Q};
97
+ `;let Y="",q=h(J);if(X.type.discriminator){let M=JSON.stringify(X.type.discriminator.property);Y+=`var ${H.disc}${q} = ${Q} && ${Q}[${M}];
98
+ `,Y+=`switch (${H.disc}${q}) {
99
+ `;for(let B of X.type.discriminator.subTypes){let P=B.value[V],z=j.length;j.push(P);let W=Z.isAsync?"await ":"";Y+=` case ${JSON.stringify(B.name)}:
100
+ `,Y+=` var ${H.result}${q} = ${W}_execs[${z}]._deserialize(${Q}, _opts);
101
+ `,Y+=t(J,Q,`${H.result}${q}`,U),Y+=` break;
102
+ `}if(Y+=` default: ${$.fail("invalidDiscriminator")};
116
103
  `,Y+=`}
117
- `,Z.type.keepDiscriminatorProperty)Y+=`if (__bk$out[${JSON.stringify(J)}] != null) __bk$out[${JSON.stringify(J)}][${j}] = __bk$dt_${U};
118
- `}else{let j=Z.type.fn()[A],H=B.length;if(B.push(j),Z.flags.validateNestedEach||Z.validation.some((M)=>M.each)){let M=`__bk$i_${U}`,O=$.isAsync?"await ":"";Y+=`if (Array.isArray(${Q})) {
119
- `;let P=Z.validation.filter((L)=>!L.each);for(let L of P){let w=s(L,J,Q,$),z=L.rule.emit(Q,X);Y+=` ${z}
120
- `}if(Y+=` var __bk$arr_${U} = [];
121
- `,Y+=` for (var ${M}=0; ${M}<${Q}.length; ${M}++) {
122
- `,Y+=` var __bk$r_${U} = ${O}_execs[${H}]._deserialize(${Q}[${M}], _opts);
123
- `,Y+=` if (_isErr(__bk$r_${U})) {
124
- `,q)Y+=` var __bk$re_${U} = __bk$r_${U}.data;
125
- `,Y+=` for (var __bk$j_${U}=0; __bk$j_${U}<__bk$re_${U}.length; __bk$j_${U}++) {
126
- `,Y+=` __bk$errors.push({path:${JSON.stringify(J)}+'['+${M}+'].'+__bk$re_${U}[__bk$j_${U}].path,code:__bk$re_${U}[__bk$j_${U}].code});
104
+ `,X.type.keepDiscriminatorProperty)Y+=`if (${H.out}[${JSON.stringify(J)}] != null) ${H.out}[${JSON.stringify(J)}][${M}] = ${H.disc}${q};
105
+ `}else{let B=(X.type.resolvedClass??X.type.fn())[V],P=j.length;if(j.push(B),X.type?.isArray||X.flags.validateNestedEach||X.validation.some((W)=>W.each)){let W=`${H.index}${q}`,F=Z.isAsync?"await ":"";Y+=`if (Array.isArray(${Q})) {
106
+ `;let L=X.validation.filter((_)=>!_.each);for(let _ of L){let D=K($,J,Q,_,Z),w=_.rule.emit(Q,D);Y+=` ${w}
107
+ `}if(Y+=` var ${H.arr}${q} = [];
108
+ `,Y+=` for (var ${W}=0; ${W}<${Q}.length; ${W}++) {
109
+ `,Y+=` var ${H.result}${q} = ${F}_execs[${P}]._deserialize(${Q}[${W}], _opts);
110
+ `,Y+=` if (_isErr(${H.result}${q})) {
111
+ `,U)Y+=` var ${H.errors}${q} = ${H.result}${q}.data;
112
+ `,Y+=` for (var ${H.nestedIdx}${q}=0; ${H.nestedIdx}${q}<${H.errors}${q}.length; ${H.nestedIdx}${q}++) {
113
+ `,Y+=` ${H.errList}.push({path:${JSON.stringify(J)}+'['+${W}+'].'+${H.errors}${q}[${H.nestedIdx}${q}].path,code:${H.errors}${q}[${H.nestedIdx}${q}].code});
127
114
  `,Y+=` }
128
- `;else Y+=` var __bk$re_${U} = __bk$r_${U}.data;
129
- `,Y+=` return _err([{path:${JSON.stringify(J)}+'['+${M}+'].'+__bk$re_${U}[0].path,code:__bk$re_${U}[0].code}]);
130
- `;Y+=` } else { __bk$arr_${U}.push(__bk$r_${U}); }
115
+ `;else Y+=` var ${H.errors}${q} = ${H.result}${q}.data;
116
+ `,Y+=` return _err([{path:${JSON.stringify(J)}+'['+${W}+'].'+${H.errors}${q}[0].path,code:${H.errors}${q}[0].code}]);
117
+ `;Y+=` } else { ${H.arr}${q}.push(${H.result}${q}); }
131
118
  `,Y+=` }
132
- `,Y+=` __bk$out[${JSON.stringify(J)}] = __bk$arr_${U};
133
- `,Y+=`} else { ${X.fail("isArray")}; }
134
- `}else{let M=$.isAsync?"await ":"";Y+=`if (${Q} != null && typeof ${Q} === 'object') {
135
- `,Y+=` var __bk$r_${U} = ${M}_execs[${H}]._deserialize(${Q}, _opts);
136
- `,Y+=$J(J,Q,`__bk$r_${U}`,q),Y+=`} else { ${X.fail("isObject")}; }
137
- `}}return Y}function $J(J,Q,Z,$){let X=V(J);if($)return` if (_isErr(${Z})) {
138
- var __bk$re_${X} = ${Z}.data;
139
- for (var __bk$j_${X}=0; __bk$j_${X}<__bk$re_${X}.length; __bk$j_${X}++) {
140
- __bk$errors.push({path:${JSON.stringify(J+".")}+__bk$re_${X}[__bk$j_${X}].path,code:__bk$re_${X}[__bk$j_${X}].code});
119
+ `,Y+=` ${H.out}[${JSON.stringify(J)}] = ${H.arr}${q};
120
+ `,Y+=`} else { ${$.fail("isArray")}; }
121
+ `}else{let W=Z.isAsync?"await ":"";Y+=`if (${Q} != null && typeof ${Q} === 'object') {
122
+ `,Y+=` var ${H.result}${q} = ${W}_execs[${P}]._deserialize(${Q}, _opts);
123
+ `,Y+=t(J,Q,`${H.result}${q}`,U),Y+=`} else { ${$.fail("isObject")}; }
124
+ `}}return Y}function t(J,Q,X,Z){let $=h(J);if(Z)return` if (_isErr(${X})) {
125
+ var ${H.errors}${$} = ${X}.data;
126
+ for (var ${H.nestedIdx}${$}=0; ${H.nestedIdx}${$}<${H.errors}${$}.length; ${H.nestedIdx}${$}++) {
127
+ ${H.errList}.push({path:${JSON.stringify(J+".")}+${H.errors}${$}[${H.nestedIdx}${$}].path,code:${H.errors}${$}[${H.nestedIdx}${$}].code});
141
128
  }
142
- } else { __bk$out[${JSON.stringify(J)}] = ${Z}; }
143
- `;else return` if (_isErr(${Z})) {
144
- var __bk$re_${X} = ${Z}.data;
145
- return _err([{path:${JSON.stringify(J+".")}+__bk$re_${X}[0].path,code:__bk$re_${X}[0].code}]);
146
- } else { __bk$out[${JSON.stringify(J)}] = ${Z}; }
147
- `}function hJ(J,Q){let{collectErrors:Z,regexes:$,refs:X,execs:q}=Q;return{addRegex(B){return $.push(B),$.length-1},addRef(B){return X.push(B),X.length-1},addExecutor(B){return q.push(B),q.length-1},fail(B){if(Z)return`__bk$errors.push({path:${JSON.stringify(J)},code:${JSON.stringify(B)}})`;else return`return _err([{path:${JSON.stringify(J)},code:${JSON.stringify(B)}}])`},collectErrors:Z}}function gJ(J,Q){let Z=Q.find((X)=>X.serializeOnly&&X.name);if(Z)return Z.name;let $=Q.find((X)=>!X.deserializeOnly&&!X.serializeOnly&&X.name);if($)return $.name;return J}function BJ(J){return J.find((Z)=>!Z.deserializeOnly)?.groups}function UJ(J,Q,Z,$){let X=[],q=[],B=`'use strict';
148
- `;if(B+=`var __bk$out = {};
149
- `,Object.values(Q).some((H)=>{let W=BJ(H.expose);return W&&W.length>0}))B+=`var __bk$groups = _opts && _opts.groups;
150
- `,B+=`var __bk$groupsSet = __bk$groups ? new Set(__bk$groups) : null;
151
- `;for(let[H,W]of Object.entries(Q))B+=EJ(H,W,X,q,$);B+=`return __bk$out;
152
- `,B+=`//# sourceURL=baker://${J.name}/serialize
153
- `;let j=Function("_refs","_execs",`return ${$?"async function":"function"}(instance, _opts) { `+B+" }")(X,q);if(Z?.debug)j.__bakerSource=B;return j}function EJ(J,Q,Z,$,X){if(Q.exclude){if(!Q.exclude.deserializeOnly)return""}if(Q.expose.length>0&&Q.expose.every((M)=>M.deserializeOnly))return"";let q=gJ(J,Q.expose),B=BJ(Q.expose),Y="",U="",j="";if(B&&B.length>0)U=`if (__bk$groupsSet && ${JSON.stringify(B)}.some(function(g){return __bk$groupsSet.has(g);})) {
154
- `,j=`}
155
- `;let H="",W=Q.flags.isOptional;if(Q.type?.fn&&!Q.transform.filter((M)=>!M.options?.deserializeOnly).length){let M=Q.type.fn()[A],O=$.length;$.push(M);let P=Q.flags.validateNestedEach||Q.validation.some((z)=>z.each),L=`__bk$out[${JSON.stringify(q)}]`,w;if(P)if(X)w=`${L} = await Promise.all(instance[${JSON.stringify(J)}].map(async function(__ser_item) { return await _execs[${O}]._serialize(__ser_item, _opts); }));`;else w=`${L} = instance[${JSON.stringify(J)}].map(function(__ser_item) { return _execs[${O}]._serialize(__ser_item, _opts); });`;else w=`${L} = ${X?"await ":""}_execs[${O}]._serialize(instance[${JSON.stringify(J)}], _opts);`;if(W)H=`if (instance[${JSON.stringify(J)}] !== undefined && instance[${JSON.stringify(J)}] !== null) {
156
- ${w}
129
+ } else { ${H.out}[${JSON.stringify(J)}] = ${X}; }
130
+ `;else return` if (_isErr(${X})) {
131
+ var ${H.errors}${$} = ${X}.data;
132
+ return _err([{path:${JSON.stringify(J+".")}+${H.errors}${$}[0].path,code:${H.errors}${$}[0].code}]);
133
+ } else { ${H.out}[${JSON.stringify(J)}] = ${X}; }
134
+ `}function KJ(J,Q){let{collectErrors:X,regexes:Z,refs:$,execs:U}=Q;return{addRegex(j){return Z.push(j),Z.length-1},addRef(j){return $.push(j),$.length-1},addExecutor(j){return U.push(j),U.length-1},fail(j){if(X)return`${H.errList}.push({path:${JSON.stringify(J)},code:${JSON.stringify(j)}})`;else return`return _err([{path:${JSON.stringify(J)},code:${JSON.stringify(j)}}])`},collectErrors:X}}function vJ(J,Q){let X=Q.find(($)=>$.serializeOnly&&$.name);if(X)return X.name;let Z=Q.find(($)=>!$.deserializeOnly&&!$.serializeOnly&&$.name);if(Z)return Z.name;return J}function XJ(J){let Q=J.filter((Z)=>!Z.deserializeOnly);if(Q.length===0)return;if(Q.some((Z)=>!Z.groups||Z.groups.length===0))return;let X=new Set;for(let Z of Q)for(let $ of Z.groups)X.add($);return[...X]}function ZJ(J,Q,X,Z){let $=[],U=[],j=`'use strict';
135
+ `;if(j+=`var __bk$out = {};
136
+ `,Object.values(Q).some((B)=>{let P=XJ(B.expose);return P&&P.length>0}))j+=`var __bk$groups = _opts && _opts.groups;
137
+ `,j+=`var __bk$groupsSet = __bk$groups ? new Set(__bk$groups) : null;
138
+ `;for(let[B,P]of Object.entries(Q))j+=EJ(B,P,$,U,Z,X);return j+=`return __bk$out;
139
+ `,j+=`//# sourceURL=baker://${J.name}/serialize
140
+ `,Function("_refs","_execs",`return ${Z?"async function":"function"}(instance, _opts) { `+j+" }")($,U)}function EJ(J,Q,X,Z,$,U){if(Q.exclude){if(!Q.exclude.deserializeOnly){if(U?.debug){let W=Q.exclude.serializeOnly?"serializeOnly":"bidirectional";return`// [baker] field "${J}" excluded (${W} @Exclude)
141
+ `}return""}}if(Q.expose.length>0&&Q.expose.every((W)=>W.deserializeOnly)){if(U?.debug)return`// [baker] field "${J}" excluded (all @Expose entries are deserializeOnly)
142
+ `;return""}let j=vJ(J,Q.expose),Y=XJ(Q.expose),q="",M="",B="";if(Y&&Y.length>0)M=`if (__bk$groupsSet && ${JSON.stringify(Y)}.some(function(g){return __bk$groupsSet.has(g);})) {
143
+ `,B=`}
144
+ `;let P="",z=Q.flags.isOptional;if((Q.type?.resolvedClass||Q.type?.discriminator||Q.type?.fn&&Q.flags.validateNested)&&!Q.transform.filter((W)=>!W.options?.deserializeOnly).length){let W=Q.type?.isArray||Q.flags.validateNestedEach||Q.validation.some((_)=>_.each),F=`__bk$out[${JSON.stringify(j)}]`,L;if(Q.type.discriminator){let{property:_,subTypes:D}=Q.type.discriminator,w=Q.type.keepDiscriminatorProperty!==!1,I=[...D].sort((A,k)=>{if(A.value.prototype instanceof k.value)return-1;if(k.value.prototype instanceof A.value)return 1;return 0}),O=(A,k)=>{let R="";for(let g=0;g<I.length;g++){let x=I[g],PJ=x.value[V],WJ=Z.length;Z.push(PJ);let FJ=X.length;if(X.push(x.value),R+=`${g===0?"if":"} else if"} (${A} instanceof _refs[${FJ}]) {
145
+ `,R+=` var __bk$sr = ${k}_execs[${WJ}]._serialize(${A}, _opts);
146
+ `,w)R+=` __bk$sr[${JSON.stringify(_)}] = ${JSON.stringify(x.name)};
147
+ `;R+=` __bk$out_item = __bk$sr;
148
+ `}return R+="} else { __bk$out_item = "+A+`; }
149
+ `,R};if(W){let A=$?"await ":"";if($)L=`${F} = await Promise.all(instance[${JSON.stringify(J)}].map(async function(__ser_item) {
150
+ `;else L=`${F} = instance[${JSON.stringify(J)}].map(function(__ser_item) {
151
+ `;L+=` var __bk$out_item;
152
+ `,L+=O("__ser_item",A),L+=` return __bk$out_item;
153
+ `,L+="});"}else{let A=$?"await ":"",k=JSON.stringify(J);L=`var __bk$out_item;
154
+ `,L+=O(`instance[${k}]`,A),L+=`${F} = __bk$out_item;`}}else{let D=(Q.type.resolvedClass??Q.type.fn())[V],w=Z.length;if(Z.push(D),W)if($)L=`${F} = await Promise.all(instance[${JSON.stringify(J)}].map(async function(__ser_item) { return __ser_item == null ? __ser_item : await _execs[${w}]._serialize(__ser_item, _opts); }));`;else L=`${F} = instance[${JSON.stringify(J)}].map(function(__ser_item) { return __ser_item == null ? __ser_item : _execs[${w}]._serialize(__ser_item, _opts); });`;else L=`${F} = ${$?"await ":""}_execs[${w}]._serialize(instance[${JSON.stringify(J)}], _opts);`}if(z)P=`if (instance[${JSON.stringify(J)}] !== undefined && instance[${JSON.stringify(J)}] !== null) {
155
+ ${L}
157
156
  } else if (instance[${JSON.stringify(J)}] === null) {
158
- ${L} = null;
157
+ ${F} = null;
159
158
  }
160
- `;else H=`if (instance[${JSON.stringify(J)}] != null) {
161
- ${w}
159
+ `;else P=`if (instance[${JSON.stringify(J)}] != null) {
160
+ ${L}
162
161
  } else {
163
- ${L} = instance[${JSON.stringify(J)}];
162
+ ${F} = instance[${JSON.stringify(J)}];
164
163
  }
165
- `}else{let M=NJ(J,q,Q,Z,X);if(W)H+=`if (instance[${JSON.stringify(J)}] !== undefined) {
166
- `,H+=" "+M+`
167
- `,H+=`}
168
- `;else H+=M+`
169
- `}return Y+=U+H+j,Y}function NJ(J,Q,Z,$,X){let q=`__bk$out[${JSON.stringify(Q)}]`,B=Z.transform.filter((Y)=>!Y.options?.deserializeOnly);if(B.length>0){let Y=`instance[${JSON.stringify(J)}]`;for(let U of B){let j=$.length;$.push(U.fn);let H=`_refs[${j}]({value:${Y},key:${JSON.stringify(J)},obj:instance,type:'serialize'})`;Y=X&&U.fn.constructor?.name==="AsyncFunction"?`(await ${H})`:H}return`${q} = ${Y};`}return`${q} = instance[${JSON.stringify(J)}];`}function WJ(J,Q,Z){if(Z?.enableCircularCheck===!0)return!0;if(Z?.enableCircularCheck===!1)return!1;let $=new Set;function X(q){if($.has(q))return!0;$.add(q);let B=q[C];if(B)for(let Y of Object.values(B)){if(Y.type?.fn){let U=Y.type.fn();if(X(U))return!0}if(Y.type?.discriminator){for(let U of Y.type.discriminator.subTypes)if(X(U.value))return!0}}return $.delete(q),!1}return X(J)}function FJ(J,Q){let Z=Q?`${Q}.`:"";for(let[$,X]of Object.entries(J)){for(let Y of X.expose)if(Y.deserializeOnly&&Y.serializeOnly)throw new R(`Invalid @Expose on field '${Z}${$}': cannot have both deserializeOnly:true and serializeOnly:true on the same @Expose entry. Use separate @Expose decorators for each direction.`);let q=X.expose.filter((Y)=>!Y.serializeOnly),B=X.expose.filter((Y)=>!Y.deserializeOnly);HJ(Z+$,q,"deserialize"),HJ(Z+$,B,"serialize")}}function HJ(J,Q,Z){for(let $=0;$<Q.length;$++)for(let X=$+1;X<Q.length;X++){let q=Q[$].groups??[],B=Q[X].groups??[];if(KJ(q,B)){let Y=q.length===0?[]:q.filter((U)=>B.includes(U));throw new R(`@Expose conflict on '${J}': 2 @Expose stacks with '${Z}' direction and overlapping groups [${Y.join(", ")}]. Each direction must have at most one @Expose per group set.`)}}}function KJ(J,Q){if(J.length===0&&Q.length===0)return!0;if(J.length===0||Q.length===0)return!1;return J.some((Z)=>Q.includes(Z))}function n(J,Q,Z){for(let $ of Object.values(J)){if(Q==="deserialize"&&$.validation.some((q)=>q.rule.isAsync))return!0;if((Q==="deserialize"?$.transform.filter((q)=>!q.options?.serializeOnly):$.transform.filter((q)=>!q.options?.deserializeOnly)).some((q)=>q.fn.constructor?.name==="AsyncFunction"))return!0;if($.type?.fn){let q=$.type.fn(),B=Z??new Set;if(!B.has(q)){B.add(q);let Y=f(q);if(n(Y,Q,B))return!0}}if($.type?.discriminator)for(let q of $.type.discriminator.subTypes){let B=Z??new Set;if(!B.has(q.value)){B.add(q.value);let Y=f(q.value);if(n(Y,Q,B))return!0}}}return!1}var MJ=!1;function vJ(J){if(MJ)throw new R("already sealed: seal() must be called exactly once");for(let Q of PJ)r(Q,J);MJ=!0}function r(J,Q){if(Object.prototype.hasOwnProperty.call(J,A))return;let Z={_deserialize:()=>{throw new R("seal in progress")},_serialize:()=>{throw new R("seal in progress")},_isAsync:!1,_isSerializeAsync:!1};J[A]=Z;let $=f(J),X=["__proto__","constructor","prototype"];for(let W of Object.keys($))if(X.includes(W))throw new R(`${J.name}: field name '${W}' is not allowed (reserved property name)`);for(let[W,M]of Object.entries($))if(M.type&&!M.flags.validateNested&&M.transform.filter((O)=>!O.options?.serializeOnly).length===0)console.warn(`[baker] ${J.name}.${W}: @Type without @ValidateNested \u2014 nested DTO will not be validated during deserialization. Add @ValidateNested() to enable recursive validation.`);FJ($,J.name);let q=WJ(J,$,Q);for(let W of Object.values($)){if(W.type?.fn){let M=W.type.fn();r(M,Q)}if(W.type?.discriminator)for(let M of W.type.discriminator.subTypes)r(M.value,Q)}let B=n($,"deserialize"),Y=n($,"serialize"),U=YJ(J,$,Q,q,B),j=UJ(J,$,Q,Y),H={_deserialize:U,_serialize:j,_isAsync:B,_isSerializeAsync:Y};if(Q?.debug)H._source={deserialize:U.__bakerSource??"",serialize:j.__bakerSource??""};Object.assign(Z,H)}function f(J){let Q=[],Z=J;while(Z&&Z!==Object){if(Object.hasOwn(Z,C))Q.push(Z);let X=Object.getPrototypeOf(Z);Z=X===Z?null:X}let $=Object.create(null);for(let X of Q){let q=X[C];for(let[B,Y]of Object.entries(q))if(!$[B])$[B]={validation:[...Y.validation],transform:[...Y.transform],expose:[...Y.expose],exclude:Y.exclude,type:Y.type,flags:{...Y.flags},schema:typeof Y.schema==="function"?Y.schema:Y.schema?{...Y.schema}:null};else{let U=$[B],j=Y;for(let M of j.validation)if(!U.validation.some((O)=>O.rule===M.rule))U.validation.push(M);if(U.transform.length===0&&j.transform.length>0)U.transform=[...j.transform];if(U.expose.length===0&&j.expose.length>0)U.expose=[...j.expose];if(U.exclude===null&&j.exclude!==null)U.exclude=j.exclude;if(U.type===null&&j.type!==null)U.type=j.type;let H=U.flags,W=j.flags;if(W.isOptional!==void 0&&H.isOptional===void 0)H.isOptional=W.isOptional;if(W.isDefined!==void 0&&H.isDefined===void 0)H.isDefined=W.isDefined;if(W.validateIf!==void 0&&H.validateIf===void 0)H.validateIf=W.validateIf;if(W.isNullable!==void 0&&H.isNullable===void 0)H.isNullable=W.isNullable;if(W.validateNested!==void 0&&H.validateNested===void 0)H.validateNested=W.validateNested;if(W.validateNestedEach!==void 0&&H.validateNestedEach===void 0)H.validateNestedEach=W.validateNestedEach;if(U.schema==null&&j.schema!=null)U.schema=typeof j.schema==="function"?j.schema:{...j.schema};else if(U.schema!=null&&j.schema!=null){if(typeof U.schema==="function");else if(typeof j.schema==="function");else for(let[M,O]of Object.entries(j.schema))if(!(M in U.schema))U.schema[M]=O}}}return $}import{isErr as uJ}from"@zipbul/result";async function CJ(J,Q,Z){let $=J[A];if(!$)throw new R(`not sealed: ${J.name}. Call seal() before deserialize()`);let X=await $._deserialize(Q,Z);if(uJ(X))throw new t(X.data,J.name);return X}async function fJ(J,Q){let Z=J.constructor,$=Z[A];if(!$)throw new R(`not sealed: ${Z.name}. Call seal() before serialize()`);return await $._serialize(J,Q)}var pJ=new Set(["allOf","anyOf","oneOf","not","if","then","else"]),xJ={isString:()=>({type:"string"}),isNumber:()=>({type:"number"}),isInt:()=>({type:"integer"}),isBoolean:()=>({type:"boolean"}),isDate:()=>({type:"string",format:"date-time"}),isArray:()=>({type:"array"}),isObject:()=>({type:"object"}),isEnum:(J)=>({enum:J.values}),isIn:(J)=>({enum:J.values}),equals:(J)=>({const:J.value}),notEquals:(J)=>({not:{const:J.value}}),isNotIn:(J)=>({not:{enum:J.values}}),min:(J)=>J.exclusive?{exclusiveMinimum:J.min}:{minimum:J.min},max:(J)=>J.exclusive?{exclusiveMaximum:J.max}:{maximum:J.max},isPositive:()=>({exclusiveMinimum:0}),isNegative:()=>({exclusiveMaximum:0}),isDivisibleBy:(J)=>({multipleOf:J.divisor}),minLength:(J)=>({minLength:J.min}),maxLength:(J)=>({maxLength:J.max}),length:(J)=>({minLength:J.min,maxLength:J.max}),matches:(J)=>({pattern:J.pattern}),isEmail:()=>({format:"email"}),isURL:()=>({format:"uri"}),isUUID:()=>({format:"uuid"}),isISO8601:()=>({format:"date-time"}),isIP:(J)=>{if(J.version===4)return{format:"ipv4"};if(J.version===6)return{format:"ipv6"};return null},arrayMinSize:(J)=>({minItems:J.min}),arrayMaxSize:(J)=>({maxItems:J.max}),arrayUnique:()=>({uniqueItems:!0}),arrayNotEmpty:()=>({minItems:1}),arrayContains:(J)=>({contains:{enum:J.values}}),isNotEmptyObject:()=>({minProperties:1})};function yJ(J,Q){let Z={direction:Q?.direction??"deserialize",groups:Q?.groups,whitelist:Q?.whitelist,processing:new Set,defKeyMap:new Map,defs:{},nameCounter:new Map};Z.processing.add(J);let $=wJ(J,Z);if(Z.processing.delete(J),Z.defKeyMap.has(J))Z.defs[Z.defKeyMap.get(J)]=$;let X={...$};if(X.$schema="https://json-schema.org/draft/2020-12/schema",Object.keys(Z.defs).length>0)X.$defs=Z.defs;let q=J[_J];if(q)Object.assign(X,q);return X}function LJ(J,Q){let Z=Q.defKeyMap.get(J);if(Z!==void 0)return Z;let $=J.name||"Anonymous",X=Q.nameCounter.get($)??0;Q.nameCounter.set($,X+1);let q=X===0?$:`${$}_${X+1}`;return Q.defKeyMap.set(J,q),q}function OJ(J,Q){let Z=Q.defKeyMap.get(J);if(Z!==void 0&&Z in Q.defs)return{$ref:`#/$defs/${Z}`};if(Q.processing.has(J))return{$ref:`#/$defs/${LJ(J,Q)}`};let $=LJ(J,Q);Q.processing.add(J);let X=wJ(J,Q);return Q.processing.delete(J),Q.defs[$]=X,{$ref:`#/$defs/${$}`}}function wJ(J,Q){let Z=f(J),$={},X=[];for(let[B,Y]of Object.entries(Z)){let U=nJ(Y,B,Q.direction);if(U===null)continue;if(Q.groups){let H=Y.expose.filter((W)=>{if(Q.direction==="deserialize"&&W.serializeOnly)return!1;if(Q.direction==="serialize"&&W.deserializeOnly)return!1;return!0});if(H.length>0){if(!H.some((M)=>{if(!M.groups||M.groups.length===0)return!0;return M.groups.some((O)=>Q.groups.includes(O))}))continue}}let j=lJ(Y,Q);if($[U]=j,!Y.flags.isOptional)X.push(U)}let q={type:"object",properties:$};if(X.length>0)q.required=X;if(Q.whitelist)q.unevaluatedProperties=!1;return q}function nJ(J,Q,Z){if(J.exclude){if(!J.exclude.deserializeOnly&&!J.exclude.serializeOnly)return null;if(Z==="deserialize"&&!J.exclude.serializeOnly)return null;if(Z==="serialize"&&!J.exclude.deserializeOnly)return null}return J.expose.find((X)=>{if(Z==="deserialize"&&X.serializeOnly)return!1;if(Z==="serialize"&&X.deserializeOnly)return!1;return!0})?.name??Q}function lJ(J,Q){if(J.type)return oJ(J,Q);let Z=a(J.validation.filter((q)=>!q.each),Q.groups),$=a(J.validation.filter((q)=>q.each),Q.groups),X=e(Z);if($.length>0){let q=e($);if(Object.keys(q).length>0)X.items=q}if(J.flags.isNullable)JJ(X);return QJ(J,X)}function oJ(J,Q){let Z;if(J.type.discriminator){let{property:X,subTypes:q}=J.type.discriminator;Z={oneOf:q.map((Y)=>{return{...OJ(Y.value,Q),properties:{[X]:{const:Y.name}},required:[X]}})}}else{let X=J.type.fn();Z=OJ(X,Q)}if(J.flags.validateNestedEach){let X={type:"array",items:Z},q=a(J.validation.filter((Y)=>!Y.each),Q.groups),B=e(q);if(B.minItems!==void 0)X.minItems=B.minItems;if(B.maxItems!==void 0)X.maxItems=B.maxItems;if(B.uniqueItems!==void 0)X.uniqueItems=B.uniqueItems;if(J.flags.isNullable)JJ(X);return QJ(J,X)}if(J.flags.isNullable)JJ(Z);return QJ(J,Z)}function a(J,Q){if(!Q)return J;return J.filter((Z)=>{if(!Z.groups||Z.groups.length===0)return!0;return Z.groups.some(($)=>Q.includes($))})}function e(J){let Q={};for(let Z of J){let $=xJ[Z.rule.ruleName];if(!$)continue;let X=$(Z.rule.constraints??{});if(!X)continue;Object.assign(Q,X)}return Q}function JJ(J){if(J.type)J.type=Array.isArray(J.type)?[...J.type,"null"]:[J.type,"null"];else J.type=["null"]}function QJ(J,Q){if(J.schema==null)return Q;if(typeof J.schema==="function")return J.schema(Q);let Z=J.schema;return Object.keys(Z).some((X)=>pJ.has(X))?{...Z}:{...Q,...Z}}function cJ(J){let{name:Q,validate:Z}=J,$=Z.constructor.name==="AsyncFunction",X=function(q){return Z(q)};if(X.emit=function(q,B){let Y=B.addRef(Z);if($)return`if(!(await _refs[${Y}](${q}))) ${B.fail(Q)};`;return`if(!_refs[${Y}](${q})) ${B.fail(Q)};`},X.ruleName=Q,X.isAsync=$,J.constraints)X.constraints=J.constraints;if(J.requiresType)X.requiresType=J.requiresType;return X}export{mJ as unregister,yJ as toJsonSchema,fJ as serialize,vJ as seal,CJ as deserialize,cJ as createRule,K2 as ValidateNested,N2 as ValidateIf,h1 as Type,k1 as Transform,R as SealError,g1 as Schema,C2 as NotEquals,B0 as NotContains,n2 as Nested,$0 as MinLength,X0 as MinDate,t2 as Min,j0 as MaxLength,Z0 as MaxDate,a2 as Max,U0 as Matches,q0 as Length,D0 as IsVariableWidth,H0 as IsUppercase,b0 as IsUUID,A0 as IsURL,w1 as IsTaxId,I0 as IsSurrogatePair,_1 as IsStrongPassword,l2 as IsString,s0 as IsSemVer,h0 as IsRgbColor,U1 as IsRFC3339,N1 as IsPostalCode,e2 as IsPositive,l0 as IsPort,O1 as IsPhoneNumber,v1 as IsPassportNumber,E2 as IsOptional,G0 as IsOctal,r2 as IsObject,O0 as IsNumberString,o2 as IsNumber,v2 as IsNullable,y2 as IsNotIn,V1 as IsNotEmptyObject,p2 as IsNotEmpty,J0 as IsNegative,T0 as IsMultibyte,r0 as IsMongoId,E1 as IsMobilePhone,X1 as IsMimeType,W1 as IsMilitaryTime,$1 as IsMagnetURI,E0 as IsMACAddress,W0 as IsLowercase,F1 as IsLongitude,x0 as IsLocale,H1 as IsLatitude,p0 as IsLatLong,f0 as IsJWT,t0 as IsJSON,d2 as IsInt,A1 as IsInstance,x2 as IsIn,K1 as IsIdentityCard,C0 as IsISSN,u0 as IsISRC,v0 as IsISO8601,L1 as IsISO4217CurrencyCode,m0 as IsISO31661Alpha3,c0 as IsISO31661Alpha2,K0 as IsISIN,N0 as IsISBN,S0 as IsIP,q1 as IsIBAN,R0 as IsHexadecimal,k0 as IsHexColor,B1 as IsHash,z0 as IsHalfWidth,g0 as IsHSL,w0 as IsFullWidth,d0 as IsFirebasePushId,n0 as IsFQDN,M1 as IsEthereumAddress,i2 as IsEnum,f2 as IsEmpty,V0 as IsEmail,o0 as IsEAN,Q0 as IsDivisibleBy,g2 as IsDefined,_0 as IsDecimal,Q1 as IsDateString,m2 as IsDate,y0 as IsDataURI,Z1 as IsCurrency,j1 as IsCreditCard,Y1 as IsByteLength,P1 as IsBtcAddress,L0 as IsBooleanString,c2 as IsBoolean,J1 as IsBase64,e0 as IsBase58,a0 as IsBase32,i0 as IsBIC,F0 as IsAscii,s2 as IsArray,P0 as IsAlphanumeric,M0 as IsAlpha,b1 as Expose,S1 as Exclude,u2 as Equals,Y0 as Contains,t as BakerValidationError,R1 as ArrayUnique,G1 as ArrayNotEmpty,D1 as ArrayNotContains,T1 as ArrayMinSize,I1 as ArrayMaxSize,z1 as ArrayContains};
164
+ `}else{let W=uJ(J,j,Q,X,$);if(z)P+=`if (instance[${JSON.stringify(J)}] !== undefined) {
165
+ `,P+=" "+W+`
166
+ `,P+=`}
167
+ `;else P+=W+`
168
+ `}return q+=M+P+B,q}function uJ(J,Q,X,Z,$){let U=`__bk$out[${JSON.stringify(Q)}]`,j=X.transform.filter((Y)=>!Y.options?.deserializeOnly);if(j.length>0){let Y=`instance[${JSON.stringify(J)}]`;for(let q of j){let M=Z.length;Z.push(q.fn);let B=`_refs[${M}]({value:${Y},key:${JSON.stringify(J)},obj:instance,type:'serialize'})`;Y=$&&S(q.fn)?`(await ${B})`:B}return`${U} = ${Y};`}return`${U} = instance[${JSON.stringify(J)}];`}function $J(J){let Q=new Set;function X(Z){if(Q.has(Z))return!0;Q.add(Z);let $=Z[b];if($)for(let U of Object.values($)){if(U.type?.fn){let j;try{j=U.type.fn()}catch(q){throw new T(`${Z.name}: type function threw: ${q.message}`)}let Y=Array.isArray(j)?j[0]:j;if(X(Y))return!0}if(U.type?.discriminator){for(let j of U.type.discriminator.subTypes)if(X(j.value))return!0}}return Q.delete(Z),!1}return X(J)}function YJ(J,Q){let X=Q?`${Q}.`:"";for(let[Z,$]of Object.entries(J)){for(let Y of $.expose)if(Y.deserializeOnly&&Y.serializeOnly)throw new T(`Invalid @Expose on field '${X}${Z}': cannot have both deserializeOnly:true and serializeOnly:true on the same @Expose entry. Use separate @Expose decorators for each direction.`);let U=$.expose.filter((Y)=>!Y.serializeOnly),j=$.expose.filter((Y)=>!Y.deserializeOnly);jJ(X+Z,U,"deserialize"),jJ(X+Z,j,"serialize")}}function jJ(J,Q,X){for(let Z=0;Z<Q.length;Z++)for(let $=Z+1;$<Q.length;$++){let U=Q[Z].groups??[],j=Q[$].groups??[];if(CJ(U,j)){let Y=new Set(j),q=U.length===0?[]:U.filter((M)=>Y.has(M));throw new T(`@Expose conflict on '${J}': 2 @Expose stacks with '${X}' direction and overlapping groups [${q.join(", ")}]. Each direction must have at most one @Expose per group set.`)}}}function CJ(J,Q){if(J.length===0&&Q.length===0)return!0;if(J.length===0||Q.length===0)return!1;return J.some((X)=>Q.includes(X))}var fJ=new Set(["__proto__","constructor","prototype"]),NJ=new Set([Number,String,Boolean,Date]);function pJ(J){let Q=`Circular dependency during seal: ${J} is still being sealed`;return{_deserialize(){throw new T(Q)},_serialize(){throw new T(Q)},_isAsync:!1,_isSerializeAsync:!1}}function f(J,Q,X){let Z=X??new Set;for(let $ of Object.values(J)){if(Q==="deserialize"&&$.validation.some((j)=>j.rule.isAsync))return!0;if((Q==="deserialize"?$.transform.filter((j)=>!j.options?.serializeOnly):$.transform.filter((j)=>!j.options?.deserializeOnly)).some((j)=>S(j.fn)))return!0;if($.type?.resolvedClass||$.type?.fn){let j;if($.type.resolvedClass)j=$.type.resolvedClass;else try{j=$.type.fn()}catch(Y){throw new T(`type function threw: ${Y.message}`)}if(!Z.has(j)){Z.add(j);let Y=E(j);if(f(Y,Q,Z))return!0}}if($.type?.discriminator){for(let j of $.type.discriminator.subTypes)if(!Z.has(j.value)){Z.add(j.value);let Y=E(j.value);if(f(Y,Q,Z))return!0}}}return!1}var n=!1;function d(){return n}var C=new Set;function xJ(){if(n)return;let J=y();try{for(let Q of G)N(Q,J)}catch(Q){for(let X of G)if(Object.hasOwn(X,V))delete X[V];throw Q}for(let Q of G)C.add(Q),Object.freeze(Q[b]);G.clear(),n=!0}function yJ(J){if(Object.hasOwn(J,V))return;if(!Object.hasOwn(J,b))return;let Q=new Set(C),X=y();N(J,X),C.add(J),Object.freeze(J[b]),G.delete(J);let Z=[...G].filter(($)=>Object.hasOwn($,V)&&!Q.has($));for(let $ of Z)C.add($),Object.freeze($[b]),G.delete($)}function p(J){let Q=J[V];if(!Q)xJ(),Q=J[V];if(!Q)yJ(J),Q=J[V];if(!Q)throw new T(`${J.name} has no @Field decorators`);return Q}function N(J,Q){if(Object.hasOwn(J,V))return;let X=pJ(J.name);J[V]=X;let Z=E(J);for(let M of Object.keys(Z))if(fJ.has(M))throw new T(`${J.name}: field name '${M}' is not allowed (reserved property name)`);for(let[M,B]of Object.entries(Z)){if(!B.type?.fn)continue;let P=B.type.fn(),z=Array.isArray(P),W=z?P[0]:P;if(W==null||typeof W!=="function")throw new T(`${J.name}: @Type/@Field type must return a constructor or [constructor], got ${String(W)}`);let F={...B.type,isArray:z};if(!NJ.has(W)){if(F.resolvedClass=W,!B.flags.validateNested||!B.flags.validateNestedEach){if(B.flags={...B.flags},!B.flags.validateNested)B.flags.validateNested=!0;if(z&&!B.flags.validateNestedEach)B.flags.validateNestedEach=!0}}Z[M]={...B,type:F}}YJ(Z,J.name);let $=$J(J);for(let M of Object.values(Z)){if(M.type?.resolvedClass)N(M.type.resolvedClass,Q);if(M.type?.discriminator)for(let B of M.type.discriminator.subTypes)N(B.value,Q)}let U=f(Z,"deserialize"),j=f(Z,"serialize"),Y=JJ(J,Z,Q,$,U),q=ZJ(J,Z,Q,j);Object.assign(X,{_deserialize:Y,_serialize:q,_isAsync:U,_isSerializeAsync:j,_merged:Z})}function E(J){let Q=[],X=J;while(X&&X!==Object){if(Object.hasOwn(X,b))Q.push(X);let $=Object.getPrototypeOf(X);X=$===X?null:$}let Z=Object.create(null);for(let $ of Q){let U=$[b];for(let[j,Y]of Object.entries(U))if(!Z[j])Z[j]={validation:[...Y.validation],transform:[...Y.transform],expose:[...Y.expose],exclude:Y.exclude,type:Y.type,flags:{...Y.flags},schema:typeof Y.schema==="function"?Y.schema:Y.schema?{...Y.schema}:null};else{let q=Z[j],M=Y;for(let z of M.validation)if(!q.validation.some((W)=>W.rule===z.rule))q.validation.push(z);if(q.transform.length===0&&M.transform.length>0)q.transform=[...M.transform];if(q.expose.length===0&&M.expose.length>0)q.expose=[...M.expose];if(q.exclude===null&&M.exclude!==null)q.exclude=M.exclude;if(q.type===null&&M.type!==null)q.type=M.type;let B=q.flags,P=M.flags;if(P.isOptional!==void 0&&B.isOptional===void 0)B.isOptional=P.isOptional;if(P.isDefined!==void 0&&B.isDefined===void 0)B.isDefined=P.isDefined;if(P.validateIf!==void 0&&B.validateIf===void 0)B.validateIf=P.validateIf;if(P.isNullable!==void 0&&B.isNullable===void 0)B.isNullable=P.isNullable;if(P.validateNested!==void 0&&B.validateNested===void 0)B.validateNested=P.validateNested;if(P.validateNestedEach!==void 0&&B.validateNestedEach===void 0)B.validateNestedEach=P.validateNestedEach;if(q.schema==null&&M.schema!=null)q.schema=typeof M.schema==="function"?M.schema:{...M.schema};else if(q.schema!=null&&M.schema!=null){if(typeof q.schema==="function");else if(typeof M.schema==="function");else for(let[z,W]of Object.entries(M.schema))if(!(z in q.schema))q.schema[z]=W}}}return Z}async function mJ(J,Q,X){let $=await p(J)._deserialize(Q,X);if(nJ($))throw new u($.data,J.name);return $}async function cJ(J,Q){let X=J.constructor;return await p(X)._serialize(J,Q)}var qJ=new Set,oJ=new Set(["allOf","anyOf","oneOf","not","if","then","else"]),iJ={isString:()=>({type:"string"}),isNumber:()=>({type:"number"}),isInt:()=>({type:"integer"}),isBoolean:()=>({type:"boolean"}),isDate:()=>({type:"string",format:"date-time"}),isArray:()=>({type:"array"}),isObject:()=>({type:"object"}),isEnum:(J)=>({enum:J.values}),isIn:(J)=>({enum:J.values}),equals:(J)=>({const:J.value}),notEquals:(J)=>({not:{const:J.value}}),isNotIn:(J)=>({not:{enum:J.values}}),min:(J)=>J.exclusive?{exclusiveMinimum:J.min}:{minimum:J.min},max:(J)=>J.exclusive?{exclusiveMaximum:J.max}:{maximum:J.max},isPositive:()=>({exclusiveMinimum:0}),isNegative:()=>({exclusiveMaximum:0}),isDivisibleBy:(J)=>({multipleOf:J.divisor}),minLength:(J)=>({minLength:J.min}),maxLength:(J)=>({maxLength:J.max}),length:(J)=>({minLength:J.min,maxLength:J.max}),matches:(J)=>({pattern:J.pattern}),isEmail:()=>({format:"email"}),isURL:()=>({format:"uri"}),isUUID:()=>({format:"uuid"}),isISO8601:()=>({format:"date-time"}),isIP:(J)=>{if(J.version===4)return{format:"ipv4"};if(J.version===6)return{format:"ipv6"};return null},arrayMinSize:(J)=>({minItems:J.min}),arrayMaxSize:(J)=>({maxItems:J.max}),arrayUnique:()=>({uniqueItems:!0}),arrayNotEmpty:()=>({minItems:1}),arrayContains:(J)=>({contains:{enum:J.values}}),isNotEmptyObject:()=>({minProperties:1})};function lJ(J,Q){let X={direction:Q?.direction??"deserialize",groups:Q?.groups,whitelist:Q?.whitelist,processing:new Set,defKeyMap:new Map,defs:{},nameCounter:new Map,onUnmappedRule:Q?.onUnmappedRule};X.processing.add(J);let Z=BJ(J,X);if(X.processing.delete(J),X.defKeyMap.has(J))X.defs[X.defKeyMap.get(J)]=Z;let $={...Z};if($.$schema="https://json-schema.org/draft/2020-12/schema",Object.keys(X.defs).length>0)$.$defs=X.defs;let U=J[MJ];if(U)for(let[j,Y]of Object.entries(U))if(j==="properties"||j==="$defs")$[j]={...$[j]??{},...Y};else if(j==="required")$.required=[...new Set([...$.required??[],...Y])];else $[j]=Y;if(Q?.title)$.title=Q.title;if(Q?.description)$.description=Q.description;if(Q?.$id)$.$id=Q.$id;return $}function UJ(J,Q){let X=Q.defKeyMap.get(J);if(X!==void 0)return X;let Z=J.name||"Anonymous",$=Q.nameCounter.get(Z)??0;Q.nameCounter.set(Z,$+1);let U=$===0?Z:`${Z}_${$+1}`;return Q.defKeyMap.set(J,U),U}function HJ(J,Q){let X=Q.defKeyMap.get(J);if(X!==void 0&&X in Q.defs)return{$ref:`#/$defs/${X}`};if(Q.processing.has(J))return{$ref:`#/$defs/${UJ(J,Q)}`};let Z=UJ(J,Q);Q.processing.add(J);let $=BJ(J,Q);return Q.processing.delete(J),Q.defs[Z]=$,{$ref:`#/$defs/${Z}`}}function BJ(J,Q){let Z=J[V]?._merged??E(J),$={},U=[];for(let[Y,q]of Object.entries(Z)){let M=dJ(q,Y,Q.direction);if(M===null)continue;if(Q.groups){let P=q.expose.filter((z)=>{if(Q.direction==="deserialize"&&z.serializeOnly)return!1;if(Q.direction==="serialize"&&z.deserializeOnly)return!1;return!0});if(P.length>0){if(!P.some((W)=>{if(!W.groups||W.groups.length===0)return!0;return W.groups.some((F)=>Q.groups.includes(F))}))continue}else if(q.validation.length>0&&q.validation.every((z)=>z.groups&&z.groups.length>0)){if(!q.validation.some((W)=>W.groups.some((F)=>Q.groups.includes(F))))continue}}let B=sJ(q,Q,Y);if($[M]=B,!q.flags.isOptional)U.push(M)}let j={type:"object",properties:$};if(U.length>0)j.required=U;if(Q.whitelist)j.unevaluatedProperties=!1;return j}function dJ(J,Q,X){if(J.exclude){if(!J.exclude.deserializeOnly&&!J.exclude.serializeOnly)return null;if(X==="deserialize"&&!J.exclude.serializeOnly)return null;if(X==="serialize"&&!J.exclude.deserializeOnly)return null}return J.expose.find(($)=>{if(X==="deserialize"&&$.serializeOnly)return!1;if(X==="serialize"&&$.deserializeOnly)return!1;return!0})?.name??Q}function sJ(J,Q,X){if(J.type)return rJ(J,Q,X);let Z=m(J.validation.filter((j)=>!j.each),Q.groups),$=m(J.validation.filter((j)=>j.each),Q.groups),U=c(Z,Q,X);if($.length>0){let j=c($,Q,X);if(Object.keys(j).length>0)U.items=j}if(J.flags.isNullable)o(U);return i(J,U)}function rJ(J,Q,X){let Z;if(J.type.discriminator){let{property:U,subTypes:j}=J.type.discriminator;Z={oneOf:j.map((q)=>{return{allOf:[HJ(q.value,Q),{properties:{[U]:{const:q.name}},required:[U]}]}})}}else{let U=J.type.resolvedClass??J.type.fn();Z=HJ(U,Q)}if(J.type?.isArray||J.flags.validateNestedEach){let U={type:"array",items:Z},j=m(J.validation.filter((q)=>!q.each),Q.groups),Y=c(j,Q,X);if(Y.minItems!==void 0)U.minItems=Y.minItems;if(Y.maxItems!==void 0)U.maxItems=Y.maxItems;if(Y.uniqueItems!==void 0)U.uniqueItems=Y.uniqueItems;if(J.flags.isNullable)o(U);return i(J,U)}if(J.flags.isNullable)if(Z.$ref)Z={oneOf:[Z,{type:"null"}]};else if(Z.oneOf)Z={oneOf:[...Z.oneOf,{type:"null"}]};else o(Z);return i(J,Z)}function m(J,Q){if(!Q)return J;return J.filter((X)=>{if(!X.groups||X.groups.length===0)return!0;return X.groups.some((Z)=>Q.includes(Z))})}function c(J,Q,X){let Z={};for(let $ of J){let U=iJ[$.rule.ruleName];if(!U){let Y=$.rule.ruleName;if(Q?.onUnmappedRule)Q.onUnmappedRule(Y,X??"<unknown>");else if(!qJ.has(Y))qJ.add(Y),console.warn(`[baker] No JSON Schema mapping for rule "${Y}"`);continue}let j=U($.rule.constraints??{});if(!j)continue;Object.assign(Z,j)}return Z}function o(J){if(J.type)if(Array.isArray(J.type)){if(!J.type.includes("null"))J.type=[...J.type,"null"]}else J.type=J.type==="null"?["null"]:[J.type,"null"];else J.type=["null"]}function i(J,Q){if(J.schema==null)return Q;if(typeof J.schema==="function")return J.schema(Q);let X=J.schema;return Object.keys(X).some(($)=>oJ.has($))?{...Q,...X}:{...Q,...X}}function tJ(J,Q){let X=typeof J==="string"?J:J.name,Z=typeof J==="string"?Q:J.validate,$=typeof J==="object"?J.constraints:void 0,U=typeof J==="object"?J.requiresType:void 0,j=S(Z),Y=function(q){return Z(q)};if(Y.emit=function(q,M){let B=M.addRef(Z);if(j)return`if(!(await _refs[${B}](${q}))) ${M.fail(X)};`;return`if(!_refs[${B}](${q})) ${M.fail(X)};`},Y.ruleName=X,Y.isAsync=j,$)Y.constraints=$;if(U)Y.requiresType=U;return Y}export{lJ as toJsonSchema,cJ as serialize,mJ as deserialize,tJ as createRule,LJ as configure,aJ as arrayOf,T as SealError,eJ as Field,u as BakerValidationError};
170
169
 
171
- //# debugId=1F36FA98141EB89664756E2164756E21
170
+ //# debugId=508E315E41EB8D9E64756E2164756E21
172
171
  //# sourceMappingURL=index.js.map
@@ -0,0 +1,33 @@
1
+ import type { SealOptions } from './interfaces';
2
+ export interface BakerConfig {
3
+ /** 타입 자동 변환 ("123" → 123). @default false */
4
+ autoConvert?: boolean;
5
+ /** input에 키 없으면 클래스 기본값 사용. @default false */
6
+ allowClassDefaults?: boolean;
7
+ /** 첫 에러에서 중단. @default false */
8
+ stopAtFirstError?: boolean;
9
+ /** 미선언 필드를 에러로 거부. @default false */
10
+ forbidUnknown?: boolean;
11
+ /**
12
+ * @deprecated `forbidUnknown`으로 이름이 변경됨. 이 옵션은 실제로 unknown 필드를
13
+ * 조용히 제거하는 것이 아니라 에러를 발생시킴. `forbidUnknown`을 사용할 것.
14
+ * `forbidUnknown`이 명시되면 `stripUnknown`은 무시됨.
15
+ */
16
+ stripUnknown?: boolean;
17
+ /** 생성 코드에 필드 제외 사유를 주석으로 포함. @default false */
18
+ debug?: boolean;
19
+ }
20
+ export interface ConfigureResult {
21
+ warnings: string[];
22
+ }
23
+ /**
24
+ * baker 글로벌 설정. 첫 auto-seal 전에 호출.
25
+ * 안 하면 기본값 적용.
26
+ *
27
+ * @returns `{ warnings }` — seal 후 호출 시 경고 메시지 포함.
28
+ */
29
+ export declare function configure(config: BakerConfig): ConfigureResult;
30
+ /** @internal — seal에서 사용 */
31
+ export declare function _getGlobalOptions(): SealOptions;
32
+ /** @internal — unseal 시 기본값으로 리셋 */
33
+ export declare function _resetConfigForTesting(): void;
@@ -2,13 +2,8 @@ import type { EmittableRule } from './types';
2
2
  export interface CreateRuleOptions {
3
3
  /** 규칙 이름. 에러 코드로 사용됨. */
4
4
  name: string;
5
- /** 검증 함수 — true: 통과, false: 실패. async 함수 허용 (Promise<boolean> 반환 시 자동으로 async 루르로 등록). */
5
+ /** 검증 함수 — true: 통과, false: 실패. async 함수 허용 (Promise<boolean> 반환 시 자동으로 async 룰로 등록). */
6
6
  validate: (value: unknown) => boolean | Promise<boolean>;
7
- /**
8
- * 기본 에러 메시지.
9
- * @phase2 — 현재는 수집만 하고 코드 생성에서 미사용.
10
- */
11
- defaultMessage?: string;
12
7
  /** 룰 파라미터 — toJsonSchema 매핑에 사용 */
13
8
  constraints?: Record<string, unknown>;
14
9
  /** 이 룰이 전제하는 타입 — 타입 게이트 최적화에 사용 */
@@ -17,19 +12,15 @@ export interface CreateRuleOptions {
17
12
  /**
18
13
  * 사용자 정의 검증 규칙을 생성한다.
19
14
  *
20
- * 반환된 EmittableRule은:
21
- * - 함수로 직접 호출 가능 (validate 위임)
22
- * - .emit()으로 인라인 코드 생성 지원
23
- * - 데코레이터/헬퍼 양쪽에서 사용 가능
24
- *
25
15
  * @example
16
+ * // 간단 형태
17
+ * const koreanPhone = createRule('koreanPhone', (v) => /^01[016789]/.test(v as string));
18
+ *
19
+ * // 옵션 형태
26
20
  * const isEven = createRule({
27
21
  * name: 'isEven',
28
22
  * validate: (v) => typeof v === 'number' && v % 2 === 0,
29
23
  * });
30
- *
31
- * class Dto {
32
- * @IsEven() count: number;
33
- * }
34
24
  */
25
+ export declare function createRule(name: string, validate: (value: unknown) => boolean | Promise<boolean>): EmittableRule;
35
26
  export declare function createRule(options: CreateRuleOptions): EmittableRule;