@zipbul/baker 0.1.1 → 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 (45) 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 +168 -2
  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 +10 -4
  27. package/dist/index-jzjz61tg.js +0 -14
  28. package/dist/index-jzjz61tg.js.map +0 -31
  29. package/dist/index-txxjqhgc.js +0 -6
  30. package/dist/index-txxjqhgc.js.map +0 -10
  31. package/dist/index.js.map +0 -9
  32. package/dist/src/decorators/array.d.ts +0 -13
  33. package/dist/src/decorators/common.d.ts +0 -39
  34. package/dist/src/decorators/date.d.ts +0 -5
  35. package/dist/src/decorators/index.js.map +0 -9
  36. package/dist/src/decorators/locales.d.ts +0 -9
  37. package/dist/src/decorators/nested.d.ts +0 -17
  38. package/dist/src/decorators/number.d.ts +0 -15
  39. package/dist/src/decorators/object.d.ts +0 -9
  40. package/dist/src/decorators/schema.d.ts +0 -13
  41. package/dist/src/decorators/string.d.ts +0 -72
  42. package/dist/src/decorators/transform.d.ts +0 -68
  43. package/dist/src/decorators/typechecker.d.ts +0 -18
  44. package/dist/src/rules/index.js.map +0 -9
  45. package/dist/src/symbols.js.map +0 -9
@@ -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,5 +1,171 @@
1
1
  // @bun
