* homepage: reduce padding below search area
Bring as much useful content up "above the fold".
* homepage: add groups for the front page sections
Group the homepage links into sections that map to the GitHub features
page (`/features`) plus two groups that are bespoke to the docs ("Get
started" and "Developers").
* homepage: update group design
Group the feature list area using the design exploration work by
@arisacoba. Remove the description.
* homepage: remove ungrouped items from main area
Remove ungrouped items (like the external links) from the main feature
area. Users can still navigate to ungrouped items in the sidebar.
* fix tsc error, use Link component
* homepage: support empty icon in group
Don't assume that we have icons everywhere on the landing page groups.
* homepage: drop octocat/invertocat
Looks weird with the modern icons, looks bad in dark mode. Drop them
for now.
* homepage: document the childGroups frontmatter property
* homepage: don't test that sidebar == main content
We're reducing the links on the homepage in the main content area, but
the sidebar should be the complete list of products. Remove the tests
that ensure that the main content area has all the sidebar content. But
keep the tests that ensure that the sidebar content has all the links in
the main content area.
* homepage: remove "GitHub" doc set
The "GitHub" doc set "will be removed soon as we keep moving more content
out of it, so let's not include it here to keep the page more
evergreen."
* homepage: don't test that `/github` is linked on the main page
We're removing the `/github` doc set, and it's now not in the main page
grouped links. Remove the test that `/github` exists, now look for
`/get-started`.
* homepage: use octicons instead of images
The images from https://github.com/features will be updated 🔜 - in
the meantime, let's use octicons which are consistent and give visual
interest.
* homepage: use octicons from @primer/octicons-react
Using the react components adds `<svg>` elements instead of `<img>`
elements, which lets the element use the current fill color, supporting
both light and dark themes.
Co-authored-by: Mike Surowiec <mikesurowiec@users.noreply.github.com>
Co-authored-by: Emily Gould <4822039+emilyistoofunky@users.noreply.github.com>
261 lines
6.2 KiB
JavaScript
261 lines
6.2 KiB
JavaScript
import fs from 'fs'
|
|
import path from 'path'
|
|
import parse from './read-frontmatter.js'
|
|
import semver from 'semver'
|
|
import { allVersions } from './all-versions.js'
|
|
|
|
const layoutNames = [
|
|
'default',
|
|
'dev-toc',
|
|
'graphql-explorer',
|
|
'product-landing',
|
|
'product-sublanding',
|
|
'release-notes',
|
|
false,
|
|
]
|
|
const semverValidRange = semver.validRange
|
|
const semverRange = {
|
|
type: 'string',
|
|
conform: semverValidRange,
|
|
message: 'Must be a valid SemVer range',
|
|
}
|
|
const versionObjs = Object.values(allVersions)
|
|
const guideTypes = ['overview', 'quick_start', 'tutorial', 'how_to', 'reference']
|
|
const featureVersions = fs
|
|
.readdirSync(path.posix.join(process.cwd(), 'data/features'))
|
|
.map((file) => path.basename(file, '.yml'))
|
|
|
|
export const schema = {
|
|
properties: {
|
|
title: {
|
|
type: 'string',
|
|
required: true,
|
|
translatable: true,
|
|
},
|
|
shortTitle: {
|
|
type: 'string',
|
|
translatable: true,
|
|
},
|
|
intro: {
|
|
type: 'string',
|
|
translatable: true,
|
|
},
|
|
product: {
|
|
type: 'string',
|
|
translatable: true,
|
|
},
|
|
permissions: {
|
|
type: 'string',
|
|
},
|
|
// true by default on articles, false on all other content
|
|
showMiniToc: {
|
|
type: 'boolean',
|
|
},
|
|
miniTocMaxHeadingLevel: {
|
|
type: 'number',
|
|
default: 2,
|
|
minimum: 2,
|
|
maximum: 4,
|
|
},
|
|
mapTopic: {
|
|
type: 'boolean',
|
|
},
|
|
// allow hidden articles under `early-access`
|
|
hidden: {
|
|
type: 'boolean',
|
|
},
|
|
layout: {
|
|
type: ['string', 'boolean'],
|
|
enum: layoutNames,
|
|
message: 'must be the filename of an existing layout file, or `false` for no layout',
|
|
},
|
|
redirect_from: {
|
|
type: ['array', 'string'],
|
|
},
|
|
allowTitleToDifferFromFilename: {
|
|
type: 'boolean',
|
|
},
|
|
introLinks: {
|
|
type: 'object',
|
|
properties: {
|
|
quickstart: { type: 'string' },
|
|
reference: { type: 'string' },
|
|
overview: { type: 'string' },
|
|
},
|
|
},
|
|
authors: {
|
|
type: 'array',
|
|
items: {
|
|
type: 'string',
|
|
},
|
|
},
|
|
examples_source: {
|
|
type: 'string',
|
|
},
|
|
effectiveDate: {
|
|
type: 'string',
|
|
},
|
|
featuredLinks: {
|
|
type: 'object',
|
|
properties: {
|
|
gettingStarted: {
|
|
type: 'array',
|
|
items: { type: 'string' },
|
|
},
|
|
guides: {
|
|
type: 'array',
|
|
items: { type: 'string' },
|
|
},
|
|
guideCards: {
|
|
type: 'array',
|
|
items: { type: 'string' },
|
|
},
|
|
popular: {
|
|
type: 'array',
|
|
items: { type: 'string' },
|
|
},
|
|
// allows you to use an alternate heading for the popular column
|
|
popularHeading: {
|
|
type: 'string',
|
|
},
|
|
},
|
|
},
|
|
// Shown in `product-landing.html` "What's new" section
|
|
changelog: {
|
|
type: 'object',
|
|
properties: {
|
|
label: { type: 'string' },
|
|
prefix: { type: 'string' },
|
|
},
|
|
},
|
|
type: {
|
|
type: 'string',
|
|
enum: guideTypes,
|
|
},
|
|
topics: {
|
|
type: 'array',
|
|
},
|
|
includeGuides: {
|
|
type: 'array',
|
|
},
|
|
learningTracks: {
|
|
type: 'array',
|
|
},
|
|
// Used in `product-landing.html`
|
|
beta_product: {
|
|
type: 'boolean',
|
|
},
|
|
// Show in `product-landing.html`
|
|
product_video: {
|
|
type: 'string',
|
|
},
|
|
interactive: {
|
|
type: 'boolean',
|
|
},
|
|
communityRedirect: {
|
|
type: 'object',
|
|
properties: {
|
|
name: 'string',
|
|
href: 'string',
|
|
},
|
|
},
|
|
// Platform-specific content preference
|
|
defaultPlatform: {
|
|
type: 'string',
|
|
enum: ['mac', 'windows', 'linux'],
|
|
},
|
|
// Tool-specific content preference
|
|
defaultTool: {
|
|
type: 'string',
|
|
enum: ['webui', 'cli', 'desktop', 'curl', 'codespaces', 'vscode'],
|
|
},
|
|
// Documentation contributed by a third party, such as a GitHub Partner
|
|
contributor: {
|
|
type: 'object',
|
|
properties: {
|
|
name: { type: 'string' },
|
|
URL: { type: 'string' },
|
|
},
|
|
},
|
|
// Child groups specified on top-level TOC
|
|
childGroups: {
|
|
type: 'array',
|
|
},
|
|
// Child links specified on any TOC page
|
|
children: {
|
|
type: 'array',
|
|
},
|
|
// External products specified on the homepage
|
|
externalProducts: {
|
|
type: 'object',
|
|
properties: {
|
|
atom: {
|
|
type: 'object',
|
|
required: true,
|
|
properties: {
|
|
id: { type: 'string', required: true },
|
|
name: { type: 'string', required: true },
|
|
href: { type: 'string', format: 'url', required: true },
|
|
external: { type: 'boolean', required: true },
|
|
},
|
|
},
|
|
electron: {
|
|
type: 'object',
|
|
required: true,
|
|
properties: {
|
|
id: { type: 'string', required: true },
|
|
name: { type: 'string', required: true },
|
|
href: { type: 'string', format: 'url', required: true },
|
|
external: { type: 'boolean', required: true },
|
|
},
|
|
},
|
|
},
|
|
},
|
|
// whether or not the page is mirrored by an experimental page
|
|
hasExperimentalAlternative: {
|
|
type: 'boolean',
|
|
},
|
|
},
|
|
}
|
|
|
|
const featureVersionsProp = {
|
|
feature: {
|
|
type: ['string', 'array'],
|
|
enum: featureVersions,
|
|
items: {
|
|
type: 'string',
|
|
},
|
|
message:
|
|
'must be the name (or names) of a feature that matches "filename" in data/features/_filename_.yml',
|
|
},
|
|
}
|
|
|
|
schema.properties.versions = {
|
|
type: ['object', 'string'], // allow a '*' string to indicate all versions
|
|
required: true,
|
|
properties: versionObjs.reduce((acc, versionObj) => {
|
|
acc[versionObj.plan] = semverRange
|
|
acc[versionObj.shortName] = semverRange
|
|
return acc
|
|
}, featureVersionsProp),
|
|
}
|
|
|
|
// Support 'github-ae': next
|
|
schema.properties.versions.properties['github-ae'] = 'next'
|
|
schema.properties.versions.properties.ghae = 'next'
|
|
|
|
function frontmatter(markdown, opts = {}) {
|
|
const defaults = {
|
|
schema,
|
|
validateKeyNames: true,
|
|
validateKeyOrder: false, // TODO: enable this once we've sorted all the keys. See issue 9658
|
|
}
|
|
|
|
return parse(markdown, Object.assign({}, defaults, opts))
|
|
}
|
|
|
|
// attach the schema object so it can be `require`d elsewhere.
|
|
frontmatter.schema = schema
|
|
|
|
export default frontmatter
|