Genere guías de incorporación, mapas de arquitectura y métricas en vivo. Convierta su código heredado en una base de conocimientos clara al instante.
Documentar proyectos creados con
Manejamos el trabajo pesado de forma asincrónica. Obtendrás el resultado al instante.
Todo lo que necesitas para transformar tu código base en documentación clara y actualizada.
Integre directamente en su proceso de CI/CD o ejecútelo localmente con un solo comando.
Realice un seguimiento de la cobertura y la calidad de la documentación a lo largo del tiempo. Identifique módulos no documentados al instante.
No nos limitamos a adivinar. Analizamos el AST para comprender la estructura de su código con precisión.
Su código nunca entrena nuestros modelos. Infraestructura compatible con SOC2 Tipo II.
Exporte a Markdown, PDF, Notion o impleméntelo como un sitio estático automáticamente.
Seguimiento de la deuda técnica, identificación
Factor de autobús
1.2Riesgo crítico: módulo `auth/core`
Mantenibilidad
A+Para código abierto
Comience gratisPara desarrolladores profesionales
Hazte profesionalPara equipos de ingeniería
Contacto Ventasexport 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;
}Desde una descripción general de alto nivel hasta la manipulación de bytes de bajo nivel. Generamos todos los formatos que tu equipo necesita.
Coloque un archivo de configuración simple en su raíz. Manejamos el análisis, los límites de tokens y la ingeniería rápida automáticamente.
{
"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"]
}