Générez des guides d'intégration, des cartes d'architecture et des métriques en direct. Transformez instantanément votre code existant en une base de connaissances claire.
Documenter les projets construits avec
Nous gérons le gros du travail de manière asynchrone. Vous obtenez simplement le résultat instantanément.
Tout ce dont vous avez besoin pour transformer votre base de code en une documentation claire et à jour.
Intégrez directement dans votre pipeline CI/CD ou exécutez localement avec une seule commande.
Suivez la couverture et la qualité de la documentation au fil du temps. Identifiez instantanément les modules non documentés.
Nous ne nous contentons pas de deviner. Nous analysons l'AST pour comprendre avec précision la structure de votre code.
Votre code n'entraîne jamais nos modèles. Infrastructure conforme SOC2 Type II.
Exportez vers Markdown, PDF, Notion ou déployez automatiquement en tant que site statique.
Suivre la dette technique, identifier
Facteur de bus
1.2Risque critique : module `auth/core`
Maintenabilité
A+Pour l'open source
Commencez gratuitementPour les développeurs professionnels
Devenez proPour les équipes d'ingénierie
Contacter le service commercialexport 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;
}De la présentation de haut niveau à la manipulation d'octets de bas niveau. Nous générons tous les formats dont votre équipe a besoin.
Déposez un simple fichier de configuration à votre racine. Nous gérons automatiquement l'analyse, les limites de jetons et l'ingénierie des invites.
{
"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"]
}