Gere guias de integração, mapas de arquitetura e métricas em tempo real. Transforme seu código legado em uma base de conhecimento clara instantaneamente.
Documente projetos construídos com
Lidamos com o trabalho pesado de forma assíncrona. Você obtém o resultado instantaneamente.
Tudo o que você precisa para transformar sua base de código em documentação clara e atualizada.
Integre-se diretamente ao seu pipeline de CI/CD ou execute localmente com um único comando.
Acompanhe a cobertura e a qualidade da documentação ao longo do tempo. Identifique módulos não documentados instantaneamente.
Nós não apenas adivinhamos. Analisamos o AST para entender a estrutura do seu código com precisão.
Seu código nunca treina nossos modelos. Infraestrutura compatível com SOC2 Tipo II.
Exporte para Markdown, PDF, Notion ou implante automaticamente como um site estático.
Acompanhe a dívida técnica, identifique
Fator de ônibus
1.2Risco Crítico: módulo `auth/core`
Capacidade de manutenção
A+Para código aberto
Comece grátisPara desenvolvedores profissionais
Torne-se profissionalPara equipes de engenharia
Entre em contato com vendasexport async function processSub(uId: string, plan: string) {
const user = await db.user.findById(uId);
if (!user.isActive) throw new Error("403");
if (user.sub === plan) return null;
const price = PRICING[plan];
// Charge the user
await stripe.charges.create({
amount: price * 100,
currency: 'usd',
customer: user.stripeId
});
await db.user.update(uId, { sub: plan, status: 'active' });
await email.sendWelcome(user.email, plan);
return true;
}/**
* Upgrades user subscription and handles payment processing.
*
* @description
* 1. Verifies user status (must be active).
* 2. Deduplicates requests (returns null if already on plan).
* 3. Charges card via Stripe and updates local DB.
*
* @param {string} uId - Internal user UUID.
* @param {string} plan - Target plan ID (e.g., 'PRO_YEARLY').
* @throws {Error} "403" if user is suspended/inactive.
* @returns {Promise<boolean|null>} True on success, null if no change needed.
*
* @example
* try {
* await processSub("user_123", "ENTERPRISE");
* } catch (err) {
* logger.error("Payment failed", err);
* }
*/
export async function processSub(uId: string, plan: string) {
const user = await db.user.findById(uId);
if (!user.isActive) throw new Error("403"); // User suspended
if (user.sub === plan) return null; // Already subscribed
const price = PRICING[plan];
// Charge the user
await stripe.charges.create({
amount: price * 100, // Convert to cents
currency: 'usd',
customer: user.stripeId
});
// Update db and send email
await db.user.update(uId, { sub: plan, status: 'active' });
await email.sendWelcome(user.email, plan);
return true;
}Da visão geral de alto nível à manipulação de bytes de baixo nível. Geramos todos os formatos que sua equipe precisa.
Solte um arquivo de configuração simples em sua raiz. Lidamos com análise, limites de token e solicitação de engenharia automaticamente.
{
"project": "my-awesome-saas",
"entry": ["src/**/*.ts"],
"exclude": ["**/*.spec.ts"],
"output": {
"modes": ["onboarding", "technical", "migration-guide"],
"metrics": true,
"format": "markdown",
"path": "./docs"
},
"metrics": ["complexity", "bus-factor"]
}