UNPKG

@gouvfr/dsfr-nexus

Version:

Le module `dsfr-nexus` est l'interface de ligne de commande (CLI) centrale du Système de Design de l’État - DSFR. Il offre des outils pour gérer et compiler les ressources du DSFR

144 lines (117 loc) 3.73 kB
import { log, normalizeId } from '@gouvfr/dsfr-forge'; class NavigationInterpreter { constructor (state, data) { this._state = state; this._data = data; } async resolve () { this._interpretMain(); this._interpretSidemenu(); } _interpretMain (main) { this._data.main.items = this._data.main.items.map(item => this._mapMainItem(item)).filter(item => item); } _mapMainItem (item) { switch (item.type) { case 'link': return { ...this._state.resolveItem(item), type: 'link' }; case 'menu': return this._interpretMenu(item); case 'mega-menu': return this._interpretMegaMenu(item); } } _interpretMenu (menu) { const node = this._state.resolveItem(menu); return { type: 'menu', id: node.id || normalizeId(menu.path), text: node.text, url: node.url, isCurrent: node.isCurrent, items: this._interpretItems(menu) }; } _interpretMegaMenu (item) { const node = this._state.resolveItem(item); const categories = item.categories ? item.categories.map(category => this._interpretCategory(category)) : this._resolveCategories(item.path); return { type: 'mega-menu', id: node.id || normalizeId(item.path), text: node.text, url: node.url, isCurrent: node.isCurrent, categories: categories }; } _resolveCategories (path) { return this._state.resolveItems(path).map(category => this._interpretCategory(category)); } _interpretCategory (category) { const node = this._state.resolveItem(category); return { id: node.id || normalizeId(category.path), text: node.text, url: node.url, isCurrent: node.isCurrent, items: this._interpretItems(category) }; } _interpretItems (wrapper) { if (wrapper.items) { const items = wrapper.items.map(item => this._state.resolveItem(item)); if (items && items.length) return items; } const items = this._state.resolveItems(wrapper.path, wrapper.rank); if (items && items.length) return items; } _interpretSidemenu () { const sidemenu = this._getMatch(); if (!sidemenu) { this._data.sidemenu = undefined; return; } const node = this._state.resolveItem({path: sidemenu.match}); const sort = sidemenu.sort?.split(',').map(s => s.trim()).filter(s => s.length > 0); const items = this._state.resolveItems(sidemenu.match, sidemenu.rank, sort?.[0]); const isCollapsible = sidemenu.isCollapsible !== false; if (!isNaN(sidemenu.depth) && sidemenu.depth >= 2) { items.forEach(item => { const items2 = this._state.resolveItems(item.path, sidemenu.rank, sort?.[1] ?? sort?.[0]); if (items2.length) { item.type = 'menu'; item.isCollapsible = isCollapsible; if (sidemenu.depth >= 3) { items2.forEach(item => { const items3 = this._state.resolveItems(item.path, sidemenu.rank, sort?.[2] ?? sort?.[0]); if (items3.length) { item.type = 'menu'; item.isCollapsible = isCollapsible; item.items = items3; } }); } item.items = items2; } }); } this._data.sidemenu = { buttonLabel: this._data.sidemenu.buttonLabel, titleLabel: this._data.sidemenu.titleLabel, text: node.text, items: items }; } _getMatch () { for (const sidemenu of this._data.sidemenu.items) { if (this._state.path.indexOf(sidemenu.match) === 0) { return sidemenu; } } return null; } } export { NavigationInterpreter };