Register
Login
Resources
Docs Blog Datasets Glossary Case Studies Tutorials & Webinars
Product
Data Engine LLMs Platform Enterprise
Pricing Explore
Connect to our Discord channel

page-data.js 4.0 KB

You have to be logged in to leave a comment. Sign In
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
  1. const path = require('path')
  2. const languages = require('./languages')
  3. const versions = Object.keys(require('./all-versions'))
  4. const createTree = require('./create-tree')
  5. const nonEnterpriseDefaultVersion = require('./non-enterprise-default-version')
  6. const englishPath = path.posix.join(__dirname, '..', 'content')
  7. /**
  8. * We only need to initialize pages _once per language_ since pages don't change per version. So we do that
  9. * first since it's the most expensive work. This gets us a nested object with pages attached that we can use
  10. * as the basis for the siteTree after we do some versioning. We can also use it to derive the pageList.
  11. */
  12. async function loadUnversionedTree () {
  13. const unversionedTree = {}
  14. await Promise.all(Object.values(languages)
  15. .map(async (langObj) => {
  16. unversionedTree[langObj.code] = await createTree(englishPath, langObj)
  17. }))
  18. return unversionedTree
  19. }
  20. /**
  21. * The siteTree is a nested object with pages for every language and version, useful for nav because it
  22. * contains parent, child, and sibling relationships:
  23. *
  24. * siteTree[languageCode][version].childPages[<array of pages>].childPages[<array of pages>] (etc...)
  25. * Given an unversioned tree of all pages per language, we can walk it for each version and do a couple operations:
  26. * 1. Add a versioned href to every item, where the href is the relevant permalink for the current version.
  27. * 2. Drop any child pages that are not available in the current version.
  28. *
  29. * Order of languages and versions doesn't matter, but order of child page arrays DOES matter (for navigation).
  30. */
  31. async function loadSiteTree (unversionedTree) {
  32. const rawTree = Object.assign({}, (unversionedTree || await loadUnversionedTree()))
  33. const siteTree = {}
  34. // For every language...
  35. await Promise.all(Object.keys(languages).map(async (langCode) => {
  36. const treePerVersion = {}
  37. // in every version...
  38. await Promise.all(versions.map(async (version) => {
  39. // "version" the pages.
  40. treePerVersion[version] = versionPages(Object.assign({}, rawTree[langCode]), version)
  41. }))
  42. siteTree[langCode] = treePerVersion
  43. }))
  44. return siteTree
  45. }
  46. // This step can't be asynchronous because the order of child pages matters.
  47. function versionPages (obj, version) {
  48. // Add a versioned href as a convenience for use in layouts.
  49. obj.href = obj.page.permalinks
  50. .find(pl => pl.pageVersion === version || (pl.pageVersion === 'homepage' && version === nonEnterpriseDefaultVersion))
  51. .href
  52. if (!obj.childPages) return obj
  53. const versionedChildPages = obj.childPages
  54. // Drop child pages that do not apply to the current version.
  55. .filter(childPage => childPage.page.applicableVersions.includes(version))
  56. // Version the child pages recursively.
  57. .map(childPage => versionPages(Object.assign({}, childPage), version))
  58. obj.childPages = [...versionedChildPages]
  59. return obj
  60. }
  61. // Derive a flat array of Page objects in all languages.
  62. async function loadPageList (unversionedTree) {
  63. const rawTree = unversionedTree || await loadUnversionedTree()
  64. const pageList = []
  65. await Promise.all(Object.keys(languages).map(async (langCode) => {
  66. await addToCollection(rawTree[langCode], pageList)
  67. }))
  68. async function addToCollection (item, collection) {
  69. if (!item.page) return
  70. collection.push(item.page)
  71. if (!item.childPages) return
  72. await Promise.all(item.childPages.map(async (childPage) => await addToCollection(childPage, collection)))
  73. }
  74. return pageList
  75. }
  76. // Create an object from the list of all pages with permalinks as keys for fast lookup.
  77. function createMapFromArray (pageList) {
  78. const pageMap =
  79. pageList.reduce(
  80. (pageMap, page) => {
  81. for (const permalink of page.permalinks) {
  82. pageMap[permalink.href] = page
  83. }
  84. return pageMap
  85. },
  86. {}
  87. )
  88. return pageMap
  89. }
  90. async function loadPageMap (pageList) {
  91. const pages = pageList || await loadPageList()
  92. return createMapFromArray(pages)
  93. }
  94. module.exports = {
  95. loadUnversionedTree,
  96. loadSiteTree,
  97. loadPages: loadPageList,
  98. loadPageMap
  99. }
Tip!

Press p or to see the previous file or, n or to see the next file

Comments

Loading...