UNPKG

zzon

Version:

A fast, spec compliant, ZON parser and serializer for JavaScript.

4 lines (3 loc) 20.9 kB
var q={Invalid:"Invalid",InvalidPeriodAsterisks:"InvalidPeriodAsterisks",Identifier:"Identifier",StringLiteral:"StringLiteral",MultilineStringLiteralLine:"MultilineStringLiteralLine",CharLiteral:"CharLiteral",Eof:"Eof",Builtin:"Builtin",Bang:"Bang",Pipe:"Pipe",PipePipe:"PipePipe",PipeEqual:"PipeEqual",Equal:"Equal",EqualEqual:"EqualEqual",EqualAngleBracketRight:"EqualAngleBracketRight",BangEqual:"BangEqual",LParen:"LParen",RParen:"RParen",Semicolon:"Semicolon",Percent:"Percent",PercentEqual:"PercentEqual",LBrace:"LBrace",RBrace:"RBrace",LBracket:"LBracket",RBracket:"RBracket",Period:"Period",PeriodAsterisk:"PeriodAsterisk",Ellipsis2:"Ellipsis2",Ellipsis3:"Ellipsis3",Caret:"Caret",CaretEqual:"CaretEqual",Plus:"Plus",PlusPlus:"PlusPlus",PlusEqual:"PlusEqual",PlusPercent:"PlusPercent",PlusPercentEqual:"PlusPercentEqual",PlusPipe:"PlusPipe",PlusPipeEqual:"PlusPipeEqual",Minus:"Minus",MinusEqual:"MinusEqual",MinusPercent:"MinusPercent",MinusPercentEqual:"MinusPercentEqual",MinusPipe:"MinusPipe",MinusPipeEqual:"MinusPipeEqual",Asterisk:"Asterisk",AsteriskEqual:"AsteriskEqual",AsteriskAsterisk:"AsteriskAsterisk",AsteriskPercent:"AsteriskPercent",AsteriskPercentEqual:"AsteriskPercentEqual",AsteriskPipe:"AsteriskPipe",AsteriskPipeEqual:"AsteriskPipeEqual",Arrow:"Arrow",Colon:"Colon",Slash:"Slash",SlashEqual:"SlashEqual",Comma:"Comma",Ampersand:"Ampersand",AmpersandEqual:"AmpersandEqual",QuestionMark:"QuestionMark",AngleBracketLeft:"AngleBracketLeft",AngleBracketLeftEqual:"AngleBracketLeftEqual",AngleBracketAngleBracketLeft:"AngleBracketAngleBracketLeft",AngleBracketAngleBracketLeftEqual:"AngleBracketAngleBracketLeftEqual",AngleBracketAngleBracketLeftPipe:"AngleBracketAngleBracketLeftPipe",AngleBracketAngleBracketLeftPipeEqual:"AngleBracketAngleBracketLeftPipeEqual",AngleBracketRight:"AngleBracketRight",AngleBracketRightEqual:"AngleBracketRightEqual",AngleBracketAngleBracketRight:"AngleBracketAngleBracketRight",AngleBracketAngleBracketRightEqual:"AngleBracketAngleBracketRightEqual",Tilde:"Tilde",NumberLiteral:"NumberLiteral",DocComment:"DocComment",ContainerDocComment:"ContainerDocComment",KeywordAddrspace:"KeywordAddrspace",KeywordAlign:"KeywordAlign",KeywordAllowzero:"KeywordAllowzero",KeywordAnd:"KeywordAnd",KeywordAnyframe:"KeywordAnyframe",KeywordAnytype:"KeywordAnytype",KeywordAsm:"KeywordAsm",KeywordBreak:"KeywordBreak",KeywordCallconv:"KeywordCallconv",KeywordCatch:"KeywordCatch",KeywordComptime:"KeywordComptime",KeywordConst:"KeywordConst",KeywordContinue:"KeywordContinue",KeywordDefer:"KeywordDefer",KeywordElse:"KeywordElse",KeywordEnum:"KeywordEnum",KeywordErrdefer:"KeywordErrdefer",KeywordError:"KeywordError",KeywordExport:"KeywordExport",KeywordExtern:"KeywordExtern",KeywordFn:"KeywordFn",KeywordFor:"KeywordFor",KeywordIf:"KeywordIf",KeywordInline:"KeywordInline",KeywordNoalias:"KeywordNoalias",KeywordNoinline:"KeywordNoinline",KeywordNosuspend:"KeywordNosuspend",KeywordOpaque:"KeywordOpaque",KeywordOr:"KeywordOr",KeywordOrelse:"KeywordOrelse",KeywordPacked:"KeywordPacked",KeywordPub:"KeywordPub",KeywordResume:"KeywordResume",KeywordReturn:"KeywordReturn",KeywordLinksection:"KeywordLinksection",KeywordStruct:"KeywordStruct",KeywordSuspend:"KeywordSuspend",KeywordSwitch:"KeywordSwitch",KeywordTest:"KeywordTest",KeywordThreadlocal:"KeywordThreadlocal",KeywordTry:"KeywordTry",KeywordUnion:"KeywordUnion",KeywordUnreachable:"KeywordUnreachable",KeywordUsingnamespace:"KeywordUsingnamespace",KeywordVar:"KeywordVar",KeywordVolatile:"KeywordVolatile",KeywordWhile:"KeywordWhile"},O=new Map([["addrspace",q.KeywordAddrspace],["align",q.KeywordAlign],["allowzero",q.KeywordAllowzero],["and",q.KeywordAnd],["anyframe",q.KeywordAnyframe],["anytype",q.KeywordAnytype],["asm",q.KeywordAsm],["break",q.KeywordBreak],["callconv",q.KeywordCallconv],["catch",q.KeywordCatch],["comptime",q.KeywordComptime],["const",q.KeywordConst],["continue",q.KeywordContinue],["defer",q.KeywordDefer],["else",q.KeywordElse],["enum",q.KeywordEnum],["errdefer",q.KeywordErrdefer],["error",q.KeywordError],["export",q.KeywordExport],["extern",q.KeywordExtern],["fn",q.KeywordFn],["for",q.KeywordFor],["if",q.KeywordIf],["inline",q.KeywordInline],["noalias",q.KeywordNoalias],["noinline",q.KeywordNoinline],["nosuspend",q.KeywordNosuspend],["opaque",q.KeywordOpaque],["or",q.KeywordOr],["orelse",q.KeywordOrelse],["packed",q.KeywordPacked],["pub",q.KeywordPub],["resume",q.KeywordResume],["return",q.KeywordReturn],["linksection",q.KeywordLinksection],["struct",q.KeywordStruct],["suspend",q.KeywordSuspend],["switch",q.KeywordSwitch],["test",q.KeywordTest],["threadlocal",q.KeywordThreadlocal],["try",q.KeywordTry],["union",q.KeywordUnion],["unreachable",q.KeywordUnreachable],["usingnamespace",q.KeywordUsingnamespace],["var",q.KeywordVar],["volatile",q.KeywordVolatile],["while",q.KeywordWhile]]);function u(J){return O.get(J)}var h=48,E=57,b=97,y=122,L=65,x=90,I=95,g=64,f=92,l=39,H=34,j=10,z=13,G=9,C=32,v=47,N=42,m=46,A=33;function D(J){return J>=b&&J<=y||J>=L&&J<=x||J===I}function i(J){return D(J)||J>=h&&J<=E}function U(J){return J>=h&&J<=E}function k(J){return J===C||J===j||J===G||J===z}function Z(J){return J>=0&&J<=31||J===127}class R{buffer;index;len;constructor(J){if(this.buffer=J,this.len=J.length,this.index=J.startsWith("\uFEFF")?1:0,J.length>=3&&J.charCodeAt(0)===239&&J.charCodeAt(1)===187&&J.charCodeAt(2)===191)this.index=3;else if(J.startsWith("\uFEFF"))this.index=1;else this.index=0}next(){let J=0,X=this.index;while(this.index<=this.len){let $=this.index<this.len?this.buffer.charCodeAt(this.index):0;switch(J){case 0:if(X=this.index,this.index>=this.len)return this.createToken(q.Eof,X);if(k($)){this.index++;continue}switch($){case H:J=4,this.index++;continue;case l:J=7,this.index++;continue;case g:J=43,this.index++;continue;case 61:J=10,this.index++;continue;case A:J=11,this.index++;continue;case 124:J=12,this.index++;continue;case 40:return this.createToken(q.LParen,X,1);case 41:return this.createToken(q.RParen,X,1);case 91:return this.createToken(q.LBracket,X,1);case 93:return this.createToken(q.RBracket,X,1);case 59:return this.createToken(q.Semicolon,X,1);case 44:return this.createToken(q.Comma,X,1);case 63:return this.createToken(q.QuestionMark,X,1);case 58:return this.createToken(q.Colon,X,1);case 37:J=31,this.index++;continue;case N:J=16,this.index++;continue;case 43:J=32,this.index++;continue;case 60:J=35,this.index++;continue;case 62:J=38,this.index++;continue;case 94:J=30,this.index++;continue;case f:J=9,this.index++;continue;case 123:return this.createToken(q.LBrace,X,1);case 125:return this.createToken(q.RBrace,X,1);case 126:return this.createToken(q.Tilde,X,1);case m:J=40,this.index++;continue;case 45:J=13,this.index++;continue;case v:J=19,this.index++;continue;case 38:J=29,this.index++;continue;default:if(D($)){J=2,this.index++;continue}if(U($)){J=24,this.index++;continue}if($===0&&this.index<this.len){J=44;continue}J=44;continue}case 1:if(this.index++,this.index>=this.len)return this.createToken(q.Invalid,X);if($===j){J=0;continue}J=44;continue;case 44:if(this.index++,this.index>=this.len||$===j)return this.createToken(q.Invalid,X);continue;case 43:if(this.index>=this.len||$===j)return this.createToken(q.Invalid,X);if($===H){J=4,this.index++;continue}if(D($)){J=3,this.index++;continue}J=44;continue;case 2:if(i($)){this.index++;continue}else{let M=this.buffer.substring(X,this.index),P=u(M);return this.createFinalToken(P??q.Identifier,X)}case 3:if(i($)){this.index++;continue}else return this.createFinalToken(q.Builtin,X);case 4:if(this.index>=this.len)return this.createToken(q.Invalid,X);switch($){case H:return this.index++,this.createFinalToken(q.StringLiteral,X);case f:J=5,this.index++;continue;case j:case z:J=44;continue;case 0:if(this.index<this.len){J=44;continue}else return this.createToken(q.Invalid,X);default:if(Z($)&&$!==G){J=44;continue}this.index++;continue}case 5:if(this.index>=this.len)return this.createToken(q.Invalid,X);J=4,this.index++;continue;case 7:if(this.index>=this.len)return this.createToken(q.Invalid,X);switch($){case l:if(this.index++,this.index===X+2)return this.createFinalToken(q.CharLiteral,X);if(this.index-X>2)return this.createFinalToken(q.CharLiteral,X);else{J=44;continue}case f:J=8,this.index++;continue;case j:case z:J=44;continue;case 0:if(this.index<this.len){J=44;continue}else return this.createToken(q.Invalid,X);default:if(Z($)&&$!==G){J=44;continue}this.index++;continue}case 8:if(this.index>=this.len)return this.createToken(q.Invalid,X);if($===j||$===z){J=44;continue}if(Z($)&&$!==G){J=44;continue}J=7,this.index++;continue;case 9:if(this.index>=this.len)return this.createToken(q.Invalid,X);if($===f){J=6,this.index++;continue}J=44;continue;case 6:if(this.index>=this.len)return this.createToken(q.Invalid,X);switch($){case j:return this.index++,this.createFinalToken(q.MultilineStringLiteralLine,X);case z:if(this.peekCharCode()===j)return this.index+=2,this.createFinalToken(q.MultilineStringLiteralLine,X);else{J=44;continue}case G:J=44;continue;case 0:if(this.index<this.len){J=44;continue}else return this.createToken(q.Invalid,X);default:if(Z($)){J=44;continue}this.index++;continue}case 10:switch($){case 61:return this.createToken(q.EqualEqual,X,2);case 62:return this.createToken(q.EqualAngleBracketRight,X,2);default:return this.createFinalToken(q.Equal,X)}case 11:if($===61)return this.createToken(q.BangEqual,X,2);return this.createFinalToken(q.Bang,X);case 12:switch($){case 61:return this.createToken(q.PipeEqual,X,2);case 124:return this.createToken(q.PipePipe,X,2);default:return this.createFinalToken(q.Pipe,X)}case 13:switch($){case 62:return this.createToken(q.Arrow,X,2);case 61:return this.createToken(q.MinusEqual,X,2);case 37:J=14,this.index++;continue;case 124:J=15,this.index++;continue;default:return this.createFinalToken(q.Minus,X)}case 14:if($===61)return this.createToken(q.MinusPercentEqual,X,3);return this.createFinalToken(q.MinusPercent,X,2);case 15:if($===61)return this.createToken(q.MinusPipeEqual,X,3);return this.createFinalToken(q.MinusPipe,X,2);case 16:switch($){case 61:return this.createToken(q.AsteriskEqual,X,2);case N:return this.createToken(q.AsteriskAsterisk,X,2);case 37:J=17,this.index++;continue;case 124:J=18,this.index++;continue;default:return this.createFinalToken(q.Asterisk,X)}case 17:if($===61)return this.createToken(q.AsteriskPercentEqual,X,3);return this.createFinalToken(q.AsteriskPercent,X,2);case 18:if($===61)return this.createToken(q.AsteriskPipeEqual,X,3);return this.createFinalToken(q.AsteriskPipe,X,2);case 19:switch($){case v:J=20,this.index++;continue;case 61:return this.createToken(q.SlashEqual,X,2);default:return this.createFinalToken(q.Slash,X)}case 20:if(this.index>=this.len){J=0;continue}switch($){case A:J=23,this.index++,X=this.index;continue;case v:J=22,this.index++;continue;case j:J=0,this.index++;continue;case z:if(this.peekCharCode()===j)this.index++;case G:J=44;continue;case 0:if(this.index<this.len){J=44;continue}else{J=0;continue}default:if(Z($)){J=44;continue}J=21,this.index++;continue}case 22:if(this.index>=this.len)return this.createToken(q.DocComment,X,3);switch($){case j:case z:case 0:return this.createToken(q.DocComment,X,3);case v:J=21,this.index++;continue;case G:J=44;continue;default:if(Z($)){J=44;continue}J=23,X=this.index,this.index++;continue}case 21:if(this.index>=this.len){J=0;continue}switch($){case j:J=0,this.index++;continue;case z:if(this.peekCharCode()===j)this.index++;else J=44;continue;case G:J=44;continue;case 0:if(this.index<this.len){J=44;continue}else{J=0;continue}default:if(Z($)){J=44;continue}this.index++;continue}case 23:let Y=this.buffer.startsWith("//!",X-3);if(this.index>=this.len)return this.createFinalToken(Y?q.ContainerDocComment:q.DocComment,X);switch($){case j:return this.index++,this.createFinalToken(Y?q.ContainerDocComment:q.DocComment,X);case z:if(this.peekCharCode()===j){this.index++;continue}else{J=44;continue}case G:J=44;continue;case 0:if(this.index<this.len){J=44;continue}else return this.createFinalToken(Y?q.ContainerDocComment:q.DocComment,X);default:if(Z($)){J=44;continue}this.index++;continue}case 24:if($===m){J=26,this.index++;continue}if($===101||$===69||$===112||$===80){J=25,this.index++;continue}if(U($)||$>=b&&$<=y||$>=L&&$<=x||$===I){this.index++;continue}return this.createFinalToken(q.NumberLiteral,X);case 25:if($===43||$===45){this.index++,J=27;continue}if(U($)||$>=b&&$<=y||$>=L&&$<=x||$===I){J=27,this.index++;continue}J=24;continue;case 26:if($===m)return this.index--,this.createFinalToken(q.NumberLiteral,X);if(U($)||$>=b&&$<=y||$>=L&&$<=x||$===I){J=27,this.index++;continue}if($===101||$===69||$===112||$===80){J=28,this.index++;continue}return this.index--,this.createFinalToken(q.NumberLiteral,X);case 27:if($===101||$===69||$===112||$===80){J=28,this.index++;continue}if(U($)||$>=b&&$<=y||$>=L&&$<=x||$===I){this.index++;continue}return this.createFinalToken(q.NumberLiteral,X);case 28:if($===43||$===45){let M=this.peekCharCode();if(U(M)||M>=b&&M<=y||M>=L&&M<=x||M===I){this.index++,J=27;continue}else{J=44;continue}}if(U($)||$>=b&&$<=y||$>=L&&$<=x||$===I){J=27,this.index++;continue}return this.createFinalToken(q.NumberLiteral,X);case 29:if($===61)return this.createToken(q.AmpersandEqual,X,2);return this.createFinalToken(q.Ampersand,X);case 30:if($===61)return this.createToken(q.CaretEqual,X,2);return this.createFinalToken(q.Caret,X);case 31:if($===61)return this.createToken(q.PercentEqual,X,2);return this.createFinalToken(q.Percent,X);case 32:switch($){case 61:return this.createToken(q.PlusEqual,X,2);case 43:return this.createToken(q.PlusPlus,X,2);case 37:J=33,this.index++;continue;case 124:J=34,this.index++;continue;default:return this.createFinalToken(q.Plus,X)}case 33:if($===61)return this.createToken(q.PlusPercentEqual,X,3);return this.createFinalToken(q.PlusPercent,X,2);case 34:if($===61)return this.createToken(q.PlusPipeEqual,X,3);return this.createFinalToken(q.PlusPipe,X,2);case 35:switch($){case 60:J=36,this.index++;continue;case 61:return this.createToken(q.AngleBracketLeftEqual,X,2);default:return this.createFinalToken(q.AngleBracketLeft,X)}case 36:switch($){case 61:return this.createToken(q.AngleBracketAngleBracketLeftEqual,X,3);case 124:J=37,this.index++;continue;default:return this.createFinalToken(q.AngleBracketAngleBracketLeft,X,2)}case 37:if($===61)return this.createToken(q.AngleBracketAngleBracketLeftPipeEqual,X,4);return this.createFinalToken(q.AngleBracketAngleBracketLeftPipe,X,3);case 38:switch($){case 62:J=39,this.index++;continue;case 61:return this.createToken(q.AngleBracketRightEqual,X,2);default:return this.createFinalToken(q.AngleBracketRight,X)}case 39:if($===61)return this.createToken(q.AngleBracketAngleBracketRightEqual,X,3);return this.createFinalToken(q.AngleBracketAngleBracketRight,X,2);case 40:switch($){case m:J=41,this.index++;continue;case N:J=42,this.index++;continue;default:return this.createFinalToken(q.Period,X)}case 41:if($===m)return this.createToken(q.Ellipsis3,X,3);return this.createFinalToken(q.Ellipsis2,X,2);case 42:if($===N)return this.createToken(q.InvalidPeriodAsterisks,X,3);return this.createFinalToken(q.PeriodAsterisk,X,2)}}if(this.index>=this.len&&J===0)return this.createToken(q.Eof,this.len);return this.createToken(q.Invalid,X)}createToken(J,X,$=1){this.index=X+$;let Y=this.index;return{tag:J,loc:{start:X,end:Y},value:this.buffer.substring(X,Y)}}createFinalToken(J,X,$){let Y=$?X+$:this.index;if($)this.index=Y;return{tag:J,loc:{start:X,end:Y},value:this.buffer.substring(X,Y)}}peekCharCode(J=1){let X=this.index+J-1;if(X>=this.len)return 0;return this.buffer.charCodeAt(X)}*tokens(){while(!0){let J=this.next();if(yield J,J.tag===q.Eof)break}}}class _{#Y;#q;#X;constructor(J){this.#Y=new R(J),this.#q=null,this.#X=null}#Q(J){return J===q.DocComment||J===q.ContainerDocComment}#$(J,X){return J?.tag===X}#j(){if(this.#X)this.#q=this.#X,this.#X=null;else do this.#q=this.#Y.next();while(this.#q&&this.#Q(this.#q.tag));if(!this.#q)throw Error("Advanced past EOF unexpectedly.");return this.#q}#w(){if(!this.#X){let J=null;do J=this.#Y.next();while(J&&this.#Q(J.tag));if(!J)throw Error("Peeked past EOF unexpectedly.");this.#X=J}if(!this.#X)throw Error("Peek failed unexpectedly.");return this.#X}#J(J){let X=this.#q;if(!X)throw Error(`Cannot consume token: stream is at EOF or not initialized. Expected ${J??"any token"}.`);if(J!==void 0&&X.tag!==J)throw Error(`Expected token ${J} but found ${X.tag} ('${X.value}') at index ${X.loc.start}`);return this.#j(),X}#M(){if(!this.#q)throw Error("Unexpected EOF while parsing value");switch(this.#q.tag){case q.Period:let J=this.#w();if(J.tag===q.LBrace)return this.#J(q.Period),this.#P();else if(J.tag===q.Identifier||J.tag===q.StringLiteral){this.#J(q.Period);let K=this.#J(J.tag);return`${K.tag===q.StringLiteral?K.value.startsWith('@"')?K.value.slice(2,-1):K.value.slice(1,-1):K.value}`}else throw Error(`Unexpected token after '.': ${J.tag} at index ${J.loc.start}. Expected '{' for struct literal or identifier/string for enum value.`);case q.StringLiteral:let X=this.#q.value;return this.#J(),X.startsWith('@"')?X.slice(2,-1):X.slice(1,-1);case q.CharLiteral:let Y=this.#q.value;return this.#J(),Y.slice(1,-1);case q.NumberLiteral:let M=this.#q.value;this.#J();let P=M.replace(/_/g,""),w=Number(P);if(isNaN(w))throw Error(`Invalid number literal format: "${M}" at index ${this.#q?.loc.start??"unknown"}`);return w;case q.Minus:this.#J(q.Minus);let B=this.#q;if(B?.tag===q.NumberLiteral){let K=B.value;this.#J();let Q=K.replace(/_/g,""),p=Number(Q);if(isNaN(p))throw Error(`Invalid number literal format: "-${K}" at index ${B.loc.start}`);return-p}throw Error(`Expected number after '-' at index ${this.#q?.loc.start??"unknown"}`);case q.Identifier:let V=this.#q.value;if(V==="true")return this.#J(),!0;if(V==="false")return this.#J(),!1;if(V==="null")return this.#J(),null;throw Error(`Unexpected identifier '${V}' found as value at index ${this.#q.loc.start}`);default:throw Error(`Unexpected token '${this.#q.value}' (${this.#q.tag}) when parsing value at index ${this.#q.loc.start}`)}}#P(){this.#J(q.LBrace);let J=void 0,X=!1,$=new Set;if(this.#$(this.#q,q.RBrace))return this.#J(q.RBrace),[];while(this.#q&&!this.#$(this.#q,q.RBrace)){if(this.#q.tag===q.Period){let Y=this.#w();switch(Y.tag){case q.Identifier:case q.StringLiteral:{if(J===void 0)J={},X=!1;else if(X)throw Error(`Expected array element but found object field starting with '.' at index ${this.#q.loc.start}`);this.#J(q.Period);let M=this.#J(Y.tag),P=M.tag===q.StringLiteral?M.value.startsWith('@"')?M.value.slice(2,-1):M.value.slice(1,-1):M.value;if(!P)throw Error(`Invalid field empty: ${M.value} at index ${M.loc.start}`);if($.has(P))throw Error(`Duplicate field name '${P}' found at index ${M.loc.start}`);$.add(P),this.#J(q.Equal),J[P]=this.#M();break}case q.LBrace:{if(J===void 0)J=[],X=!0;else if(!X)throw Error(`Expected object field (starting with '.') but found array element at index ${this.#q.loc.start}`);this.#J(q.Period),J.push(this.#P());break}default:throw Error(`Unexpected token after '.': ${Y.tag} at index ${Y.loc.start}`)}}else{if(J===void 0)J=[],X=!0;else if(!X)throw Error(`Expected object field (starting with '.') but found array element at index ${this.#q.loc.start}`);J.push(this.#M())}if(this.#$(this.#q,q.Comma)){if(this.#J(),this.#$(this.#q,q.RBrace))break}else if(!this.#$(this.#q,q.RBrace))throw Error(`Expected ',' or '}' after element/field, but found ${this.#q.tag} '${this.#q.value}' at index ${this.#q.loc.start}`)}return this.#J(q.RBrace),J===void 0?[]:J}parse(J){if(this.#j(),!this.#q||this.#$(this.#q,q.Eof))throw Error("Input ZON string is empty or contains only comments.");let X=this.#M();if(this.#q&&!this.#$(this.#q,q.Eof))throw Error(`Parsing finished, but unexpected token remained: ${this.#q.tag} '${this.#q.value}' at index ${this.#q.loc.start}`);if(!J)return X;return JSON.parse(JSON.stringify(X),J)}}function d(J,X){return new _(J).parse(X)}function S(J,X,$){let Y="",M="";if(typeof $==="number")Y=" ".repeat($),M=` `;else if(typeof $==="string")Y=$,M=` `;let P=(w,B=0)=>{switch(typeof w){case"object":if(w===null)return"null";let V=Object.entries(w),K=Array.isArray(w),Q=".{";if(V.length>0)Q+=M;let p=-1;if(V.forEach(([W,F])=>{if(F===void 0)return;if(p++,typeof X==="function")F=X.call(F,W,F);if(Array.isArray(X)&&!X.includes(W))return;if(p>0)Q+=",",Q+=M;if(Y)Q+=Y.repeat(B+1);if(!K){let c=O.has(W),s=!/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(W);Q+=`.${c?`@"${W}"`:s?`@"${W}"`:W}${Y?" = ":"="}`}if(typeof F==="object"&&F!==null)Q+=P(F,B+1);else if(typeof F==="string"&&F.length===1)Q+=`'${F}'`;else Q+=JSON.stringify(F)}),p>0){if(Y)Q+=",";if(Q+=M,Y)Q+=Y.repeat(B)}return Q+="}",Q;case"undefined":return"";case"boolean":return w?"true":"false";case"number":return`${w}`;case"string":return w.length===1?`'${w}'`:`"${w}"`;default:return`${w}`}};return P(J)}var qq={parse:d,stringify:S};export{qq as ZON};