(() => {
let metadataStore;
function createPropsTable(props) {
const table = document.createElement('table');
table.innerHTML = `
Property
Attribute
Description
Type
Default
${escapeHtml(prop.name)}
${escapeHtml(prop.attribute)}
` : '-'}${escapeHtml(prop.type?.text || '')}
` : '-'}${escapeHtml(prop.default)}
` : '-'}${escapeHtml(event.name)}
${escapeHtml(event.type?.text)}` : '-'}
${escapeHtml(method.name)}
${escapeHtml(
method.parameters.map(param => `${param.name}: ${param.type.text}`).join(', ')
)}
`
: '-'
}
${escapeHtml(slot.name)}
` : '(default)'}${escapeHtml(style.name)}
${escapeHtml(part.name)}
${escapeHtml(animation.name)}
<${tag}>
`;
ul.appendChild(li);
});
return ul.outerHTML;
}
function escapeHtml(html) {
return (html + '')
.replace(/&/g, '&')
.replace(//g, '>')
.replace(/"/g, '"')
.replace(/'/g, ''')
.replace(/`(.*?)`/g, '$1
');
}
function getAllComponents(metadata) {
const allComponents = [];
metadata.modules.map(module => {
module.exports.find(ex => {
if (ex.kind === 'custom-element-definition') {
allComponents.push(getComponent(metadata, ex.name));
}
});
});
return allComponents;
}
function getComponent(metadata, tagName) {
const module = metadata.modules.find(module => {
return module.exports.find(ex => {
return ex.kind === 'custom-element-definition' && ex.name === tagName;
});
});
const component = module?.declarations.find(dec => dec.name === 'default');
const tag = module.exports.filter(ex => ex.kind === 'custom-element-definition' && ex.name === tagName)[0]?.name;
return Object.assign({ tag }, component);
}
function getMetadata() {
return new Promise((resolve, reject) => {
// Simple caching to prevent multiple XHR requests
if (metadataStore) {
return resolve(metadataStore);
}
fetch('/dist/custom-elements.json')
.then(res => res.json())
.then(data => {
metadataStore = data;
resolve(metadataStore);
})
.catch(err => console.error(err));
});
}
if (!window.$docsify) {
throw new Error('Docsify must be loaded before installing this plugin.');
}
window.$docsify.plugins.push((hook, vm) => {
hook.mounted(function () {
getMetadata().then(metadata => {
const target = document.querySelector('.app-name');
// Add version
const version = document.createElement('div');
version.classList.add('sidebar-version');
version.textContent = metadata.package.version;
target.appendChild(version);
// Add repo buttons
const buttons = document.createElement('div');
buttons.classList.add('sidebar-buttons');
buttons.innerHTML = `
${component.className} | <${component.tag}>
<${tag}>
.
${createDependenciesList(component.tag, getAllComponents(metadata))}
`;
}
// Strip whitespace so markdown doesn't process things as code blocks
return result.replace(/^ +| +$/gm, '');
});
next(content);
});
});
})();