schemastery
Advanced tools
Comparing version 3.4.2 to 3.4.3
@@ -1,1 +0,1 @@ | ||
var x=Object.defineProperty;var c=(e,t)=>x(e,"name",{value:t,configurable:!0});var w=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);import{clone as X,isNullable as p,isPlainObject as m,valueMap as f}from"cosmokit";var $=w((N,g)=>{var v=0,S=Symbol("schemastery"),r=c(function(e){let t=c(function(n){return r.resolve(n,t)[0]},"schema");if(e.refs){let n=f(e.refs,i=>new r(i)),o=c(i=>n[i],"getRef");for(let i in n){let s=n[i];s.sKey=o(s.sKey),s.inner=o(s.inner),s.list=s.list&&s.list.map(o),s.dict=s.dict&&f(s.dict,o)}return n[e.uid]}return Object.assign(t,e),Object.defineProperty(t,"uid",{value:v++}),Object.setPrototypeOf(t,r.prototype),t.meta||={},t},"Schema");r.prototype=Object.create(Function.prototype);r.prototype[S]=!0;var a;r.prototype.toJSON=c(function(){if(a)return a[this.uid]??=JSON.parse(JSON.stringify({...this})),this.uid;a={[this.uid]:{...this}},a[this.uid]=JSON.parse(JSON.stringify({...this}));let t={uid:this.uid,refs:a};return a=null,t},"toJSON");r.prototype.set=c(function(t,n){return this.dict[t]=n,this},"set");r.prototype.push=c(function(t){return this.list.push(t),this},"push");for(let e of["required","hidden"])Object.assign(r.prototype,{[e](t=!0){let n=r(this);return n.meta={...n.meta,[e]:t},n}});for(let e of["default","role","link","comment","description","max","min","step"])Object.assign(r.prototype,{[e](t){let n=r(this);return n.meta={...n.meta,[e]:t},n}});var T={};r.extend=c(function(t,n){T[t]=n},"extend");r.resolve=c(function(t,n,o){if(!n)return[t];if(p(t)){if(n.meta.required)throw new TypeError("missing required value");let s=n.meta.default;if(p(s))return[t];t=X(s)}let i=T[n.type];if(i)return i(t,n,o);throw new TypeError(`unsupported type "${n.type}"`)},"resolve");r.from=c(function(t){if(p(t))return r.any();if(["string","number","boolean"].includes(typeof t))return r.const(t).required();if(t[S])return t;if(typeof t=="function")switch(t){case String:return r.string().required();case Number:return r.number().required();case Boolean:return r.boolean().required();case Function:return r.function().required();default:return r.is(t).required()}else throw new TypeError(`cannot infer schema from ${t}`)},"from");r.natural=c(function(){return r.number().step(1).min(0)},"natural");r.percent=c(function(){return r.number().step(.01).min(0).max(1).role("slider")},"percent");r.extend("any",e=>[e]);r.extend("never",e=>{throw new TypeError(`expected nullable but got ${e}`)});r.extend("const",(e,{value:t})=>{if(e===t)return[t];throw new TypeError(`expected ${t} but got ${e}`)});function h(e,t,n){let{max:o=1/0,min:i=-1/0}=t;if(e>o)throw new TypeError(`expected ${n} <= ${o} but got ${e}`);if(e<i)throw new TypeError(`expected ${n} >= ${i} but got ${e}`)}c(h,"checkWithinRange");r.extend("string",(e,{meta:t})=>{if(typeof e!="string")throw new TypeError(`expected string but got ${e}`);return h(e.length,t,"string length"),[e]});r.extend("number",(e,{meta:t})=>{if(typeof e!="number")throw new TypeError(`expected number but got ${e}`);h(e,t,"number");let{step:n}=t;if(n){let o=Math.abs(e-(t.min??0))%n;if(o>=Number.EPSILON&&o<n-Number.EPSILON)throw new TypeError(`expected number multiple of ${n} but got ${e}`)}return[e]});r.extend("boolean",e=>{if(typeof e=="boolean")return[e];throw new TypeError(`expected boolean but got ${e}`)});r.extend("bitset",(e,{dict:t})=>{if(typeof e=="number")return[e];if(!Array.isArray(e))throw new TypeError(`expected array but got ${e}`);let n=0;for(let o of e){if(typeof o!="string")throw new TypeError(`expected string but got ${o}`);if(!(o in t))throw new TypeError(`unknown value ${o}`);n|=t[o]}return[n,n]});r.extend("function",e=>{if(typeof e=="function")return[e];throw new TypeError(`expected function but got ${e}`)});r.extend("is",(e,{callback:t})=>{if(e instanceof t)return[e];throw new TypeError(`expected ${t.name} but got ${e}`)});function l(e,t,n){let[o,i]=r.resolve(e[t],n);return p(i)||(e[t]=i),o}c(l,"property");r.extend("array",(e,{inner:t,meta:n})=>{if(!Array.isArray(e))throw new TypeError(`expected array but got ${e}`);return h(e.length,n,"array length"),[e.map((o,i)=>l(e,i,t))]});r.extend("dict",(e,{inner:t,sKey:n},o)=>{if(!m(e))throw new TypeError(`expected object but got ${e}`);let i={};for(let s in e){let y;try{y=r.resolve(s,n)[0]}catch(d){if(o)continue;throw d}i[y]=l(e,s,t),e[y]=e[s],s!==y&&delete e[s]}return[i]});r.extend("tuple",(e,{list:t},n)=>{if(!Array.isArray(e))throw new TypeError(`expected array but got ${e}`);let o=t.map((i,s)=>l(e,s,i));return n?[o]:(o.push(...e.slice(t.length)),[o])});function b(e,t){for(let n in t)n in e||(e[n]=t[n])}c(b,"merge");r.extend("object",(e,{dict:t},n)=>{if(!m(e))throw new TypeError(`expected object but got ${e}`);let o={};for(let i in t){let s=l(e,i,t[i]);(!p(s)||i in e)&&(o[i]=s)}return n||b(o,e),[o]});r.extend("union",(e,{list:t,toString:n})=>{let o=[];for(let i of t)try{return r.resolve(e,i)}catch(s){o.push(s.message)}throw new TypeError(`expected ${n()} but got ${JSON.stringify(e)}`)});r.extend("intersect",(e,{list:t},n)=>{let o={};for(let i of t){let s=r.resolve(e,i,!0)[0];Object.assign(o,s)}return!n&&m(e)&&b(o,e),[o]});r.extend("transform",(e,{inner:t,callback:n})=>{let[o,i=e]=r.resolve(e,t,!0);if(m(e)){let s={};for(let y in o)y in e&&(s[y]=e[y],delete e[y]);return Object.assign(e,n(s)),[n(o)]}else return[n(o),n(i)]});function u(e,t,n){Object.assign(r,{[e](...o){let i=new r({type:e});return i.toString=n.bind(null,i),t.forEach((s,y)=>{switch(s){case"sKey":i.sKey=o[y]??r.string();break;case"inner":i.inner=r.from(o[y]);break;case"list":i.list=o[y].map(r.from);break;case"dict":i.dict=f(o[y],r.from);break;default:i[s]=o[y]}}),e==="object"||e==="dict"?i.meta.default={}:(e==="array"||e==="tuple"||e==="bitset")&&(i.meta.default=[]),i}})}c(u,"defineMethod");u("is",["callback"],({callback:e})=>e.name);u("any",[],()=>"any");u("never",[],()=>"never");u("const",["value"],({value:e})=>typeof e=="string"?JSON.stringify(e):e);u("string",[],()=>"string");u("number",[],()=>"number");u("boolean",[],()=>"boolean");u("bitset",["dict"],()=>"bitset");u("function",[],()=>"function");u("array",["inner"],({inner:e})=>`${e.toString(!0)}[]`);u("dict",["inner","sKey"],({inner:e,sKey:t})=>`{ [key: ${t.toString()}]: ${e.toString()} }`);u("tuple",["list"],({list:e})=>`[${e.map(t=>t.toString()).join(", ")}]`);u("object",["dict"],({dict:e})=>Object.keys(e).length===0?"{}":`{ ${Object.entries(e).map(([t,n])=>`${t}${n.meta.required?"":"?"}: ${n.toString()}`).join(", ")} }`);u("union",["list"],({list:e},t)=>{let n=e.map(({toString:o})=>o()).join(" | ");return t?`(${n})`:n});u("intersect",["list"],({list:e})=>`${e.map(t=>t.toString(!0)).join(" & ")}`);u("transform",["inner","callback"],({inner:e},t)=>e.toString(t));g.exports=r});export default $(); | ||
var x=Object.defineProperty;var u=(e,t)=>x(e,"name",{value:t,configurable:!0});var w=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);import{clone as X,isNullable as m,isPlainObject as l,valueMap as h}from"cosmokit";var $=w((N,d)=>{var v=0,T=Symbol("schemastery"),r=u(function(e){let t=u(function(n){return r.resolve(n,t)[0]},"schema");if(e.refs){let n=h(e.refs,i=>new r(i)),o=u(i=>n[i],"getRef");for(let i in n){let s=n[i];s.sKey=o(s.sKey),s.inner=o(s.inner),s.list=s.list&&s.list.map(o),s.dict=s.dict&&h(s.dict,o)}return n[e.uid]}return Object.assign(t,e),Object.defineProperty(t,"uid",{value:v++}),Object.setPrototypeOf(t,r.prototype),t.meta||={},t},"Schema");r.prototype=Object.create(Function.prototype);r.prototype[T]=!0;var a;r.prototype.toJSON=u(function(){if(a)return a[this.uid]??=JSON.parse(JSON.stringify({...this})),this.uid;a={[this.uid]:{...this}},a[this.uid]=JSON.parse(JSON.stringify({...this}));let t={uid:this.uid,refs:a};return a=null,t},"toJSON");r.prototype.set=u(function(t,n){return this.dict[t]=n,this},"set");r.prototype.push=u(function(t){return this.list.push(t),this},"push");for(let e of["required","hidden"])Object.assign(r.prototype,{[e](t=!0){let n=r(this);return n.meta={...n.meta,[e]:t},n}});for(let e of["default","role","link","comment","description","max","min","step"])Object.assign(r.prototype,{[e](t){let n=r(this);return n.meta={...n.meta,[e]:t},n}});var b={};r.extend=u(function(t,n){b[t]=n},"extend");r.resolve=u(function(t,n,o){if(!n)return[t];if(m(t)){if(n.meta.required)throw new TypeError("missing required value");let s=n.meta.default;if(m(s))return[t];t=X(s)}let i=b[n.type];if(i)return i(t,n,o);throw new TypeError(`unsupported type "${n.type}"`)},"resolve");r.from=u(function(t){if(m(t))return r.any();if(["string","number","boolean"].includes(typeof t))return r.const(t).required();if(t[T])return t;if(typeof t=="function")switch(t){case String:return r.string().required();case Number:return r.number().required();case Boolean:return r.boolean().required();case Function:return r.function().required();default:return r.is(t).required()}else throw new TypeError(`cannot infer schema from ${t}`)},"from");r.natural=u(function(){return r.number().step(1).min(0)},"natural");r.percent=u(function(){return r.number().step(.01).min(0).max(1).role("slider")},"percent");r.extend("any",e=>[e]);r.extend("never",e=>{throw new TypeError(`expected nullable but got ${e}`)});r.extend("const",(e,{value:t})=>{if(e===t)return[t];throw new TypeError(`expected ${t} but got ${e}`)});function S(e,t,n){let{max:o=1/0,min:i=-1/0}=t;if(e>o)throw new TypeError(`expected ${n} <= ${o} but got ${e}`);if(e<i)throw new TypeError(`expected ${n} >= ${i} but got ${e}`)}u(S,"checkWithinRange");r.extend("string",(e,{meta:t})=>{if(typeof e!="string")throw new TypeError(`expected string but got ${e}`);return S(e.length,t,"string length"),[e]});r.extend("number",(e,{meta:t})=>{if(typeof e!="number")throw new TypeError(`expected number but got ${e}`);S(e,t,"number");let{step:n}=t;if(n){let o=Math.abs(e-(t.min??0))%n;if(o>=Number.EPSILON&&o<n-Number.EPSILON)throw new TypeError(`expected number multiple of ${n} but got ${e}`)}return[e]});r.extend("boolean",e=>{if(typeof e=="boolean")return[e];throw new TypeError(`expected boolean but got ${e}`)});r.extend("bitset",(e,{bits:t})=>{if(typeof e=="number")return[e];if(!Array.isArray(e))throw new TypeError(`expected array but got ${e}`);let n=0;for(let o of e){if(typeof o!="string")throw new TypeError(`expected string but got ${o}`);if(!(o in t))throw new TypeError(`unknown value ${o}`);n|=t[o]}return[n,n]});r.extend("function",e=>{if(typeof e=="function")return[e];throw new TypeError(`expected function but got ${e}`)});r.extend("is",(e,{callback:t})=>{if(e instanceof t)return[e];throw new TypeError(`expected ${t.name} but got ${e}`)});function f(e,t,n){let[o,i]=r.resolve(e[t],n);return m(i)||(e[t]=i),o}u(f,"property");r.extend("array",(e,{inner:t,meta:n})=>{if(!Array.isArray(e))throw new TypeError(`expected array but got ${e}`);return S(e.length,n,"array length"),[e.map((o,i)=>f(e,i,t))]});r.extend("dict",(e,{inner:t,sKey:n},o)=>{if(!l(e))throw new TypeError(`expected object but got ${e}`);let i={};for(let s in e){let c;try{c=r.resolve(s,n)[0]}catch(p){if(o)continue;throw p}i[c]=f(e,s,t),e[c]=e[s],s!==c&&delete e[s]}return[i]});r.extend("tuple",(e,{list:t},n)=>{if(!Array.isArray(e))throw new TypeError(`expected array but got ${e}`);let o=t.map((i,s)=>f(e,s,i));return n?[o]:(o.push(...e.slice(t.length)),[o])});function g(e,t){for(let n in t)n in e||(e[n]=t[n])}u(g,"merge");r.extend("object",(e,{dict:t},n)=>{if(!l(e))throw new TypeError(`expected object but got ${e}`);let o={};for(let i in t){let s=f(e,i,t[i]);(!m(s)||i in e)&&(o[i]=s)}return n||g(o,e),[o]});r.extend("union",(e,{list:t,toString:n})=>{let o=[];for(let i of t)try{return r.resolve(e,i)}catch(s){o.push(s.message)}throw new TypeError(`expected ${n()} but got ${JSON.stringify(e)}`)});r.extend("intersect",(e,{list:t},n)=>{let o={};for(let i of t){let s=r.resolve(e,i,!0)[0];Object.assign(o,s)}return!n&&l(e)&&g(o,e),[o]});r.extend("transform",(e,{inner:t,callback:n})=>{let[o,i=e]=r.resolve(e,t,!0);if(l(e)){let s={};for(let c in o)c in e&&(s[c]=e[c],delete e[c]);return Object.assign(e,n(s)),[n(o)]}else return[n(o),n(i)]});function y(e,t,n){Object.assign(r,{[e](...o){let i=new r({type:e});return i.toString=n.bind(null,i),t.forEach((s,c)=>{switch(s){case"sKey":i.sKey=o[c]??r.string();break;case"inner":i.inner=r.from(o[c]);break;case"list":i.list=o[c].map(r.from);break;case"dict":i.dict=h(o[c],r.from);break;case"bits":{i.bits={};for(let p in o[c])typeof o[c][p]=="number"&&(i.bits[p]=o[c][p]);break}default:i[s]=o[c]}}),e==="object"||e==="dict"?i.meta.default={}:e==="array"||e==="tuple"?i.meta.default=[]:e==="bitset"&&(i.meta.default=0),i}})}u(y,"defineMethod");y("is",["callback"],({callback:e})=>e.name);y("any",[],()=>"any");y("never",[],()=>"never");y("const",["value"],({value:e})=>typeof e=="string"?JSON.stringify(e):e);y("string",[],()=>"string");y("number",[],()=>"number");y("boolean",[],()=>"boolean");y("bitset",["bits"],()=>"bitset");y("function",[],()=>"function");y("array",["inner"],({inner:e})=>`${e.toString(!0)}[]`);y("dict",["inner","sKey"],({inner:e,sKey:t})=>`{ [key: ${t.toString()}]: ${e.toString()} }`);y("tuple",["list"],({list:e})=>`[${e.map(t=>t.toString()).join(", ")}]`);y("object",["dict"],({dict:e})=>Object.keys(e).length===0?"{}":`{ ${Object.entries(e).map(([t,n])=>`${t}${n.meta.required?"":"?"}: ${n.toString()}`).join(", ")} }`);y("union",["list"],({list:e},t)=>{let n=e.map(({toString:o})=>o()).join(" | ");return t?`(${n})`:n});y("intersect",["list"],({list:e})=>`${e.map(t=>t.toString(!0)).join(" & ")}`);y("transform",["inner","callback"],({inner:e},t)=>e.toString(t));d.exports=r});export default $(); |
@@ -33,3 +33,4 @@ import { Dict, Intersect } from 'cosmokit'; | ||
list?: Schema[]; | ||
dict?: Dict<any>; | ||
dict?: Dict<Schema>; | ||
bits?: Dict<number>; | ||
callback?: Function; | ||
@@ -77,3 +78,3 @@ value?: T; | ||
boolean(): Schema<boolean>; | ||
bitset<K extends string>(dict: Dict<number, K>): Schema<number | readonly K[], number>; | ||
bitset<K extends string>(bits: Dict<number, K>): Schema<number | readonly K[], number>; | ||
function(): Schema<Function, (...args: any[]) => any>; | ||
@@ -80,0 +81,0 @@ is<T>(constructor: Constructor<T>): Schema<T>; |
@@ -183,3 +183,3 @@ var __defProp = Object.defineProperty; | ||
}); | ||
Schema.extend("bitset", (data, { dict }) => { | ||
Schema.extend("bitset", (data, { bits }) => { | ||
if (typeof data === "number") | ||
@@ -193,5 +193,5 @@ return [data]; | ||
throw new TypeError(`expected string but got ${value}`); | ||
if (!(value in dict)) | ||
if (!(value in bits)) | ||
throw new TypeError(`unknown value ${value}`); | ||
result |= dict[value]; | ||
result |= bits[value]; | ||
} | ||
@@ -331,2 +331,11 @@ return [result, result]; | ||
break; | ||
case "bits": { | ||
schema.bits = {}; | ||
for (const key2 in args[index2]) { | ||
if (typeof args[index2][key2] !== "number") | ||
continue; | ||
schema.bits[key2] = args[index2][key2]; | ||
} | ||
break; | ||
} | ||
default: | ||
@@ -338,4 +347,6 @@ schema[key] = args[index2]; | ||
schema.meta.default = {}; | ||
} else if (name === "array" || name === "tuple" || name === "bitset") { | ||
} else if (name === "array" || name === "tuple") { | ||
schema.meta.default = []; | ||
} else if (name === "bitset") { | ||
schema.meta.default = 0; | ||
} | ||
@@ -354,3 +365,3 @@ return schema; | ||
defineMethod("boolean", [], () => "boolean"); | ||
defineMethod("bitset", ["dict"], () => "bitset"); | ||
defineMethod("bitset", ["bits"], () => "bitset"); | ||
defineMethod("function", [], () => "function"); | ||
@@ -357,0 +368,0 @@ defineMethod("array", ["inner"], ({ inner }) => `${inner.toString(true)}[]`); |
{ | ||
"name": "schemastery", | ||
"description": "Type driven schema validator", | ||
"version": "3.4.2", | ||
"version": "3.4.3", | ||
"main": "lib/node.js", | ||
@@ -33,2 +33,3 @@ "module": "lib/browser.js", | ||
"c8": "^7.11.2", | ||
"chai": "^4.3.6", | ||
"esbuild": "^0.14.38", | ||
@@ -35,0 +36,0 @@ "esbuild-register": "^3.3.2", |
Sorry, the diff of this file is not supported yet
64707
500
10