UNPKG

@mockanapi/mockanapi-parser

Version:

api data parser

1 lines 4.55 kB
import Chance from"chance";const chance=new Chance;function generateJSON(schema){if(Array.isArray(schema)){const hasRepeat=schema[0]?.startsWith?.("{{repeat(");const repeatCount=parseRepeat(schema[0]);const data=[];if(hasRepeat){for(let i=0;i<repeatCount;i++){data.push(generateObject(schema[1]))}if(schema.length>2){for(let i=2;i<schema.length;i++){data.push(generateObject(schema[i]))}}}else{for(let i=0;i<schema.length;i++){data.push(generateObject(schema[i]))}}return data}else if(schema===null){return schema}else if(typeof schema==="object"){const generatedObject={};for(const key in schema){if(schema.hasOwnProperty(key)){generatedObject[key]=generateValue(schema[key])}}return generatedObject}}function parseRepeat(repeatValue){if(typeof repeatValue==="string"&&repeatValue.startsWith("{{repeat(")){const parts=repeatValue.match(/\d+/g);if(parts){const min=parseInt(parts[0]);const max=parseInt(parts[1]);if(min&&max){return chance.natural({min:min,max:max})}else{return min||max}}}return 1}function extractAndCallChance(string){const regex=/{{(.*?)\((.*?)\)}}/;const match=string.match(regex);if(match){const func=match[1];const args=match[2];if(chance[func]){const result=eval(`chance.${func}(${args})`);return result}}return string}function generateObject(schema){if(typeof schema==="object"){return generateJSON(schema)}else if(typeof schema==="string"){return extractAndCallChance(schema)}return schema}function generateValue(value){if(typeof value==="string"&&value.includes("{{")){const regex=/{{(.*?)}}/g;const replacedString=value.replace(regex,match=>{const evaluatedValue=extractAndCallChance(match);return evaluatedValue});if(Number(replacedString)){return Number(replacedString)}else if(replacedString==="true"){return true}else if(replacedString==="false"){return false}else{return replacedString}}if(typeof value==="object"){return generateJSON(value)}return value}function parseThisValues(schema){const initialData=schema;function traverse(schema){if(Array.isArray(schema)){const data=[];for(let i=0;i<schema.length;i++){data.push(traverse(schema[i]))}return data}else if(schema===null){return schema}else if(typeof schema==="object"){const generatedObject={};for(const key in schema){if(schema.hasOwnProperty(key)){generatedObject[key]=generateThisValue(schema[key],schema)}}return generatedObject}return schema}function getObjectValueByPath(obj,path){const segments=path.split(".");let current=obj;for(const segment of segments){if(current.hasOwnProperty(segment)){current=current[segment]}else{return undefined}}return current}function generateThisValue(value,parentObj){if(typeof value==="string"){if(value.startsWith("<this.")&&value.endsWith(">")){let trimmedValue=value.substring(1,value.length-1);trimmedValue=trimmedValue.replace("this.","");return getObjectValueByPath(parentObj,trimmedValue)}if(value.startsWith("<parent.")&&value.endsWith(">")){let trimmedValue=value.substring(1,value.length-1);trimmedValue=trimmedValue.replace("parent.","");return getObjectValueByPath(initialData,trimmedValue)}let updatedValue=value;const thisRegex=/<this\.[^>]+>/g;const thisMatch=value.match(thisRegex);thisMatch?.forEach(item=>{let trimmedValue=item.substring(1,item.length-1);trimmedValue=trimmedValue.replace("this.","");const generatedData=getObjectValueByPath(parentObj,trimmedValue);updatedValue=updatedValue.replace(item,generatedData)});const parentRegex=/<parent\.[^>]+>/g;const parentMatch=value.match(parentRegex);parentMatch?.forEach(item=>{let trimmedValue=item.substring(1,item.length-1);trimmedValue=trimmedValue.replace("parent.","");const generatedData=getObjectValueByPath(parentObj,trimmedValue);updatedValue=updatedValue.replace(item,generatedData)});return updatedValue}if(typeof value==="object"){return traverse(value)}return value}return traverse(schema)}export const schemaParser=code=>{try{const codeValue=JSON.parse(code);let generatedData=generateJSON(codeValue);generatedData=parseThisValues(generatedData);return JSON.stringify(generatedData,null,2)}catch(error){return error?.toString()||"Invalid JSON Schema"}};function formatBytes(bytes,decimals=2){if(!+bytes)return"0 Bytes";const k=1024;const dm=decimals<0?0:decimals;const sizes=["Bytes","KiB","MiB","GiB","TiB","PiB","EiB","ZiB","YiB"];const i=Math.floor(Math.log(bytes)/Math.log(k));return`${parseFloat((bytes/Math.pow(k,i)).toFixed(dm))} ${sizes[i]}`}export function getDataSizeInKB(data){var encoded=encodeURIComponent(data).match(/%[89ABab]/g);const totalLength=data?.length+(encoded?encoded.length:0);return formatBytes(totalLength)}