The vitest suite silently ran zero tests: vitest 4 transpiles with oxc, which does not pick up `experimentalDecorators` from a tsconfig that excludes the files being transformed, so every decorator-using suite failed to parse and was reported as "0 test". A vitest.config.ts enabling legacy decorators brings all 40 existing tests back to life. - Add vitest.config.ts (oxc legacy decorators + v8 coverage config) - Type-check test files: move the test/demo exclusions from the base tsconfig onto the two build configs, and fix the strict-mode errors this surfaced - Stop shipping src/example.ts in dist (it invokes runExample() at import time, a side effect in a package declaring "sideEffects": false) - CI: run lint, tests with coverage, build and entry-point smoke checks; drop EOL Node 18, add Node 24; commit package-lock.json so `npm ci` works - Add `verify`, `test:watch` and `build:docs` scripts, and an engines field; `build:docs` regenerates the previously hand-maintained docs/cereale.js Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01SAcqrz3FcadkYr3xG32CjK
2 lines
9.7 KiB
JavaScript
2 lines
9.7 KiB
JavaScript
"use strict";var Cereale=(()=>{var v=Object.defineProperty;var S=Object.getOwnPropertyDescriptor;var N=Object.getOwnPropertyNames;var R=Object.prototype.hasOwnProperty;var L=(t,n)=>{for(var e in n)v(t,e,{get:n[e],enumerable:!0})},D=(t,n,e,a)=>{if(n&&typeof n=="object"||typeof n=="function")for(let i of N(n))!R.call(t,i)&&i!==e&&v(t,i,{get:()=>n[i],enumerable:!(a=S(n,i))||a.enumerable});return t};var z=t=>D(v({},"__esModule",{value:!0}),t);var pt={};L(pt,{ArrayMaxSize:()=>ot,ArrayMinSize:()=>rt,ArrayNotEmpty:()=>lt,Email:()=>et,IsArray:()=>st,IsBoolean:()=>H,IsDate:()=>dt,IsDefined:()=>_,IsIn:()=>ut,IsInt:()=>B,IsNotEmpty:()=>G,IsNotIn:()=>ct,IsNumber:()=>W,IsObject:()=>F,IsOptional:()=>q,IsString:()=>U,IsUrl:()=>at,JsonDeserialize:()=>J,JsonMapper:()=>C,JsonPolymorphic:()=>Z,JsonSerialize:()=>k,JsonType:()=>Y,JsonValidationError:()=>O,METADATA_KEYS:()=>f,Matches:()=>it,Max:()=>X,MaxLength:()=>nt,Min:()=>Q,MinLength:()=>tt,Negative:()=>K,Positive:()=>j,Validate:()=>ft,ValidateNested:()=>gt,fromJson:()=>w,fromRequest:()=>T,registerDecorator:()=>mt,toInstance:()=>M,toJson:()=>P,toPlain:()=>E,validate:()=>I});var x=class t{static instance;properties=new WeakMap;propertyMetadata=new WeakMap;classMetadata=new WeakMap;constructor(){}static getInstance(){return t.instance||(t.instance=new t),t.instance}defineMetadata(n,e,a,i){if(i){let s=this.propertyMetadata.get(a);s||(s=new Map,this.propertyMetadata.set(a,s));let r=s.get(i);r||(r=new Map,s.set(i,r)),r.set(n,e)}else{let s=this.classMetadata.get(a);s||(s=new Map,this.classMetadata.set(a,s)),s.set(n,e)}}getMetadata(n,e,a){let i=e;for(;i;){let s=this.getOwnMetadata(n,i,a);if(s!==void 0)return s;i=Object.getPrototypeOf(i)}}getOwnMetadata(n,e,a){return a?this.propertyMetadata.get(e)?.get(a)?.get(n):this.classMetadata.get(e)?.get(n)}registerProperty(n,e){let a=this.properties.get(n);a||(a=[],this.properties.set(n,a)),a.includes(e)||a.push(e)}getProperties(n){let e=new Set,a=n;for(;a;){let i=this.properties.get(a);i&&i.forEach(s=>e.add(s)),a=Object.getPrototypeOf(a)}return Array.from(e)}},l=x.getInstance();var f={PROPERTIES:"cereale:properties",TYPE:"cereale:type",VALIDATION:"cereale:validation",SERIALIZER:"cereale:serializer",DESERIALIZER:"cereale:deserializer",POLYMORPHIC:"cereale:polymorphic",IS_OPTIONAL:"cereale:optional"};function y(t,n){l.registerProperty(t,n)}function o(t,n,e,a){y(t,n),a&&(a.each&&(e.each=!0),a.message&&(e.message=a.message));let i=l.getOwnMetadata(f.VALIDATION,t,n)||[];i.push(e),l.defineMetadata(f.VALIDATION,i,t,n)}function k(t){return(n,e)=>{y(n,e),l.defineMetadata(f.SERIALIZER,t,n,e)}}function J(t){return(n,e)=>{y(n,e),l.defineMetadata(f.DESERIALIZER,t,n,e)}}function Y(t){return(n,e)=>{y(n,e),l.defineMetadata(f.TYPE,t,n,e)}}function Z(t,n){return(e,a)=>{y(e,a),l.defineMetadata(f.POLYMORPHIC,{discriminator:t,subTypes:n},e,a)}}function q(){return(t,n)=>{y(t,n),l.defineMetadata(f.IS_OPTIONAL,!0,t,n)}}function U(t){return(n,e)=>{o(n,e,{name:"isString",validate:a=>typeof a=="string",message:`${e} must be a string`},t)}}function H(t){return(n,e)=>{o(n,e,{name:"isBoolean",validate:a=>typeof a=="boolean",message:`${e} must be a boolean`},t)}}function W(t){return(n,e)=>{o(n,e,{name:"isNumber",validate:a=>typeof a=="number"&&!isNaN(a),message:`${e} must be a number`},t)}}function B(t){return(n,e)=>{o(n,e,{name:"isInt",validate:a=>Number.isInteger(a),message:`${e} must be an integer`},t)}}function F(t){return(n,e)=>{o(n,e,{name:"isObject",validate:a=>typeof a=="object"&&a!==null&&!Array.isArray(a),message:`${e} must be an object`},t)}}function _(t){return(n,e)=>{o(n,e,{name:"isDefined",validate:a=>a!=null,message:`${e} should not be null or undefined`},t)}}function G(t){return(n,e)=>{o(n,e,{name:"isNotEmpty",validate:a=>a!=null&&a!=="",message:`${e} should not be empty`},t)}}function Q(t,n){return(e,a)=>{o(e,a,{name:"min",validate:i=>typeof i=="number"&&i>=t,message:`${a} must be at least ${t}`,constraints:[t]},n)}}function X(t,n){return(e,a)=>{o(e,a,{name:"max",validate:i=>typeof i=="number"&&i<=t,message:`${a} must be at most ${t}`,constraints:[t]},n)}}function j(t){return(n,e)=>{o(n,e,{name:"positive",validate:a=>typeof a=="number"&&a>0,message:`${e} must be positive`},t)}}function K(t){return(n,e)=>{o(n,e,{name:"negative",validate:a=>typeof a=="number"&&a<0,message:`${e} must be negative`},t)}}function tt(t,n){return(e,a)=>{o(e,a,{name:"minLength",validate:i=>typeof i=="string"&&i.length>=t,message:`${a} must be longer than or equal to ${t} characters`,constraints:[t]},n)}}function nt(t,n){return(e,a)=>{o(e,a,{name:"maxLength",validate:i=>typeof i=="string"&&i.length<=t,message:`${a} must be shorter than or equal to ${t} characters`,constraints:[t]},n)}}function et(t){let n=/^[^\s@]+@[^\s@]+\.[^\s@]+$/;return(e,a)=>{o(e,a,{name:"isEmail",validate:i=>typeof i=="string"&&n.test(i),message:`${a} must be a valid email`},t)}}function at(t){return(n,e)=>{o(n,e,{name:"isUrl",validate:a=>{try{return new URL(a),!0}catch{return!1}},message:`${e} must be a valid URL`},t)}}function it(t,n){return(e,a)=>{o(e,a,{name:"matches",validate:i=>typeof i=="string"&&t.test(i),message:`${a} must match ${t} regular expression`,constraints:[t]},n)}}function st(t){return(n,e)=>{o(n,e,{name:"isArray",validate:a=>Array.isArray(a),message:`${e} must be an array`},t)}}function rt(t,n){return(e,a)=>{o(e,a,{name:"arrayMinSize",validate:i=>Array.isArray(i)&&i.length>=t,message:`${a} must contain at least ${t} elements`,constraints:[t]},n)}}function ot(t,n){return(e,a)=>{o(e,a,{name:"arrayMaxSize",validate:i=>Array.isArray(i)&&i.length<=t,message:`${a} must contain at most ${t} elements`,constraints:[t]},n)}}function lt(t){return(n,e)=>{o(n,e,{name:"arrayNotEmpty",validate:a=>Array.isArray(a)&&a.length>0,message:`${e} should not be empty`},t)}}function ut(t,n){return(e,a)=>{o(e,a,{name:"isIn",validate:i=>t.includes(i),message:`${a} must be one of the following values: ${t.join(", ")}`,constraints:[t]},n)}}function ct(t,n){return(e,a)=>{o(e,a,{name:"isNotIn",validate:i=>!t.includes(i),message:`${a} must not be one of the following values: ${t.join(", ")}`,constraints:[t]},n)}}function dt(t){return(n,e)=>{o(n,e,{name:"isDate",validate:a=>a instanceof Date&&!isNaN(a.getTime()),message:`${e} must be a valid Date object`},t)}}function gt(){return(t,n)=>{y(t,n),l.defineMetadata("cereale:nested",!0,t,n)}}function ft(t,n,e){return(a,i)=>{let s=[],r;if(Array.isArray(n)?(s=n,r=e):typeof n=="object"&&(r=n),typeof t=="function"&&!t.prototype?.validate)o(a,i,{name:"custom",validate:t,message:c=>`${c.property} is invalid`,constraints:s},r);else{let c=new t;o(a,i,{name:t.name,validate:(d,g)=>c.validate(d,g),message:d=>c.defaultMessage?c.defaultMessage(d):`${d.property} is invalid`,constraints:s},r)}}}function mt(t){let{name:n,target:e,propertyName:a,options:i,constraints:s,validator:r}=t,c;if(typeof r=="function"&&!r.prototype?.validate)c={name:n,validate:r,message:d=>`${d.property} is invalid`,...s?{constraints:s}:{}};else{let d=typeof r=="function"?new r:r;c={name:n,validate:(g,m)=>d.validate(g,m),message:g=>d.defaultMessage?d.defaultMessage(g):`${g.property} is invalid`,...s?{constraints:s}:{}}}o(e.prototype,a,c,i)}var O=class extends Error{constructor(e,a){super(e);this.errors=a;this.name="JsonValidationError"}toString(){return`${this.message}: ${JSON.stringify(this.errors,null,2)}`}};async function b(t){if(t==null||typeof t!="object")return t;if(Array.isArray(t))return Promise.all(t.map(i=>b(i)));if(t instanceof Date)return t.toISOString();let n=t.constructor.prototype,e={},a=Object.keys(t);for(let i of a){let s=t[i],r=l.getMetadata(f.SERIALIZER,n,i);if(r){let c=new r;e[i]=await c.serialize(s)}else e[i]=await b(s)}return e}async function A(t,n){if(n==null)return n;if(Array.isArray(n))return await Promise.all(n.map(s=>A(t,s)));let e=new t,a=t.prototype;for(let i of Object.keys(n)){let s=n[i],r=l.getMetadata(f.DESERIALIZER,a,i);if(r){let g=new r;e[i]=await g.deserialize(s);continue}let c=l.getMetadata(f.POLYMORPHIC,a,i);if(c&&s!==null&&s!==void 0){let{discriminator:g,subTypes:m}=c;if(Array.isArray(s))e[i]=await Promise.all(s.map(async p=>{let u=m.find(h=>p[g]===h.name);return u?A(u.value,p):p}));else{let p=m.find(u=>s[g]===u.name);if(p){e[i]=await A(p.value,s);continue}}continue}let d=l.getMetadata(f.TYPE,a,i);if(d&&s!==null&&s!==void 0){let g=d();e[i]=await A(g,s);continue}e[i]=s}return e}async function I(t){let n=[];if(t==null||typeof t!="object")return n;if(Array.isArray(t)){for(let i=0;i<t.length;i++){let s=await I(t[i]);s.length>0&&n.push({property:`[${i}]`,value:t[i],constraints:{},children:s})}return n}let e=Object.getPrototypeOf(t),a=l.getProperties(e);for(let i of a){let s=t[i],r={property:i,value:s,constraints:{}},c=l.getMetadata(f.IS_OPTIONAL,e,i),d=s==null;if(c&&d)continue;let g=l.getMetadata(f.VALIDATION,e,i)||[],m={value:s,object:t,property:i,constraints:[]};for(let u of g){m.constraints=u.constraints||[];let h=!0;if(u.each&&Array.isArray(s))for(let V of s){let $={...m,value:V};if(!await u.validate(V,$)){h=!1;break}}else h=await u.validate(s,m);if(!h){let V=typeof u.message=="function"?u.message(m):u.message;u.each&&(V=`each element in ${V}`),r.constraints[u.name]=V}}if(l.getMetadata("cereale:nested",e,i)&&s!==null&&s!==void 0){let u=await I(s);u.length>0&&(r.children=u)}(Object.keys(r.constraints).length>0||r.children)&&n.push(r)}return n}async function E(t){if(t==null)return t;let n=await I(t);if(n.length>0)throw new O("Validation failed during serialization",n);return b(t)}async function P(t){let n=await E(t);return JSON.stringify(n)}async function M(t,n){let e=await A(t,n),a=await I(e);if(a.length>0)throw new O("Validation failed during deserialization",a);return e}async function w(t,n){let e=JSON.parse(n);return M(t,e)}async function T(t,n){let e=await n.json();return M(t,e)}var C=class{static toPlain=E;static toJson=P;static toInstance=M;static fromJson=w;static fromRequest=T;static validate=I};return z(pt);})();
|