
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".
253 lines
5.4 KiB
JavaScript
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
|
|
* }
|
|
* }
|
|
*/
|