2
- import{$ as Sr,$a as So,A as L,Aa as Lr,B as M,Ba as Mr,C as N,Ca as Nr,D as Q,Da as Qr,E as U,Ea as Ur,F as W,Fa as Wr,G as X,Ga as Xr,H as Y,Ha as Yr,I as Z,Ia as Zr,J as _,Ja as _r,K as $,Ka as $r,L as rr,La as ro,M as or,Ma as oo,N as er,Na as eo,O as tr,Oa as to,P as pr,Pa as po,Q as sr,Qa as so,R as ar,Ra as ao,S as ir,Sa as io,T as mr,Ta as mo,U as nr,Ua as no,V as fr,Va as fo,W as cr,Wa as co,X as xr,Xa as xo,Y as lr,Ya as lo,Z as ur,Za as uo,_ as yr,_a as yo,a as h,aa as hr,ab as ho,b as O,ba as Or,bb as Oo,c as d,ca as dr,cb as Eo,d as E,da as Er,db as Jo,e as J,ea as Jr,eb as ko,f as k,fa as kr,g as z,ga as zr,h as B,ha as Br,i as P,ia as Pr,j as R,ja as Rr,k as V,ka as Vr,l as b,la as br,m as g,ma as gr,n as j,na as jr,o as A,oa as Ar,p as I,pa as Ir,q as T,qa as Tr,r as q,ra as qr,s as v,sa as vr,t as w,ta as wr,u as C,ua as Cr,v as D,va as Dr,w as F,wa as Fr,x as G,xa as Gr,y as H,ya as Hr,z as K,za as Kr}from"./index-jzjz61tg.js";import"./index-txxjqhgc.js";export{x as unregister,m as toJsonSchema,a as serialize,e as seal,p as deserialize,f as createRule,E as ValidateNested,d as ValidateIf,So as Type,yo as Transform,S as SealError,ho as Schema,z as NotEquals,W as NotContains,b as Nested,M as MinLength,K as MinDate,C as Min,N as MaxLength,L as MaxDate,D as Max,X as Matches,Q as Length,ar as IsVariableWidth,Z as IsUppercase,lr as IsUUID,xr as IsURL,po as IsTaxId,mr as IsSurrogatePair,to as IsStrongPassword,g as IsString,vr as IsSemVer,Sr as IsRgbColor,Xr as IsRFC3339,Eo as IsPostalCode,F as IsPositive,gr as IsPort,eo as IsPhoneNumber,ko as IsPassportNumber,O as IsOptional,fr as IsOctal,w as IsObject,er as IsNumberString,j as IsNumber,J as IsNullable,V as IsNotIn,co as IsNotEmptyObject,P as IsNotEmpty,G as IsNegative,ir as IsMultibyte,wr as IsMongoId,Oo as IsMobilePhone,Kr as IsMimeType,Yr as IsMilitaryTime,Mr as IsMagnetURI,Or as IsMACAddress,Y as IsLowercase,_r as IsLongitude,Rr as IsLocale,Zr as IsLatitude,Pr as IsLatLong,Br as IsJWT,Cr as IsJSON,q as IsInt,xo as IsInstance,R as IsIn,Jo as IsIdentityCard,zr as IsISSN,kr as IsISRC,Jr as IsISO8601,oo as IsISO4217CurrencyCode,Ir as IsISO31661Alpha3,Ar as IsISO31661Alpha2,Er as IsISIN,dr as IsISBN,ur as IsIP,Qr as IsIBAN,nr as IsHexadecimal,yr as IsHexColor,Wr as IsHash,sr as IsHalfWidth,hr as IsHSL,pr as IsFullWidth,qr as IsFirebasePushId,br as IsFQDN,$r as IsEthereumAddress,T as IsEnum,B as IsEmpty,cr as IsEmail,jr as IsEAN,H as IsDivisibleBy,h as IsDefined,tr as IsDecimal,Hr as IsDateString,I as IsDate,Vr as IsDataURI,Lr as IsCurrency,Nr as IsCreditCard,Ur as IsByteLength,ro as IsBtcAddress,or as IsBooleanString,A as IsBoolean,Gr as IsBase64,Fr as IsBase58,Dr as IsBase32,Tr as IsBIC,_ as IsAscii,v as IsArray,rr as IsAlphanumeric,$ as IsAlpha,lo as Expose,uo as Exclude,k as Equals,U as Contains,y as BakerValidationError,no as ArrayUnique,fo as ArrayNotEmpty,ao as ArrayNotContains,io as ArrayMinSize,mo as ArrayMaxSize,so as ArrayContains};
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);})) {
39
+ ${Q}
40
+ }
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});
42
+ `;case"number":return` ${Q} = Number(${Q});
43
+ if (isNaN(${Q})) { ${j} }
44
+ `;case"boolean":return` if (${Q} === 'true' || ${Q} === '1' || ${Q} === 1) ${Q} = true;
45
+ else if (${Q} === 'false' || ${Q} === '0' || ${Q} === 0) ${Q} = false;
46
+ else { ${j} }
47
+ `;case"date":return` ${Q} = new Date(${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};
61
+ `,j+=`}
62
+ `}else{j+=`if (${q}) ${B.fail(M)};
63
+ `,j+=`else {
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};
66
+ `,j+=`}
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")};
103
+ `,Y+=`}
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});
114
+ `,Y+=` }
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}); }
118
+ `,Y+=` }
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});
128
+ }
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}
156
+ } else if (instance[${JSON.stringify(J)}] === null) {
157
+ ${F} = null;
158
+ }
159
+ `;else P=`if (instance[${JSON.stringify(J)}] != null) {
160
+ ${L}
161
+ } else {
162
+ ${F} = instance[${JSON.stringify(J)}];
163
+ }
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};
3
169
 
