Skip to content

Commit fe2f09b

Browse files
authored
feat(gatsby): let serve use getServerData headers (#33159)
* feat(gatsby): let serve use getServerData headers * fix types
1 parent fc66250 commit fe2f09b

File tree

3 files changed

+38
-6
lines changed

3 files changed

+38
-6
lines changed

packages/gatsby/cache-dir/page-ssr/index.d.ts

+12-1
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,12 @@ interface IQueryResult {
2727
// https://codemix.com/opaque-types-in-javascript/
2828
type Opaque<K, T> = T & { __TYPE__: K }
2929
// redacted details as this is meant to be opaque internal type that shouldn't be relied on by integrators (can change any time)
30-
type ISSRData = Opaque<"ISSRData", {}>
30+
type ISSRData = Opaque<
31+
"ISSRData",
32+
{
33+
serverDataHeaders?: Record<string, string>
34+
}
35+
>
3136

3237
type PageContext = Record<string, any>
3338

@@ -52,6 +57,12 @@ export function getData(args: {
5257
runQuery(query: string, context: Record<string, any>): Promise<IQueryResult>
5358
findPageByPath(pathName: string): IGatsbyPage | undefined
5459
}
60+
req: Partial<{
61+
query: Record<string, unknown>
62+
method: string
63+
url: string
64+
headers: Record<string, string>
65+
}>
5566
}): Promise<ISSRData>
5667

5768
export function renderPageData(args: {

packages/gatsby/src/commands/serve.ts

+16-2
Original file line numberDiff line numberDiff line change
@@ -232,12 +232,12 @@ module.exports = async (program: IServeProgram): Promise<void> => {
232232
program.directory,
233233
`.cache`,
234234
`query-engine`
235-
))
235+
)) as typeof import("../schema/graphql-engine/entry")
236236
const { getData, renderPageData, renderHTML } = require(path.join(
237237
program.directory,
238238
`.cache`,
239239
`page-ssr`
240-
))
240+
)) as typeof import("../utils/page-ssr-module/entry")
241241
const graphqlEngine = new GraphQLEngine({
242242
dbPath: path.join(program.directory, `.cache`, `data`, `datastore`),
243243
})
@@ -260,6 +260,13 @@ module.exports = async (program: IServeProgram): Promise<void> => {
260260
req,
261261
})
262262
const results = await renderPageData({ data })
263+
if (page.mode === `SSR` && data.serverDataHeaders) {
264+
for (const [name, value] of Object.entries(
265+
data.serverDataHeaders
266+
)) {
267+
res.setHeader(name, value)
268+
}
269+
}
263270
return void res.send(results)
264271
}
265272

@@ -279,6 +286,13 @@ module.exports = async (program: IServeProgram): Promise<void> => {
279286
req,
280287
})
281288
const results = await renderHTML({ data })
289+
if (page.mode === `SSR` && data.serverDataHeaders) {
290+
for (const [name, value] of Object.entries(
291+
data.serverDataHeaders
292+
)) {
293+
res.setHeader(name, value)
294+
}
295+
}
282296
return res.send(results)
283297
}
284298

packages/gatsby/src/utils/page-ssr-module/entry.ts

+10-3
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ import {
1616
} from "../page-data-helpers"
1717
// @ts-ignore render-page import will become valid later on (it's marked as external)
1818
import htmlComponentRenderer from "./render-page"
19-
import { getServerData } from "../get-server-data"
19+
import { getServerData, IServerData } from "../get-server-data"
2020

2121
export interface ITemplateDetails {
2222
query: string
@@ -28,6 +28,7 @@ export interface ISSRData {
2828
page: IGatsbyPage
2929
templateDetails: ITemplateDetails
3030
potentialPagePath: string
31+
serverDataHeaders?: Record<string, string>
3132
}
3233

3334
const pageTemplateDetailsMap: Record<
@@ -71,7 +72,7 @@ export async function getData({
7172
// 3. Execute query
7273
// query-runner handles case when query is not there - so maybe we should consider using that somehow
7374
let results: IExecutionResult = {}
74-
let serverData: any = undefined
75+
let serverData: IServerData | undefined
7576
if (templateDetails.query) {
7677
executionPromises.push(
7778
graphqlEngine
@@ -104,7 +105,13 @@ export async function getData({
104105
}
105106
results.pageContext = page.context
106107

107-
return { results, page, templateDetails, potentialPagePath }
108+
return {
109+
results,
110+
page,
111+
templateDetails,
112+
potentialPagePath,
113+
serverDataHeaders: serverData?.headers,
114+
}
108115
}
109116

110117
export async function renderPageData({

0 commit comments

Comments
 (0)