Normativa front guia implementacion documentación WC Vigente Versión: 1.0.0Estado: ACTIVOEntrada en vigor desde:Obligado cumplimiento desde: Sept-2023 | Normativa front guia implementacion documentación WC PRE-RELEASE Versión: 1.0.0Estado: RELEASEEntrada en vigor desde:Obligado cumplimiento desde: - |
---|
Las normas expuestas son de obligado cumplimiento. La STIC podrá estudiar los casos excepcionales los cuales serán gestionados a través de los responsables del proyecto correspondiente y autorizados por el Área de Gobernanza de la STIC. Asimismo cualquier aspecto no recogido en estas normas deberá regirse en primera instancia por las guías técnicas correspondientes al esquema nacional de seguridad y esquema nacional de interoperabilidad según correspondencia y en su defecto a los marcos normativos y de desarrollo software establecidos por la Junta de Andalucía, debiendo ser puesto de manifiesto ante la STIC.
La STIC se reserva el derecho a la modificación de la norma sin previo aviso, tras lo cual, notificará del cambio a los actores implicados para su adopción inmediata según la planificación de cada proyecto.
En el caso de que algún actor considere conveniente y/o necesario el incumplimiento de alguna de las normas y/o recomendaciones, deberá aportar previamente la correspondiente justificación fehaciente documentada de la solución alternativa propuesta, así como toda aquella documentación que le sea requerida por la STIC para proceder a su validación técnica.
Contacto Arquitectura: l-arquitectura.stic@juntadeandalucia.es
Los cambios en la normativa vendr谩n acompa帽ados de un registro de las modificaciones. De este modo se podr谩 realizar un seguimiento y consultar su evoluci贸n. Orden谩ndose de mas recientes a menos recientes, prestando especial cuidado a las cabeceras de la tablas d贸nde se indican las fechas de entrada en vigor y versi贸n.
En el desarrollo de componentes web, as铆 c贸mo para cualquier elemento software orientado a la reutilizaci贸n, la correcta gesti贸n de la documentaci贸n es fundamental, de cara a su reaprovechamiento y mantenimiento. Esta guia define los aspectos b谩sicos a documentar en聽 la implementaci贸n de soluciones de front-end, teniedo en mente las siguientes cuestiones:
La soluci贸n se basa en la generaci贸n autom谩tica de una serie de descriptores, extray茅ndose de los comentarios definidos en el c贸digo fuente. Los ficheros generados de forma autom谩tica son:
Como se ha dicho en el punto 1, se deben generar los siguientes ficheros en los que se visualice nuestra documentaci贸n:
La herramienta base para crear ambos ficheros es WCA (web-component-analyzer) , y se trata de un CLI que se integra en nuestro proyecto y con el que se analizan de manera sencilla los componentes para obtener la documentaci贸n en distintos formatos.
Una vez se generaron los ficheros con WCA, se observ贸 que la herramienta no agrupaba la documentaci贸n de los distintos tags que podr铆a tener en el componente, de modo que solo aparecia en el fichero README.md o en storybook el primero que analizase. Por ello, el departamento de arquitectura crea una herramienta llamada CustomElementMerger mediante la cual, con la salida del WCA, se obtiene:
Por 煤ltimo se usar谩 la herramienta JSDOC, mediante la cual se analizar谩n los comentarios sobre el c贸digo fuente (JS) y se generar谩 autom谩ticamente una estructura de p谩ginas HTML que el desarrollador pueda seguir para observar la API del componente.
La siguiente secci贸n aclara los pasos necesarios para instalar todas estas herramientas en nuestro proyecto y as铆 poder generar la documentaci贸n necesaria.
Desde consola, estando en la ra铆z del proyecto, se ejecutar谩 lo siguiente:
npm install -g web-component-analyzer
npm install @sas/custom-element-merger@1.0.3
npm install @sas/custom-element-merger@1.0.3
A parte de instalar este paquete, se ha de configurar para que haga lo que se necesita聽a nivel de documentaci贸n. Para ello descargar el siguiente fichero (.jsdoc.zip) y descomprimir en la ra铆z del proyecto.
El contenido de este fichero es una carpeta (.jsdoc) cuyo contenido es el siguiente:
Los ficheros que contiene el archivo zip son los siguientes:
El objetivo de esta secci贸n es facilitar al desarrollador el modo de realizar los comentarios dentro del c贸digo fuente del WC para que dichos comentarios puedan ser parseados por WCA (para storybook) y por JSDoc (HTML Doc) y que generen la documentaci贸n necesaria en cada uno de sus sistemas. Se intentar谩 unificar de una manera l贸gica todos los comentarios para que estos sean lo mas precisos posibles dentro del modelo Model-View-ViewModel de la manera que se explica a continuaci贸n:
Observaciones previas que toda documentaci贸n de componentes debe cumplir:
window.customElements.define("<nombre-componente>", <ClaseViewDelComponente>);
y siempre como 煤ltima l铆nea del documento. No se deber谩 hacer nunca con el decorador @customElement :
import { setCustomElementsManifest } from '@storybook/web-components'; import customElements from '../custom-elements.json'; setCustomElementsManifest(customElements);
export default { title: 'Nombre de la story', component: 'nombre-componente', // El que se encuentra también como nombre en el fichero `custom-elements.json` };
La siguiente tabla incluye todos los tags disponibles para comentar el c贸digo fuente:
Tag | Definici贸n | Scope | Visible en | Ejemplo |
---|---|---|---|---|
@element | Se usa para asociar el nombre del componente con la聽documentaci贸n | Ficheros View, ViewModel, CSS | Storybook | Simple property doc example /** * * @element my-custom-element * |
@file | Se utiliza para indicar una descripci贸n del fichero | Todos los ficheros | JSDOC | Simple property doc example /** * * @file <shortFileDescription> * |
@author | Se usa para identificar el autor de un fichero o elemento | Todos los ficheros | JSDOC | Simple property doc example * * @author <authorName> [<authorEmail>] * |
@version | Se usa para documentar la versi贸n de un fichero o elemento | Todos los ficheros | JSDOC | Simple property doc example * * @version <versionNumber> * |
@class | Se usa para identificar una clase | Todos los ficheros que incluyan clases | JSDOC | Simple property doc example * * @class [<type>] [<name>] * |
@classdesc | Se usa para dar la descripci贸n de una clase, y suele usarse en combinaci贸n con el tag @class (o @constructor) | Todos los ficheros que incluyan clases | JSDOC | Simple property doc example * * @class [<type>] [<name>] * @classdesc <classDescription> * NOTA: Para usar @classdesc es obligatorio haber definido el tag聽@class previo a este |
@extends | Se usa para indicar que un elemento hereda de otro elemento padre | Todos los ficheros que incluyan clases y extiendan de otra clase padre | JSDOC | Simple property doc example * * @extends <namepath> * |
@interface | Se usa para documentar una interfaz que otros elementos podr铆an implementar | Ficheros Model, ViewModel, Utils o ficheros de interfaz | JSDOC | Simple property doc example * * @interface [<name>] * |
@function | Se usa para marcar un elemento como funci贸n o m茅todo | Ficheros Model, ViewModel y Utils | JSDOC | Simple property doc example * * @function [<functionName>] * |
@param | Se usa para establecer nombre, tipo y descripci贸n de un par谩metro de una funci贸n | Ficheros Model, ViewModel y Utils con par谩metros definidos dentro de las funciones | JSDOC | Simple property doc example * * @param [{type}] <name> [- <description>] * |
@return | Se usa para describir el tipo y resultado devuelto por una funci贸n o m茅todo | Ficheros Model, ViewModel y Utils con funciones que devuelvan alg煤n resultado | JSDOC | Simple property doc example * * @return [{type}] [<description>] * |
@static | Se usa para indicar que un elemento esta contenido en su elemento padre y puede ser accedido sin crear una instancia del padre | Todos los ficheros que definan elementos est谩ticos | JSDOC | Simple property doc example * * @static * |
@protected | Se usa para indicar que un elemento es protegido | Todos los ficheros que definan elementos protegidos | JSDOC | Simple property doc example * * @protected * |
@fires | Se usa para documentar eventos | Ficheros Model, ViewModel y Utils | Storybook y JSDOC | Simple property doc example * * @fires <name> [- <description>] * |
@slot | Se usar para documentar slots (谩rea dentro del componente que permite la inyecci贸n de HTML) | Ficheros Model, ViewModel | Storybook | Simple property doc example * * @slot <name> [%- <description>] * |
@attr | Se usa para documentar los atributos (propiedades internas al componente - Internal properties) del componente | Todos los ficheros que definan atributos sobre algunos de sus elementos | Storybook y JSDOC | Complex property doc example /** * Attribute description * @attr [{type}] attrTest[=defaultValue] - Attribute description **/ attrTest=defaultvalue |
@prop | Se usa para documentar las propiedades (propiedades expuestas al exterior a trav茅s de la API) del componente | Todos los ficheros que definan propiedades sobre algunos de sus elementos | Storybook y JSDOC | Simple property doc example /** * Property description **/ @property({type:propertyType}) propName=defaultvalue Complex property doc example /** * Property description * @prop [{propertyType}] propName[=defaultValue] - Property description **/ @property({type:propertyType}) propName=defaultvalue |
@cssprop | Se usa para documentar las propiedades custom CSS del componente | Ficheros CSS | Storybook | Simple property doc example * * @cssprop --<name>=[defaultValue] [- <description>] * |
@csspart | Se usa para documentar CSS shadow parts (谩reas que permiten el uso de propiedades CSS dentro del shadow dom) del componente | Ficheros CSS | Storybook | Simple property doc example * * @cssprop <name> * |
IMPORTANTE:
NOTA: Para los ejemplos, indicar:
A nivel de ejemplo, la estructura global de los comentarios dentro聽 del fichero ser谩 la siguiente:
/** * @file STIC Button, Patron MVVM -> View * * @author STIC Arquitectura * * @version 0.0.3 */ import { html } from 'lit-element'; import { ButtonTheme } from './css/ButtonTheme.css'; import '@material/mwc-button'; import '@material/mwc-icon'; import { WcSticButtonViewModel } from './WcSticButtonViewModel'; /** * * @element wc-stic-button * * @class WcSticButtonView * * @classdesc La Vista define cómo la información y las funcionalidades se mostrarán gráficamente.<br> * Tiene la responsabilidad de definir la estructura que saldrá de la pantalla del componenete WCSticButton. * * @extends WcSticButtonViewModel */ export class WcSticButtonView extends WcSticButtonViewModel { static getStyles() { return [ButtonTheme.buttonTheme]; } render() { return html` <mwc-button .label=${this.label} .icon=${this.icon} ?trailingIcon=${this.trailingIcon} ?disabled=${this.disabled} ?dense=${this.dense} ?fullwidth=${this.fullwidth} ?outlined=${this.outlined} ?raised=${this.raised} ?unelevated=${this.unelevated}></mwc-button> `; } } window.customElements.define('wc-stic-button', WcSticButtonView);
Y dentro de esta estructura, profundizando sobre cada uno de sus elementos:
/** * @file <descripción a alto nivel del fichero> * * @author <nombreAutor> * * @version <versionFichero> (versionado semántico) */
comentario que se situar谩 en la primera l铆nea del fichero y llegar谩 hasta la l铆nea anterior de los imports.
/** * Definición del componente (puede ser multilínea) * * @element [nombre-customElement-componente] (Nombre que se le da al componente en la definición del customElement) * */
ya que con聽@element se asocia el nombre del customElement de ese componente a la documentaci贸n que aparece en el storybook.
Este bloque de comentarios vendr谩 a continuaci贸n de los imports y, por norma general, llegar谩 hasta la definici贸n de la clase exportada del fichero.
Es importante aclarar que el bloque de comentarios anterior y el bloque de comentarios de definici贸n de la clase HAN DE SER UN 脷NICO BLOQUE DE COMENTARIOS (por necesidades de los parseadores de documentaci贸n WCA y JSDOC), de modo que, por ejemplo, quedar铆a de la siguiente manera:
/** * * @element wc-stic-button * * @class WcSticButtonView * * @classdesc La Vista define cómo la información y las funcionalidades se mostrarán gráficamente.<br> * Tiene la responsabilidad de definir la estructura que saldrá de la pantalla del componenete WCSticButton. * * @extends WcSticButtonViewModel */
y, bajo ning煤n concepto, podr铆a quedar as铆:
/** * * @element wc-stic-button * */ /** * * @class WcSticButtonView * * @classdesc La Vista define cómo la información y las funcionalidades se mostrarán gráficamente.<br> * Tiene la responsabilidad de definir la estructura que saldrá de la pantalla del componenete WCSticButton. * * @extends WcSticButtonViewModel */
Por ejemplo, dentro del ViewModel, donde se definen聽las propiedades:
/** * @prop {string} label - Texto del botón. */ @property() protected label: string = "";
/** * * @element wc-stic-button * * @prop {string} [variant=primary] - Permite seleccionar el conjunto de valores "primarios" o "secundarios" mediante el selector de clases definido a tal efecto. * * @cssprop [--stic-button-background=--theme-color-background] - Color de superficie del botón. * */
Una vez instaladas las herramientas (punto 3) y documentados los componentes (punto 4) se crear谩n una serie de scripts en el archivo package.json de la ra铆z del proyecto para automatizar la generaci贸n de documentaci贸n.
Estos scripts se generar谩n dentro del package.json del storybook de desarrollo de monorepo en que se est谩 trabajando.
Dentro del fichero package.json se han creado los elementos dentro de la secci贸n scripts:
"jsdoc:generate:docs": "jsdoc --configure .jsdoc/.jsdoc.config.json --verbose" "storybook:generate:docs": "wca analyze sas/**/dist/src/** --outFile ./custom-elements.json && wcamerger --inputFile 'custom-elements.json' --outputFile 'custom-elements.json' --makeJsDocsChips --jsdocURI 'http://storybook.dev.alm.sas.junta-andalucia.es/storybook/docs'" "storybook": "npm run storybook:generate:docs && npm run jsdoc:generate:docs && start-storybook -p 6006"
Estos scripts son la para la parte del run storybook (dev), mientras que los siguientes:
"build-storybook": "npm run storybook:generate:docs && build-storybook --modern" "build": "npm run jsdoc:generate:docs && npm run build-storybook"
Son para el build de storybook y su generaci贸n de ficheros est谩ticos.
En un an谩lisis m谩s pormenorizado de los scripts:
"jsdoc:generate:docs": "jsdoc --configure .jsdoc/.jsdoc.config.json --verbose"
Este primer script genera toda la documentaci贸n mediante la herramienta JSDOC. Se usan los siguientes flags:
Esto nos genera una carpeta jsdocs en la raiz del proyecto mediante la cual se puede ver toda la documentaci贸n generada por la herramienta. Para ello (de manera local) se puede abrir el fichero index.html (Home) dentro de esta carpeta y navegar por la documentaci贸n. A modo ejemplo esta es una captura de la documentaci贸n generada por JSDOC en el storybook de DEV:
"storybook:generate:docs": "wca analyze sas/**/dist/src/** --outFile ./custom-elements.json && wcamerger --inputFile 'custom-elements.json' --outputFile 'custom-elements.json' --makeJsDocsChips --jsdocURI 'http://storybook.dev.alm.sas.junta-andalucia.es/storybook/docs'"
Este segundo script une las herramientas WCA y CEM de la siguiente manera:
"storybook": "npm run storybook:generate:docs && npm run jsdoc:generate:docs && start-storybook -p 6006"
Este tercer script sirve para ejecutar los dos scripts anteriores y lanzar el storybook de manera local, con lo que una vez finalizada su ejecuci贸n, si se accede a un componente, en la pesta帽a DOCS del mismo aparecer谩 toda la documentaci贸n generada por WCA y CEM en el fichero custom-elements.json, si como las chips de las clases generadas por JSDOC:
Destacando los chips de la parte superior :
Y tambi茅n la zona de documentaci贸n de la API (imagen parcial) :
En la que se puede聽ver c贸mo se integra en Storybook toda la documentaci贸n generada por WCA en el fichero custom-element.json y que posteriormente se une para todas las TAGS del componente a trav茅s de CustomElementMerger .