import { createHydrogenContext } from '@shopify/hydrogen';
import { WeaverseClient } from '@weaverse/hydrogen';
import {
CART_MUTATION_FRAGMENT,
CART_QUERY_FRAGMENT,
} from '~/graphql/fragments';
import { components } from '~/weaverse/components';
import { themeSchema } from '~/weaverse/schema.server';
export async function createHydrogenRouterContext(
request: Request,
env: Env,
executionContext: ExecutionContext,
) {
const waitUntil = executionContext.waitUntil.bind(executionContext);
const [cache, session] = await Promise.all([
caches.open('hydrogen'),
AppSession.init(request, [env.SESSION_SECRET]),
]);
const hydrogenContext = createHydrogenContext({
env,
request,
cache,
waitUntil,
session,
i18n: getLocaleFromRequest(request),
cart: {
queryFragment: CART_QUERY_FRAGMENT,
mutateFragment: CART_MUTATION_FRAGMENT,
},
});
const weaverse = new WeaverseClient({
...hydrogenContext,
request,
cache,
themeSchema,
components,
});
// Add weaverse directly to the hydrogenContext instance.
// This preserves the RouterContextProvider class instance — do not
// return a spread copy such as `{ ...hydrogenContext, weaverse }`.
Object.assign(hydrogenContext, { weaverse });
return hydrogenContext;
}