durable-json-lint
Version:
A Json Lint library that can parse and partially correct dirty Json.
1 lines • 3.25 kB
JavaScript
(function(){var a,b,c;a=typeof module=="undefined"?window.esprima:require("esprima"),b=typeof module=="undefined"?window.falafel:require("free-falafel"),c=function(c){var d,e,f,g,h,i,j,k,l,m,n,o,p,q;if(!c||/^\s*$/.test(c))return{json:null,errors:[{lineNumber:1,column:1,description:"An empty string is not valid Json",status:"crash"}]};c=c.replace(/[\u0000-\u0008\u000b\u000c\u000e-\u001f]/g,function(a){return JSON.stringify(a).slice(1,-1)}),n="(function(){return "+c+"\n})();",j=[];try{d=a.parse(n,{range:!0,tolerant:!0,loc:!0,raw:!0,comment:!0})}catch(r){return r.status="crash",r.index>=n.length-7&&(r.lineNumber>=n.match(/\r\n?|\n/g).length+1&&r.lineNumber--,r.column=1,r.description="Invalid Json. Did you forget a close bracket?"),j.push(r),{errors:j,json:null}}k=/^(?:-?(?=[1-9]|0(?!\d))\d+(\.\d+)?([eE][+-]?\d+)?|true|false|null|"([^"\\]|(?:\\["\\\/bfnrt])|(?:\\u[\][0-9a-f]{4}))*")$/,f=/,(?=\s*[\]}]\s*$)/,h=function(a,b,c){j.push({lineNumber:a.loc.start.line,column:a.loc.start.column,description:c,status:b});if(a.loc.start.line===1)return j[j.length-1].column-=19},q=d.comments;for(o=0,p=q.length;o<p;o++)g=q[o],h(g,"correctable","Comments are not valid in Json");return m=null,e=function(a){var b;m===null&&(a.valid=!0),m===null&&a.type==="ReturnStatement"&&(m=a.argument);if(a.valid!=null)return;if(!a.parent.valid){a.valid=!1;return}switch(a.type){case"Literal":if(k.test(a.raw))return a.valid=!0;a.valid=!1;switch(a.raw[0]){case"'":h(a,"correctable","Json strings must use double quotes");break;case'"':h(a,"correctable","Invalid Json string");break;default:h(a,"correctable","Invalid Json number")}return a.correct=JSON.stringify(a.value);case"UnaryExpression":if(a.operator==="-"&&a.argument.type==="Literal")return a.valid=!0;break;case"ObjectExpression":return a.valid=!0,a.props={};case"ArrayExpression":return a.valid=!0;case"Property":a.valid=!0,b=a.key;if(b.type==="Identifier")return h(b,"correctable",'Keys must be double quoted in Json. Did you mean "'+b.name+'"?'),b.valid=!1,b.correct=JSON.stringify(b.name);if(b.type==="Literal"&&typeof b.value=="number")return h(b,"correctable",'Keys must be double quoted in Json. Did you mean "'+b.raw+'"?'),b.valid=!1,b.correct=JSON.stringify(b.raw);break;case"Identifier":return a.valid=!1,h(a,"guessable",'An identifier is not a valid Json element. Did you mean "'+a.name+'"?'),a.correct=JSON.stringify(a.name);case"CallExpression":return a.valid=!1,h(a,"fail","You can not make function calls in Json. Do you think I am a fool?");case"Line":case"Block":return a.valid=!1,a.correct="";default:return a.valid=!1,h(a,"fail",'A "'+a.type+'" is an invalid Json element.')}},i=function(a){var b;a.type==="Property"&&(b=a.key,a.parent.props[b.correct||b.raw]!=null?(a.valid=!1,a.correct="",h(a,"guessable","Duplicate key in Json object. The key "+(b.correct||b.raw)+" is already present.")):a.parent.props[b.correct||b.raw]=a),(a.type==="ObjectExpression"||a.type==="ArrayExpression")&&a.update(a.source().replace(f,""));if(a.valid)return;a.correct!=null?a.update(a.correct):a.update("null")},l=b(n,{ast:d},i,e).toString(),l=l.substring(19,l.length-6),l=JSON.stringify(JSON.parse(l)),{json:l,errors:j}},typeof module=="undefined"?window.durableJsonLint=c:module.exports=c}).call(this)