4
- //# debugId=31FD76A57C77B63964756E2164756E21
170
+ //# debugId=508E315E41EB8D9E64756E2164756E21
5
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;
@@ -0,0 +1,74 @@
1
+ import type { EmittableRule } from '../types';
2
+ export interface ArrayOfMarker {
3
+ readonly [key: symbol]: true;
4
+ readonly rules: EmittableRule[];
5
+ }
6
+ /**
7
+ * 배열의 각 원소에 규칙 적용.
8
+ *
9
+ * @example
10
+ * @Field(arrayOf(isString(), minLength(1)))
11
+ * tags!: string[];
12
+ */
13
+ export declare function arrayOf(...rules: EmittableRule[]): ArrayOfMarker;
14
+ export interface FieldTransformParams {
15
+ value: unknown;
16
+ key: string;
17
+ obj: Record<string, unknown>;
18
+ direction: 'deserialize' | 'serialize';
19
+ }
20
+ export interface JsonSchemaOverride {
21
+ title?: string;
22
+ description?: string;
23
+ default?: unknown;
24
+ examples?: unknown[];
25
+ [key: string]: unknown;
26
+ }
27
+ export interface FieldOptions {
28
+ /** 중첩 DTO 타입. thunk — 순환 참조 지원. [Dto]면 배열. */
29
+ type?: () => (new (...args: any[]) => any) | (new (...args: any[]) => any)[];
30
+ /** 다형성 discriminator 설정 — type과 함께 사용 */
31
+ discriminator?: {
32
+ property: string;
33
+ subTypes: {
34
+ value: Function;
35
+ name: string;
36
+ }[];
37
+ };
38
+ /** discriminator 프로퍼티를 결과 객체에 유지할지 여부 */
39
+ keepDiscriminatorProperty?: boolean;
40
+ /** 검증 규칙 배열 */
41
+ rules?: (EmittableRule | ArrayOfMarker)[];
42
+ /** undefined 허용 */
43
+ optional?: boolean;
44
+ /** null 허용 */
45
+ nullable?: boolean;
46
+ /** JSON 키 매핑 (양방향) */
47
+ name?: string;
48
+ /** deserialize 방향 키 매핑 (name과 동시 사용 불가) */
49
+ deserializeName?: string;
50
+ /** serialize 방향 키 매핑 (name과 동시 사용 불가) */
51
+ serializeName?: string;
52
+ /** 필드 제외 — true: 양방향, 'deserializeOnly': 역직렬화만, 'serializeOnly': 직렬화만 */
53
+ exclude?: boolean | 'deserializeOnly' | 'serializeOnly';
54
+ /** 그룹 — 필드 가시성 제어 + validation rule 조건부 적용 */
55
+ groups?: string[];
56
+ /** 조건부 검증 — false 시 필드 전체 검증 skip */
57
+ when?: (obj: any) => boolean;
58
+ /** JSON Schema 커스텀 (프로퍼티 레벨) */
59
+ schema?: JsonSchemaOverride;
60
+ /** 값 변환 함수 */
61
+ transform?: (params: FieldTransformParams) => unknown;
62
+ /** transform 방향 제한 */
63
+ transformDirection?: 'deserializeOnly' | 'serializeOnly';
64
+ }
65
+ type RuleArg = EmittableRule | ArrayOfMarker;
66
+ /** @Field() — 빈 필드 등록 */
67
+ export declare function Field(): PropertyDecorator;
68
+ /** @Field(isString(), email()) — 가변 인자 규칙 */
69
+ export declare function Field(...rules: RuleArg[]): PropertyDecorator;
70
+ /** @Field({ type: () => Dto }) — 옵션 객체 */
71
+ export declare function Field(options: FieldOptions): PropertyDecorator;
72
+ /** @Field(isString(), { optional: true }) — 규칙 + 옵션 혼합 */
73
+ export declare function Field(...rulesAndOptions: [...RuleArg[], FieldOptions]): PropertyDecorator;
74
+ export {};
@@ -1,14 +1,2 @@
1
- export { IsDefined, IsOptional, ValidateIf, ValidateNested, IsNullable, Equals, NotEquals, IsEmpty, IsNotEmpty, IsIn, IsNotIn, } from './common';
2
- export { Nested } from './nested';
3
- export type { NestedOptions } from './nested';
4
- export { IsString, IsNumber, IsBoolean, IsDate, IsEnum, IsInt, IsArray, IsObject, } from './typechecker';
5
- export { Min, Max, IsPositive, IsNegative, IsDivisibleBy, } from './number';
6
- export { MinDate, MaxDate, } from './date';
7
- export { MinLength, MaxLength, Length, Contains, NotContains, Matches, IsLowercase, IsUppercase, IsAscii, IsAlpha, IsAlphanumeric, IsBooleanString, IsNumberString, IsDecimal, IsFullWidth, IsHalfWidth, IsVariableWidth, IsMultibyte, IsSurrogatePair, IsHexadecimal, IsOctal, IsEmail, IsURL, IsUUID, IsIP, IsHexColor, IsRgbColor, IsHSL, IsMACAddress, IsISBN, IsISIN, IsISO8601, IsISRC, IsISSN, IsJWT, IsLatLong, IsLocale, IsDataURI, IsFQDN, IsPort, IsEAN, IsISO31661Alpha2, IsISO31661Alpha3, IsBIC, IsFirebasePushId, IsSemVer, IsMongoId, IsJSON, IsBase32, IsBase58, IsBase64, IsDateString, IsMimeType, IsCurrency, IsMagnetURI, IsCreditCard, IsIBAN, IsByteLength, IsHash, IsRFC3339, IsMilitaryTime, IsLatitude, IsLongitude, IsEthereumAddress, IsBtcAddress, IsISO4217CurrencyCode, IsPhoneNumber, IsStrongPassword, IsTaxId, } from './string';
8
- export type { IsEmailOptions, IsURLOptions, IsBase32Options, IsBase64Options, IsDateStringOptions, IsCurrencyOptions, IsMACAddressOptions, IsIBANOptions, IsISSNOptions, IsFQDNOptions, IsLatLongOptions, IsISO8601Options, IsNumberStringOptions, IsDecimalOptions, IsStrongPasswordOptions, } from './string';
9
- export { ArrayContains, ArrayNotContains, ArrayMinSize, ArrayMaxSize, ArrayUnique, ArrayNotEmpty, } from './array';
10
- export { IsNotEmptyObject, IsInstance, } from './object';
11
- export { Expose, Exclude, Transform, Type, } from './transform';
12
- export type { ExposeOptions, ExcludeOptions, TransformOptions, TypeOptions, } from './transform';
13
- export { Schema } from './schema';
14
- export { IsMobilePhone, IsPostalCode, IsIdentityCard, IsPassportNumber, } from './locales';
1
+ export { Field, arrayOf } from './field';
2
+ export type { FieldOptions, FieldTransformParams, JsonSchemaOverride, ArrayOfMarker } from './field';
@@ -1,5 +1,5 @@
1
1
  // @bun
