Guia para IA

Use esta página como referência compacta ao gerar exemplos, tutoriais, migrações ou código de aplicações para @beforesemicolon/router.

Propósito do pacote

@beforesemicolon/router é uma biblioteca de roteamento orientada a HTML e construída com Web Components. Ela fornece elementos personalizados para navegação e renderização de rotas, além de uma pequena API JavaScript para navegação programática, inscrições, proteções, módulos de rota, metadados, atualização de consultas e roteamento por hash.

Importações necessárias

Para aplicações empacotadas:

javascript
import '@beforesemicolon/router'

Ao usar APIs exportadas:

javascript
import {
    goToPage,
    onPage,
    onPageChange,
    registerGlobalGuard,
    registerRouteGuard,
    registerRouteModules,
    updateSearchQuery,
} from '@beforesemicolon/router'

Para uso direto no navegador, carregue Web Component primeiro:

html
<script src="https://unpkg.com/@beforesemicolon/web-component/dist/client.js"></script>
<script src="https://unpkg.com/@beforesemicolon/router/dist/client.js"></script>

As APIs via CDN ficam disponíveis em BFS.ROUTER.

Elementos personalizados

Use estes elementos exatamente como demonstrado:

html
<page-link path="/docs" title="Docs">Docs</page-link>
<page-route path="/docs" src="./pages/docs.html"></page-route>
<page-route-query key="tab" value="api">API tab</page-route-query>
<page-redirect path="/404"></page-redirect>
<page-data param="id">fallback</page-data>

Padrões de rota

Use :name para parâmetros dinâmicos:

html
<page-route path="/users/:userId">
    User <page-data param="userId">unknown</page-data>
</page-route>

Defina exact="false" em rotas de layout que devem permanecer ativas em caminhos aninhados:

html
<page-route path="/docs" exact="false">
    <page-route path="/intro">Intro</page-route>
    <page-route path="/api">API</page-route>
</page-route>

Use path para navegação por caminho e search para atualizar consultas. Use keep-current-search ao atualizar uma chave de consulta preservando as demais.

html
<page-link path="/projects">Projects</page-link>
<page-link search="view=grid" keep-current-search>Grid</page-link>

Use $ dentro de uma rota aninhada para referenciar o caminho da rota pai mais próxima:

html
<page-route path="/projects/:projectId" exact="false">
    <page-link path="$/settings">Settings</page-link>
</page-route>

Use ~ para referenciar o caminho atual do navegador:

html
<page-link path="~/edit">Edit current page</page-link>

Conteúdo de rota sob demanda

src pode carregar módulos HTML, texto ou JavaScript. Módulos JavaScript devem exportar como padrão uma string, um Node do DOM, um HtmlTemplate do Markup ou uma função que recebe (data, params, query).

javascript
import { html } from '@beforesemicolon/web-component'

export default (data, params, query) => html`
    <h1>Project ${params.projectId}</h1>
    <p>Filter: ${query.filter || 'all'}</p>
    <p>Opened from: ${data.from || 'direct visit'}</p>
`

goToPage e replacePage são assíncronas e aceitam um objeto literal como estado.

javascript
await goToPage('/users/42', { from: 'search' }, 'User 42')
await replacePage('/login', { reason: 'expired' }, 'Login')

Proteções

registerGlobalGuard e registerRouteGuard registram proteções e não retornam funções de limpeza. Uma proteção retorna:

javascript
registerGlobalGuard((pathname) => {
    if (pathname.startsWith('/account') && !auth.isSignedIn()) {
        return '/login'
    }

    return true
})

Dados de consulta

getSearchParams analisa valores de consulta com o analisador JSON do roteador. Valores escritos com updateSearchQuery fazem ida e volta pela serialização JSON.

javascript
updateSearchQuery({ page: 2, tags: ['router', 'web'] })

Evite estes erros

editar este documento