mirror of
https://github.com/hanzoai/shadcn.git
synced 2026-10-30 18:22:59 +00:00
* refactor: decouple @hanzo/ui from hanzogui Make @hanzo/ui shadcn-only — no hanzogui/Tamagui coupling. - remove primitives/bases (gui/admin/svelte/vue) re-exports - drop @hanzogui peerDependencies + peerDependenciesMeta entries - add check-no-hanzogui guard, wired into build - fix latent NodeJS.Timeout types to keep the build green * refactor: remove duplicate @hanzo/brand from the monorepo @hanzo/brand is owned by the standalone hanzoai/brand (the npm-canonical source); this monorepo's copy was unused and had drifted. - delete pkg/brand - add check-no-brand-pkg guard (wired into `check`) so it can't reappear * refactor(ui): stop importing from the app; use own cn util pkg/ui pulled `cn` from @/lib/utils (../../app) — an inverted dependency on the consuming app. Point the animation components at pkg/ui's own cn and drop the @/app, @/registry, @/lib tsconfig path aliases. * fix(ui): type errors; stop tracking the root lockfile - ModelCard: lucide-react dropped the Github icon → use Code - drawer: annotate DrawerTrigger/DrawerClose (radix type portability) - untrack root pnpm-lock.yaml; CI → --no-frozen-lockfile * release: bump @hanzo/ui to 5.7.0 * refactor: rename pkg/ → pkgs/, merge packages/ into it standardize on 'pkgs/': move pkg/* and packages/* into pkgs/. Update workspace globs, CI, scripts, and config references accordingly.
121 lines
3.0 KiB
TypeScript
121 lines
3.0 KiB
TypeScript
/**
|
|
* By default, Remix will handle generating the HTTP Response for you.
|
|
* You are free to delete this file if you'd like to, but if you ever want it revealed again, you can run `npx remix reveal` ✨
|
|
* For more information, see https://remix.run/docs/en/main/file-conventions/entry.server
|
|
*/
|
|
|
|
import { PassThrough } from "node:stream";
|
|
|
|
import type { EntryContext } from "@remix-run/node";
|
|
import { createReadableStreamFromReadable } from "@remix-run/node";
|
|
import { RemixServer } from "@remix-run/react";
|
|
import { isbot } from "isbot";
|
|
import { renderToPipeableStream } from "react-dom/server";
|
|
|
|
const ABORT_DELAY = 5_000;
|
|
|
|
export default function handleRequest(
|
|
request: Request,
|
|
responseStatusCode: number,
|
|
responseHeaders: Headers,
|
|
remixContext: EntryContext,
|
|
) {
|
|
return isbot(request.headers.get("user-agent"))
|
|
? handleBotRequest(
|
|
request,
|
|
responseStatusCode,
|
|
responseHeaders,
|
|
remixContext,
|
|
)
|
|
: handleBrowserRequest(
|
|
request,
|
|
responseStatusCode,
|
|
responseHeaders,
|
|
remixContext,
|
|
);
|
|
}
|
|
|
|
function handleBotRequest(
|
|
request: Request,
|
|
responseStatusCode: number,
|
|
responseHeaders: Headers,
|
|
remixContext: EntryContext,
|
|
) {
|
|
return new Promise((resolve, reject) => {
|
|
const { abort, pipe } = renderToPipeableStream(
|
|
<RemixServer
|
|
context={remixContext}
|
|
url={request.url}
|
|
abortDelay={ABORT_DELAY}
|
|
/>,
|
|
{
|
|
onAllReady() {
|
|
const body = new PassThrough();
|
|
|
|
responseHeaders.set("Content-Type", "text/html");
|
|
|
|
resolve(
|
|
new Response(createReadableStreamFromReadable(body), {
|
|
headers: responseHeaders,
|
|
status: responseStatusCode,
|
|
}),
|
|
);
|
|
|
|
pipe(body);
|
|
},
|
|
onShellError(error: unknown) {
|
|
reject(error);
|
|
},
|
|
onError(error: unknown) {
|
|
responseStatusCode = 500;
|
|
console.error(error);
|
|
},
|
|
},
|
|
);
|
|
|
|
setTimeout(abort, ABORT_DELAY);
|
|
});
|
|
}
|
|
|
|
function handleBrowserRequest(
|
|
request: Request,
|
|
responseStatusCode: number,
|
|
responseHeaders: Headers,
|
|
remixContext: EntryContext,
|
|
) {
|
|
return new Promise((resolve, reject) => {
|
|
const { abort, pipe } = renderToPipeableStream(
|
|
<RemixServer
|
|
context={remixContext}
|
|
url={request.url}
|
|
abortDelay={ABORT_DELAY}
|
|
/>,
|
|
{
|
|
onShellReady() {
|
|
const body = new PassThrough();
|
|
|
|
responseHeaders.set("Content-Type", "text/html");
|
|
|
|
resolve(
|
|
new Response(createReadableStreamFromReadable(body), {
|
|
headers: responseHeaders,
|
|
status: responseStatusCode,
|
|
}),
|
|
);
|
|
|
|
pipe(body);
|
|
},
|
|
onShellError(error: unknown) {
|
|
reject(error);
|
|
},
|
|
onError(error: unknown) {
|
|
console.error(error);
|
|
responseStatusCode = 500;
|
|
},
|
|
},
|
|
);
|
|
|
|
setTimeout(abort, ABORT_DELAY);
|
|
});
|
|
}
|