2
- import{$,$a,A,Aa,B,Ba,C,Ca,D,Da,E,Ea,F,Fa,G,Ga,H,Ha,I,Ia,J,Ja,K,Ka,L,La,M,Ma,N,Na,O,Oa,P,Pa,Q,Qa,R,Ra,S,Sa,T,Ta,U,Ua,V,Va,W,Wa,X,Xa,Y,Ya,Z,Za,_,_a,a,aa,ab,b,ba,bb,c,ca,cb,d,da,db,e,ea,eb,f,fa,g,ga,h,ha,i,ia,j,ja,k,ka,l,la,m,ma,n,na,o,oa,p,pa,q,qa,r,ra,s,sa,t,ta,u,ua,v,va,w,wa,x,xa,y,ya,z,za}from"../../index-jzjz61tg.js";import"../../index-txxjqhgc.js";export{d as ValidateNested,c as ValidateIf,$a as Type,_a as Transform,ab as Schema,g as NotEquals,F as NotContains,l as Nested,B as MinLength,z as MinDate,u as Min,C as MaxLength,A as MaxDate,v as Max,G as Matches,D as Length,R as IsVariableWidth,I as IsUppercase,Y as IsUUID,X as IsURL,Pa as IsTaxId,T as IsSurrogatePair,Oa as IsStrongPassword,m as IsString,sa as IsSemVer,$ as IsRgbColor,Ga as IsRFC3339,cb as IsPostalCode,w as IsPositive,ma as IsPort,Na as IsPhoneNumber,eb as IsPassportNumber,b as IsOptional,V as IsOctal,t as IsObject,N as IsNumberString,n as IsNumber,e as IsNullable,k as IsNotIn,Wa as IsNotEmptyObject,i as IsNotEmpty,x as IsNegative,S as IsMultibyte,ta as IsMongoId,bb as IsMobilePhone,za as IsMimeType,Ha as IsMilitaryTime,Ba as IsMagnetURI,ba as IsMACAddress,H as IsLowercase,Ja as IsLongitude,ja as IsLocale,Ia as IsLatitude,ia as IsLatLong,ha as IsJWT,ua as IsJSON,r as IsInt,Xa as IsInstance,j as IsIn,db as IsIdentityCard,ga as IsISSN,fa as IsISRC,ea as IsISO8601,Ma as IsISO4217CurrencyCode,pa as IsISO31661Alpha3,oa as IsISO31661Alpha2,da as IsISIN,ca as IsISBN,Z as IsIP,Da as IsIBAN,U as IsHexadecimal,_ as IsHexColor,Fa as IsHash,Q as IsHalfWidth,aa as IsHSL,P as IsFullWidth,ra as IsFirebasePushId,la as IsFQDN,Ka as IsEthereumAddress,q as IsEnum,h as IsEmpty,W as IsEmail,na as IsEAN,y as IsDivisibleBy,a as IsDefined,O as IsDecimal,ya as IsDateString,p as IsDate,ka as IsDataURI,Aa as IsCurrency,Ca as IsCreditCard,Ea as IsByteLength,La as IsBtcAddress,M as IsBooleanString,o as IsBoolean,xa as IsBase64,wa as IsBase58,va as IsBase32,qa as IsBIC,J as IsAscii,s as IsArray,L as IsAlphanumeric,K as IsAlpha,Ya as Expose,Za as Exclude,f as Equals,E as Contains,Ua as ArrayUnique,Va as ArrayNotEmpty,Ra as ArrayNotContains,Sa as ArrayMinSize,Ta as ArrayMaxSize,Qa as ArrayContains};
2
+ import"../../index-xdn55cz3.js";import{c as a,d as b}from"../../index-57gr0v18.js";import"../../index-aegrb1kn.js";export{a as arrayOf,b as Field};
3
3
 
