UNPKG

els-addon-docs

Version:

Ember Language Server Completion Provider for Addons with Addon Docs

101 lines (91 loc) 2.75 kB
const html2md = require('html-to-md'); const TurndownService = require('turndown') const turndownService = new TurndownService(); function normalizeDescription(str) { let result = str; try { result = html2md(str).trim(); } catch(e) { try { result = turndownService.turndown(str).trim(); } catch(e) { } } return result; } function normalizeFields(fields) { if (!Array.isArray(fields)) { return []; } return fields.reduce((result, field)=>{ if (field.access !== 'public') { return result; } let data = Object.assign({}, field); data.description = normalizeDescription(data.description); result.push(data); return result; }, []); } function normalizeYield(yieldItem) { // 6 - variable // 7 - class // object, boolean, array, number const kindForType = { Component: 7, object: 9, array: 9, number: 9, boolean: 14, } return { label: yieldItem.name, rootName: yieldItem.name.split('.')[0], index: 0, detail: normalizeDescription(yieldItem.description), kind: kindForType[yieldItem.type] || 6 } } function normalizeComponentInfo({attributes}) { const { name, description, fields, methods } = attributes; const result = { name, yields: (attributes.yields || []).map(el=>normalizeYield(el)), description: normalizeDescription(description), arguments: [...normalizeFields(fields), ...normalizeFields(methods), ...normalizeFields(attributes.arguments)] } let yieldIndex = 0; let yieldParamName = undefined; result.yields.forEach((item, i)=>{ if (i === 0) { yieldParamName = item.rootName; } else { if (yieldParamName !== item.rootName) { yieldIndex++; } } item.index = yieldIndex; }); return result; } function extractComponentInfo(raw) { if (!raw || !raw.included) { return []; } return raw.included.filter((item)=>item.type === 'component' && item.attributes && item.attributes.access === 'public'); } module.exports.normalizeComponents = function normalizeComponents(rawItems) { let items = extractComponentInfo(rawItems); return items.reduce((result, item)=>{ let data = normalizeComponentInfo(item); result[data.name] = data; return result; }, {}); } module.exports.mergeLeft = function mergeLeft(to, from) { Object.keys(from).forEach(key => { if (!to[key]) { to[key] = from[key]; } }); }