golangci-lint/docs/gatsby-node.js
Isaev Denis 0d774cd24a
docs: inline website theme (#1096)
Inline @rocketseat theme for Gatsby
because we need a lot of changes.

Fix bad GitHub edit url, next/prev links,
    external links without target="_blank".
2020-05-16 17:17:58 +03:00

253 lines
5.4 KiB
JavaScript

const path = require(`path`);
const { createFilePath } = require(`gatsby-source-filesystem`);
const fs = require(`fs`);
const {
normalizeBasePath,
resolveLink,
} = require(`./src/@rocketseat/gatsby-theme-docs-core/util/url`);
const withDefault = require(`./src/@rocketseat/gatsby-theme-docs-core/util/with-default`);
exports.createPages = ({ graphql, actions: { createPage }, reporter }) => {
reporter.success(`onCreateDocs`);
const siteConfig = require(`./src/config/site.js`);
const { basePath, baseDir, docsPath, githubUrl } = withDefault(siteConfig);
const docsTemplate = require.resolve(
`./src/@rocketseat/gatsby-theme-docs/src/templates/docs-query.js`
);
const homeTemplate = require.resolve(
`./src/@rocketseat/gatsby-theme-docs/src/templates/homepage-query.js`
);
return graphql(
`
{
files: allFile(filter: { extension: { in: ["md", "mdx"] } }) {
edges {
node {
id
relativePath
childMdx {
frontmatter {
next
}
fields {
slug
}
}
}
}
}
sidebar: allSidebarItems {
edges {
node {
label
link
items {
label
link
}
id
}
}
}
}
`
).then((result) => {
if (result.errors) {
reporter.panic(
`docs: there was an error loading the docs folder!`,
result.errors
);
return;
}
createPage({
path: basePath,
component: homeTemplate,
});
// Generate prev/next items based on sidebar.yml file
const sidebar = result.data.sidebar.edges;
const listOfItems = [];
sidebar.forEach(({ node: { label, link, items } }) => {
if (Array.isArray(items)) {
items.forEach((item) => {
listOfItems.push({
label: item.label,
link: resolveLink(item.link, basePath),
});
});
} else {
listOfItems.push({
label,
link: resolveLink(link, basePath),
});
}
});
// Generate docs pages
const docs = result.data.files.edges;
docs.forEach((doc) => {
const {
childMdx: {
frontmatter: { next },
fields: { slug },
},
relativePath,
} = doc.node;
const githubEditUrl =
githubUrl &&
`${githubUrl}/tree/master/${baseDir}/${docsPath}/${relativePath}`;
const currentPageIndex = listOfItems.findIndex(
(page) => page.link === slug
);
const prevItem = listOfItems[currentPageIndex - 1];
const nextItem = next
? listOfItems.find((item) => item.link === next)
: listOfItems[currentPageIndex + 1];
createPage({
path: slug,
component: docsTemplate,
context: {
slug,
prev: prevItem,
next: nextItem,
githubEditUrl,
},
});
});
reporter.success(`docs pages created`);
});
};
exports.createSchemaCustomization = ({ actions }) => {
actions.createTypes(`
type MdxFrontmatter @dontInfer {
title: String!
description: String
image: String
disableTableOfContents: Boolean
next: String
}
`);
actions.createTypes(`
type SidebarItems implements Node {
label: String!
link: String
items: [SidebarItemsItems]
}
type SidebarItemsItems {
label: String
link: String
}
`);
};
exports.onPreBootstrap = ({ store, reporter }, themeOptions) => {
const { configPath, docsPath } = withDefault(themeOptions);
const { program } = store.getState();
const dirs = [
path.join(program.directory, configPath),
path.join(program.directory, docsPath),
];
dirs.forEach((dir) => {
if (!fs.existsSync(dir)) {
reporter.success(`docs: intialized the ${dir} directory`);
fs.mkdirSync(dir);
}
});
};
exports.onCreateNode = (
{ node, actions: { createNodeField }, getNode },
themeOptions
) => {
if (node.internal.type !== `Mdx`) {
return;
}
const { basePath } = withDefault(themeOptions);
let value = createFilePath({ node, getNode });
if (value === "index") value = "";
createNodeField({
name: `slug`,
node,
value: normalizeBasePath(basePath, value),
});
createNodeField({
name: `id`,
node,
value: node.id,
});
};
/**
[
{
"node": {
"label": "Home",
"link": "/",
"items": null,
"id": "a2913be3-af3c-5fc9-967e-a058e86b20a9"
}
},
{
"node": {
"label": "With dropdown",
"link": null,
"items": [
{ "label": "My Example", "link": "/my-example" },
{ "label": "Teste 2", "link": "/teste-2" }
],
"id": "c7d9606c-4bda-5097-a0df-53108e9f4efd"
}
}
]
*/
// Ler todo o array e salvar em uma objeto chave/valor
/**
* {
* '/': {
* prev: null,
* next: {
* label: 'My example',
* link: '/my-example'
* }
* },
* '/my-example': {
* prev: {
* label: 'Home',
* link: '/'
* },
* next: {
* label: 'Teste 2',
* link: '/teste-2'
* }
* },
* '/teste-2': {
* prev: {
* label: 'My example',
* link: '/my-example'
* },
* next: null
* }
* }
*/