4
- //# debugId=7BE9DD90DFC747EF64756E2164756E21
4
+ //# debugId=9E4BFE621FA3997464756E2164756E21
5
5
  //# sourceMappingURL=index.js.map
@@ -1,8 +1,9 @@
1
1
  import type { RuntimeOptions } from '../interfaces';
2
2
  /**
3
3
  * input → Class 인스턴스 변환 + 검증.
4
+ * - 첫 호출 시 auto-seal (globalRegistry 전체 배치)
4
5
  * - 성공: Promise<T> 반환
5
6
  * - 검증 실패: BakerValidationError throw
6
- * - 미봉인: SealError throw
7
+ * - 데코레이터 없는 클래스: SealError throw
7
8
  */
8
9
  export declare function deserialize<T>(Class: new (...args: any[]) => T, input: unknown, options?: RuntimeOptions): Promise<T>;
@@ -1,8 +1,8 @@
1
1
  import type { RuntimeOptions } from '../interfaces';
2
2
  /**
3
3
  * Class 인스턴스 → plain 객체 변환.
4
+ * - 첫 호출 시 auto-seal (globalRegistry 전체 배치)
4
5
  * - 무검증 전제 — 항상 Record<string, unknown> 반환 (또는 Promise)
5
- * - async @Transform 사용 Promise<Record<string, unknown>> 반환
6
- * - 미봉인: SealError throw
6
+ * - 데코레이터 없는 클래스: SealError throw
7
7
  */
8
8
  export declare function serialize<T>(instance: T, options?: RuntimeOptions): Promise<Record<string, unknown>>;
