Routing

MiniWork uses file-based routing where your file structure defines your URL structure.

Basic Routes

routes/about/+page.tsx
        export default function AboutPage() {
  return (
    <div>
      <h1>About Us</h1>
      <p>Welcome to our website.</p>
    </div>
  );
}
      

Dynamic Routes

routes/posts/[id]/+page.tsx
        export async function loader({ params, db }) {
  const post = db.query('SELECT * FROM posts WHERE id = ?', [params.id]);
  return { post };
}

export default function PostPage({ data }) {
  return (
    <article>
      <h1>{data.post.title}</h1>
      <p>{data.post.content}</p>
    </article>
  );
}
      

Loaders

Loaders fetch data before rendering. They run on the server:

export async function loader(ctx) {
  const users = ctx.db.query('SELECT * FROM users');
  const page = ctx.url.searchParams.get('page') || '1';
  return { users, page: parseInt(page) };
}

Actions

Actions handle form submissions and mutations:

export async function action(ctx) {
  const formData = await ctx.formData();
  const name = formData.get('name');
  
  ctx.db.run('INSERT INTO users (name) VALUES (?)', [name]);
  return ctx.redirect('/users');
}