Helpers
Component docs
Helpers per documentazione runtime di MFEComponent. groupComponentsByCategory e generateComponentDocs.
API
function groupComponentsByCategory(
components: MFEComponent[],
): Map<string, MFEComponent[]>
function generateComponentDocs(component: MFEComponent): string
Helper per costruire cataloghi UI e documentazione markdown runtime dai componenti esposti dai MFE.
groupComponentsByCategory
Raggruppa un array di MFEComponent[] per category. Componenti senza category finiscono nel gruppo 'General'.
import { groupComponentsByCategory } from '@pzeta/mfe-contracts/helpers'
const grouped = groupComponentsByCategory([
{ name: 'ClienteCard', description: '...', category: 'Cards' },
{ name: 'AgenteCard', description: '...', category: 'Cards' },
{ name: 'KpiTile', description: '...', category: 'Metrics' },
{ name: 'Legacy', description: '...' }, // no category
])
// Map:
// 'Cards' → [ClienteCard, AgenteCard]
// 'Metrics' → [KpiTile]
// 'General' → [Legacy]
Iterazione
for (const [category, components] of grouped) {
console.log(`${category}: ${components.length} componenti`)
for (const c of components) {
console.log(` - ${c.name}: ${c.description}`)
}
}
Esempio: catalogo UI
<script setup lang="ts">
import { computed } from 'vue'
import { groupComponentsByCategory } from '@pzeta/mfe-contracts/helpers'
const props = defineProps<{ manifest: MFEManifest }>()
const byCategory = computed(() =>
groupComponentsByCategory(props.manifest.components ?? []),
)
</script>
<template>
<section v-for="[category, components] in byCategory" :key="category">
<h2>{{ category }}</h2>
<div class="catalog-grid">
<ComponentCard v-for="c in components" :key="c.name" :component="c" />
</div>
</section>
</template>
generateComponentDocs
Genera markdown auto-generato da un MFEComponent. Include:
- Heading
# {name}e descrizione - Tabella Props (se presenti): Nome, Tipo, Required, Default, Descrizione
- Tabella Events (se presenti): Nome, Payload, Descrizione
- Blocco
vueconexampleSource(se presente)
import { generateComponentDocs } from '@pzeta/mfe-contracts/helpers'
const md = generateComponentDocs({
name: 'ClienteCard',
description: 'Card riassuntiva di un cliente',
category: 'Cards',
props: [
{ name: 'cliente', type: 'Cliente', required: true, description: 'Oggetto cliente' },
{ name: 'compact', type: 'boolean', default: false, description: 'Versione compatta' },
],
events: [
{ name: 'edit', payload: 'Cliente', description: 'Click su modifica' },
{ name: 'delete', payload: 'string', description: 'Click su elimina (id)' },
],
exampleSource: `<ClienteCard :cliente="c" @edit="onEdit" @delete="onDelete" />`,
})
console.log(md)
Output
# ClienteCard
Card riassuntiva di un cliente
## Props
| Nome | Tipo | Required | Default | Descrizione |
|------|------|----------|---------|-------------|
| cliente | `Cliente` | ✓ | - | Oggetto cliente |
| compact | `boolean` | | `false` | Versione compatta |
## Events
| Nome | Payload | Descrizione |
|------|---------|-------------|
| edit | `Cliente` | Click su modifica |
| delete | `string` | Click su elimina (id) |
## Esempio d'uso
```vue
<ClienteCard :cliente="c" @edit="onEdit" @delete="onDelete" />
```
Quando usarlo
- Generazione documentazione runtime di una libreria di componenti esposta da un MFE
- Pagine "/dev/components" che mostrano automaticamente il catalogo dei componenti esposti
- Export del manifest in
.mdper onboarding - Integrazione con un portale docs come questo (markdown → Nuxt Content)
Esempio: pagina docs dinamica
<script setup lang="ts">
import { computed } from 'vue'
import {
groupComponentsByCategory,
generateComponentDocs,
} from '@pzeta/mfe-contracts/helpers'
const props = defineProps<{ manifest: MFEManifest }>()
const docs = computed(() => {
const byCategory = groupComponentsByCategory(props.manifest.components ?? [])
let md = `# ${props.manifest.name}\n\n${props.manifest.description}\n\n`
for (const [category, components] of byCategory) {
md += `## ${category}\n\n`
for (const c of components) {
md += generateComponentDocs(c)
md += '\n---\n\n'
}
}
return md
})
</script>
<template>
<pre><code>{{ docs }}</code></pre>
<!-- Oppure: renderizza con marked, MDX, @nuxt/content, ecc. -->
</template>
Tipi correlati
MFEComponent— inputMFEManifest— contienecomponents?: MFEComponent[]