@cmtlyt/json-schema
Version:
json schema 处理相关方法
2 lines (1 loc) • 4.66 kB
JavaScript
;const base=require("@cmtlyt/base"),f=["string","number","boolean"];let c$1=0;function l$1(e,r=new Map){const t=base.getType(e),n={type:t,id:c$1,value:"unknown"};r.has(e)?n.id=r.get(e):(++c$1,r.set(e,n.id));let a=n;return f.includes(t)&&(a={...n,value:e}),t==="array"?a={...n,value:e.map(o=>l$1(o,r))}:t==="object"?a={...n,value:Object.keys(e).sort().reduce((o,u)=>(o[u]=l$1(e[u],r),o),{})}:t==="map"?a={...n,value:[...e.entries()].map(([o,u])=>{const s=l$1(o,r),w=l$1(u,r);return{key:s,value:w}})}:t==="set"?a={...n,value:[...e.values()].map(o=>l$1(o,r))}:t==="function"||t==="asyncfunction"?a={...n,value:(()=>{const o=e.toString();return/^.*?=>/.test(o)?`return ${o}`:o.indexOf("async")===0?o.replace("async","return async function"):o.indexOf("function")===0?`return ${o}`:`return function ${o}`})()}:t==="date"?a={...n,value:e.toISOString()}:t==="regexp"&&(a={...n,value:{source:e.source,flags:e.flags}}),a}function encodeDataSchema(e){c$1=0;let r=new Map;const t=l$1(e,r);return r.clear(),r=null,JSON.stringify(t)}function i(e,r={}){const t=e.type;if(f.includes(t))return e.value;if(r[e.id])return r[e.id];let n="unknown";return t==="array"?n=e.value.map(a=>i(a),r):t==="object"?n=Object.keys(e.value).reduce((a,o)=>(a[o]=i(e.value[o],r),a),{}):t==="map"?n=new Map(e.value.map(({key:a,value:o})=>[i(a,r),i(o,r)])):t==="set"?n=new Set(e.value.map(a=>i(a,r))):t==="function"||t==="asyncfunction"?n=new Function(e.value)():t==="date"?n=new Date(e.value):t==="regexp"&&(n=new RegExp(e.value.source,e.value.flags)),r[e.id]=n,n}function decodeDataSchema(e){let r={};const t=i(JSON.parse(e),r);for(const n in r)delete r[n];return r=null,t}const baseTypeDefaultValue={string:()=>"",number:()=>0,boolean:()=>!1,array:()=>[],object:()=>({}),map:()=>new Map,set:()=>new Set,function:()=>()=>{},asyncfunction:()=>async()=>{},date:()=>new Date,regexp:()=>/(?:.)/,bigint:()=>BigInt(0),symbol:()=>Symbol(""),weakmap:()=>new WeakMap,weakset:()=>new WeakSet,promise:()=>Promise.resolve(),error:()=>new Error(" "),int8array:()=>new Int8Array,uint8array:()=>new Uint8Array,uint8clampedarray:()=>new Uint8ClampedArray,int16array:()=>new Int16Array,uint16array:()=>new Uint16Array,int32array:()=>new Int32Array,uint32array:()=>new Uint32Array,float32array:()=>new Float32Array,float64array:()=>new Float64Array,file:()=>new File([],"file"),blob:()=>new Blob};function y(e){const r=base.getType(e),t={type:r,description:""};if(Array.isArray(e)){const n=e[0],a=y(n);t.type="array",typeof n<"u"&&(t.items=a)}else if(r==="object"){const n=[];t.properties={};for(const a in e){const o=e[a],u=y(o);t.properties[a]=u,!n.includes(a)&&n.push(a)}t.required=n}return t}function jsonSchemaGenerator(e){const r=y(e);return JSON.stringify(r)}function l(e,r){const t=r.type,n=(e[t]||(()=>{}))();if(t!=="object"&&t!=="array")return n;if(t==="object"){const a=r.properties,o=n;for(const u in a){const s=a[u];o[u]=l(e,s)}return o}else if(t==="array"){const a=r.items;if(!a)return n;const o=n,{maxItems:u=0,minItems:s=0}=a,w=Math.floor(Math.random()*(u-s+1))+s||1;for(let d=0;d<w;d++)o.push(l(e,a));return o}}function mockFromSchema(e,r={}){const t={...baseTypeDefaultValue,...r};return l(t,JSON.parse(e))}function p(e,r,t="",n=[]){const a=base.getType(r);if(e.type!==a&&n.push({path:t,message:`\u7C7B\u578B\u5E94\u8BE5\u4E3A ${e.type}`}),a==="array"){const o=r.length,{minItems:u=0,maxItems:s=1/0,uniqueItems:w,items:d}=e;(o>s||o<u)&&n.push({path:t,message:`\u6700\u591A\u5141\u8BB8 ${s} \u5143\u7D20, \u81F3\u5C11\u8981\u6709 ${u} \u5143\u7D20, \u5F53\u524D ${o} \u4E2A`});const b=new Set,g=base.cacheByReturn(()=>w?(m,h)=>{if(b.has(m))return n.push({path:t,message:`\u5143\u7D20\u5FC5\u987B\u552F\u4E00 ${h}`}),!1;b.add(m),d&&p(d,m,`${t}/${h}`,n)}:(m,h)=>{d&&p(d,m,`${t}/${h}`,n)});for(const m in r){const h=r[m];if(base.isFalse(g(h,+m)))break}}if(a==="object"){const{properties:o,required:u}=e;u?.every(s=>s in r);for(const s in o)p(o[s],r[s],`${t}/${s}`,n)}}function verifyBySchema(e,r){const t=[];return p(JSON.parse(e),r,"",t),[t.length===0,t]}function c(e){if(typeof e=="string")return baseTypeDefaultValue[e]?.();if(Array.isArray(e))return[c(e[0])];if(base.getType(e)!=="object")return{};const r={};return Object.keys(e).forEach(t=>{const n=e[t];base.getType(n)==="string"?r[t]=baseTypeDefaultValue[n]?.():typeof n=="object"?r[t]=c(n):r[t]=n}),r}function typeObjectToSchema(e){const r=c(e);return jsonSchemaGenerator(r)}exports.decodeDataSchema=decodeDataSchema,exports.encodeDataSchema=encodeDataSchema,exports.jsonSchemaGenerator=jsonSchemaGenerator,exports.mockFromSchema=mockFromSchema,exports.typeObjectToSchema=typeObjectToSchema,exports.verifyBySchema=verifyBySchema;