Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
const immediateAsyncAssets = asyncAssetManager.used(
AssetTiming.Immediate,
);
const [styles, scripts] = await Promise.all([
assets.styles({name: 'main', asyncAssets: immediateAsyncAssets}),
assets.scripts({name: 'main', asyncAssets: immediateAsyncAssets}),
]);
const response = stream(
{app}
,
);
ctx.set(Header.ContentType, 'text/html');
ctx.body = response;
} catch (error) {
const errorMessage = `React server-side rendering error:\n${error.stack ||
error.message}`;
logger.log(errorMessage);
ctx.status = StatusCode.InternalServerError;
// eslint-disable-next-line no-process-env
if (process.env.NODE_ENV === 'development') {
ctx.body = errorMessage;
} else {
ctx.throw(StatusCode.InternalServerError, error);
}
}
}
]);
const response = stream(
{app}
,
);
ctx.set(Header.ContentType, 'text/html');
ctx.body = response;
} catch (error) {
const errorMessage = `React server-side rendering error:\n${error.stack ||
error.message}`;
logger.log(errorMessage);
ctx.status = StatusCode.InternalServerError;
// eslint-disable-next-line no-process-env
if (process.env.NODE_ENV === 'development') {
ctx.body = errorMessage;
} else {
ctx.throw(StatusCode.InternalServerError, error);
}
}
}
);
ctx.set(Header.ContentType, 'text/html');
ctx.body = response;
} catch (error) {
const errorMessage = `React server-side rendering error:\n${error.stack ||
error.message}`;
logger.log(errorMessage);
ctx.status = StatusCode.InternalServerError;
// eslint-disable-next-line no-process-env
if (process.env.NODE_ENV === 'development') {
ctx.body = errorMessage;
} else {
ctx.throw(StatusCode.InternalServerError, error);
}
}
}
{app}
);
},
});
} catch (error) {
logger.error(error);
throw error;
}
applyToContext(ctx, networkManager);
const response = renderToString({app});
ctx.set(Header.ContentType, 'text/html');
ctx.body = response;
return response;
};
}
server,
initialData,
graphQLEndpoint = '/graphql',
connectToDevTools,
headers = {},
}: Options) {
const cache = new InMemoryCache({
dataIdFromObject: object => object.id,
});
const link = createHttpLink({
credentials: 'include',
uri: graphQLEndpoint,
headers: {
[Header.Accept.toLowerCase()]: 'application/json',
[Header.ContentType.toLowerCase()]: 'application/json',
...headers,
},
});
return new ApolloClient({
link,
ssrMode: server,
ssrForceFetchDelay: 100,
cache: initialData ? cache.restore(initialData) : cache,
connectToDevTools: !server && connectToDevTools,
});
}
return function CombinedProvider({children}: Props) {
const csrfToken = useRequestHeader('x-csrf-token') || '';
return (
{children}
);
};
}
async function renderFunction(ctx: Context) {
const logger = getLogger(ctx) || console;
const assets = getAssets(ctx);
const networkManager = new NetworkManager({
headers: ctx.headers,
cookies: ctx.request.headers.cookie || '',
});
const htmlManager = new HtmlManager();
const asyncAssetManager = new AsyncAssetManager();
const hydrationManager = new HydrationManager();
function Providers({children}: {children: React.ReactElement}) {
return (
{children}
return async function render(ctx: RenderContext) {
const app = renderFunction(ctx);
const networkManager = new NetworkManager();
const htmlManager = new HtmlManager();
try {
await extract(app, {
decorate(app) {
return (
{app}
);
},
});
} catch (error) {
logger.error(error);
);
},
afterEachPass({renderDuration, resolveDuration, index, finished}) {
const pass = `Pass number ${index} ${
finished ? ' (this was the final pass)' : ''
}`;
const rendering = `Rendering took ${renderDuration}ms`;
const resolving = `Resolving promises took ${resolveDuration}ms`;
logger.log(pass);
logger.log(rendering);
logger.log(resolving);
},
...options,
});
applyToContext(ctx, networkManager);
const immediateAsyncAssets = asyncAssetManager.used(
AssetTiming.Immediate,
);
const [styles, scripts] = await Promise.all([
assets.styles({name: 'main', asyncAssets: immediateAsyncAssets}),
assets.scripts({name: 'main', asyncAssets: immediateAsyncAssets}),
]);
const response = stream(
{app}
,
);
ctx.set(Header.ContentType, 'text/html');
decorate(app) {
return (
{app}
);
},
});
} catch (error) {
logger.error(error);
throw error;
}
applyToContext(ctx, networkManager);
const response = renderToString({app});
ctx.set(Header.ContentType, 'text/html');
ctx.body = response;
return response;
};
}