A documentação é gerada automaticamente com base nos códigos fontes utilizando o processador de documentação Dgeni e o JSDoc.
Este guia descreve como documentar os códigos-fonte, bem como os padrões de documentação do projeto PO UI. A seguir, serão apresentados exemplos e padrões para a criação da documentação.
A documentação do código ficará no mesmo arquivo do código-fonte, que será identificado por estar entre os símbolos de comentários:
/** */
. Abaixo, segue as tags comuns para documentação geral de componentes, módulos, serviços, entre outros.
Para inserir uma descrição utilize a tag @description
, conforme o exemplo abaixo:
/**
* @description
*
* Escreva descrições claras, concisas e objetivas de forma que o leitor saiba identificar:
* - Do que se trata;
* - Como usar;
* - Onde é utilizado;
* - Onde não é utilizado.
*/
Como não existe uma tag específica para propriedades, a descrição deve vir antes da declaração da propriedade (linha acima). É importante que as propriedades estejam tipadas, para que o processador possa gerar a documentação especificando o tipo da propriedade de forma correta.
Existe também a tag @description
que define a descrição de uma propriedade, ela é utilizada quando existem mais tags com
informações na documentação.
Exemplo de documentação das propriedades:
/** Título do Widget. */
@Input('p-title') title: string;
/**
* Link de ajuda.
* Também é possível usar mais de uma linha de comentário como descrição das propriedades.
*/
@Input('p-help') help?: string;
/** Função que será chamada na primeira ação. */
@Output('p-primary-action') primaryAction = new EventEmitter;
// Essa linha não será incluída na documentação.
@Input('p-primary-label') primaryLabel?: string;
Para indicar se a propriedade é opcional, basta utilizar o operador ?
(elvis), por exemplo:
@Input('p-optional') optional?: string;
Caso não seja possível definir que a propriedade é opcional com o operador ?
(elvis), por exemplo quando existe um set
da propriedade, é possível utilizar também a tag @optional
, conforme exemplificado abaixo:
Ao utilizar a tag
@optional
, a mesma deve vir antes de todas as outras tags, apenas a tag@deprecated
pode vir antes da tag@optional
.
/**
* @optional
*
* @description
*
* Indica a quantidade mínima de caracteres que o campo aceita.
*/
@Input('p-minlength') set minLength(minLength: number) {
this._minLength = minLength;
this.validators['minlength'] = this.getValidatorMinlength();
this.updateValidators();
}
No caso da propriedade possuir um valor padrão, é necessário adicionar a tag @default
e utilização de crase simples no valor.
Por exemplo nesse caso onde o valor default da propriedade 'p-size' é 'md'.
/**
* @description
*
* Define o tamanho do elemento, pode receber os valores 'lg' e 'md'.
*
* @default `md`
*/
@Input('p-size') size: string;
Quando uma propriedade é depreciada a tag @deprecated
pode ser utilizada.
/**
* @deprecated 12.1.21
*
* @description
*
* Define o botão com padrão de cor "primary" (principal) do contrário vai utilizar as cores "default".
*
* > Use a nova propriedade `p-type`.
*/
@Input('p-primary') primary: boolean;
Caso seja necessário ocultar algum comentário de documentação, pode ser utilizada a tag de JSDoc @docsPrivate
ou
um comentário simples com //
. Por exemplo:
/** @docsPrivate */
description: string;
// Função executada ao clicar na ação.
function?: string | Function;
Ao se referir as propriedades, lembre-se:
- O
@Input
é uma propriedade@prop
(property binding).- O
@Output
é um evento@event
(event binding).
Segue apresentação das documentações específicas de cada item da arquitetura:
É possível herdar a descrição e as propriedades de outras classes. Para isso, adicione a tag @docExtends
e o nome da
classe que se deseja herdar, conforme o exemplo a seguir:
/**
* @docExtends PoButtonBaseComponent
*/
É possivel ignorar a descrição da classe ou interface estendida. Para isso, adicione a tag @ignoreExtendedDescription
na classe ou interface mãe, conforme o exemplo a seguir:
/**
* @docExtends PoButtonBaseComponent
*
* @ignoreExtendedDescription
*/
Os samples podem ser incluídos na documentação através da tag @example
e incluindo o exemplo dentro de <example></example>
.
Para a criação ou referência de cada arquivo, utiliza-se a tag <file> </file>
, conforme o exemplo a seguir:
/**
* @docExtends PoButtonBaseComponent
*
* @example
*
* <example name='po-button' title='Tipos e tamanhos do po-button' >
* <file name='sample-po-button.component.html'> </file>
* <file name='sample-po-button.component.ts'> </file>
* </example>
*
* <example name='po-button-click' title='Eventos de click e botão desabilitado'>
* <file name='sample-po-button-click.component.html'> </file>
* <file name='sample-po-button-click.component.ts'> </file>
* <file name='sample-po-button-click.component.css'> </file>
* </example>
*
* <example name='po-button-labs' title='PO Button Labs'>
* <file name='sample-po-button-labs.component.html'> </file>
* <file name='sample-po-button-labs.component.ts'> </file>
* </example>
*/
@Component({
selector: 'po-button',
templateUrl: './po-button.component.html',
providers: []
})
export class PoButtonComponent extends PoButtonBaseComponent { }
Para criar diversos blocos de exemplo, adicione outras tags do tipo <example></example
. Sempre utilize o mesmo padrão
de nome para os arquivos, como:
<file name='sample-po-button-click.component.html'> ... </file>
<file name='sample-po-button-click.component.ts'> ... </file>
Os arquivos referenciados devem ficar na pasta /samples
do componente, conforme
exemplo do po-button.
O padrão de nomenclatura dos samples deve ser sample-po-<nome>.<type>.<extensao>
, por exemplo:
<file name='sample-po-button.component.html'> ... </file>
<file name='sample-po-button.component.ts'> ... </file>
O nome do componente exportado, o seletor e o template URL também devem seguir o padrão:
@Component({
selector: 'sample-po-button',
templateUrl: './sample-po-button.component.html',
})
export class SamplePoButtonComponent {}
Coloque nomes diferentes para os samples, por exemplo:
<example name='po-button'> ... </example>
<example name='po-button-click'> ... </example>
<example name='po-button-labs'> ... </example>
No caso de mais samples, lembre-se de seguir o mesmo padrão de nome definido para os arquivos:
export class SamplePoButtonClickComponent {
Também é possível criar uma tag <file name='sample-po-button.component.css'> </file>
para arquivos .css, como:
stylesUrls: ['./sample-po-button.component.css'],
Mantenha a indentação, organização, simplicidade e sempre valide o código do sample, para garantir a qualidade do seu código utilize ferramentas de LINT.
Exemplo de fonte completo:
A tag @usedBy
é utilizada para descrever em quais componentes a documentação da interface/ enums deve aparecer.
/**
* @usedBy PoPageListComponent, PoPageBaseComponent
*/
Exemplo de documentação completa de uma interface:
/**
* @usedBy PoModalComponent
*
* @description
*
* Interface que define os botões de ação do componente `po-modal`.
*/
export interface PoModalAction {
/** Função que será executada ao clicar sobre o botão. */
action: Function;
/**
* Define o tipo *danger* no botão.
*
* > Caso a propriedade esteja definida em ambos os botões, apenas o botão primário recebe o tipo *danger*.
*/
danger?: boolean;
/** Desabilita o botão impossibilitando que sua ação seja executada. */
disabled?: boolean;
/** Rótulo do botão. */
label: string;
/** Habilita um estado de carregamento ao botão, desabilitando-o e exibindo um ícone de carregamento à esquerda de seu rótulo. */
loading?: boolean;
}
Fonte completo: po-modal-action.interface.ts
Para a documentação dos parâmetros do serviço, utiliza-se a tag @param
dentro dos comentários, seguida do nome do parâmetro,
do tipo e da descrição, conforme o exemplo abaixo:
/**
* Emite uma notificação de sucesso.
*
* @param notification { PoNotification | string } Objeto com os dados da notificação ou somente a string com a
* mensagem da notificação.
* @param viewContainerRef { ViewContainerRef } Container do componente.
*/
Nesta seção, serão apresentadas as boas práticas para a documentação no projeto do PO UI.
-
Coloque o comentário de documentação logo abaixo dos imports.
-
Ao se referir a um item da arquitetura, como por exemplo um componente, sempre utilize o nome do seletor:
- Certo: "O componente po-widget".
- Errado: "O componente Widget".
-
Ordem de precedência na escrita das tags na documentação:
@docExtends
,@usedBy
e@docsPrivate
.@description
.@example
.
- Sempre deixe um espaçamento de uma linha entre a tag e o texto, por exemplo:
/**
* @description
*
* Interface para as ações dos componentes po-page-default e po-page-list.
*/
"EM BREVE"