Patrones, gotchas y reglas acumuladas en 5 plugins con +95 pts en el Bot Store. Todo lo que necesitás saber para pasar la revisión de la comunidad.
Estas son las reglas que NUNCA debés violar. El bot de revisión las detecta automáticamente.
innerHTML. Usá createEl(), createDiv(), createSpan().fetch() directo. Usá requestUrl() de la API de Obsidian. Retorna { status, json, text } — son propiedades, no métodos.new Setting(containerEl).setName("Título").setHeading().confirm() ni window.confirm(). Usá un Modal personalizado de Obsidian.window.prompt(). Usá un Modal personalizado.window.setTimeout() en vez de setTimeout() bare. Para compatibilidad con popout windows.void (async () => { ... })().@since de cada API contra minAppVersion en manifest.json antes de escribir código.Leé references/obsidian.md — gotchas acumulados, compatibilidad de API, reglas del bot de revisión, patrones, y flujo de releases.
Para cada método de la API de Obsidian que uses, verificá la anotación @since en node_modules/obsidian/obsidian.d.ts y compará con minAppVersion.
| API | @since | Alternativa compatible |
|---|---|---|
fileManager.trashFile() | 1.6.6 | vault.trash(file, true) (0.9.7) |
workspace.revealLeaf() | 1.7.2 | setActiveLeaf(leaf, { focus: true }) (0.16.3) |
PluginSettingTab.display() | deprecated 1.13.0 | Extraer método render(), delegar desde display() |
innerHTML → métodos de creación DOMfetch() → requestUrl() con { url, method?, headers?, body? }requestUrl() retorna { status, json, text } — son propiedades, no métodosres.status >= 200 && res.status < 300 en vez de res.okconfirm() / window.confirm() → Modal personalizadosetHeading(), no createEl("h2")setTimeout() usa prefijo window.JSON.parse() resultados tipados explícitamente (no any)v; versions.json actualizadomain.js, manifest.json, styles.cssno-unsupported-api rechaza APIs nuevas; no-deprecated-api exige las mismas. Fix: subir minAppVersion.\n, \r, \\, \".Array.sort() muta in-place. Usá [...arr].sort() o arr.toSorted() en views.data.json del plugin no se sincroniza. Implementá auto-descubrimiento de books desde el filesystem del vault.onload(). Fallback a adapter.list() / adapter.exists().DEFAULT_SETTINGS solo aplica a instalaciones nuevas. Los usuarios existentes necesitan lógica de migración.gh release create manualmente y el CI también lo hace, falla. Solo subí el tag — CI maneja el release.requestUrl no soporta signal/AbortController. No podés pasar AbortSignal.timeout(). Eliminá la lógica de timeout o wrappeá con Promise.race.setTimeout que retornan non-void activan warnings. Usá block body: setTimeout(() => { expression; }).references/obsidian.md revisado para gotchas relevantesminAppVersion vía @sinceinnerHTML, fetch() raw, confirm(), ni window.prompt()setHeading(), no createEl("h2"/"h3")setTimeout() usa prefijo window.; handlers async wrappeados con voidJSON.parse() y requestUrl().json resultados tipados explícitamentev; versions.json actualizado en mainmain.js, manifest.json, styles.cssmanifest.json minAppVersion ≥ @since más alto entre APIs usadas