Vite + Hono + TanStack port of the Shopify storefront

Ports nextjs-templates/shopify-storefront to Vite, TanStack Router/Query,
Tailwind v4 and Hono, without the AI store assistant.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Rami Bitar
2026-10-03 11:27:27 -04:00
co-authored by Claude Opus 5.5
commit c447c51e82
82 changed files with 11712 additions and 0 deletions
+30
View File
@@ -0,0 +1,30 @@
// Production entry: the API plus the static client build, with an SPA fallback
// so deep links like /products/:handle load index.html.
import { readFile } from 'node:fs/promises';
import { Hono } from 'hono';
import { serve } from '@hono/node-server';
import { serveStatic } from '@hono/node-server/serve-static';
import api from './app';
const CLIENT_DIR = './dist/client';
const indexHtml = await readFile(`${CLIENT_DIR}/index.html`, 'utf8');
const app = new Hono();
app.route('/', api);
// Unknown API paths stay JSON 404s rather than falling through to the SPA.
app.all('/api/*', (c) => c.json({ error: 'Not found' }, 404));
// Hashed build assets never change, so let browsers keep them.
app.use('/assets/*', async (c, next) => {
await next();
c.header('Cache-Control', 'public, max-age=31536000, immutable');
});
app.use('*', serveStatic({ root: CLIENT_DIR }));
app.get('*', (c) => c.html(indexHtml));
const port = Number(process.env.PORT) || 3000;
serve({ fetch: app.fetch, port }, (info) => {
console.log(`Storefront listening on http://localhost:${info.port}`);
});