@udt/parser-utils 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +13 -0
- package/README.md +78 -0
- package/coverage/base.css +224 -0
- package/coverage/block-navigation.js +87 -0
- package/coverage/clover.xml +123 -0
- package/coverage/coverage-final.json +5 -0
- package/coverage/extractProperties.ts.html +277 -0
- package/coverage/favicon.png +0 -0
- package/coverage/index.html +161 -0
- package/coverage/index.ts.html +94 -0
- package/coverage/isJsonObject.ts.html +142 -0
- package/coverage/parseData.ts.html +898 -0
- package/coverage/prettify.css +1 -0
- package/coverage/prettify.js +2 -0
- package/coverage/sort-arrow-sprite.png +0 -0
- package/coverage/sorter.js +196 -0
- package/dist/extractProperties.d.ts +30 -0
- package/dist/extractProperties.js +36 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.js +3 -0
- package/dist/isJsonObject.d.ts +16 -0
- package/dist/isJsonObject.js +10 -0
- package/dist/parseData.d.ts +159 -0
- package/dist/parseData.js +87 -0
- package/package.json +29 -0
- package/src/extractProperties.test.ts +33 -0
- package/src/extractProperties.ts +64 -0
- package/src/index.ts +3 -0
- package/src/isJsonObject.test.ts +32 -0
- package/src/isJsonObject.ts +19 -0
- package/src/parseData.test.ts +438 -0
- package/src/parseData.ts +271 -0
- package/tsconfig.build.json +11 -0
- package/tsconfig.json +6 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.pln{color:#000}@media screen{.str{color:#080}.kwd{color:#008}.com{color:#800}.typ{color:#606}.lit{color:#066}.pun,.opn,.clo{color:#660}.tag{color:#008}.atn{color:#606}.atv{color:#080}.dec,.var{color:#606}.fun{color:red}}@media print,projection{.str{color:#060}.kwd{color:#006;font-weight:bold}.com{color:#600;font-style:italic}.typ{color:#404;font-weight:bold}.lit{color:#044}.pun,.opn,.clo{color:#440}.tag{color:#006;font-weight:bold}.atn{color:#404}.atv{color:#060}}pre.prettyprint{padding:2px;border:1px solid #888}ol.linenums{margin-top:0;margin-bottom:0}li.L0,li.L1,li.L2,li.L3,li.L5,li.L6,li.L7,li.L8{list-style-type:none}li.L1,li.L3,li.L5,li.L7,li.L9{background:#eee}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
/* eslint-disable */
|
|
2
|
+
window.PR_SHOULD_USE_CONTINUATION=true;(function(){var h=["break,continue,do,else,for,if,return,while"];var u=[h,"auto,case,char,const,default,double,enum,extern,float,goto,int,long,register,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile"];var p=[u,"catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof"];var l=[p,"alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,dynamic_cast,explicit,export,friend,inline,late_check,mutable,namespace,nullptr,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where"];var x=[p,"abstract,boolean,byte,extends,final,finally,implements,import,instanceof,null,native,package,strictfp,super,synchronized,throws,transient"];var R=[x,"as,base,by,checked,decimal,delegate,descending,dynamic,event,fixed,foreach,from,group,implicit,in,interface,internal,into,is,lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var"];var r="all,and,by,catch,class,else,extends,false,finally,for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,true,try,unless,until,when,while,yes";var w=[p,"debugger,eval,export,function,get,null,set,undefined,var,with,Infinity,NaN"];var s="caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END";var I=[h,"and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,with,yield,False,True,None"];var f=[h,"alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END"];var H=[h,"case,done,elif,esac,eval,fi,function,in,local,set,then,until"];var A=[l,R,w,s+I,f,H];var e=/^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\d*)/;var C="str";var z="kwd";var j="com";var O="typ";var G="lit";var L="pun";var F="pln";var m="tag";var E="dec";var J="src";var P="atn";var n="atv";var N="nocode";var M="(?:^^\\.?|[+-]|\\!|\\!=|\\!==|\\#|\\%|\\%=|&|&&|&&=|&=|\\(|\\*|\\*=|\\+=|\\,|\\-=|\\->|\\/|\\/=|:|::|\\;|<|<<|<<=|<=|=|==|===|>|>=|>>|>>=|>>>|>>>=|\\?|\\@|\\[|\\^|\\^=|\\^\\^|\\^\\^=|\\{|\\||\\|=|\\|\\||\\|\\|=|\\~|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\\s*";function k(Z){var ad=0;var S=false;var ac=false;for(var V=0,U=Z.length;V<U;++V){var ae=Z[V];if(ae.ignoreCase){ac=true}else{if(/[a-z]/i.test(ae.source.replace(/\\u[0-9a-f]{4}|\\x[0-9a-f]{2}|\\[^ux]/gi,""))){S=true;ac=false;break}}}var Y={b:8,t:9,n:10,v:11,f:12,r:13};function ab(ah){var ag=ah.charCodeAt(0);if(ag!==92){return ag}var af=ah.charAt(1);ag=Y[af];if(ag){return ag}else{if("0"<=af&&af<="7"){return parseInt(ah.substring(1),8)}else{if(af==="u"||af==="x"){return parseInt(ah.substring(2),16)}else{return ah.charCodeAt(1)}}}}function T(af){if(af<32){return(af<16?"\\x0":"\\x")+af.toString(16)}var ag=String.fromCharCode(af);if(ag==="\\"||ag==="-"||ag==="["||ag==="]"){ag="\\"+ag}return ag}function X(am){var aq=am.substring(1,am.length-1).match(new RegExp("\\\\u[0-9A-Fa-f]{4}|\\\\x[0-9A-Fa-f]{2}|\\\\[0-3][0-7]{0,2}|\\\\[0-7]{1,2}|\\\\[\\s\\S]|-|[^-\\\\]","g"));var ak=[];var af=[];var ao=aq[0]==="^";for(var ar=ao?1:0,aj=aq.length;ar<aj;++ar){var ah=aq[ar];if(/\\[bdsw]/i.test(ah)){ak.push(ah)}else{var ag=ab(ah);var al;if(ar+2<aj&&"-"===aq[ar+1]){al=ab(aq[ar+2]);ar+=2}else{al=ag}af.push([ag,al]);if(!(al<65||ag>122)){if(!(al<65||ag>90)){af.push([Math.max(65,ag)|32,Math.min(al,90)|32])}if(!(al<97||ag>122)){af.push([Math.max(97,ag)&~32,Math.min(al,122)&~32])}}}}af.sort(function(av,au){return(av[0]-au[0])||(au[1]-av[1])});var ai=[];var ap=[NaN,NaN];for(var ar=0;ar<af.length;++ar){var at=af[ar];if(at[0]<=ap[1]+1){ap[1]=Math.max(ap[1],at[1])}else{ai.push(ap=at)}}var an=["["];if(ao){an.push("^")}an.push.apply(an,ak);for(var ar=0;ar<ai.length;++ar){var at=ai[ar];an.push(T(at[0]));if(at[1]>at[0]){if(at[1]+1>at[0]){an.push("-")}an.push(T(at[1]))}}an.push("]");return an.join("")}function W(al){var aj=al.source.match(new RegExp("(?:\\[(?:[^\\x5C\\x5D]|\\\\[\\s\\S])*\\]|\\\\u[A-Fa-f0-9]{4}|\\\\x[A-Fa-f0-9]{2}|\\\\[0-9]+|\\\\[^ux0-9]|\\(\\?[:!=]|[\\(\\)\\^]|[^\\x5B\\x5C\\(\\)\\^]+)","g"));var ah=aj.length;var an=[];for(var ak=0,am=0;ak<ah;++ak){var ag=aj[ak];if(ag==="("){++am}else{if("\\"===ag.charAt(0)){var af=+ag.substring(1);if(af&&af<=am){an[af]=-1}}}}for(var ak=1;ak<an.length;++ak){if(-1===an[ak]){an[ak]=++ad}}for(var ak=0,am=0;ak<ah;++ak){var ag=aj[ak];if(ag==="("){++am;if(an[am]===undefined){aj[ak]="(?:"}}else{if("\\"===ag.charAt(0)){var af=+ag.substring(1);if(af&&af<=am){aj[ak]="\\"+an[am]}}}}for(var ak=0,am=0;ak<ah;++ak){if("^"===aj[ak]&&"^"!==aj[ak+1]){aj[ak]=""}}if(al.ignoreCase&&S){for(var ak=0;ak<ah;++ak){var ag=aj[ak];var ai=ag.charAt(0);if(ag.length>=2&&ai==="["){aj[ak]=X(ag)}else{if(ai!=="\\"){aj[ak]=ag.replace(/[a-zA-Z]/g,function(ao){var ap=ao.charCodeAt(0);return"["+String.fromCharCode(ap&~32,ap|32)+"]"})}}}}return aj.join("")}var aa=[];for(var V=0,U=Z.length;V<U;++V){var ae=Z[V];if(ae.global||ae.multiline){throw new Error(""+ae)}aa.push("(?:"+W(ae)+")")}return new RegExp(aa.join("|"),ac?"gi":"g")}function a(V){var U=/(?:^|\s)nocode(?:\s|$)/;var X=[];var T=0;var Z=[];var W=0;var S;if(V.currentStyle){S=V.currentStyle.whiteSpace}else{if(window.getComputedStyle){S=document.defaultView.getComputedStyle(V,null).getPropertyValue("white-space")}}var Y=S&&"pre"===S.substring(0,3);function aa(ab){switch(ab.nodeType){case 1:if(U.test(ab.className)){return}for(var ae=ab.firstChild;ae;ae=ae.nextSibling){aa(ae)}var ad=ab.nodeName;if("BR"===ad||"LI"===ad){X[W]="\n";Z[W<<1]=T++;Z[(W++<<1)|1]=ab}break;case 3:case 4:var ac=ab.nodeValue;if(ac.length){if(!Y){ac=ac.replace(/[ \t\r\n]+/g," ")}else{ac=ac.replace(/\r\n?/g,"\n")}X[W]=ac;Z[W<<1]=T;T+=ac.length;Z[(W++<<1)|1]=ab}break}}aa(V);return{sourceCode:X.join("").replace(/\n$/,""),spans:Z}}function B(S,U,W,T){if(!U){return}var V={sourceCode:U,basePos:S};W(V);T.push.apply(T,V.decorations)}var v=/\S/;function o(S){var V=undefined;for(var U=S.firstChild;U;U=U.nextSibling){var T=U.nodeType;V=(T===1)?(V?S:U):(T===3)?(v.test(U.nodeValue)?S:V):V}return V===S?undefined:V}function g(U,T){var S={};var V;(function(){var ad=U.concat(T);var ah=[];var ag={};for(var ab=0,Z=ad.length;ab<Z;++ab){var Y=ad[ab];var ac=Y[3];if(ac){for(var ae=ac.length;--ae>=0;){S[ac.charAt(ae)]=Y}}var af=Y[1];var aa=""+af;if(!ag.hasOwnProperty(aa)){ah.push(af);ag[aa]=null}}ah.push(/[\0-\uffff]/);V=k(ah)})();var X=T.length;var W=function(ah){var Z=ah.sourceCode,Y=ah.basePos;var ad=[Y,F];var af=0;var an=Z.match(V)||[];var aj={};for(var ae=0,aq=an.length;ae<aq;++ae){var ag=an[ae];var ap=aj[ag];var ai=void 0;var am;if(typeof ap==="string"){am=false}else{var aa=S[ag.charAt(0)];if(aa){ai=ag.match(aa[1]);ap=aa[0]}else{for(var ao=0;ao<X;++ao){aa=T[ao];ai=ag.match(aa[1]);if(ai){ap=aa[0];break}}if(!ai){ap=F}}am=ap.length>=5&&"lang-"===ap.substring(0,5);if(am&&!(ai&&typeof ai[1]==="string")){am=false;ap=J}if(!am){aj[ag]=ap}}var ab=af;af+=ag.length;if(!am){ad.push(Y+ab,ap)}else{var al=ai[1];var ak=ag.indexOf(al);var ac=ak+al.length;if(ai[2]){ac=ag.length-ai[2].length;ak=ac-al.length}var ar=ap.substring(5);B(Y+ab,ag.substring(0,ak),W,ad);B(Y+ab+ak,al,q(ar,al),ad);B(Y+ab+ac,ag.substring(ac),W,ad)}}ah.decorations=ad};return W}function i(T){var W=[],S=[];if(T.tripleQuotedStrings){W.push([C,/^(?:\'\'\'(?:[^\'\\]|\\[\s\S]|\'{1,2}(?=[^\']))*(?:\'\'\'|$)|\"\"\"(?:[^\"\\]|\\[\s\S]|\"{1,2}(?=[^\"]))*(?:\"\"\"|$)|\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$))/,null,"'\""])}else{if(T.multiLineStrings){W.push([C,/^(?:\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$)|\`(?:[^\\\`]|\\[\s\S])*(?:\`|$))/,null,"'\"`"])}else{W.push([C,/^(?:\'(?:[^\\\'\r\n]|\\.)*(?:\'|$)|\"(?:[^\\\"\r\n]|\\.)*(?:\"|$))/,null,"\"'"])}}if(T.verbatimStrings){S.push([C,/^@\"(?:[^\"]|\"\")*(?:\"|$)/,null])}var Y=T.hashComments;if(Y){if(T.cStyleComments){if(Y>1){W.push([j,/^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/,null,"#"])}else{W.push([j,/^#(?:(?:define|elif|else|endif|error|ifdef|include|ifndef|line|pragma|undef|warning)\b|[^\r\n]*)/,null,"#"])}S.push([C,/^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h|[a-z]\w*)>/,null])}else{W.push([j,/^#[^\r\n]*/,null,"#"])}}if(T.cStyleComments){S.push([j,/^\/\/[^\r\n]*/,null]);S.push([j,/^\/\*[\s\S]*?(?:\*\/|$)/,null])}if(T.regexLiterals){var X=("/(?=[^/*])(?:[^/\\x5B\\x5C]|\\x5C[\\s\\S]|\\x5B(?:[^\\x5C\\x5D]|\\x5C[\\s\\S])*(?:\\x5D|$))+/");S.push(["lang-regex",new RegExp("^"+M+"("+X+")")])}var V=T.types;if(V){S.push([O,V])}var U=(""+T.keywords).replace(/^ | $/g,"");if(U.length){S.push([z,new RegExp("^(?:"+U.replace(/[\s,]+/g,"|")+")\\b"),null])}W.push([F,/^\s+/,null," \r\n\t\xA0"]);S.push([G,/^@[a-z_$][a-z_$@0-9]*/i,null],[O,/^(?:[@_]?[A-Z]+[a-z][A-Za-z_$@0-9]*|\w+_t\b)/,null],[F,/^[a-z_$][a-z_$@0-9]*/i,null],[G,new RegExp("^(?:0x[a-f0-9]+|(?:\\d(?:_\\d+)*\\d*(?:\\.\\d*)?|\\.\\d\\+)(?:e[+\\-]?\\d+)?)[a-z]*","i"),null,"0123456789"],[F,/^\\[\s\S]?/,null],[L,/^.[^\s\w\.$@\'\"\`\/\#\\]*/,null]);return g(W,S)}var K=i({keywords:A,hashComments:true,cStyleComments:true,multiLineStrings:true,regexLiterals:true});function Q(V,ag){var U=/(?:^|\s)nocode(?:\s|$)/;var ab=/\r\n?|\n/;var ac=V.ownerDocument;var S;if(V.currentStyle){S=V.currentStyle.whiteSpace}else{if(window.getComputedStyle){S=ac.defaultView.getComputedStyle(V,null).getPropertyValue("white-space")}}var Z=S&&"pre"===S.substring(0,3);var af=ac.createElement("LI");while(V.firstChild){af.appendChild(V.firstChild)}var W=[af];function ae(al){switch(al.nodeType){case 1:if(U.test(al.className)){break}if("BR"===al.nodeName){ad(al);if(al.parentNode){al.parentNode.removeChild(al)}}else{for(var an=al.firstChild;an;an=an.nextSibling){ae(an)}}break;case 3:case 4:if(Z){var am=al.nodeValue;var aj=am.match(ab);if(aj){var ai=am.substring(0,aj.index);al.nodeValue=ai;var ah=am.substring(aj.index+aj[0].length);if(ah){var ak=al.parentNode;ak.insertBefore(ac.createTextNode(ah),al.nextSibling)}ad(al);if(!ai){al.parentNode.removeChild(al)}}}break}}function ad(ak){while(!ak.nextSibling){ak=ak.parentNode;if(!ak){return}}function ai(al,ar){var aq=ar?al.cloneNode(false):al;var ao=al.parentNode;if(ao){var ap=ai(ao,1);var an=al.nextSibling;ap.appendChild(aq);for(var am=an;am;am=an){an=am.nextSibling;ap.appendChild(am)}}return aq}var ah=ai(ak.nextSibling,0);for(var aj;(aj=ah.parentNode)&&aj.nodeType===1;){ah=aj}W.push(ah)}for(var Y=0;Y<W.length;++Y){ae(W[Y])}if(ag===(ag|0)){W[0].setAttribute("value",ag)}var aa=ac.createElement("OL");aa.className="linenums";var X=Math.max(0,((ag-1))|0)||0;for(var Y=0,T=W.length;Y<T;++Y){af=W[Y];af.className="L"+((Y+X)%10);if(!af.firstChild){af.appendChild(ac.createTextNode("\xA0"))}aa.appendChild(af)}V.appendChild(aa)}function D(ac){var aj=/\bMSIE\b/.test(navigator.userAgent);var am=/\n/g;var al=ac.sourceCode;var an=al.length;var V=0;var aa=ac.spans;var T=aa.length;var ah=0;var X=ac.decorations;var Y=X.length;var Z=0;X[Y]=an;var ar,aq;for(aq=ar=0;aq<Y;){if(X[aq]!==X[aq+2]){X[ar++]=X[aq++];X[ar++]=X[aq++]}else{aq+=2}}Y=ar;for(aq=ar=0;aq<Y;){var at=X[aq];var ab=X[aq+1];var W=aq+2;while(W+2<=Y&&X[W+1]===ab){W+=2}X[ar++]=at;X[ar++]=ab;aq=W}Y=X.length=ar;var ae=null;while(ah<T){var af=aa[ah];var S=aa[ah+2]||an;var ag=X[Z];var ap=X[Z+2]||an;var W=Math.min(S,ap);var ak=aa[ah+1];var U;if(ak.nodeType!==1&&(U=al.substring(V,W))){if(aj){U=U.replace(am,"\r")}ak.nodeValue=U;var ai=ak.ownerDocument;var ao=ai.createElement("SPAN");ao.className=X[Z+1];var ad=ak.parentNode;ad.replaceChild(ao,ak);ao.appendChild(ak);if(V<S){aa[ah+1]=ak=ai.createTextNode(al.substring(W,S));ad.insertBefore(ak,ao.nextSibling)}}V=W;if(V>=S){ah+=2}if(V>=ap){Z+=2}}}var t={};function c(U,V){for(var S=V.length;--S>=0;){var T=V[S];if(!t.hasOwnProperty(T)){t[T]=U}else{if(window.console){console.warn("cannot override language handler %s",T)}}}}function q(T,S){if(!(T&&t.hasOwnProperty(T))){T=/^\s*</.test(S)?"default-markup":"default-code"}return t[T]}c(K,["default-code"]);c(g([],[[F,/^[^<?]+/],[E,/^<!\w[^>]*(?:>|$)/],[j,/^<\!--[\s\S]*?(?:-\->|$)/],["lang-",/^<\?([\s\S]+?)(?:\?>|$)/],["lang-",/^<%([\s\S]+?)(?:%>|$)/],[L,/^(?:<[%?]|[%?]>)/],["lang-",/^<xmp\b[^>]*>([\s\S]+?)<\/xmp\b[^>]*>/i],["lang-js",/^<script\b[^>]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-css",/^<style\b[^>]*>([\s\S]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i]]),["default-markup","htm","html","mxml","xhtml","xml","xsl"]);c(g([[F,/^[\s]+/,null," \t\r\n"],[n,/^(?:\"[^\"]*\"?|\'[^\']*\'?)/,null,"\"'"]],[[m,/^^<\/?[a-z](?:[\w.:-]*\w)?|\/?>$/i],[P,/^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],["lang-uq.val",/^=\s*([^>\'\"\s]*(?:[^>\'\"\s\/]|\/(?=\s)))/],[L,/^[=<>\/]+/],["lang-js",/^on\w+\s*=\s*\"([^\"]+)\"/i],["lang-js",/^on\w+\s*=\s*\'([^\']+)\'/i],["lang-js",/^on\w+\s*=\s*([^\"\'>\s]+)/i],["lang-css",/^style\s*=\s*\"([^\"]+)\"/i],["lang-css",/^style\s*=\s*\'([^\']+)\'/i],["lang-css",/^style\s*=\s*([^\"\'>\s]+)/i]]),["in.tag"]);c(g([],[[n,/^[\s\S]+/]]),["uq.val"]);c(i({keywords:l,hashComments:true,cStyleComments:true,types:e}),["c","cc","cpp","cxx","cyc","m"]);c(i({keywords:"null,true,false"}),["json"]);c(i({keywords:R,hashComments:true,cStyleComments:true,verbatimStrings:true,types:e}),["cs"]);c(i({keywords:x,cStyleComments:true}),["java"]);c(i({keywords:H,hashComments:true,multiLineStrings:true}),["bsh","csh","sh"]);c(i({keywords:I,hashComments:true,multiLineStrings:true,tripleQuotedStrings:true}),["cv","py"]);c(i({keywords:s,hashComments:true,multiLineStrings:true,regexLiterals:true}),["perl","pl","pm"]);c(i({keywords:f,hashComments:true,multiLineStrings:true,regexLiterals:true}),["rb"]);c(i({keywords:w,cStyleComments:true,regexLiterals:true}),["js"]);c(i({keywords:r,hashComments:3,cStyleComments:true,multilineStrings:true,tripleQuotedStrings:true,regexLiterals:true}),["coffee"]);c(g([],[[C,/^[\s\S]+/]]),["regex"]);function d(V){var U=V.langExtension;try{var S=a(V.sourceNode);var T=S.sourceCode;V.sourceCode=T;V.spans=S.spans;V.basePos=0;q(U,T)(V);D(V)}catch(W){if("console" in window){console.log(W&&W.stack?W.stack:W)}}}function y(W,V,U){var S=document.createElement("PRE");S.innerHTML=W;if(U){Q(S,U)}var T={langExtension:V,numberLines:U,sourceNode:S};d(T);return S.innerHTML}function b(ad){function Y(af){return document.getElementsByTagName(af)}var ac=[Y("pre"),Y("code"),Y("xmp")];var T=[];for(var aa=0;aa<ac.length;++aa){for(var Z=0,V=ac[aa].length;Z<V;++Z){T.push(ac[aa][Z])}}ac=null;var W=Date;if(!W.now){W={now:function(){return +(new Date)}}}var X=0;var S;var ab=/\blang(?:uage)?-([\w.]+)(?!\S)/;var ae=/\bprettyprint\b/;function U(){var ag=(window.PR_SHOULD_USE_CONTINUATION?W.now()+250:Infinity);for(;X<T.length&&W.now()<ag;X++){var aj=T[X];var ai=aj.className;if(ai.indexOf("prettyprint")>=0){var ah=ai.match(ab);var am;if(!ah&&(am=o(aj))&&"CODE"===am.tagName){ah=am.className.match(ab)}if(ah){ah=ah[1]}var al=false;for(var ak=aj.parentNode;ak;ak=ak.parentNode){if((ak.tagName==="pre"||ak.tagName==="code"||ak.tagName==="xmp")&&ak.className&&ak.className.indexOf("prettyprint")>=0){al=true;break}}if(!al){var af=aj.className.match(/\blinenums\b(?::(\d+))?/);af=af?af[1]&&af[1].length?+af[1]:true:false;if(af){Q(aj,af)}S={langExtension:ah,sourceNode:aj,numberLines:af};d(S)}}}if(X<T.length){setTimeout(U,250)}else{if(ad){ad()}}}U()}window.prettyPrintOne=y;window.prettyPrint=b;window.PR={createSimpleLexer:g,registerLangHandler:c,sourceDecorator:i,PR_ATTRIB_NAME:P,PR_ATTRIB_VALUE:n,PR_COMMENT:j,PR_DECLARATION:E,PR_KEYWORD:z,PR_LITERAL:G,PR_NOCODE:N,PR_PLAIN:F,PR_PUNCTUATION:L,PR_SOURCE:J,PR_STRING:C,PR_TAG:m,PR_TYPE:O}})();PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_DECLARATION,/^<!\w[^>]*(?:>|$)/],[PR.PR_COMMENT,/^<\!--[\s\S]*?(?:-\->|$)/],[PR.PR_PUNCTUATION,/^(?:<[%?]|[%?]>)/],["lang-",/^<\?([\s\S]+?)(?:\?>|$)/],["lang-",/^<%([\s\S]+?)(?:%>|$)/],["lang-",/^<xmp\b[^>]*>([\s\S]+?)<\/xmp\b[^>]*>/i],["lang-handlebars",/^<script\b[^>]*type\s*=\s*['"]?text\/x-handlebars-template['"]?\b[^>]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-js",/^<script\b[^>]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-css",/^<style\b[^>]*>([\s\S]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i],[PR.PR_DECLARATION,/^{{[#^>/]?\s*[\w.][^}]*}}/],[PR.PR_DECLARATION,/^{{&?\s*[\w.][^}]*}}/],[PR.PR_DECLARATION,/^{{{>?\s*[\w.][^}]*}}}/],[PR.PR_COMMENT,/^{{![^}]*}}/]]),["handlebars","hbs"]);PR.registerLangHandler(PR.createSimpleLexer([[PR.PR_PLAIN,/^[ \t\r\n\f]+/,null," \t\r\n\f"]],[[PR.PR_STRING,/^\"(?:[^\n\r\f\\\"]|\\(?:\r\n?|\n|\f)|\\[\s\S])*\"/,null],[PR.PR_STRING,/^\'(?:[^\n\r\f\\\']|\\(?:\r\n?|\n|\f)|\\[\s\S])*\'/,null],["lang-css-str",/^url\(([^\)\"\']*)\)/i],[PR.PR_KEYWORD,/^(?:url|rgb|\!important|@import|@page|@media|@charset|inherit)(?=[^\-\w]|$)/i,null],["lang-css-kw",/^(-?(?:[_a-z]|(?:\\[0-9a-f]+ ?))(?:[_a-z0-9\-]|\\(?:\\[0-9a-f]+ ?))*)\s*:/i],[PR.PR_COMMENT,/^\/\*[^*]*\*+(?:[^\/*][^*]*\*+)*\//],[PR.PR_COMMENT,/^(?:<!--|-->)/],[PR.PR_LITERAL,/^(?:\d+|\d*\.\d+)(?:%|[a-z]+)?/i],[PR.PR_LITERAL,/^#(?:[0-9a-f]{3}){1,2}/i],[PR.PR_PLAIN,/^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i],[PR.PR_PUNCTUATION,/^[^\s\w\'\"]+/]]),["css"]);PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_KEYWORD,/^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i]]),["css-kw"]);PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_STRING,/^[^\)\"\']+/]]),["css-str"]);
|
|
Binary file
|
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
/* eslint-disable */
|
|
2
|
+
var addSorting = (function() {
|
|
3
|
+
'use strict';
|
|
4
|
+
var cols,
|
|
5
|
+
currentSort = {
|
|
6
|
+
index: 0,
|
|
7
|
+
desc: false
|
|
8
|
+
};
|
|
9
|
+
|
|
10
|
+
// returns the summary table element
|
|
11
|
+
function getTable() {
|
|
12
|
+
return document.querySelector('.coverage-summary');
|
|
13
|
+
}
|
|
14
|
+
// returns the thead element of the summary table
|
|
15
|
+
function getTableHeader() {
|
|
16
|
+
return getTable().querySelector('thead tr');
|
|
17
|
+
}
|
|
18
|
+
// returns the tbody element of the summary table
|
|
19
|
+
function getTableBody() {
|
|
20
|
+
return getTable().querySelector('tbody');
|
|
21
|
+
}
|
|
22
|
+
// returns the th element for nth column
|
|
23
|
+
function getNthColumn(n) {
|
|
24
|
+
return getTableHeader().querySelectorAll('th')[n];
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
function onFilterInput() {
|
|
28
|
+
const searchValue = document.getElementById('fileSearch').value;
|
|
29
|
+
const rows = document.getElementsByTagName('tbody')[0].children;
|
|
30
|
+
for (let i = 0; i < rows.length; i++) {
|
|
31
|
+
const row = rows[i];
|
|
32
|
+
if (
|
|
33
|
+
row.textContent
|
|
34
|
+
.toLowerCase()
|
|
35
|
+
.includes(searchValue.toLowerCase())
|
|
36
|
+
) {
|
|
37
|
+
row.style.display = '';
|
|
38
|
+
} else {
|
|
39
|
+
row.style.display = 'none';
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
// loads the search box
|
|
45
|
+
function addSearchBox() {
|
|
46
|
+
var template = document.getElementById('filterTemplate');
|
|
47
|
+
var templateClone = template.content.cloneNode(true);
|
|
48
|
+
templateClone.getElementById('fileSearch').oninput = onFilterInput;
|
|
49
|
+
template.parentElement.appendChild(templateClone);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
// loads all columns
|
|
53
|
+
function loadColumns() {
|
|
54
|
+
var colNodes = getTableHeader().querySelectorAll('th'),
|
|
55
|
+
colNode,
|
|
56
|
+
cols = [],
|
|
57
|
+
col,
|
|
58
|
+
i;
|
|
59
|
+
|
|
60
|
+
for (i = 0; i < colNodes.length; i += 1) {
|
|
61
|
+
colNode = colNodes[i];
|
|
62
|
+
col = {
|
|
63
|
+
key: colNode.getAttribute('data-col'),
|
|
64
|
+
sortable: !colNode.getAttribute('data-nosort'),
|
|
65
|
+
type: colNode.getAttribute('data-type') || 'string'
|
|
66
|
+
};
|
|
67
|
+
cols.push(col);
|
|
68
|
+
if (col.sortable) {
|
|
69
|
+
col.defaultDescSort = col.type === 'number';
|
|
70
|
+
colNode.innerHTML =
|
|
71
|
+
colNode.innerHTML + '<span class="sorter"></span>';
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
return cols;
|
|
75
|
+
}
|
|
76
|
+
// attaches a data attribute to every tr element with an object
|
|
77
|
+
// of data values keyed by column name
|
|
78
|
+
function loadRowData(tableRow) {
|
|
79
|
+
var tableCols = tableRow.querySelectorAll('td'),
|
|
80
|
+
colNode,
|
|
81
|
+
col,
|
|
82
|
+
data = {},
|
|
83
|
+
i,
|
|
84
|
+
val;
|
|
85
|
+
for (i = 0; i < tableCols.length; i += 1) {
|
|
86
|
+
colNode = tableCols[i];
|
|
87
|
+
col = cols[i];
|
|
88
|
+
val = colNode.getAttribute('data-value');
|
|
89
|
+
if (col.type === 'number') {
|
|
90
|
+
val = Number(val);
|
|
91
|
+
}
|
|
92
|
+
data[col.key] = val;
|
|
93
|
+
}
|
|
94
|
+
return data;
|
|
95
|
+
}
|
|
96
|
+
// loads all row data
|
|
97
|
+
function loadData() {
|
|
98
|
+
var rows = getTableBody().querySelectorAll('tr'),
|
|
99
|
+
i;
|
|
100
|
+
|
|
101
|
+
for (i = 0; i < rows.length; i += 1) {
|
|
102
|
+
rows[i].data = loadRowData(rows[i]);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
// sorts the table using the data for the ith column
|
|
106
|
+
function sortByIndex(index, desc) {
|
|
107
|
+
var key = cols[index].key,
|
|
108
|
+
sorter = function(a, b) {
|
|
109
|
+
a = a.data[key];
|
|
110
|
+
b = b.data[key];
|
|
111
|
+
return a < b ? -1 : a > b ? 1 : 0;
|
|
112
|
+
},
|
|
113
|
+
finalSorter = sorter,
|
|
114
|
+
tableBody = document.querySelector('.coverage-summary tbody'),
|
|
115
|
+
rowNodes = tableBody.querySelectorAll('tr'),
|
|
116
|
+
rows = [],
|
|
117
|
+
i;
|
|
118
|
+
|
|
119
|
+
if (desc) {
|
|
120
|
+
finalSorter = function(a, b) {
|
|
121
|
+
return -1 * sorter(a, b);
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
for (i = 0; i < rowNodes.length; i += 1) {
|
|
126
|
+
rows.push(rowNodes[i]);
|
|
127
|
+
tableBody.removeChild(rowNodes[i]);
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
rows.sort(finalSorter);
|
|
131
|
+
|
|
132
|
+
for (i = 0; i < rows.length; i += 1) {
|
|
133
|
+
tableBody.appendChild(rows[i]);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
// removes sort indicators for current column being sorted
|
|
137
|
+
function removeSortIndicators() {
|
|
138
|
+
var col = getNthColumn(currentSort.index),
|
|
139
|
+
cls = col.className;
|
|
140
|
+
|
|
141
|
+
cls = cls.replace(/ sorted$/, '').replace(/ sorted-desc$/, '');
|
|
142
|
+
col.className = cls;
|
|
143
|
+
}
|
|
144
|
+
// adds sort indicators for current column being sorted
|
|
145
|
+
function addSortIndicators() {
|
|
146
|
+
getNthColumn(currentSort.index).className += currentSort.desc
|
|
147
|
+
? ' sorted-desc'
|
|
148
|
+
: ' sorted';
|
|
149
|
+
}
|
|
150
|
+
// adds event listeners for all sorter widgets
|
|
151
|
+
function enableUI() {
|
|
152
|
+
var i,
|
|
153
|
+
el,
|
|
154
|
+
ithSorter = function ithSorter(i) {
|
|
155
|
+
var col = cols[i];
|
|
156
|
+
|
|
157
|
+
return function() {
|
|
158
|
+
var desc = col.defaultDescSort;
|
|
159
|
+
|
|
160
|
+
if (currentSort.index === i) {
|
|
161
|
+
desc = !currentSort.desc;
|
|
162
|
+
}
|
|
163
|
+
sortByIndex(i, desc);
|
|
164
|
+
removeSortIndicators();
|
|
165
|
+
currentSort.index = i;
|
|
166
|
+
currentSort.desc = desc;
|
|
167
|
+
addSortIndicators();
|
|
168
|
+
};
|
|
169
|
+
};
|
|
170
|
+
for (i = 0; i < cols.length; i += 1) {
|
|
171
|
+
if (cols[i].sortable) {
|
|
172
|
+
// add the click event handler on the th so users
|
|
173
|
+
// dont have to click on those tiny arrows
|
|
174
|
+
el = getNthColumn(i).querySelector('.sorter').parentElement;
|
|
175
|
+
if (el.addEventListener) {
|
|
176
|
+
el.addEventListener('click', ithSorter(i));
|
|
177
|
+
} else {
|
|
178
|
+
el.attachEvent('onclick', ithSorter(i));
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
// adds sorting functionality to the UI
|
|
184
|
+
return function() {
|
|
185
|
+
if (!getTable()) {
|
|
186
|
+
return;
|
|
187
|
+
}
|
|
188
|
+
cols = loadColumns();
|
|
189
|
+
loadData();
|
|
190
|
+
addSearchBox();
|
|
191
|
+
addSortIndicators();
|
|
192
|
+
enableUI();
|
|
193
|
+
};
|
|
194
|
+
})();
|
|
195
|
+
|
|
196
|
+
window.addEventListener('load', addSorting);
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { type PlainObject } from "./isJsonObject.js";
|
|
2
|
+
/**
|
|
3
|
+
* Extracts specfied properties and their values from
|
|
4
|
+
* an object.
|
|
5
|
+
*
|
|
6
|
+
* A bit like destructuring, except that you can also use
|
|
7
|
+
* regular expressions to match the properties you want to
|
|
8
|
+
* extract.
|
|
9
|
+
*
|
|
10
|
+
* @param object The plain object from which to extract
|
|
11
|
+
* properties.
|
|
12
|
+
* @param propsToExtract An array of names, and/or
|
|
13
|
+
* regular expressions that match the
|
|
14
|
+
* names of the properties to exract.
|
|
15
|
+
* @returns The object containing the extracted properties
|
|
16
|
+
* and their values, and an array of all property
|
|
17
|
+
* names of the input object that were not extracted.
|
|
18
|
+
*/
|
|
19
|
+
export declare function extractProperties(object: PlainObject, propsToExtract: (string | RegExp)[]): {
|
|
20
|
+
/**
|
|
21
|
+
* Object containg the extract properties
|
|
22
|
+
* and their respective values.
|
|
23
|
+
*/
|
|
24
|
+
extracted: PlainObject;
|
|
25
|
+
/**
|
|
26
|
+
* Array of property names of the input
|
|
27
|
+
* object that were not extracted.
|
|
28
|
+
*/
|
|
29
|
+
remainingProps: string[];
|
|
30
|
+
};
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Extracts specfied properties and their values from
|
|
3
|
+
* an object.
|
|
4
|
+
*
|
|
5
|
+
* A bit like destructuring, except that you can also use
|
|
6
|
+
* regular expressions to match the properties you want to
|
|
7
|
+
* extract.
|
|
8
|
+
*
|
|
9
|
+
* @param object The plain object from which to extract
|
|
10
|
+
* properties.
|
|
11
|
+
* @param propsToExtract An array of names, and/or
|
|
12
|
+
* regular expressions that match the
|
|
13
|
+
* names of the properties to exract.
|
|
14
|
+
* @returns The object containing the extracted properties
|
|
15
|
+
* and their values, and an array of all property
|
|
16
|
+
* names of the input object that were not extracted.
|
|
17
|
+
*/
|
|
18
|
+
export function extractProperties(object, propsToExtract) {
|
|
19
|
+
const propNamesToExtract = propsToExtract.filter((prop) => typeof prop === "string");
|
|
20
|
+
const propRegexesToExtract = propsToExtract.filter((prop) => prop instanceof RegExp);
|
|
21
|
+
const extracted = {};
|
|
22
|
+
const remainingProps = [];
|
|
23
|
+
Object.getOwnPropertyNames(object).forEach((prop) => {
|
|
24
|
+
if (propNamesToExtract.some((propNameToExtract) => propNameToExtract === prop) ||
|
|
25
|
+
propRegexesToExtract.some((propRegexToExtract) => propRegexToExtract.test(prop))) {
|
|
26
|
+
extracted[prop] = object[prop];
|
|
27
|
+
}
|
|
28
|
+
else {
|
|
29
|
+
remainingProps.push(prop);
|
|
30
|
+
}
|
|
31
|
+
});
|
|
32
|
+
return {
|
|
33
|
+
extracted,
|
|
34
|
+
remainingProps,
|
|
35
|
+
};
|
|
36
|
+
}
|
package/dist/index.d.ts
ADDED
package/dist/index.js
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A plain object.
|
|
3
|
+
*
|
|
4
|
+
* I.e. `{ ... }`, and not an array or `null`, which
|
|
5
|
+
* JavaScript's `typeof` operator would also return
|
|
6
|
+
* `"object"` for.
|
|
7
|
+
*/
|
|
8
|
+
export type PlainObject = Record<string, unknown>;
|
|
9
|
+
/**
|
|
10
|
+
* Checks whether a value is a plain object.
|
|
11
|
+
*
|
|
12
|
+
* @param value The value to check.
|
|
13
|
+
*
|
|
14
|
+
* @returns `true` if it is a plain object, `false` otherwise.
|
|
15
|
+
*/
|
|
16
|
+
export declare function isPlainObject(value: unknown): value is PlainObject;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Checks whether a value is a plain object.
|
|
3
|
+
*
|
|
4
|
+
* @param value The value to check.
|
|
5
|
+
*
|
|
6
|
+
* @returns `true` if it is a plain object, `false` otherwise.
|
|
7
|
+
*/
|
|
8
|
+
export function isPlainObject(value) {
|
|
9
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
10
|
+
}
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
import { type PlainObject } from "./isJsonObject.js";
|
|
2
|
+
/**
|
|
3
|
+
* A function that checks whether an object is a design token
|
|
4
|
+
* or not (if not, it is assumed to be a group).
|
|
5
|
+
*
|
|
6
|
+
* E.g. for DTCG data, this could check for the presence of a
|
|
7
|
+
* `$value` property.
|
|
8
|
+
*
|
|
9
|
+
* @param data A plain object (guaranteed not to `null` or an
|
|
10
|
+
* array)
|
|
11
|
+
*
|
|
12
|
+
* @returns `true` if `data` is design token data, `false` if
|
|
13
|
+
* it is group data.
|
|
14
|
+
*/
|
|
15
|
+
export type IsDesignTokenDataFn = (data: PlainObject) => boolean;
|
|
16
|
+
/**
|
|
17
|
+
* A function that parses design token data.
|
|
18
|
+
*
|
|
19
|
+
* @param data A plain object containing design token data
|
|
20
|
+
* (guaranteed not to be `null` or an array)
|
|
21
|
+
* @param path The path to the design token data.
|
|
22
|
+
* @param contextFromParent Context data (if any) that was
|
|
23
|
+
* returned by the `parseGroupData()` call that
|
|
24
|
+
* parsed the group containing this design token.
|
|
25
|
+
*
|
|
26
|
+
* @returns The parsed representation of the design token.
|
|
27
|
+
* May be `undefined` if there is no useful result
|
|
28
|
+
* to return from `parseData()` - e.g. if just
|
|
29
|
+
* logging design token info or something like that.
|
|
30
|
+
*/
|
|
31
|
+
export type ParseDesignTokenDataFn<ParsedDesignToken, T> = (data: PlainObject, path: string[], contextFromParent?: T) => ParsedDesignToken;
|
|
32
|
+
/**
|
|
33
|
+
* A function that adds a parsed group or design token
|
|
34
|
+
* as a child of a parsed group.
|
|
35
|
+
*
|
|
36
|
+
* @param name The name of the child group or design token
|
|
37
|
+
* @param child The group or desing token to add
|
|
38
|
+
*/
|
|
39
|
+
export type AddChildFn<ParsedGroup, ParsedDesignToken> = (name: string, child: ParsedGroup | ParsedDesignToken) => void;
|
|
40
|
+
/**
|
|
41
|
+
* The return value of a `ParseGroupDataFn`.
|
|
42
|
+
*/
|
|
43
|
+
export interface ParseGroupResult<ParsedGroup, ParsedDesignToken, T> {
|
|
44
|
+
/**
|
|
45
|
+
* The parsed representation of the group.
|
|
46
|
+
*
|
|
47
|
+
* May be `undefined` if there is no useful result
|
|
48
|
+
* to return from `parseData()` - e.g. if just
|
|
49
|
+
* logging group info or something like that.
|
|
50
|
+
*/
|
|
51
|
+
group: ParsedGroup;
|
|
52
|
+
/**
|
|
53
|
+
* Optional function that will add other parsed groups
|
|
54
|
+
* or design tokens as children of this parsed group.
|
|
55
|
+
*
|
|
56
|
+
* Intended for cases where the parsed representation
|
|
57
|
+
* of a group needs to contain its children. If not
|
|
58
|
+
* needed, this property can be omitted.
|
|
59
|
+
*/
|
|
60
|
+
addChild?: AddChildFn<ParsedGroup, ParsedDesignToken>;
|
|
61
|
+
/**
|
|
62
|
+
* Optional context data to be passed into the
|
|
63
|
+
* `parseGroupData()` and `parseDesignTokenData()` calls
|
|
64
|
+
* for any nested group or design token data.
|
|
65
|
+
*
|
|
66
|
+
* Useful if those functions need access to some data from
|
|
67
|
+
* higher up in the original data structure. For example, if
|
|
68
|
+
* parsing DTCG data, this could be used to pass inherited
|
|
69
|
+
* properties like `$type` down.
|
|
70
|
+
*/
|
|
71
|
+
contextForChildren?: T;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* A function that parses group data.
|
|
75
|
+
*
|
|
76
|
+
* @param data A plain object containing group data
|
|
77
|
+
* (guaranteed not to be `null` or an array)
|
|
78
|
+
* @param path The path to the group data.
|
|
79
|
+
* @param contextFromParent Context data (if any) that was
|
|
80
|
+
* returned by the `parseGroupData()` call that
|
|
81
|
+
* parsed the group containing this group.
|
|
82
|
+
*
|
|
83
|
+
* @returns The parsed representation of the group and,
|
|
84
|
+
* optionally, a function to add child groups or
|
|
85
|
+
* design tokens to it and some context data to
|
|
86
|
+
* pass down when child data is parsed.
|
|
87
|
+
*/
|
|
88
|
+
export type ParseGroupDataFn<ParsedGroup, ParsedDesignToken, T> = (data: PlainObject, path: string[], contextFromParent?: T) => ParseGroupResult<ParsedGroup, ParsedDesignToken, T>;
|
|
89
|
+
export interface ParserConfig<ParsedDesignToken, ParsedGroup, T> {
|
|
90
|
+
/**
|
|
91
|
+
* A function that determines whether an object in the input
|
|
92
|
+
* data is a design token or a group.
|
|
93
|
+
*/
|
|
94
|
+
isDesignTokenData: IsDesignTokenDataFn;
|
|
95
|
+
/**
|
|
96
|
+
* Array of strings and/or RegExp which match
|
|
97
|
+
* properties of group objects that are NOT
|
|
98
|
+
* names of child design tokens or groups.
|
|
99
|
+
*
|
|
100
|
+
* E.g. for DTCG data, this could be a RegEx
|
|
101
|
+
* like /^$/ which would match all $-prefixed
|
|
102
|
+
* format properties
|
|
103
|
+
*/
|
|
104
|
+
groupPropsToExtract: (string | RegExp)[];
|
|
105
|
+
/**
|
|
106
|
+
* Function which is called for each group data object
|
|
107
|
+
* that is encountered.
|
|
108
|
+
*
|
|
109
|
+
* Is given the extracted properties of that group and its
|
|
110
|
+
* path, and should parse that data into whatever structure
|
|
111
|
+
* is desired.
|
|
112
|
+
*/
|
|
113
|
+
parseGroupData: ParseGroupDataFn<ParsedGroup, ParsedDesignToken, T>;
|
|
114
|
+
/**
|
|
115
|
+
* Function which is called for each design token
|
|
116
|
+
*data object that is encountered.
|
|
117
|
+
*
|
|
118
|
+
* Is given the design token data and its path, and
|
|
119
|
+
* should parse that data into whatever structure is
|
|
120
|
+
* desired.
|
|
121
|
+
*/
|
|
122
|
+
parseDesignTokenData: ParseDesignTokenDataFn<ParsedDesignToken, T>;
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Thrown when `parseData()` encounters group or design token
|
|
126
|
+
* data that is not a plain object.
|
|
127
|
+
*/
|
|
128
|
+
export declare class InvalidDataError extends Error {
|
|
129
|
+
/**
|
|
130
|
+
* Path to the value that is not a plain object
|
|
131
|
+
*/
|
|
132
|
+
path: string[];
|
|
133
|
+
/**
|
|
134
|
+
* The offending value.
|
|
135
|
+
*/
|
|
136
|
+
data: unknown;
|
|
137
|
+
constructor(path: string[], data: unknown);
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Parses a nested object structure representing groups
|
|
141
|
+
* and design tokens, such as the data obtained by reading
|
|
142
|
+
* and JSON-parsing a DTCG file.
|
|
143
|
+
*
|
|
144
|
+
* It will recursively traverse the input data (depth first)
|
|
145
|
+
* and, using the functions provided in the config:
|
|
146
|
+
*
|
|
147
|
+
* 1. Check if the object is design token or group data
|
|
148
|
+
* 2. Pass that data to the parsed or processed by the
|
|
149
|
+
* relevant function
|
|
150
|
+
* 3. Return the outermost parsed group or design token
|
|
151
|
+
*
|
|
152
|
+
* @param data The input data to traverse and parse
|
|
153
|
+
* @param config Configuration for this parser
|
|
154
|
+
* @param contextFromParent Optional context data to
|
|
155
|
+
* pass into the top-most design token
|
|
156
|
+
* or group parser function call.
|
|
157
|
+
* @returns The outermost parsed group or design token
|
|
158
|
+
*/
|
|
159
|
+
export declare function parseData<ParsedDesignToken, ParsedGroup, T>(data: unknown, config: ParserConfig<ParsedDesignToken, ParsedGroup, T>, contextFromParent?: T): ParsedDesignToken | ParsedGroup;
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { isPlainObject } from "./isJsonObject.js";
|
|
2
|
+
import { extractProperties } from "./extractProperties.js";
|
|
3
|
+
/**
|
|
4
|
+
* Thrown when `parseData()` encounters group or design token
|
|
5
|
+
* data that is not a plain object.
|
|
6
|
+
*/
|
|
7
|
+
export class InvalidDataError extends Error {
|
|
8
|
+
/**
|
|
9
|
+
* Path to the value that is not a plain object
|
|
10
|
+
*/
|
|
11
|
+
path;
|
|
12
|
+
/**
|
|
13
|
+
* The offending value.
|
|
14
|
+
*/
|
|
15
|
+
data;
|
|
16
|
+
constructor(path, data) {
|
|
17
|
+
super(`Expected object at path "${path.join(".")}", but got ${typeof data} instead`);
|
|
18
|
+
this.name = "InvalidDataError";
|
|
19
|
+
this.path = path;
|
|
20
|
+
this.data = data;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* The internal data parsing implementation.
|
|
25
|
+
*
|
|
26
|
+
* Recursively calls itself for nested group and
|
|
27
|
+
* design token data.
|
|
28
|
+
*
|
|
29
|
+
* @param data The input data to traverse and parse
|
|
30
|
+
* @param config Parser config
|
|
31
|
+
* @param contextFromParent Context data passed in from
|
|
32
|
+
* parent calls to this function.
|
|
33
|
+
* @param path The path to the input data
|
|
34
|
+
* @param addToParent A function to add the parsed data
|
|
35
|
+
* to the parent group.
|
|
36
|
+
* @returns The parsed design token or group.
|
|
37
|
+
*/
|
|
38
|
+
function parseDataImpl(data, config, contextFromParent, path = [], addToParent) {
|
|
39
|
+
if (!isPlainObject(data)) {
|
|
40
|
+
throw new InvalidDataError(path, data);
|
|
41
|
+
}
|
|
42
|
+
const { isDesignTokenData, groupPropsToExtract, parseGroupData, parseDesignTokenData, } = config;
|
|
43
|
+
let groupOrToken;
|
|
44
|
+
if (isDesignTokenData(data)) {
|
|
45
|
+
// looks like a token
|
|
46
|
+
groupOrToken = parseDesignTokenData(data, path, contextFromParent);
|
|
47
|
+
if (addToParent && path.length > 0) {
|
|
48
|
+
addToParent(path[path.length - 1], groupOrToken);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
// must be a group
|
|
53
|
+
const { extracted: groupData, remainingProps: childNames } = extractProperties(data, groupPropsToExtract);
|
|
54
|
+
const { group, addChild, contextForChildren } = parseGroupData(groupData, path, contextFromParent);
|
|
55
|
+
groupOrToken = group;
|
|
56
|
+
if (addToParent && path.length > 0) {
|
|
57
|
+
addToParent(path[path.length - 1], groupOrToken);
|
|
58
|
+
}
|
|
59
|
+
for (const childName of childNames) {
|
|
60
|
+
parseDataImpl(data[childName], config, contextForChildren, [...path, childName], addChild);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
return groupOrToken;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Parses a nested object structure representing groups
|
|
67
|
+
* and design tokens, such as the data obtained by reading
|
|
68
|
+
* and JSON-parsing a DTCG file.
|
|
69
|
+
*
|
|
70
|
+
* It will recursively traverse the input data (depth first)
|
|
71
|
+
* and, using the functions provided in the config:
|
|
72
|
+
*
|
|
73
|
+
* 1. Check if the object is design token or group data
|
|
74
|
+
* 2. Pass that data to the parsed or processed by the
|
|
75
|
+
* relevant function
|
|
76
|
+
* 3. Return the outermost parsed group or design token
|
|
77
|
+
*
|
|
78
|
+
* @param data The input data to traverse and parse
|
|
79
|
+
* @param config Configuration for this parser
|
|
80
|
+
* @param contextFromParent Optional context data to
|
|
81
|
+
* pass into the top-most design token
|
|
82
|
+
* or group parser function call.
|
|
83
|
+
* @returns The outermost parsed group or design token
|
|
84
|
+
*/
|
|
85
|
+
export function parseData(data, config, contextFromParent) {
|
|
86
|
+
return parseDataImpl(data, config, contextFromParent);
|
|
87
|
+
}
|
package/package.json
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@udt/parser-utils",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Low-level logic and utilities for parsing DTCG and DTCG-like files",
|
|
5
|
+
"main": "dist/index.js",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"types": "dist/index.d.ts",
|
|
8
|
+
"scripts": {
|
|
9
|
+
"clean": "del-cli dist/*",
|
|
10
|
+
"build": "tsc -p tsconfig.build.json",
|
|
11
|
+
"watch": "tsc -p tsconfig.build.json --watch",
|
|
12
|
+
"test": "vitest run --coverage"
|
|
13
|
+
},
|
|
14
|
+
"repository": {
|
|
15
|
+
"type": "git",
|
|
16
|
+
"url": "git+https://github.com/universal-design-tokens/udt.git"
|
|
17
|
+
},
|
|
18
|
+
"keywords": [
|
|
19
|
+
"design tokens",
|
|
20
|
+
"parser",
|
|
21
|
+
"dtcg"
|
|
22
|
+
],
|
|
23
|
+
"author": "James Nash (https://cirrus.twiddles.com/)",
|
|
24
|
+
"license": "ISC",
|
|
25
|
+
"bugs": {
|
|
26
|
+
"url": "https://github.com/universal-design-tokens/udt/issues"
|
|
27
|
+
},
|
|
28
|
+
"homepage": "https://github.com/universal-design-tokens/udt/tree/master/packages/parser-utils#readme"
|
|
29
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { describe, it, expect } from "vitest";
|
|
2
|
+
import { extractProperties } from "./extractProperties.js";
|
|
3
|
+
|
|
4
|
+
describe("extractProperties()", () => {
|
|
5
|
+
it("extracts the specified properties and their values", () => {
|
|
6
|
+
const extractResult = extractProperties(
|
|
7
|
+
{ foo: 42, bar: 13, baz: 666, quux: 0 },
|
|
8
|
+
["foo", "baz"]
|
|
9
|
+
);
|
|
10
|
+
expect(extractResult.extracted).toStrictEqual({ foo: 42, baz: 666 });
|
|
11
|
+
});
|
|
12
|
+
|
|
13
|
+
it("extracts the properties matching a RegEx and their values", () => {
|
|
14
|
+
const extractResult = extractProperties(
|
|
15
|
+
{ foo: 42, bar: 13, baz: 666, quux: 0 },
|
|
16
|
+
[/^ba/]
|
|
17
|
+
);
|
|
18
|
+
expect(extractResult.extracted).toStrictEqual({ bar: 13, baz: 666 });
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
it("returns keys of non-extracted properties", () => {
|
|
22
|
+
const extractResult = extractProperties(
|
|
23
|
+
{ foo: 42, bar: 13, baz: 666, quux: 0 },
|
|
24
|
+
["foo", "baz"]
|
|
25
|
+
);
|
|
26
|
+
expect(extractResult.remainingProps).toStrictEqual(["bar", "quux"]);
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
it("ignores props to extract that are not present in input object", () => {
|
|
30
|
+
const extractResult = extractProperties({ foo: 42 }, ["baz"]);
|
|
31
|
+
expect(extractResult.extracted).toStrictEqual({});
|
|
32
|
+
});
|
|
33
|
+
});
|