json-summary
Advanced tools
Comparing version 0.1.5 to 0.2.0
@@ -1,2 +0,2 @@ | ||
// https://andrewtburks.dev/json-summary v0.1.5 Copyright 2019 Andrew Burks | ||
// https://andrewtburks.dev/json-summary v0.2.0 Copyright 2019 Andrew Burks | ||
(function (global, factory) { | ||
@@ -9,3 +9,13 @@ typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : | ||
const summarizer = (function() { | ||
let defaultOptions = { | ||
arraySampleCount: 10, | ||
indentation: " ", // or "\t" | ||
indentCount: 2, | ||
showExampleValue: true, | ||
startExpanded: false | ||
}; | ||
// summarizer utility class | ||
return function({ | ||
arraySampleCount = 10, | ||
indentation = " ", // or "\t" | ||
@@ -15,10 +25,6 @@ indentCount = 2, | ||
startExpanded = false | ||
} = { | ||
indentation: " ", // or "\t" | ||
indentCount: 2, | ||
showExampleValue: true, | ||
startExpanded: false | ||
}) { | ||
} = defaultOptions) { | ||
let options = { | ||
arraySampleCount, | ||
indentation, | ||
@@ -43,12 +49,43 @@ indentCount, | ||
Array: arr => { | ||
let summarized = {}; | ||
let summarized = { | ||
count: 1, | ||
type: "Array", | ||
length: arr.length | ||
}; | ||
summarized.type = "Array"; | ||
summarized.length = arr.length; | ||
// recurse to items in the array | ||
if (arr.length) { | ||
summarized.items = { | ||
0: summarizeItem(arr[0]) | ||
}; | ||
if (arraySampleCount > 0) { | ||
let numToSample = Math.min(arraySampleCount, arr.length); | ||
let sampledItems = {}; | ||
// summarized.count = numToSample; | ||
while (numToSample > 0) { | ||
let sampleIndex = Math.floor(Math.random() * arr.length); | ||
if (!sampledItems.hasOwnProperty(sampleIndex)) { | ||
sampledItems[sampleIndex] = arr[sampleIndex]; | ||
numToSample--; | ||
} | ||
} | ||
let summarizedSamples = []; | ||
for (let [idx, item] of Object.entries(sampledItems)) { | ||
summarizedSamples.push(summarizeItem(item)); | ||
} | ||
let joinedSample = joinSampledArray(summarizedSamples); | ||
summarized.items = { | ||
0: joinedSample | ||
}; | ||
} else { | ||
// sumamrized.count = 1; | ||
summarized.items = { | ||
0: summarizeItem(arr[0]) | ||
}; | ||
} | ||
} | ||
@@ -59,9 +96,9 @@ | ||
Object: obj => { | ||
let summarized = {}; | ||
summarized.type = "Object"; | ||
summarized.keys = Object.keys(obj); | ||
summarized.items = {}; | ||
let summarized = { | ||
count: 1, | ||
type: "Object", | ||
keys: Object.keys(obj), | ||
items: {} | ||
}; | ||
for (let key of summarized.keys) { | ||
@@ -74,5 +111,15 @@ summarized.items[key] = summarizeItem(obj[key]); | ||
Other: data => { | ||
let range; | ||
if (typeof data === "string") { | ||
range = [data.length, data.length]; | ||
} else if (typeof data === "number") { | ||
range = [data, data]; | ||
} | ||
return { | ||
type: typeof data, | ||
example: data | ||
example: data, | ||
count: 1, | ||
range | ||
}; | ||
@@ -110,2 +157,118 @@ } | ||
function joinSampledArray(itemset) { | ||
// let type = itemset.map(d => d.type) | ||
// .reduce((a, type) => { | ||
// a[type] = []; | ||
// return a; | ||
// }, {}); | ||
// for (let item of itemset) { | ||
// type[item.type].push(item); | ||
// } | ||
// let joins = {}; | ||
// for (let [t, itemset] of Object.entries(type)) { | ||
// joins[t] = joinItems(itemset, t); | ||
// } | ||
// console.log(joins); | ||
// return | ||
// assume theyre all a matching type | ||
let type = itemset[0].type; | ||
return joinItems(itemset, type); | ||
} | ||
function joinItems(itemArr, type) { | ||
// functions to join items by type | ||
let joiner = { | ||
string: function(items) { | ||
// string length range | ||
let min = items.reduce((acc, item) => { | ||
return Math.min(acc, item.range[0]); | ||
}, Infinity); | ||
let max = items.reduce((acc, item) => { | ||
return Math.max(acc, item.range[1]); | ||
}, -Infinity); | ||
let joinedString = { | ||
type: "string", | ||
example: items[0].example, | ||
range: [min, max], | ||
count: items.reduce((a, i) => a + i.count, 0) | ||
}; | ||
return joinedString; | ||
}, | ||
number: function(items) { | ||
let min = items.reduce((acc, item) => { | ||
return Math.min(acc, item.range[0]); | ||
}, Infinity); | ||
let max = items.reduce((acc, item) => { | ||
return Math.max(acc, item.range[1]); | ||
}, -Infinity); | ||
let joinedNumber = { | ||
type: "number", | ||
example: items[0].example, | ||
range: [min, max], | ||
count: items.reduce((a, i) => a + i.count, 0) | ||
}; | ||
return joinedNumber; | ||
}, | ||
boolean: function(items) { | ||
return { | ||
type: "boolean", | ||
example: items[0].example, | ||
count: items.reduce((a, i) => a + i.count, 0) | ||
}; | ||
}, | ||
Object: function(items) { | ||
let masterKeys = {}; | ||
for (let obj of items) { | ||
if (!obj.circular) { | ||
for (let key of obj.keys) { | ||
!masterKeys[key] && (masterKeys[key] = []); | ||
masterKeys[key].push(obj.items[key]); | ||
} | ||
} | ||
} | ||
let joinedObject = { type: "Object", keys: [], items: {}, count: items.length }; | ||
for (let key of Object.keys(masterKeys)) { | ||
joinedObject.keys.push(key); | ||
joinedObject.items[key] = joinSampledArray(masterKeys[key]); | ||
} | ||
return joinedObject; | ||
}, | ||
Array: function(items) { | ||
let joinedValues = joinSampledArray(items.map(i => i.items[0])); | ||
let joinedArray = { | ||
count: items.length, | ||
items: { | ||
0: joinedValues | ||
}, | ||
length: joinedValues.count / items.length, | ||
type: "Array" | ||
}; | ||
return joinedArray; | ||
} | ||
}; | ||
return joiner[type](itemArr); | ||
} | ||
function unmarkObject(obj) { | ||
@@ -125,10 +288,10 @@ if (obj && obj["*snippets_mark*"]) { | ||
} | ||
// utility function to stringify the summary output from summarizeJSON | ||
function printSummarizedJSON(summary) { | ||
// start at 0 indentation | ||
return printSummaryLevel(summary, 0); | ||
return printSummaryLevel(summary, 0, 1); | ||
} | ||
function printSummaryLevel(data, l) { | ||
function printSummaryLevel(data, l, prevCount) { | ||
let string = ""; | ||
@@ -146,3 +309,3 @@ | ||
let childStrings = data.keys.map(key => { | ||
return printSummaryLevel(data.items[key], l + 1); | ||
return printSummaryLevel(data.items[key], l + 1, data.count); | ||
}); | ||
@@ -159,2 +322,6 @@ | ||
childStringCombined += wrapInHTML(data.keys[i], "name") + ": "; | ||
if (data.count > 1) { | ||
childStringCombined += htmlPercentageBar(data.items[data.keys[i]].count / data.count * 100); | ||
} | ||
@@ -181,4 +348,4 @@ childStringCombined += childStrings[i]; | ||
// string += `[ ${data.length ? `(${data.length}×)` : "∅"} `; | ||
string += wrapInHTML(`(${data.length})`, "length") + ` [`; | ||
string += wrapInHTML(data.count > 1 ? "μ = " + data.length.toFixed(1) : data.length, "length") + ` [`; | ||
if (data.length) { | ||
@@ -192,3 +359,3 @@ let needsNewlines = | ||
string += printSummaryLevel(data.items["0"], l + 1); | ||
string += printSummaryLevel(data.items["0"], l + 1, data.count); | ||
@@ -212,2 +379,3 @@ if (needsNewlines) { | ||
string += wrapInHTML(data.example, "value", data.type); | ||
data.count > 1 && data.range && (string += wrapInHTML(data.range, "range", data.type)); | ||
} | ||
@@ -223,7 +391,12 @@ } | ||
value: `<span class="json-summary json-summary-value json-summary-value-${type}">${value}</span>`, | ||
range: `<span class="json-summary json-summary-range json-summary-range-${type}">[${value[0]}, ${value[1]}]</span>`, | ||
name: `<span class="json-summary json-summary-name">${value}</span>`, | ||
length: `<span class="json-summary json-summary-length">${value}</span>`, | ||
length: `<span class="json-summary json-summary-length">(${value})</span>`, | ||
circular: `<span class="json-summary json-summary-circular">${value}</span>`, | ||
layer: `<span class="json-summary json-summary-checkbox ${options.startExpanded ? "checked" : ""}"> | ||
<input type="checkbox" ${options.startExpanded ? "checked" : ""}> | ||
layer: `<span class="json-summary json-summary-checkbox ${ | ||
options.startExpanded ? "checked" : "" | ||
}"> | ||
<input type="checkbox" ${ | ||
options.startExpanded ? "checked" : "" | ||
}> | ||
<span class="json-summary-checkboxmarker" onclick="(function(me){ | ||
@@ -239,2 +412,6 @@ me.parentNode.classList.toggle('checked'); | ||
} | ||
function htmlPercentageBar(percentage) { | ||
return `<div class="json-summary json-summary-bar"><div class="json-summary json-summary-percentage" style="width:${percentage}%;"></div></div>` | ||
} | ||
@@ -248,4 +425,6 @@ return { | ||
return summarizer; | ||
var jsonSummary = summarizer; | ||
return jsonSummary; | ||
})); |
@@ -1,2 +0,2 @@ | ||
// https://andrewtburks.dev/json-summary v0.1.5 Copyright 2019 Andrew Burks | ||
!function(e,n){"object"==typeof exports&&"undefined"!=typeof module?module.exports=n():"function"==typeof define&&define.amd?define(n):(e=e||self).jsonSummary=n()}(this,function(){"use strict";return function({indentation:e=" ",indentCount:n=2,showExampleValue:t=!0,startExpanded:s=!1}={indentation:" ",indentCount:2,showExampleValue:!0,startExpanded:!1}){let a={indentation:e,indentCount:n,showExampleValue:t,startExpanded:s};function r(e,n,t){return{type:`<span class="json-summary json-summary-type json-summary-type-${e}"><${e}></span>`,value:`<span class="json-summary json-summary-value json-summary-value-${t}">${e}</span>`,name:`<span class="json-summary json-summary-name">${e}</span>`,length:`<span class="json-summary json-summary-length">${e}</span>`,circular:`<span class="json-summary json-summary-circular">${e}</span>`,layer:`<span class="json-summary json-summary-checkbox ${a.startExpanded?"checked":""}">\n <input type="checkbox" ${a.startExpanded?"checked":""}>\n <span class="json-summary-checkboxmarker" onclick="(function(me){\n me.parentNode.classList.toggle('checked');\n })(this)"></span>\n </span><div class="json-summary json-summary-layer">${e}</div>`,child:`<div class="json-summary json-summary-child">${e}</div>`,keys:`<span class="json-summary json-summary-keys">${e}</span>`}[n]}return{summarize:function(e){let n=function e(n){let t={Array:n=>{let t={type:"Array"};return t.length=n.length,n.length&&(t.items={0:e(n[0])}),t},Object:n=>{let t={type:"Object"};t.keys=Object.keys(n),t.items={};for(let s of t.keys)t.items[s]=e(n[s]);return t},Other:e=>({type:typeof e,example:e})},s="Other";return n instanceof Array?s="Array":n instanceof Object&&(s="Object"),n&&n["*snippets_mark*"]?{type:s,circular:!0}:("Other"!==s&&(Object.defineProperty(n,"*snippets_mark*",{enumerable:!1,writable:!0,configurable:!0}),n["*snippets_mark*"]=!0),t[s](n))}(e);return function e(n){if(n&&n["*snippets_mark*"])if(delete n["*snippets_mark*"],n instanceof Array&&n.length)e(n[0]);else if(n instanceof Object)for(let t of Object.keys(n))e(n[t])}(e),n},printSummary:function(e){return function e(n,t){let s="";if(n.circular)s+=r("(circular reference)","circular");else if("Object"===n.type){s+="{";let i=n.keys.map(e=>`'${e}'`).join(", ");s+=r(i,"keys");let l=n.keys.map(s=>e(n.items[s],t+1));if(l.length){let e="\n";for(let s=0;s<n.keys.length;s++)e+=a.indentation.repeat((t+1)*a.indentCount),e+=r(n.keys[s],"name")+": ",e+=l[s],s<n.keys.length-1&&(e+=","),e+="\n";e+=a.indentation.repeat(t*a.indentCount),s+=r(e,"child")}s=r(s+="}","layer")}else if("Array"===n.type){if(s+=r(`(${n.length})`,"length")+" [",n.length){let r="Object"===n.items[0].type||"Array"===n.items[0].type;r&&(s+="\n"+a.indentation.repeat((t+1)*a.indentCount)),s+=e(n.items[0],t+1),r&&(s+="\n"+a.indentation.repeat(t*a.indentCount))}s+="]"}else null==n.example||null==n.example?s+=r("?","type"):s+=r(n.type,"type"),a.showExampleValue&&(s+=r(n.example,"value",n.type));return s}(e,0)}}}}); | ||
// https://andrewtburks.dev/json-summary v0.2.0 Copyright 2019 Andrew Burks | ||
!function(e,n){"object"==typeof exports&&"undefined"!=typeof module?module.exports=n():"function"==typeof define&&define.amd?define(n):(e=e||self).jsonSummary=n()}(this,function(){"use strict";return function(){let e={arraySampleCount:10,indentation:" ",indentCount:2,showExampleValue:!0,startExpanded:!1};return function({arraySampleCount:n=10,indentation:t=" ",indentCount:a=2,showExampleValue:r=!0,startExpanded:s=!1}=e){let o={arraySampleCount:n,indentation:t,indentCount:a,showExampleValue:r,startExpanded:s};function u(e){return function(e,n){return{string:function(e){let n=e.reduce((e,n)=>Math.min(e,n.range[0]),1/0),t=e.reduce((e,n)=>Math.max(e,n.range[1]),-1/0),a={type:"string",example:e[0].example,range:[n,t],count:e.reduce((e,n)=>e+n.count,0)};return a},number:function(e){let n=e.reduce((e,n)=>Math.min(e,n.range[0]),1/0),t=e.reduce((e,n)=>Math.max(e,n.range[1]),-1/0),a={type:"number",example:e[0].example,range:[n,t],count:e.reduce((e,n)=>e+n.count,0)};return a},boolean:function(e){return{type:"boolean",example:e[0].example,count:e.reduce((e,n)=>e+n.count,0)}},Object:function(e){let n={};for(let t of e)if(!t.circular)for(let e of t.keys)!n[e]&&(n[e]=[]),n[e].push(t.items[e]);let t={type:"Object",keys:[],items:{},count:e.length};for(let e of Object.keys(n))t.keys.push(e),t.items[e]=u(n[e]);return t},Array:function(e){let n=u(e.map(e=>e.items[0])),t={count:e.length,items:{0:n},length:n.count/e.length,type:"Array"};return t}}[n](e)}(e,e[0].type)}function l(e,n,t){return{type:`<span class="json-summary json-summary-type json-summary-type-${e}"><${e}></span>`,value:`<span class="json-summary json-summary-value json-summary-value-${t}">${e}</span>`,range:`<span class="json-summary json-summary-range json-summary-range-${t}">[${e[0]}, ${e[1]}]</span>`,name:`<span class="json-summary json-summary-name">${e}</span>`,length:`<span class="json-summary json-summary-length">(${e})</span>`,circular:`<span class="json-summary json-summary-circular">${e}</span>`,layer:`<span class="json-summary json-summary-checkbox ${o.startExpanded?"checked":""}">\n <input type="checkbox" ${o.startExpanded?"checked":""}>\n <span class="json-summary-checkboxmarker" onclick="(function(me){\n me.parentNode.classList.toggle('checked');\n })(this)"></span>\n </span><div class="json-summary json-summary-layer">${e}</div>`,child:`<div class="json-summary json-summary-child">${e}</div>`,keys:`<span class="json-summary json-summary-keys">${e}</span>`}[n]}return{summarize:function(e){let t=function e(t){let a={Array:t=>{let a={count:1,type:"Array",length:t.length};if(t.length)if(n>0){let r=Math.min(n,t.length),s={};for(;r>0;){let e=Math.floor(Math.random()*t.length);s.hasOwnProperty(e)||(s[e]=t[e],r--)}let o=[];for(let[n,t]of Object.entries(s))o.push(e(t));let l=u(o);a.items={0:l}}else a.items={0:e(t[0])};return a},Object:n=>{let t={count:1,type:"Object",keys:Object.keys(n),items:{}};for(let a of t.keys)t.items[a]=e(n[a]);return t},Other:e=>{let n;return"string"==typeof e?n=[e.length,e.length]:"number"==typeof e&&(n=[e,e]),{type:typeof e,example:e,count:1,range:n}}},r="Other";return t instanceof Array?r="Array":t instanceof Object&&(r="Object"),t&&t["*snippets_mark*"]?{type:r,circular:!0}:("Other"!==r&&(Object.defineProperty(t,"*snippets_mark*",{enumerable:!1,writable:!0,configurable:!0}),t["*snippets_mark*"]=!0),a[r](t))}(e);return function e(n){if(n&&n["*snippets_mark*"])if(delete n["*snippets_mark*"],n instanceof Array&&n.length)e(n[0]);else if(n instanceof Object)for(let t of Object.keys(n))e(n[t])}(e),t},printSummary:function(e){return function e(n,t,a){let r="";if(n.circular)r+=l("(circular reference)","circular");else if("Object"===n.type){r+="{";let a=n.keys.map(e=>`'${e}'`).join(", ");r+=l(a,"keys");let s=n.keys.map(a=>e(n.items[a],t+1,n.count));if(s.length){let e="\n";for(let a=0;a<n.keys.length;a++)e+=o.indentation.repeat((t+1)*o.indentCount),e+=l(n.keys[a],"name")+": ",n.count>1&&(e+=`<div class="json-summary json-summary-bar"><div class="json-summary json-summary-percentage" style="width:${n.items[n.keys[a]].count/n.count*100}%;"></div></div>`),e+=s[a],a<n.keys.length-1&&(e+=","),e+="\n";e+=o.indentation.repeat(t*o.indentCount),r+=l(e,"child")}r=l(r+="}","layer")}else if("Array"===n.type){if(r+=l(n.count>1?"μ = "+n.length.toFixed(1):n.length,"length")+" [",n.length){let a="Object"===n.items[0].type||"Array"===n.items[0].type;a&&(r+="\n"+o.indentation.repeat((t+1)*o.indentCount)),r+=e(n.items[0],t+1,n.count),a&&(r+="\n"+o.indentation.repeat(t*o.indentCount))}r+="]"}else null==n.example||null==n.example?r+=l("?","type"):r+=l(n.type,"type"),o.showExampleValue&&(r+=l(n.example,"value",n.type),n.count>1&&n.range&&(r+=l(n.range,"range",n.type)));return r}(e,0)}}}}()}); |
let ex1 = { | ||
"key1": "val1", | ||
"key2": [ | ||
"a", "b", "c" | ||
"name": "val1", | ||
"data": [ | ||
{"a": 1}, {a: 6, "b": 2}, {"c": 3} | ||
], | ||
"key3": true, | ||
"key4": { | ||
"isOk": true, | ||
"location": { | ||
"x": 1, | ||
@@ -52,3 +52,3 @@ "y": 2 | ||
let ex0 = { | ||
a: [2], | ||
a: [2, 8, 24], | ||
b: { x: "y" } | ||
@@ -55,0 +55,0 @@ }; |
241
index.js
const summarizer = (function() { | ||
let defaultOptions = { | ||
arraySampleCount: 10, | ||
indentation: " ", // or "\t" | ||
indentCount: 2, | ||
showExampleValue: true, | ||
startExpanded: false | ||
}; | ||
// summarizer utility class | ||
return function({ | ||
arraySampleCount = 10, | ||
indentation = " ", // or "\t" | ||
@@ -7,10 +17,6 @@ indentCount = 2, | ||
startExpanded = false | ||
} = { | ||
indentation: " ", // or "\t" | ||
indentCount: 2, | ||
showExampleValue: true, | ||
startExpanded: false | ||
}) { | ||
} = defaultOptions) { | ||
let options = { | ||
arraySampleCount, | ||
indentation, | ||
@@ -35,12 +41,43 @@ indentCount, | ||
Array: arr => { | ||
let summarized = {}; | ||
let summarized = { | ||
count: 1, | ||
type: "Array", | ||
length: arr.length | ||
}; | ||
summarized.type = "Array"; | ||
summarized.length = arr.length; | ||
// recurse to items in the array | ||
if (arr.length) { | ||
summarized.items = { | ||
0: summarizeItem(arr[0]) | ||
}; | ||
if (arraySampleCount > 0) { | ||
let numToSample = Math.min(arraySampleCount, arr.length); | ||
let sampledItems = {}; | ||
// summarized.count = numToSample; | ||
while (numToSample > 0) { | ||
let sampleIndex = Math.floor(Math.random() * arr.length); | ||
if (!sampledItems.hasOwnProperty(sampleIndex)) { | ||
sampledItems[sampleIndex] = arr[sampleIndex]; | ||
numToSample--; | ||
} | ||
} | ||
let summarizedSamples = []; | ||
for (let [idx, item] of Object.entries(sampledItems)) { | ||
summarizedSamples.push(summarizeItem(item)); | ||
} | ||
let joinedSample = joinSampledArray(summarizedSamples); | ||
summarized.items = { | ||
0: joinedSample | ||
}; | ||
} else { | ||
// sumamrized.count = 1; | ||
summarized.items = { | ||
0: summarizeItem(arr[0]) | ||
}; | ||
} | ||
} | ||
@@ -51,9 +88,9 @@ | ||
Object: obj => { | ||
let summarized = {}; | ||
summarized.type = "Object"; | ||
summarized.keys = Object.keys(obj); | ||
summarized.items = {}; | ||
let summarized = { | ||
count: 1, | ||
type: "Object", | ||
keys: Object.keys(obj), | ||
items: {} | ||
}; | ||
for (let key of summarized.keys) { | ||
@@ -66,5 +103,15 @@ summarized.items[key] = summarizeItem(obj[key]); | ||
Other: data => { | ||
let range; | ||
if (typeof data === "string") { | ||
range = [data.length, data.length]; | ||
} else if (typeof data === "number") { | ||
range = [data, data]; | ||
} | ||
return { | ||
type: typeof data, | ||
example: data | ||
example: data, | ||
count: 1, | ||
range | ||
}; | ||
@@ -102,2 +149,118 @@ } | ||
function joinSampledArray(itemset) { | ||
// let type = itemset.map(d => d.type) | ||
// .reduce((a, type) => { | ||
// a[type] = []; | ||
// return a; | ||
// }, {}); | ||
// for (let item of itemset) { | ||
// type[item.type].push(item); | ||
// } | ||
// let joins = {}; | ||
// for (let [t, itemset] of Object.entries(type)) { | ||
// joins[t] = joinItems(itemset, t); | ||
// } | ||
// console.log(joins); | ||
// return | ||
// assume theyre all a matching type | ||
let type = itemset[0].type; | ||
return joinItems(itemset, type); | ||
} | ||
function joinItems(itemArr, type) { | ||
// functions to join items by type | ||
let joiner = { | ||
string: function(items) { | ||
// string length range | ||
let min = items.reduce((acc, item) => { | ||
return Math.min(acc, item.range[0]); | ||
}, Infinity); | ||
let max = items.reduce((acc, item) => { | ||
return Math.max(acc, item.range[1]); | ||
}, -Infinity); | ||
let joinedString = { | ||
type: "string", | ||
example: items[0].example, | ||
range: [min, max], | ||
count: items.reduce((a, i) => a + i.count, 0) | ||
}; | ||
return joinedString; | ||
}, | ||
number: function(items) { | ||
let min = items.reduce((acc, item) => { | ||
return Math.min(acc, item.range[0]); | ||
}, Infinity); | ||
let max = items.reduce((acc, item) => { | ||
return Math.max(acc, item.range[1]); | ||
}, -Infinity); | ||
let joinedNumber = { | ||
type: "number", | ||
example: items[0].example, | ||
range: [min, max], | ||
count: items.reduce((a, i) => a + i.count, 0) | ||
}; | ||
return joinedNumber; | ||
}, | ||
boolean: function(items) { | ||
return { | ||
type: "boolean", | ||
example: items[0].example, | ||
count: items.reduce((a, i) => a + i.count, 0) | ||
}; | ||
}, | ||
Object: function(items) { | ||
let masterKeys = {}; | ||
for (let obj of items) { | ||
if (!obj.circular) { | ||
for (let key of obj.keys) { | ||
!masterKeys[key] && (masterKeys[key] = []); | ||
masterKeys[key].push(obj.items[key]); | ||
} | ||
} | ||
} | ||
let joinedObject = { type: "Object", keys: [], items: {}, count: items.length }; | ||
for (let key of Object.keys(masterKeys)) { | ||
joinedObject.keys.push(key); | ||
joinedObject.items[key] = joinSampledArray(masterKeys[key]); | ||
} | ||
return joinedObject; | ||
}, | ||
Array: function(items) { | ||
let joinedValues = joinSampledArray(items.map(i => i.items[0])); | ||
let joinedArray = { | ||
count: items.length, | ||
items: { | ||
0: joinedValues | ||
}, | ||
length: joinedValues.count / items.length, | ||
type: "Array" | ||
}; | ||
return joinedArray; | ||
} | ||
}; | ||
return joiner[type](itemArr); | ||
} | ||
function unmarkObject(obj) { | ||
@@ -117,10 +280,10 @@ if (obj && obj["*snippets_mark*"]) { | ||
} | ||
// utility function to stringify the summary output from summarizeJSON | ||
function printSummarizedJSON(summary) { | ||
// start at 0 indentation | ||
return printSummaryLevel(summary, 0); | ||
return printSummaryLevel(summary, 0, 1); | ||
} | ||
function printSummaryLevel(data, l) { | ||
function printSummaryLevel(data, l, prevCount) { | ||
let string = ""; | ||
@@ -138,3 +301,3 @@ | ||
let childStrings = data.keys.map(key => { | ||
return printSummaryLevel(data.items[key], l + 1); | ||
return printSummaryLevel(data.items[key], l + 1, data.count); | ||
}); | ||
@@ -151,2 +314,6 @@ | ||
childStringCombined += wrapInHTML(data.keys[i], "name") + ": "; | ||
if (data.count > 1) { | ||
childStringCombined += htmlPercentageBar(data.items[data.keys[i]].count / data.count * 100); | ||
} | ||
@@ -173,4 +340,4 @@ childStringCombined += childStrings[i]; | ||
// string += `[ ${data.length ? `(${data.length}×)` : "∅"} `; | ||
string += wrapInHTML(`(${data.length})`, "length") + ` [`; | ||
string += wrapInHTML(data.count > 1 ? "μ = " + data.length.toFixed(1) : data.length, "length") + ` [`; | ||
if (data.length) { | ||
@@ -184,3 +351,3 @@ let needsNewlines = | ||
string += printSummaryLevel(data.items["0"], l + 1); | ||
string += printSummaryLevel(data.items["0"], l + 1, data.count); | ||
@@ -204,2 +371,3 @@ if (needsNewlines) { | ||
string += wrapInHTML(data.example, "value", data.type); | ||
data.count > 1 && data.range && (string += wrapInHTML(data.range, "range", data.type)); | ||
} | ||
@@ -215,7 +383,12 @@ } | ||
value: `<span class="json-summary json-summary-value json-summary-value-${type}">${value}</span>`, | ||
range: `<span class="json-summary json-summary-range json-summary-range-${type}">[${value[0]}, ${value[1]}]</span>`, | ||
name: `<span class="json-summary json-summary-name">${value}</span>`, | ||
length: `<span class="json-summary json-summary-length">${value}</span>`, | ||
length: `<span class="json-summary json-summary-length">(${value})</span>`, | ||
circular: `<span class="json-summary json-summary-circular">${value}</span>`, | ||
layer: `<span class="json-summary json-summary-checkbox ${options.startExpanded ? "checked" : ""}"> | ||
<input type="checkbox" ${options.startExpanded ? "checked" : ""}> | ||
layer: `<span class="json-summary json-summary-checkbox ${ | ||
options.startExpanded ? "checked" : "" | ||
}"> | ||
<input type="checkbox" ${ | ||
options.startExpanded ? "checked" : "" | ||
}> | ||
<span class="json-summary-checkboxmarker" onclick="(function(me){ | ||
@@ -231,2 +404,6 @@ me.parentNode.classList.toggle('checked'); | ||
} | ||
function htmlPercentageBar(percentage) { | ||
return `<div class="json-summary json-summary-bar"><div class="json-summary json-summary-percentage" style="width:${percentage}%;"></div></div>` | ||
} | ||
@@ -240,2 +417,2 @@ return { | ||
export default summarizer; | ||
module.exports = summarizer; |
{ | ||
"name": "json-summary", | ||
"version": "0.1.5", | ||
"version": "0.2.0", | ||
"description": "A simple JSON summarizer to extract the structure from a JSON object", | ||
@@ -11,10 +11,11 @@ "keywords": [ | ||
], | ||
"main": "dist/json-summary-node.js", | ||
"module": "index.js", | ||
"main": "index.js", | ||
"module": "dist/json-summary.esm.js", | ||
"browser": "dist/json-summary.js", | ||
"browserMin": "dist/json-summary.min.js", | ||
"scripts": { | ||
"test": "jest && codecov", | ||
"jest": "jest", | ||
"test": "jest --coverage --coverageReporters=text-lcov | coveralls", | ||
"prepublish": "npm run build && npm test", | ||
"build": "rollup -c && cp dist/json-summary.min.js docs/json-summary.min.js && cp summarizer.css docs/summarizer.css" | ||
"build": "rollup -c && cp dist/json-summary.js docs/json-summary.js && cp summarizer.css docs/summarizer.css" | ||
}, | ||
@@ -35,3 +36,3 @@ "repository": { | ||
"devDependencies": { | ||
"codecov": "^3.3.0", | ||
"coveralls": "^3.0.3", | ||
"jest": "^24.7.1", | ||
@@ -41,9 +42,5 @@ "rollup": "^1.9.0", | ||
"rollup-plugin-node-resolve": "^4.2.1", | ||
"rollup-plugin-resolve": "0.0.1-predev.1", | ||
"rollup-plugin-terser": "^4.0.4" | ||
}, | ||
"jest": { | ||
"coverageDirectory": "./coverage/", | ||
"collectCoverage": true | ||
} | ||
"dependencies": {} | ||
} |
# json-summary | ||
[![npm version](https://img.shields.io/npm/v/json-summary.svg)](https://www.npmjs.com/package/json-summary) | ||
[![npm version](https://img.shields.io/travis/com/AndrewTBurks/json-summary.svg)](https://www.npmjs.com/package/json-summary) | ||
[![npm downloads](https://img.shields.io/npm/v/json-summary.svg)](https://www.npmjs.com/package/json-summary) | ||
[![npm downloads](https://img.shields.io/npm/dt/json-summary.svg)](https://www.npmjs.com/package/json-summary) | ||
[![codecov](https://codecov.io/gh/AndrewTBurks/json-summary/branch/master/graph/badge.svg)](https://codecov.io/gh/AndrewTBurks/json-summary) | ||
[![Coverage Status](https://coveralls.io/repos/github/AndrewTBurks/json-summary/badge.svg?branch=master)](https://coveralls.io/github/AndrewTBurks/json-summary?branch=master) | ||
@@ -7,0 +8,0 @@ |
@@ -54,6 +54,6 @@ // https://github.com/AndrewTBurks/json-summary v0.1.3 Copyright 2019 Andrew Burks | ||
output: [ | ||
{ file: pkg.main, format: "cjs" }, | ||
// { file: pkg.module, format: "es" } | ||
// { file: pkg.main, format: "cjs" }, | ||
{ file: pkg.module, format: "esm", banner: copyright } | ||
] | ||
} | ||
]; |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Found 1 instance in 1 package
78553
6
16
2057
12
1