openapi-explorer
Version:
OpenAPI Explorer - API viewer with dynamically generated components, documentation, and interaction console
74 lines (70 loc) • 4.85 kB
JavaScript
;
exports.__esModule = true;
exports.default = void 0;
var _lit = require("lit");
var _fontStyles = _interopRequireDefault(require("../styles/font-styles.js"));
var _borderStyles = _interopRequireDefault(require("../styles/border-styles.js"));
var _inputStyles = _interopRequireDefault(require("../styles/input-styles.js"));
var _keyFrameStyles = _interopRequireDefault(require("../styles/key-frame-styles.js"));
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
class JsonTree extends _lit.LitElement {
static get properties() {
return {
data: {
type: Object
},
renderStyle: {
type: String,
attribute: 'render-style'
}
};
}
/**
* @param {Map<string, object>} changedProperties Changed Properties
*/
update(changedProperties) {
if (changedProperties.has('data')) {
this.interactive = false;
}
super.update(changedProperties);
}
updated() {
this.interactive = true; // Note: interactive is not a reactive property
}
static finalizeStyles() {
return [_fontStyles.default, _borderStyles.default, _inputStyles.default, _keyFrameStyles.default, (0, _lit.css)`:host{display:flex}.json-tree{background:var(--bg2);padding:12px;min-height:30px;font-family:var(--font-mono);font-size:var(--font-size-small);overflow:hidden;word-break:break-all;flex:1;line-height:calc(var(--font-size-small) + 6px)}.open-bracket{display:inline-block;padding:0 20px 0 0;cursor:pointer;border:1px solid transparent;border-radius:3px}.collapsed.open-bracket{padding-right:0}.tree>.open-bracket{margin-left:-2px}.open-bracket:hover{color:var(--primary-color);background-color:var(--hover-color);border:1px solid var(--border-color)}.inside-bracket-wrapper{overflow:hidden}.tree:not(.interactive) .inside-bracket-wrapper{animation-duration:0s!important}.open-bracket:not(.collapsed)+.inside-bracket-wrapper{animation:linear .2s expand-height}.open-bracket.collapsed+.inside-bracket-wrapper{animation:linear .2s collapse-height;max-height:0}.inside-bracket{padding-left:16px;border-left:1px dotted var(--border-color)}.string{color:var(--green)}.number{color:var(--blue)}.null{color:var(--red)}.boolean{color:var(--orange)}.toolbar{display:none}.tree .toolbar{display:flex;justify-content:space-between;width:100%}.tree .item{border-bottom:1px dotted transparent}.toolbar-item{cursor:pointer;flex-shrink:0}.tree .toolbar .toolbar-item{display:none}.inside-bracket.xxx-of{padding:5px 0;border-style:dotted;border-width:0 0 1px 0;border-color:var(--primary-color)}.schema-root-type.xxx-of{display:none}.toolbar-item:first-of-type{margin:0 2px 0 0}@media only screen and (min-width:576px){.key-descr{display:block}.tree .toolbar .toolbar-item{display:block}.toolbar{display:flex}}.toolbar-backup{position:absolute;right:6px;display:flex;align-items:center}`];
}
/* eslint-disable indent */
render() {
return (0, _lit.html)` <div class="json-tree tree ${this.interactive ? 'interactive' : ''}"> ${this.generateTree(this.data, true)} </div> `;
}
generateTree(data, isLast = false) {
if (data === null) {
return (0, _lit.html)`<div class="null" style="display:inline">null</div>`;
}
if (typeof data === 'object' && data instanceof Date === false) {
const detailType = Array.isArray(data) ? 'array' : 'pure_object';
if (Object.keys(data).length === 0) {
return (0, _lit.html)`${Array.isArray(data) ? '[ ],' : '{ },'}`;
}
return (0, _lit.html)` <div class="open-bracket ${detailType === 'array' ? 'array' : 'object'}" @click="${this.toggleExpand}"> ${detailType === 'array' ? '[' : '{'}</div> <div class="inside-bracket-wrapper"> <div class="inside-bracket"> ${Object.keys(data).map((key, i, a) => (0, _lit.html)` <div class="item"> ${detailType === 'pure_object' ? (0, _lit.html)`"${key}":` : ''} ${this.generateTree(data[key], i === a.length - 1)} </div>`)} </div> <div class="close-bracket">${detailType === 'array' ? ']' : '}'}${isLast ? '' : ','}</div> </div> `;
}
return typeof data === 'string' || data instanceof Date ? (0, _lit.html)`<span class="${typeof data}">"${data}"</span>${isLast ? '' : ','}` : (0, _lit.html)`<span class="${typeof data}">${data}</span>${isLast ? '' : ','}`;
}
/* eslint-enable indent */
toggleExpand(e) {
const openBracketEl = e.target;
openBracketEl.classList.toggle('collapsed');
if (openBracketEl.classList.contains('collapsed')) {
e.target.innerHTML = e.target.classList.contains('array') ? '[...]' : '{...}';
} else {
e.target.innerHTML = e.target.classList.contains('array') ? '[' : '{';
}
this.requestUpdate();
}
}
// Register the element with the browser
exports.default = JsonTree;
if (!customElements.get('openapi-explorer')) {
customElements.define('json-tree', JsonTree);
}