Skip to content
This repository was archived by the owner on Dec 30, 2022. It is now read-only.

Commit 45f1a41

Browse files
authored
prerender graphql mutations page (github#23757)
1 parent 8565f03 commit 45f1a41

File tree

6 files changed

+7263
-7
lines changed

6 files changed

+7263
-7
lines changed

content/graphql/reference/mutations.md

+2-3
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,5 @@ Every GraphQL schema has a root type for both queries and mutations. The [mutati
1818

1919
For more information, see "[About mutations](/graphql/guides/forming-calls-with-graphql#about-mutations)."
2020

21-
{% for item in graphql.schemaForCurrentVersion.mutations %}
22-
{% include graphql-mutation %}
23-
{% endfor %}
21+
<!-- this page is pre-rendered by scripts because it's too big to load dynamically -->
22+
<!-- see lib/graphql/static/prerendered-mutations.json -->

lib/graphql/static/prerendered-mutations.json

+7,198
Large diffs are not rendered by default.

middleware/contextualizers/graphql.js

+4
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,9 @@ const prerenderedObjects = readCompressedJsonFileFallback(
99
const prerenderedInputObjects = readCompressedJsonFileFallback(
1010
'./lib/graphql/static/prerendered-input-objects.json'
1111
)
12+
const prerenderedMutations = readCompressedJsonFileFallback(
13+
'./lib/graphql/static/prerendered-mutations.json'
14+
)
1215

1316
const explorerUrl =
1417
process.env.NODE_ENV === 'production'
@@ -36,6 +39,7 @@ export default function graphqlContext(req, res, next) {
3639
upcomingChangesForCurrentVersion: upcomingChanges[graphqlVersion],
3740
prerenderedObjectsForCurrentVersion: prerenderedObjects[graphqlVersion],
3841
prerenderedInputObjectsForCurrentVersion: prerenderedInputObjects[graphqlVersion],
42+
prerenderedMutationsForCurrentVersion: prerenderedMutations[graphqlVersion],
3943
explorerUrl,
4044
changelog,
4145
}

middleware/render-page.js

+10
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,16 @@ export default async function renderPage(req, res, next) {
8181
context.renderedPage + req.context.graphql.prerenderedInputObjectsForCurrentVersion.html
8282
}
8383

84+
// handle special-case prerendered GraphQL mutations page
85+
if (req.pagePath.endsWith('graphql/reference/mutations')) {
86+
// concat the markdown source miniToc items and the prerendered miniToc items
87+
context.miniTocItems = context.miniTocItems.concat(
88+
req.context.graphql.prerenderedMutationsForCurrentVersion.miniToc
89+
)
90+
context.renderedPage =
91+
context.renderedPage + req.context.graphql.prerenderedMutationsForCurrentVersion.html
92+
}
93+
8494
// Create string for <title> tag
8595
context.page.fullTitle = context.page.titlePlainText
8696

script/graphql/update-files.js

+19-4
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,7 @@ import { allVersions } from '../../lib/all-versions.js'
99
import processPreviews from './utils/process-previews.js'
1010
import processUpcomingChanges from './utils/process-upcoming-changes.js'
1111
import processSchemas from './utils/process-schemas.js'
12-
import prerenderObjects from './utils/prerender-objects.js'
13-
import prerenderInputObjects from './utils/prerender-input-objects.js'
12+
import prerender from './utils/prerender-graphql.js'
1413
import { prependDatedEntry, createChangelogEntry } from './build-changelog.js'
1514
import loadData from '../../lib/site-data.js'
1615

@@ -36,6 +35,7 @@ async function main() {
3635
const upcomingChangesJson = {}
3736
const prerenderedObjects = {}
3837
const prerenderedInputObjects = {}
38+
const prerenderedMutations = {}
3939

4040
const siteData = loadData()
4141

@@ -83,11 +83,22 @@ async function main() {
8383

8484
// 4. PRERENDER OBJECTS HTML
8585
// because the objects page is too big to render on page load
86-
prerenderedObjects[graphqlVersion] = await prerenderObjects(context)
86+
prerenderedObjects[graphqlVersion] = await prerender(context, 'objects', 'graphql-object.html')
8787

8888
// 5. PRERENDER INPUT OBJECTS HTML
8989
// because the objects page is too big to render on page load
90-
prerenderedInputObjects[graphqlVersion] = await prerenderInputObjects(context)
90+
prerenderedInputObjects[graphqlVersion] = await prerender(
91+
context,
92+
'inputObjects',
93+
'graphql-input-object.html'
94+
)
95+
96+
// Prerender mutations
97+
prerenderedMutations[graphqlVersion] = await prerender(
98+
context,
99+
'mutations',
100+
'graphql-mutation.html'
101+
)
91102

92103
// 6. UPDATE CHANGELOG
93104
if (allVersions[version].nonEnterpriseDefault) {
@@ -118,6 +129,10 @@ async function main() {
118129
prerenderedInputObjects,
119130
path.join(graphqlStaticDir, 'prerendered-input-objects.json')
120131
)
132+
await updateStaticFile(
133+
prerenderedMutations,
134+
path.join(graphqlStaticDir, 'prerendered-mutations.json')
135+
)
121136

122137
// Ensure the YAML linter runs before checkinging in files
123138
execSync('npx prettier -w "**/*.{yml,yaml}"')
+30
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
#!/usr/bin/env node
2+
import fs from 'fs/promises'
3+
import path from 'path'
4+
import cheerio from 'cheerio'
5+
import { liquid } from '../../../lib/render-content/index.js'
6+
import getMiniTocItems from '../../../lib/get-mini-toc-items.js'
7+
import rewriteLocalLinks from '../../../lib/rewrite-local-links.js'
8+
const includes = path.join(process.cwd(), 'includes')
9+
10+
export default async function prerender(context, type, includeFilename) {
11+
const htmlArray = []
12+
13+
const includeFile = await fs.readFile(path.join(includes, includeFilename), 'utf8')
14+
// render the layout for every object
15+
for (const item of context.graphql.schemaForCurrentVersion[type]) {
16+
context.item = item
17+
const itemHtml = await liquid.parseAndRender(includeFile, context)
18+
const $ = cheerio.load(itemHtml, { xmlMode: true })
19+
rewriteLocalLinks($, context.currentVersion, context.currentLanguage)
20+
const htmlWithVersionedLinks = $.html()
21+
htmlArray.push(htmlWithVersionedLinks)
22+
}
23+
24+
const html = htmlArray.join('\n')
25+
26+
return {
27+
html: html,
28+
miniToc: getMiniTocItems(html),
29+
}
30+
}

0 commit comments

Comments
 (0)