Skip to content

Commit 9185eb3

Browse files
committed
pre-render graphql input-objects
resolves #18269
1 parent bfef839 commit 9185eb3

6 files changed

Lines changed: 4546 additions & 4 deletions

File tree

content/graphql/reference/input-objects.md

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,5 @@ For example, [`CommitAuthor`](/graphql/reference/input-objects#commitauthor) tak
1919

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

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

lib/graphql/static/prerendered-input-objects.json

Lines changed: 4487 additions & 0 deletions
Large diffs are not rendered by default.

middleware/contextualizers/graphql.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ const previews = require('../../lib/graphql/static/previews')
22
const upcomingChanges = require('../../lib/graphql/static/upcoming-changes')
33
const changelog = require('../../lib/graphql/static/changelog')
44
const prerenderedObjects = require('../../lib/graphql/static/prerendered-objects')
5+
const prerenderedInputObjects = require('../../lib/graphql/static/prerendered-input-objects')
56
const allVersions = require('../../lib/all-versions')
67

78
const explorerUrl = process.env.NODE_ENV === 'production'
@@ -26,6 +27,7 @@ module.exports = function graphqlContext (req, res, next) {
2627
previewsForCurrentVersion: previews[graphqlVersion],
2728
upcomingChangesForCurrentVersion: upcomingChanges[graphqlVersion],
2829
prerenderedObjectsForCurrentVersion: prerenderedObjects[graphqlVersion],
30+
prerenderedInputObjectsForCurrentVersion: prerenderedInputObjects[graphqlVersion],
2931
explorerUrl,
3032
changelog
3133
}

middleware/render-page.js

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,13 @@ module.exports = async function renderPage (req, res, next) {
107107
context.renderedPage = context.renderedPage + req.context.graphql.prerenderedObjectsForCurrentVersion.html
108108
}
109109

110+
// handle special-case prerendered GraphQL input objects page
111+
if (req.path.endsWith('graphql/reference/input-objects')) {
112+
// concat the markdown source miniToc items and the prerendered miniToc items
113+
context.miniTocItems = context.miniTocItems.concat(req.context.graphql.prerenderedInputObjectsForCurrentVersion.miniToc)
114+
context.renderedPage = context.renderedPage + req.context.graphql.prerenderedInputObjectsForCurrentVersion.html
115+
}
116+
110117
// Create string for <title> tag
111118
context.page.fullTitle = context.page.title
112119

script/graphql/update-files.js

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ const processPreviews = require('./utils/process-previews')
1414
const processUpcomingChanges = require('./utils/process-upcoming-changes')
1515
const processSchemas = require('./utils/process-schemas')
1616
const prerenderObjects = require('./utils/prerender-objects')
17+
const prerenderInputObjects = require('./utils/prerender-input-objects')
1718
const { prependDatedEntry, createChangelogEntry } = require('./build-changelog')
1819

1920
// check for required PAT
@@ -42,6 +43,7 @@ async function main () {
4243
const previewsJson = {}
4344
const upcomingChangesJson = {}
4445
const prerenderedObjects = {}
46+
const prerenderedInputObjects = {}
4547

4648
for (const version of versionsToBuild) {
4749
// Get the relevant GraphQL name for the current version
@@ -77,7 +79,11 @@ async function main () {
7779
// because the objects page is too big to render on page load
7880
prerenderedObjects[graphqlVersion] = await prerenderObjects(schemaJsonPerVersion, version)
7981

80-
// 5. UPDATE CHANGELOG
82+
// 5. PRERENDER INPUT OBJECTS HTML
83+
// because the objects page is too big to render on page load
84+
prerenderedInputObjects[graphqlVersion] = await prerenderInputObjects(schemaJsonPerVersion, version)
85+
86+
// 6. UPDATE CHANGELOG
8187
if (allVersions[version].nonEnterpriseDefault) {
8288
// The Changelog is only build for free-pro-team@latest
8389
const changelogEntry = await createChangelogEntry(
@@ -96,6 +102,7 @@ async function main () {
96102
updateStaticFile(previewsJson, path.join(graphqlStaticDir, 'previews.json'))
97103
updateStaticFile(upcomingChangesJson, path.join(graphqlStaticDir, 'upcoming-changes.json'))
98104
updateStaticFile(prerenderedObjects, path.join(graphqlStaticDir, 'prerendered-objects.json'))
105+
updateStaticFile(prerenderedInputObjects, path.join(graphqlStaticDir, 'prerendered-input-objects.json'))
99106

100107
// Ensure the YAML linter runs before checkinging in files
101108
execSync('npx prettier -w "**/*.{yml,yaml}"')
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
const fs = require('fs')
2+
const path = require('path')
3+
const cheerio = require('cheerio')
4+
const { liquid } = require('../../../lib/render-content')
5+
const getMiniTocItems = require('../../../lib/get-mini-toc-items')
6+
const rewriteLocalLinks = require('../../../lib/rewrite-local-links')
7+
const includes = path.join(process.cwd(), 'includes')
8+
const inputObjectIncludeFile = fs.readFileSync(path.join(includes, 'graphql-input-object.html'), 'utf8')
9+
// TODO need to localize
10+
const currentLanguage = 'en'
11+
12+
module.exports = async function prerenderInputObjects (schemaJsonPerVersion, version) {
13+
const site = await require('../../../lib/site-data')()
14+
15+
// create a bare minimum context for rendering the graphql-object.html layout
16+
const context = {
17+
currentLanguage,
18+
site: site[currentLanguage].site,
19+
graphql: { schemaForCurrentVersion: schemaJsonPerVersion }
20+
}
21+
22+
const inputObjectsArray = []
23+
24+
// render the graphql-object.html layout for every object
25+
for (const inputObject of schemaJsonPerVersion.inputObjects) {
26+
context.item = inputObject
27+
const inputObjectHtml = await liquid.parseAndRender(inputObjectIncludeFile, context)
28+
const $ = cheerio.load(inputObjectHtml, { xmlMode: true })
29+
rewriteLocalLinks($, version, currentLanguage)
30+
const htmlWithVersionedLinks = $.html()
31+
inputObjectsArray.push(htmlWithVersionedLinks)
32+
}
33+
34+
const inputObjectsHtml = inputObjectsArray.join('\n')
35+
36+
return {
37+
html: inputObjectsHtml,
38+
miniToc: getMiniTocItems(inputObjectsHtml)
39+
}
40+
}

0 commit comments

Comments
 (0)