@@ -4,6 +4,12 @@ export interface ToJsonSchemaOptions {
4
4
  groups?: string[];
5
5
  /** true: 모든 object 스키마에 unevaluatedProperties: false 추가 (seal의 whitelist 옵션 대응) */
6
6
  whitelist?: boolean;
7
+ /** 클래스 레벨 JSON Schema 메타데이터 (title, description 등) */
8
+ title?: string;
9
+ description?: string;
10
+ $id?: string;
11
+ /** 매핑되지 않은 규칙에 대한 콜백 (기본: console.warn) */
12
+ onUnmappedRule?: (ruleName: string, fieldKey: string) => void;
7
13
  }
8
14
  /**
9
15
  * 등록된 DTO 클래스를 JSON Schema Draft 2020-12 형식으로 변환한다.
@@ -1,29 +1,9 @@
1
- export interface ValidationOptions {
2
- /** true: 배열의 각 원소에 규칙 적용 */
3
- each?: boolean;
4
- /** 이 규칙이 속하는 그룹 목록 */
5
- groups?: string[];
6
- /** 사용자 정의 에러 메시지 — 검증 실패 시 BakerError.message에 포함 */
7
- message?: string | ((args: {
8
- property: string;
9
- value: unknown;
10
- constraints: Record<string, unknown>;
11
- }) => string);
12
- /** 검증 실패 시 BakerError.context에 포함할 임의 값 */
13
- context?: unknown;
14
- }
15
1
  export interface SealOptions {
16
2
  /**
17
3
  * validation 데코레이터를 타입 힌트로 활용한 자동 변환.
18
4
  * @default false
19
5
  */
20
6
  enableImplicitConversion?: boolean;
21
- /**
22
- * 순환 참조 감지.
23
- * 'auto' = 정적 분석으로 필요한 DTO만 WeakSet 삽입.
24
- * @default 'auto'
25
- */
26
- enableCircularCheck?: boolean | 'auto';
27
7
  /**
28
8
  * input에 해당 키가 없을 때 클래스 기본값을 사용.
29
9
  * @default false
@@ -34,18 +14,17 @@ export interface SealOptions {
34
14
  * @default false
35
15
  */
36
16
  stopAtFirstError?: boolean;
37
- /**
38
- * true: 생성된 executor 소스코드를 `SealedExecutors._source`에 저장.
39
- * 디버깅용. 프로덕션에서는 false(기본).
40
- * @default false
41
- */
42
- debug?: boolean;
43
17
  /**
44
18
  * true: 미선언 필드 거부. mergeInheritance(Class)의 key 집합을 허용 목록으로 사용.
45
19
  * @Exclude 필드도 whitelist에 포함 — 존재는 허용하되 결과에서 제외.
46
20
  * @default false
47
21
  */
48
22
  whitelist?: boolean;
23
+ /**
24
+ * true: 생성 코드에 필드 제외 사유를 주석으로 포함.
25
+ * @default false
26
+ */
27
+ debug?: boolean;
49
28
  }
50
29
  export interface RuntimeOptions {
51
30
  /** 요청별 groups — 요청마다 다를 수 있으므로 런타임에 전달 */
@@ -6,11 +6,3 @@
6
6
  * - 메타데이터는 여기에 저장되지 않음 — 인덱스(어떤 클래스가 등록되었는지)로만 사용
7
7
  */
8
8
  export declare const globalRegistry: Set<Function>;
9
- /**
10
- * 클래스를 레지스트리에서 제거한다.
11
- * seal() 후 더 이상 필요 없는 DTO를 GC 대상으로 돌린다 (§L1).
12
- *
13
- * @param cls 제거할 클래스 생성자
14
- * @returns 세트에 존재했는지 여부
15
- */
16
- export declare function unregister(cls: Function): boolean;
@@ -9,3 +9,5 @@ export { arrayContains, arrayNotContains, arrayMinSize, arrayMaxSize, arrayUniqu
9
9
  export { isNotEmptyObject, isInstance } from './object';
10
10
  export type { IsNotEmptyObjectOptions } from './object';
11
11
  export { isMobilePhone, isPostalCode, isIdentityCard, isPassportNumber } from './locales';
12
+ export { arrayOf } from '../decorators/field';
13
+ export type { ArrayOfMarker } from '../decorators/field';