React Router

// article/delete.js
// Only a single action per file 😕
export async function action({ request }) {
  const { article_id } = await request.json()
  await db.article.delete({ article_id })
  return Response.json({ success: true })
}
// Article.jsx
export default function Article() {
  const onClick = async () => {
    // Lots of boilerplate 😕
    const res = await fetch("/article/delete", {
      method: "POST",
      headers: { "Content-Type": "application/json" },
      body: JSON.stringify({ article_id })
    })
    const { success } = await res.json()
    if (!success) alert("Deletion failed")
  }
  return <button onClick={onClick}>Delete</button>
}

Vike + Telefunc

// Article.telefunc.js
export async function onArticleDelete({ article_id }) {
  await db.article.delete({ article_id })
  return { success: true }
}
// Article.jsx
import { onArticleDelete } from './article.telefunc.js'
export default function Article() {
  const onClick = async () => {
    const { success } = await onArticleDelete({ article_id })
    if (!success) alert("Deletion failed")
  }
  return <button onClick={onClick}>Delete</button>
}