From 2e0eb513f7a2b900f830c9a31d0f1be89f8eb7b3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maciej=20Urba=C5=84czyk?= Date: Sat, 6 Jul 2019 16:09:05 +0200 Subject: [PATCH 1/9] Rewrite gatsby-node to typescript --- gatsby-node.js | 17 +- gatsby/{constants.js => constants.ts} | 2 +- .../blogPostPages/blogPostsList.js | 22 -- .../docsPages/docsArchGenerator/docsLoader.js | 34 -- .../docsPages/docsArchGenerator/manifest.js | 5 - gatsby/createPages/index.js | 13 - gatsby/createPages/roadmapPages/helpers.js | 71 ---- gatsby/createPages/roadmapPages/index.js | 11 - gatsby/index.js | 20 + gatsby/nodes/index.ts | 40 ++ .../onCreateNode/blogPost.ts} | 19 +- .../docs.js => nodes/onCreateNode/docs.ts} | 19 +- gatsby/nodes/onCreateNode/index.ts | 3 + gatsby/nodes/onCreateNode/roadmap.ts | 27 ++ gatsby/onCreateNode/index.js | 37 -- gatsby/onCreateNode/roadmap.js | 27 -- gatsby/onCreatePage.js | 12 - gatsby/onCreateWebpackConfig.js | 16 - gatsby/pages/blog/blogPostsList.ts | 33 ++ .../index.js => pages/blog/helpers.ts} | 9 +- gatsby/pages/blog/index.ts | 14 + .../blog/singlePostPage.ts} | 30 +- gatsby/pages/blog/types.ts | 21 + .../fixLinks.js => pages/docs/fixLinks.ts} | 60 +-- gatsby/pages/docs/generator/docsLoader.ts | 34 ++ .../docs/generator/extractContent.ts} | 41 +- .../docs/generator/generateNavigation.ts} | 33 +- .../docs/generator/index.ts} | 16 +- gatsby/pages/docs/generator/manifest.ts | 6 + .../helpers.js => pages/docs/helpers.ts} | 72 ++-- .../index.js => pages/docs/index.ts} | 39 +- gatsby/pages/docs/types.ts | 115 ++++++ gatsby/{helpers.js => pages/helpers.ts} | 62 +-- gatsby/pages/index.ts | 20 + gatsby/pages/onCreatePage.ts | 22 ++ gatsby/pages/roadmap/helpers.ts | 77 ++++ gatsby/pages/roadmap/index.ts | 16 + .../roadmap/modalPage.ts} | 32 +- .../roadmap/rootPage.ts} | 25 +- gatsby/pages/roadmap/types.ts | 24 ++ gatsby/types.ts | 25 ++ gatsby/webpack/index.ts | 1 + gatsby/webpack/onCreateWebpackConfig.ts | 17 + package-lock.json | 372 ++++++++++++++++-- package.json | 19 +- tslint.json | 2 +- 46 files changed, 1162 insertions(+), 470 deletions(-) rename gatsby/{constants.js => constants.ts} (98%) delete mode 100644 gatsby/createPages/blogPostPages/blogPostsList.js delete mode 100644 gatsby/createPages/docsPages/docsArchGenerator/docsLoader.js delete mode 100644 gatsby/createPages/docsPages/docsArchGenerator/manifest.js delete mode 100644 gatsby/createPages/index.js delete mode 100644 gatsby/createPages/roadmapPages/helpers.js delete mode 100644 gatsby/createPages/roadmapPages/index.js create mode 100644 gatsby/index.js create mode 100644 gatsby/nodes/index.ts rename gatsby/{onCreateNode/blogPost.js => nodes/onCreateNode/blogPost.ts} (71%) rename gatsby/{onCreateNode/docs.js => nodes/onCreateNode/docs.ts} (52%) create mode 100644 gatsby/nodes/onCreateNode/index.ts create mode 100644 gatsby/nodes/onCreateNode/roadmap.ts delete mode 100644 gatsby/onCreateNode/index.js delete mode 100644 gatsby/onCreateNode/roadmap.js delete mode 100644 gatsby/onCreatePage.js delete mode 100644 gatsby/onCreateWebpackConfig.js create mode 100644 gatsby/pages/blog/blogPostsList.ts rename gatsby/{createPages/blogPostPages/index.js => pages/blog/helpers.ts} (69%) create mode 100644 gatsby/pages/blog/index.ts rename gatsby/{createPages/blogPostPages/singleBlogPost.js => pages/blog/singlePostPage.ts} (59%) create mode 100644 gatsby/pages/blog/types.ts rename gatsby/{createPages/docsPages/fixLinks.js => pages/docs/fixLinks.ts} (52%) create mode 100644 gatsby/pages/docs/generator/docsLoader.ts rename gatsby/{createPages/docsPages/docsArchGenerator/extractContent.js => pages/docs/generator/extractContent.ts} (55%) rename gatsby/{createPages/docsPages/docsArchGenerator/navigation.js => pages/docs/generator/generateNavigation.ts} (54%) rename gatsby/{createPages/docsPages/docsArchGenerator/index.js => pages/docs/generator/index.ts} (51%) create mode 100644 gatsby/pages/docs/generator/manifest.ts rename gatsby/{createPages/docsPages/helpers.js => pages/docs/helpers.ts} (62%) rename gatsby/{createPages/docsPages/index.js => pages/docs/index.ts} (74%) create mode 100644 gatsby/pages/docs/types.ts rename gatsby/{helpers.js => pages/helpers.ts} (63%) create mode 100644 gatsby/pages/index.ts create mode 100644 gatsby/pages/onCreatePage.ts create mode 100644 gatsby/pages/roadmap/helpers.ts create mode 100644 gatsby/pages/roadmap/index.ts rename gatsby/{createPages/roadmapPages/modalPage.js => pages/roadmap/modalPage.ts} (58%) rename gatsby/{createPages/roadmapPages/roadmapPage.js => pages/roadmap/rootPage.ts} (52%) create mode 100644 gatsby/pages/roadmap/types.ts create mode 100644 gatsby/types.ts create mode 100644 gatsby/webpack/index.ts create mode 100644 gatsby/webpack/onCreateWebpackConfig.ts diff --git a/gatsby-node.js b/gatsby-node.js index 467b338de1..b2643781af 100755 --- a/gatsby-node.js +++ b/gatsby-node.js @@ -1,4 +1,13 @@ -exports.onCreateWebpackConfig = require("./gatsby/onCreateWebpackConfig"); -exports.createPages = require("./gatsby/createPages"); -exports.onCreateNode = require("./gatsby/onCreateNode"); -exports.onCreatePage = require("./gatsby/onCreatePage"); +const { + onCreateWebpackConfig, + createPages, + onCreateNode, + onCreatePage, +} = require("./gatsby"); + +module.exports = { + onCreateWebpackConfig, + createPages, + onCreateNode, + onCreatePage, +}; diff --git a/gatsby/constants.js b/gatsby/constants.ts similarity index 98% rename from gatsby/constants.js rename to gatsby/constants.ts index 96141a0ef1..ee8a92cdc3 100644 --- a/gatsby/constants.js +++ b/gatsby/constants.ts @@ -20,7 +20,7 @@ const ROADMAP_CAPABILITY_FILENAME_REGEX = /roadmap\/capabilities\/(.+)\.md$/; const POSTS_PER_PAGE = 8; -module.exports = { +export { BLOG_POST_DIR, DOCS_DIR, ROADMAP_CAPABILITIES_DIR, diff --git a/gatsby/createPages/blogPostPages/blogPostsList.js b/gatsby/createPages/blogPostPages/blogPostsList.js deleted file mode 100644 index 160e7a1662..0000000000 --- a/gatsby/createPages/blogPostPages/blogPostsList.js +++ /dev/null @@ -1,22 +0,0 @@ -const { resolve } = require("path"); - -const { BLOG_PATH_PREFIX, POSTS_PER_PAGE } = require("../../constants"); - -module.exports = ({ createPage, posts }) => { - const blogPostsListTemplate = resolve( - __dirname, - "../../../src/templates/BlogPostsList.tsx", - ); - - const numPages = Math.ceil(posts.length / POSTS_PER_PAGE); - Array.from({ length: numPages }).forEach((_, i) => { - createPage({ - path: !i ? `/${BLOG_PATH_PREFIX}` : `/${BLOG_PATH_PREFIX}/page/${i + 1}`, - component: blogPostsListTemplate, - context: { - limit: POSTS_PER_PAGE, - skip: i * POSTS_PER_PAGE, - }, - }); - }); -}; diff --git a/gatsby/createPages/docsPages/docsArchGenerator/docsLoader.js b/gatsby/createPages/docsPages/docsArchGenerator/docsLoader.js deleted file mode 100644 index 36551f7c01..0000000000 --- a/gatsby/createPages/docsPages/docsArchGenerator/docsLoader.js +++ /dev/null @@ -1,34 +0,0 @@ -const { resolve } = require("path"); -const fs = require("fs-extra"); - -const DOCS_FOLDER = "docs"; - -const VERSION_MANIFEST_YAML = "manifest.yaml"; -const TOPIC_CONFIG_JSON = "docs.config.json"; - -class DocsLoader { - constructor(version) { - this.version = version; - } - - loadManifest() { - return fs.readFileSync(this.createPath(VERSION_MANIFEST_YAML), "utf8"); - } - - loadTopicConfig(topic) { - return this.load(`${topic}/${TOPIC_CONFIG_JSON}`); - } - - load(path) { - return require(this.createPath(path)); - } - - createPath(path) { - return resolve( - __dirname, - `../../../../content/${DOCS_FOLDER}/${this.version}/${path}`, - ); - } -} - -module.exports = DocsLoader; diff --git a/gatsby/createPages/docsPages/docsArchGenerator/manifest.js b/gatsby/createPages/docsPages/docsArchGenerator/manifest.js deleted file mode 100644 index b974166503..0000000000 --- a/gatsby/createPages/docsPages/docsArchGenerator/manifest.js +++ /dev/null @@ -1,5 +0,0 @@ -const yaml = require("js-yaml"); - -module.exports = json => { - return yaml.safeLoad(json); -}; diff --git a/gatsby/createPages/index.js b/gatsby/createPages/index.js deleted file mode 100644 index d4e8bb1265..0000000000 --- a/gatsby/createPages/index.js +++ /dev/null @@ -1,13 +0,0 @@ -const { createIntlPage } = require("../helpers"); -const createBlogPostPages = require("./blogPostPages"); -const createDocsPages = require("./docsPages"); -const createRoadmapPages = require("./roadmapPages"); - -module.exports = async ({ graphql, actions }) => { - const createPage = createIntlPage({ actions }); - const { createRedirect } = actions; - - await createBlogPostPages({ graphql, createPage, createRedirect }); - await createDocsPages({ graphql, createPage }); - await createRoadmapPages({ graphql, createPage, createRedirect }); -}; diff --git a/gatsby/createPages/roadmapPages/helpers.js b/gatsby/createPages/roadmapPages/helpers.js deleted file mode 100644 index dd73963a18..0000000000 --- a/gatsby/createPages/roadmapPages/helpers.js +++ /dev/null @@ -1,71 +0,0 @@ -const { ROADMAP_CAPABILITY_PATH_PREFIX } = require("../../constants"); - -const getCapabilities = async graphql => { - const result = await graphql(` - { - allMarkdownRemark( - sort: { order: DESC, fields: [fields___slug] } - filter: { fileAbsolutePath: { regex: "/roadmap/capabilities/" } } - ) { - edges { - node { - frontmatter { - displayName - epicsLabels - id - } - } - } - } - } - `); - if (result.errors) { - throw new Error(result.errors); - } - - return sortCapabilities(result.data.allMarkdownRemark.edges); -}; - -const sortCapabilities = capabilities => { - return capabilities.sort((a, b) => { - const orderA = a.node.frontmatter.displayName.toLowerCase(); - const orderB = b.node.frontmatter.displayName.toLowerCase(); - - if (orderA > orderB) { - return 1; - } else if (orderA < orderB) { - return -1; - } - return 0; - }); -}; - -const generateCapabilitiesNavigation = capabilities => { - const navigation = []; - - capabilities.map(capability => { - navigation.push({ - displayName: capability.node.frontmatter.displayName, - id: capability.node.frontmatter.id, - }); - }); - - return navigation; -}; - -const generateMapOfDisplayNameToId = capabilities => { - const map = {}; - - capabilities.map(capability => { - map[capability.node.frontmatter.displayName] = - capability.node.frontmatter.id; - }); - - return map; -}; - -module.exports = { - getCapabilities, - generateCapabilitiesNavigation, - generateMapOfDisplayNameToId, -}; diff --git a/gatsby/createPages/roadmapPages/index.js b/gatsby/createPages/roadmapPages/index.js deleted file mode 100644 index e3a87d0662..0000000000 --- a/gatsby/createPages/roadmapPages/index.js +++ /dev/null @@ -1,11 +0,0 @@ -const createRoadmapPage = require("./roadmapPage"); -const createModalPage = require("./modalPage"); - -const { getCapabilities } = require("./helpers"); - -module.exports = async ({ graphql, createPage, createRedirect }) => { - const capabilities = await getCapabilities(graphql); - - createRoadmapPage({ createPage, createRedirect, capabilities }); - createModalPage({ createPage, createRedirect, capabilities }); -}; diff --git a/gatsby/index.js b/gatsby/index.js new file mode 100644 index 0000000000..9f883a3586 --- /dev/null +++ b/gatsby/index.js @@ -0,0 +1,20 @@ +"use strict"; + +require("source-map-support").install(); +require("ts-node").register({ + compilerOptions: { + module: "commonjs", + target: "es2017", + }, +}); + +const { onCreateWebpackConfig } = require("./webpack"); +const { createPages, onCreatePage } = require("./pages"); +const { onCreateNode } = require("./nodes"); + +module.exports = { + onCreateWebpackConfig, + createPages, + onCreateNode, + onCreatePage, +}; diff --git a/gatsby/nodes/index.ts b/gatsby/nodes/index.ts new file mode 100644 index 0000000000..b523f5c7c9 --- /dev/null +++ b/gatsby/nodes/index.ts @@ -0,0 +1,40 @@ +import { CreateNodeArgs } from "gatsby"; +import { + BLOG_POST_DIR, + DOCS_DIR, + ROADMAP_CAPABILITIES_DIR, + ROADMAP_TICKETS_DIR, +} from "../constants"; + +import { + onCreateBlogPostNode, + onCreateDocsNode, + onCreateRoadmapNode, +} from "./onCreateNode"; + +export const onCreateNode = async ({ + node, + actions, + getNode, +}: CreateNodeArgs) => { + const { createNodeField } = actions; + + switch (node.internal.type) { + case "MarkdownRemark": + const { relativePath } = getNode(node.parent); + + if (relativePath.startsWith(BLOG_POST_DIR)) { + onCreateBlogPostNode({ node, relativePath, createNodeField }); + } + + if (relativePath.startsWith(DOCS_DIR)) { + onCreateDocsNode({ node, relativePath, createNodeField }); + } + + if (relativePath.startsWith(ROADMAP_CAPABILITIES_DIR)) { + onCreateRoadmapNode.capability({ node, relativePath, createNodeField }); + } + + return; + } +}; diff --git a/gatsby/onCreateNode/blogPost.js b/gatsby/nodes/onCreateNode/blogPost.ts similarity index 71% rename from gatsby/onCreateNode/blogPost.js rename to gatsby/nodes/onCreateNode/blogPost.ts index e817478a39..5754c66fae 100644 --- a/gatsby/onCreateNode/blogPost.js +++ b/gatsby/nodes/onCreateNode/blogPost.ts @@ -1,11 +1,24 @@ -const { +import { Node } from "gatsby"; +import { ASSETS_DIR, BLOG_PATH_PREFIX, BLOG_POST_FILENAME_REGEX, -} = require("../constants"); +} from "../../constants"; -module.exports = ({ node, relativePath, createNodeField }) => { +interface OnCreateBlogPostNode { + node: Node; + relativePath: string; + createNodeField: Function; +} + +export const onCreateBlogPostNode = ({ + node, + relativePath, + createNodeField, +}: OnCreateBlogPostNode) => { const match = BLOG_POST_FILENAME_REGEX.exec(relativePath); + if (!match || match.length < 5) return; + const year = Number(match[1]); const month = Number(match[2]); const day = Number(match[3]); diff --git a/gatsby/onCreateNode/docs.js b/gatsby/nodes/onCreateNode/docs.ts similarity index 52% rename from gatsby/onCreateNode/docs.js rename to gatsby/nodes/onCreateNode/docs.ts index 0bbc07c8f8..a62304ec66 100644 --- a/gatsby/onCreateNode/docs.js +++ b/gatsby/nodes/onCreateNode/docs.ts @@ -1,14 +1,27 @@ -const { DOCS_PATH_PREFIX, DOCS_FILENAME_REGEX } = require("../constants"); +import { Node } from "gatsby"; +import { DOCS_PATH_PREFIX, DOCS_FILENAME_REGEX } from "../../constants"; -module.exports = ({ node, relativePath, createNodeField }) => { +interface OnCreateDocsNode { + node: Node; + relativePath: string; + createNodeField: Function; +} + +export const onCreateDocsNode = ({ + node, + relativePath, + createNodeField, +}: OnCreateDocsNode) => { const match = DOCS_FILENAME_REGEX.exec(relativePath); + if (!match || match.length < 4) return; + const version = match[1]; const id = match[2].split("/")[0]; const fileName = match[3]; let type = null; try { - type = require(`../../content/docs/${version}/${id}/docs.config.json`).spec.type.toLowerCase(); + type = require(`../../../content/docs/${version}/${id}/docs.config.json`).spec.type.toLowerCase(); } catch (err) { console.error(err); return; diff --git a/gatsby/nodes/onCreateNode/index.ts b/gatsby/nodes/onCreateNode/index.ts new file mode 100644 index 0000000000..481439a9ab --- /dev/null +++ b/gatsby/nodes/onCreateNode/index.ts @@ -0,0 +1,3 @@ +export * from "./blogPost"; +export * from "./docs"; +export * from "./roadmap"; diff --git a/gatsby/nodes/onCreateNode/roadmap.ts b/gatsby/nodes/onCreateNode/roadmap.ts new file mode 100644 index 0000000000..bfda2c8b44 --- /dev/null +++ b/gatsby/nodes/onCreateNode/roadmap.ts @@ -0,0 +1,27 @@ +import { Node } from "gatsby"; +import { ROADMAP_CAPABILITY_FILENAME_REGEX } from "../../constants"; + +interface OnCreateCapabilityNode { + node: Node; + relativePath: string; + createNodeField: Function; +} + +const capability = ({ + node, + relativePath, + createNodeField, +}: OnCreateCapabilityNode) => { + const match = ROADMAP_CAPABILITY_FILENAME_REGEX.exec(relativePath); + if (!match || match.length < 2) return; + + const type = match[1]; + + createNodeField({ + node, + name: "type", + value: type, + }); +}; + +export const onCreateRoadmapNode = { capability }; diff --git a/gatsby/onCreateNode/index.js b/gatsby/onCreateNode/index.js deleted file mode 100644 index ef84519517..0000000000 --- a/gatsby/onCreateNode/index.js +++ /dev/null @@ -1,37 +0,0 @@ -const { - BLOG_POST_DIR, - DOCS_DIR, - ROADMAP_CAPABILITIES_DIR, - ROADMAP_TICKETS_DIR, -} = require("../constants"); - -const onCreateNodeBlogPost = require("./blogPost"); -const onCreateNodeDocs = require("./docs"); -const onCreateNodeRoadmap = require("./roadmap"); - -module.exports = async ({ node, actions, getNode }) => { - const { createNodeField } = actions; - - switch (node.internal.type) { - case "MarkdownRemark": - const { relativePath } = getNode(node.parent); - - if (relativePath.startsWith(BLOG_POST_DIR)) { - onCreateNodeBlogPost({ node, relativePath, createNodeField }); - } - - if (relativePath.startsWith(DOCS_DIR)) { - onCreateNodeDocs({ node, relativePath, createNodeField }); - } - - if (relativePath.startsWith(ROADMAP_CAPABILITIES_DIR)) { - onCreateNodeRoadmap.capability({ node, relativePath, createNodeField }); - } - - if (relativePath.startsWith(ROADMAP_TICKETS_DIR)) { - onCreateNodeRoadmap.ticket({ node, relativePath, createNodeField }); - } - - return; - } -}; diff --git a/gatsby/onCreateNode/roadmap.js b/gatsby/onCreateNode/roadmap.js deleted file mode 100644 index 2c4b91bfd8..0000000000 --- a/gatsby/onCreateNode/roadmap.js +++ /dev/null @@ -1,27 +0,0 @@ -const { - ROADMAP_CAPABILITY_PATH_PREFIX, - ROADMAP_TICKET_PATH_PREFIX, - ROADMAP_CAPABILITY_FILENAME_REGEX, -} = require("../constants"); - -const capability = ({ node, relativePath, createNodeField }) => { - const match = ROADMAP_CAPABILITY_FILENAME_REGEX.exec(relativePath); - const type = match[1]; - - createNodeField({ - node, - name: "type", - value: type, - }); - - const slug = `/${ROADMAP_CAPABILITY_PATH_PREFIX}/${type}`; - createNodeField({ - node, - name: "slug", - value: slug, - }); -}; - -const ticket = ({ node, relativePath, createNodeField }) => {}; - -module.exports = { capability, ticket }; diff --git a/gatsby/onCreatePage.js b/gatsby/onCreatePage.js deleted file mode 100644 index 83cc0c4f03..0000000000 --- a/gatsby/onCreatePage.js +++ /dev/null @@ -1,12 +0,0 @@ -const { createIntlPage } = require("./helpers"); - -module.exports = async ({ page, actions }) => { - const createPage = createIntlPage({ actions }); - const { deletePage } = actions; - - return new Promise(resolve => { - deletePage(page); - createPage(page); - resolve(); - }); -}; diff --git a/gatsby/onCreateWebpackConfig.js b/gatsby/onCreateWebpackConfig.js deleted file mode 100644 index a93d481af7..0000000000 --- a/gatsby/onCreateWebpackConfig.js +++ /dev/null @@ -1,16 +0,0 @@ -const { resolve } = require("path"); - -module.exports = ({ actions }) => { - actions.setWebpackConfig({ - resolve: { - alias: { - "@components": resolve(__dirname, "../src/components"), - "@common": resolve(__dirname, "../src/common"), - "@config": resolve(__dirname, "../config.json"), - "@content": resolve(__dirname, "../content"), - "@static": resolve(__dirname, "../static"), - "@styled": resolve(__dirname, "../src/common/styled"), - }, - }, - }); -}; diff --git a/gatsby/pages/blog/blogPostsList.ts b/gatsby/pages/blog/blogPostsList.ts new file mode 100644 index 0000000000..eaabfcaee9 --- /dev/null +++ b/gatsby/pages/blog/blogPostsList.ts @@ -0,0 +1,33 @@ +import { resolve } from "path"; +import { PostQL } from "./types"; +import { CreatePageFn, CreateRedirectFn } from "../../types"; +import { BLOG_PATH_PREFIX, POSTS_PER_PAGE } from "../../constants"; + +export interface CreateBlogPostsListArgs { + createPage: CreatePageFn; + createRedirect: CreateRedirectFn; + posts: PostQL[]; +} + +export const createSingleBlogPost = ({ + createPage, + createRedirect, + posts, +}: CreateBlogPostsListArgs) => { + const blogPostsListTemplate: string = resolve( + __dirname, + "../../../src/templates/BlogPostsList.tsx", + ); + + const numPages = Math.ceil(posts.length / POSTS_PER_PAGE); + Array.from({ length: numPages }).forEach((_, i) => { + createPage({ + path: !i ? `/${BLOG_PATH_PREFIX}` : `/${BLOG_PATH_PREFIX}/page/${i + 1}`, + component: blogPostsListTemplate, + context: { + limit: POSTS_PER_PAGE, + skip: i * POSTS_PER_PAGE, + }, + }); + }); +}; diff --git a/gatsby/createPages/blogPostPages/index.js b/gatsby/pages/blog/helpers.ts similarity index 69% rename from gatsby/createPages/blogPostPages/index.js rename to gatsby/pages/blog/helpers.ts index 2864605549..33d53904c7 100644 --- a/gatsby/createPages/blogPostPages/index.js +++ b/gatsby/pages/blog/helpers.ts @@ -1,6 +1,6 @@ -const createSingleBlogPost = require("./singleBlogPost"); +import { PostQL } from "./types"; -module.exports = async ({ graphql, createPage, createRedirect }) => { +export const getPosts = async (graphql: Function): Promise => { const result = await graphql(` { allMarkdownRemark( @@ -28,7 +28,8 @@ module.exports = async ({ graphql, createPage, createRedirect }) => { if (result.errors) { throw new Error(result.errors); } - const posts = result.data.allMarkdownRemark.edges; - createSingleBlogPost({ createPage, createRedirect, posts }); + return result.data.allMarkdownRemark.edges.map( + (e: any) => e.node, + ) as PostQL[]; }; diff --git a/gatsby/pages/blog/index.ts b/gatsby/pages/blog/index.ts new file mode 100644 index 0000000000..0580002cec --- /dev/null +++ b/gatsby/pages/blog/index.ts @@ -0,0 +1,14 @@ +import { CreateBlogPages } from "./types"; +import { getPosts } from "./helpers"; + +import { createSingleBlogPost } from "./singlePostPage"; + +export const createBlogPages = async ({ + graphql, + createPage, + createRedirect, +}: CreateBlogPages) => { + const posts = await getPosts(graphql); + + createSingleBlogPost({ createPage, createRedirect, posts }); +}; diff --git a/gatsby/createPages/blogPostPages/singleBlogPost.js b/gatsby/pages/blog/singlePostPage.ts similarity index 59% rename from gatsby/createPages/blogPostPages/singleBlogPost.js rename to gatsby/pages/blog/singlePostPage.ts index 97e666d052..a083152a16 100644 --- a/gatsby/createPages/blogPostPages/singleBlogPost.js +++ b/gatsby/pages/blog/singlePostPage.ts @@ -1,17 +1,29 @@ -const { resolve } = require("path"); +import { resolve } from "path"; +import { PostQL } from "./types"; +import { CreatePageFn, CreateRedirectFn } from "../../types"; -module.exports = ({ createPage, createRedirect, posts }) => { - const singleBlogPostTemplate = resolve( +export interface CreateSingleBlogPostArgs { + createPage: CreatePageFn; + createRedirect: CreateRedirectFn; + posts: PostQL[]; +} + +export const createSingleBlogPost = ({ + createPage, + createRedirect, + posts, +}: CreateSingleBlogPostArgs) => { + const singleBlogPostTemplate: string = resolve( __dirname, "../../../src/templates/BlogPost.tsx", ); posts.map((post, index) => { - const slug = post.node.fields.slug; - const assetsPath = post.node.fields.assetsPath; + const slug = post.fields.slug; + const assetsPath = post.fields.assetsPath; - const redirectFrom = post.node.frontmatter.redirectFrom; - const postFileName = post.node.fields.postInfo.postFileName; + const redirectFrom = post.frontmatter.redirectFrom; + const postFileName = post.fields.postInfo.fileName; if (redirectFrom && Array.isArray(redirectFrom)) { redirectFrom.map(redirect => { @@ -35,8 +47,8 @@ module.exports = ({ createPage, createRedirect, posts }) => { toPath: slug, }); - const previous = index === posts.length - 1 ? null : posts[index + 1].node; - const next = index === 0 ? null : posts[index - 1].node; + const previous = index === posts.length - 1 ? null : posts[index + 1]; + const next = index === 0 ? null : posts[index - 1]; createPage({ path: slug, diff --git a/gatsby/pages/blog/types.ts b/gatsby/pages/blog/types.ts new file mode 100644 index 0000000000..26c667b5f3 --- /dev/null +++ b/gatsby/pages/blog/types.ts @@ -0,0 +1,21 @@ +import { CreatePageFn, CreateRedirectFn } from "../../types"; + +export interface CreateBlogPages { + graphql: Function; + createPage: CreatePageFn; + createRedirect: CreateRedirectFn; +} + +export interface PostQL { + fields: { + slug: string; + assetsPath: string; + postInfo: { + fileName: string; + }; + }; + frontmatter: { + title: string; + redirectFrom: string[]; + }; +} diff --git a/gatsby/createPages/docsPages/fixLinks.js b/gatsby/pages/docs/fixLinks.ts similarity index 52% rename from gatsby/createPages/docsPages/fixLinks.js rename to gatsby/pages/docs/fixLinks.ts index 6e10a6bac9..f208485bf3 100644 --- a/gatsby/createPages/docsPages/fixLinks.js +++ b/gatsby/pages/docs/fixLinks.ts @@ -1,25 +1,31 @@ -const { DOCS_LATEST_VERSION } = require("../../constants"); +import { DOCS_LATEST_VERSION } from "../../constants"; +import { DocsContentItem } from "./types"; const linksToRewrite = require("../../../content/docs/fix-links"); -const mdLinksRegex = /\[([^\[]+)\]\(([^\)]+)\)/g; -const docsLinksRegex = /^\/(docs|components|root)\/(.*?)$/g; +const MD_LINKS_REGEX = /\[([^\[]+)\]\(([^\)]+)\)/g; +const DOCS_LINKS_REGEX = /^\/(docs|components|root)\/(.*?)$/g; -const changeVersion = ({ source, version }) => { - return source.replace(mdLinksRegex, occurrence => { - mdLinksRegex.lastIndex = 0; - let href = mdLinksRegex.exec(occurrence); +const changeVersion = ({ + source, + version, +}: { + source: string; + version: string; +}) => { + return source.replace(MD_LINKS_REGEX, occurrence => { + MD_LINKS_REGEX.lastIndex = 0; + let href = MD_LINKS_REGEX.exec(occurrence); if (!href || !href[2]) return occurrence; - href = href[2]; + const h = href[2]; - occurrence = occurrence.replace(href, newHref => { - docsLinksRegex.lastIndex = 0; - newHref = docsLinksRegex.exec(newHref); + occurrence = occurrence.replace(h, oldHref => { + DOCS_LINKS_REGEX.lastIndex = 0; + const r = DOCS_LINKS_REGEX.exec(oldHref); - if (!newHref || !newHref[2]) return href; - newHref = - newHref[1] === "docs" ? newHref[2] : `${newHref[1]}/${newHref[2]}`; + if (!r || !r[2]) return h; + const newHref = r[1] === "docs" ? r[2] : `${r[1]}/${r[2]}`; return version && !newHref.includes(version) ? `/docs/${version}/${newHref}` @@ -38,28 +44,30 @@ const rewrite = ({ docType, docTitle, latestVersion, +}: { + [k: string]: string; }) => { const v = version === DOCS_LATEST_VERSION || !version ? latestVersion : version; if (!linksToRewrite[v]) return source; - return source.replace(mdLinksRegex, occurrence => { - mdLinksRegex.lastIndex = 0; - let href = mdLinksRegex.exec(occurrence); + return source.replace(MD_LINKS_REGEX, occurrence => { + MD_LINKS_REGEX.lastIndex = 0; + let href = MD_LINKS_REGEX.exec(occurrence); if (!href || !href[2]) return occurrence; - href = href[2]; + const h = href[2]; if ( linksToRewrite[v][type] && linksToRewrite[v][type][id] && linksToRewrite[v][type][id][docType] && linksToRewrite[v][type][id][docType][docTitle] && - linksToRewrite[v][type][id][docType][docTitle][href] + linksToRewrite[v][type][id][docType][docTitle][h] ) { occurrence = occurrence.replace( - href, - linksToRewrite[v][type][id][docType][docTitle][href], + h, + linksToRewrite[v][type][id][docType][docTitle][h], ); } @@ -67,7 +75,15 @@ const rewrite = ({ }); }; -module.exports = ({ content, version, latestVersion }) => { +export const fixLinks = ({ + content, + version, + latestVersion, +}: { + content: DocsContentItem; + version: string; + latestVersion: string; +}) => { const type = content.type || "root"; const id = content.id; diff --git a/gatsby/pages/docs/generator/docsLoader.ts b/gatsby/pages/docs/generator/docsLoader.ts new file mode 100644 index 0000000000..0317ca9091 --- /dev/null +++ b/gatsby/pages/docs/generator/docsLoader.ts @@ -0,0 +1,34 @@ +import { resolve } from "path"; +import { readFileSync } from "fs-extra"; +import { DocsConfig } from "../types"; + +const DOCS_FOLDER = "docs"; +const VERSION_MANIFEST_YAML = "manifest.yaml"; +const TOPIC_CONFIG_JSON = "docs.config.json"; + +export class DocsLoader { + private version: string = ""; + + constructor(version: string) { + this.version = version; + } + + loadManifest() { + return readFileSync(this.createPath(VERSION_MANIFEST_YAML), "utf8"); + } + + loadTopicConfig(topic: string): DocsConfig { + return this.load(`${topic}/${TOPIC_CONFIG_JSON}`); + } + + private load(path: string): any | JSON { + return require(this.createPath(path)); + } + + private createPath(path: string): string { + return resolve( + __dirname, + `../../../../content/${DOCS_FOLDER}/${this.version}/${path}`, + ); + } +} diff --git a/gatsby/createPages/docsPages/docsArchGenerator/extractContent.js b/gatsby/pages/docs/generator/extractContent.ts similarity index 55% rename from gatsby/createPages/docsPages/docsArchGenerator/extractContent.js rename to gatsby/pages/docs/generator/extractContent.ts index fa0c64e664..9502d7dff0 100644 --- a/gatsby/createPages/docsPages/docsArchGenerator/extractContent.js +++ b/gatsby/pages/docs/generator/extractContent.ts @@ -1,21 +1,36 @@ -const { - sortDocsByOrder, - sortDocsByType, - populateObject, -} = require("../helpers"); +import { DocsLoader } from "./docsLoader"; +import { + DocQL, + ManifestSpec, + ManifestItem, + DocsContent, + DocsContentDocs, + DocsType, +} from "../types"; +import { sortDocsByOrder, sortDocsByType, populateObject } from "../helpers"; -module.exports = ({ version, manifest, docs, docsLoader }) => { - let content = {}; +export const extractContent = ({ + version, + manifest, + docs, + docsLoader, +}: { + version: string; + manifest: ManifestSpec; + docs: DocQL[]; + docsLoader: DocsLoader; +}): DocsContent => { + let content: DocsContent = {} as DocsContent; Object.keys(manifest).map(docsType => { content[docsType] = {}; - const topics = populateObject(manifest[docsType]); + const topics = populateObject(manifest[docsType]); topics.map(topic => { const topicId = topic.id; const topicConfig = docsLoader.loadTopicConfig(topicId).spec; - let topicDocs = []; + let topicDocs: DocsContentDocs[] = []; docs.map((doc, index) => { const { rawMarkdownBody, @@ -23,17 +38,17 @@ module.exports = ({ version, manifest, docs, docsLoader }) => { docInfo: { id, type, version: v, fileName }, }, frontmatter: { title, type: docType }, - } = doc.node; + } = doc; if (version === v && docsType === type && topicId === id) { - let obj = { + let obj: DocsContentDocs = { order: fileName, title: title, source: rawMarkdownBody, }; if (docType) { - obj["type"] = docType; + obj.type = docType; } topicDocs.push(obj); @@ -45,7 +60,7 @@ module.exports = ({ version, manifest, docs, docsLoader }) => { content[docsType][topicId] = { ...topicConfig, - type: topicConfig.type.toLowerCase(), + type: topicConfig.type.toLowerCase() as DocsType, docs: topicDocs, }; }); diff --git a/gatsby/createPages/docsPages/docsArchGenerator/navigation.js b/gatsby/pages/docs/generator/generateNavigation.ts similarity index 54% rename from gatsby/createPages/docsPages/docsArchGenerator/navigation.js rename to gatsby/pages/docs/generator/generateNavigation.ts index 97d100264c..6da3bdda7f 100644 --- a/gatsby/createPages/docsPages/docsArchGenerator/navigation.js +++ b/gatsby/pages/docs/generator/generateNavigation.ts @@ -1,7 +1,16 @@ -const createTopicNavigation = content => { - const topic = { +import { + DocsNavigation, + DocsContent, + DocsContentItem, + DocsNavigationTopic, + DocsNavigationSectionTitles, + DocsType, +} from "../types"; + +const createTopic = (content: DocsContentItem) => { + const topic: DocsNavigationTopic = { id: content.id, - contentType: toLowerCase(content.type), + contentType: toLowerCase(content.type) as DocsType, sections: [], }; @@ -14,16 +23,16 @@ const createTopicNavigation = content => { if (!section) { const name = doc.type ? doc.type : doc.title; section = { - topicType: doc.type ? doc.type : null, - name: name, + topicType: doc.type, + name, anchor: toAnchor(name), - titles: [], + titles: [] as DocsNavigationSectionTitles[], }; topic.sections.push(section); } - if (doc.type) { + if (doc.type && section.titles) { section.titles.push({ name: doc.title, anchor: toAnchor(doc.title), @@ -34,24 +43,24 @@ const createTopicNavigation = content => { return topic; }; -const toLowerCase = value => { +const toLowerCase = (value: string) => { return value && value.toString().toLowerCase(); }; -const toAnchor = value => { +const toAnchor = (value: string) => { return toLowerCase(value) .trim() .replace(/\s/g, "-"); }; -module.exports = content => { - const navigation = { +export const generateNavigation = (content: DocsContent): DocsNavigation => { + const navigation: DocsNavigation = { topics: [], }; Object.keys(content).map(docsType => { Object.keys(content[docsType]).map(docsTopic => { - const topic = createTopicNavigation(content[docsType][docsTopic]); + const topic = createTopic(content[docsType][docsTopic]); navigation.topics.push(topic); }); diff --git a/gatsby/createPages/docsPages/docsArchGenerator/index.js b/gatsby/pages/docs/generator/index.ts similarity index 51% rename from gatsby/createPages/docsPages/docsArchGenerator/index.js rename to gatsby/pages/docs/generator/index.ts index 31663660f3..1d167325f3 100644 --- a/gatsby/createPages/docsPages/docsArchGenerator/index.js +++ b/gatsby/pages/docs/generator/index.ts @@ -1,16 +1,16 @@ -const DocsLoader = require("./docsLoader"); -const extractContent = require("./extractContent"); +import { DocsLoader } from "./docsLoader"; +import { extractContent } from "./extractContent"; +import { loadManifest } from "./manifest"; +import { generateNavigation } from "./generateNavigation"; +import { DocQL, Docs, DocsVersions } from "../types"; -const generateManifest = require("./manifest"); -const generateNavigation = require("./navigation"); - -module.exports = (docs, versions) => { - docsArch = {}; +export const generator = (docs: DocQL[], versions: DocsVersions) => { + const docsArch: Docs = {} as Docs; Object.keys(versions).map(versionType => { versions[versionType].map((version, index) => { const docsLoader = new DocsLoader(version); - const manifest = generateManifest(docsLoader.loadManifest()).spec; + const manifest = loadManifest(docsLoader.loadManifest()).spec; const content = extractContent({ version, manifest, docs, docsLoader }); const navigation = generateNavigation(content); diff --git a/gatsby/pages/docs/generator/manifest.ts b/gatsby/pages/docs/generator/manifest.ts new file mode 100644 index 0000000000..0bdd8741a9 --- /dev/null +++ b/gatsby/pages/docs/generator/manifest.ts @@ -0,0 +1,6 @@ +import { safeLoad } from "js-yaml"; +import { DocsManifest } from "../types"; + +export const loadManifest = (yaml: string): DocsManifest => { + return safeLoad(yaml) as DocsManifest; +}; diff --git a/gatsby/createPages/docsPages/helpers.js b/gatsby/pages/docs/helpers.ts similarity index 62% rename from gatsby/createPages/docsPages/helpers.js rename to gatsby/pages/docs/helpers.ts index 982af900c0..42868a76fd 100644 --- a/gatsby/createPages/docsPages/helpers.js +++ b/gatsby/pages/docs/helpers.ts @@ -1,6 +1,12 @@ -const compareVersions = require("compare-versions"); - -const getDocs = async graphql => { +import compareVersions from "compare-versions"; +import { DocQL, DocsVersions, DocsContentDocs } from "./types"; +import { + DocsGeneratedVersions, + DocsBranchesVersion, + DocsReleasesVersion, +} from "../../../tools/content-loader/src/prepare-docs/docs-versions"; + +const getDocs = async (graphql: Function): Promise => { const result = await graphql(` { allMarkdownRemark(filter: { fileAbsolutePath: { regex: "/docs/" } }) { @@ -29,13 +35,17 @@ const getDocs = async graphql => { throw new Error(result.errors); } - return result.data.allMarkdownRemark.edges; + return result.data.allMarkdownRemark.edges.map((e: any) => e.node); }; -const getDocsVersions = versions => { - const versionsByType = {}; +const getDocsVersions = (versions: DocsGeneratedVersions): DocsVersions => { + const versionsByType: DocsVersions = {}; - const appendType = (type, versions, versionsByType) => { + const appendType = ( + type: string, + versions: (DocsReleasesVersion | DocsBranchesVersion)[], + versionsByType: DocsVersions, + ) => { if (!versions || versions.length === 0) { return; } @@ -55,29 +65,12 @@ const getDocsVersions = versions => { return versionsByType; }; -const sortDocsByOrder = docs => { - return docs.sort(sortFnByProperty("order")); -}; - -const sortFnByProperty = sortBy => { - return (a, b) => { - if (a[sortBy] && b[sortBy]) { - const nameA = a[sortBy].toString().toLowerCase(); - const nameB = b[sortBy].toString().toLowerCase(); - - if (nameA < nameB) { - return -1; - } - if (nameA > nameB) { - return 1; - } - } - return 0; - }; +const sortDocsByOrder = (docs: DocsContentDocs[]) => { + return docs.sort(sortFnByProperty("order")); }; -const sortDocsByType = docs => { - let docsTypes = []; +const sortDocsByType = (docs: DocsContentDocs[]): DocsContentDocs[] => { + let docsTypes: string[] = []; docs.map(doc => { if (!docsTypes.includes(doc.type || doc.title)) { docsTypes.push(doc.type || doc.title); @@ -85,7 +78,7 @@ const sortDocsByType = docs => { return doc; }); - let sortedDocs = []; + let sortedDocs: DocsContentDocs[] = []; for (const type of docsTypes) { for (const doc of docs) { if (type === doc.type || (!doc.type && type === doc.title)) { @@ -96,7 +89,24 @@ const sortDocsByType = docs => { return sortedDocs; }; -const populateObject = obj => { +const sortFnByProperty = (sortBy: string) => { + return (a: T, b: T) => { + if (a[sortBy] && b[sortBy]) { + const nameA = a[sortBy].toString().toLowerCase(); + const nameB = b[sortBy].toString().toLowerCase(); + + if (nameA < nameB) { + return -1; + } + if (nameA > nameB) { + return 1; + } + } + return 0; + }; +}; + +const populateObject = (obj: any | Array): Array => { if (Array.isArray(obj)) { return obj; } @@ -108,7 +118,7 @@ const populateObject = obj => { return []; }; -module.exports = { +export { getDocs, getDocsVersions, sortDocsByOrder, diff --git a/gatsby/createPages/docsPages/index.js b/gatsby/pages/docs/index.ts similarity index 74% rename from gatsby/createPages/docsPages/index.js rename to gatsby/pages/docs/index.ts index 613234b134..e6c9af0d36 100644 --- a/gatsby/createPages/docsPages/index.js +++ b/gatsby/pages/docs/index.ts @@ -1,22 +1,31 @@ -const { resolve } = require("path"); - -const { getDocs, getDocsVersions, populateObject } = require("./helpers"); -const fixLinks = require("./fixLinks"); - -const docsArchGenerator = require("./docsArchGenerator"); - -const { +import { resolve } from "path"; +import { generator } from "./generator"; +import { fixLinks } from "./fixLinks"; +import { getDocs, getDocsVersions, populateObject } from "./helpers"; +import { + CreateDocsPages, + DocsContentItems, + DocsContentItem, + ManifestItem, + DocsType, +} from "./types"; +import { DOCS_DIR, ASSETS_DIR, DOCS_PATH_PREFIX, DOCS_LATEST_VERSION, DOCS_ROOT_TYPE, DOCS_KYMA_ID, -} = require("../../constants"); +} from "../../constants"; -const docsTemplate = resolve(__dirname, "../../../src/templates/Docs.tsx"); - -module.exports = async ({ graphql, createPage }) => { +export const createDocsPages = async ({ + graphql, + createPage, +}: CreateDocsPages) => { + const docsTemplate: string = resolve( + __dirname, + "../../../src/templates/Docs.tsx", + ); const docs = await getDocs(graphql); const versions = getDocsVersions(require("../../../content/docs/versions")); @@ -26,7 +35,7 @@ module.exports = async ({ graphql, createPage }) => { } const latestVersion = versions.releases[0]; - let docsArch = docsArchGenerator(docs, versions); + let docsArch = generator(docs, versions); docsArch[DOCS_LATEST_VERSION] = JSON.parse( JSON.stringify(docsArch[latestVersion]), ); @@ -42,14 +51,14 @@ module.exports = async ({ graphql, createPage }) => { const topicContent = topics[topic]; Object.keys(manifest).map(key => { - manifest[key] = populateObject(manifest[key]); + manifest[key] = populateObject(manifest[key]); }); const assetsPath = `/${ASSETS_DIR}${DOCS_DIR}${ !version || version === DOCS_LATEST_VERSION ? latestVersion : version }/${topic}/${DOCS_DIR}${ASSETS_DIR}`; - let newContent = content[docsType][topic]; + let newContent = content[docsType][topic] as DocsContentItem; newContent = fixLinks({ content: newContent, version, diff --git a/gatsby/pages/docs/types.ts b/gatsby/pages/docs/types.ts new file mode 100644 index 0000000000..066d6614cd --- /dev/null +++ b/gatsby/pages/docs/types.ts @@ -0,0 +1,115 @@ +import { CreatePageFn, CreateRedirectFn } from "../../types"; + +export interface CreateDocsPages { + graphql: Function; + createPage: CreatePageFn; +} + +export interface DocQL { + rawMarkdownBody: string; + fields: { + docInfo: { + id: string; + type: string; + version: string; + fileName: string; + }; + slug: string; + }; + frontmatter: { + title: string; + type: string; + }; +} + +export interface DocsVersions { + [type: string]: string[]; +} + +export interface Docs { + [version: string]: { + content: DocsContent; + navigation: DocsNavigation; + manifest: ManifestSpec; + }; +} + +/* Docs Content */ +export interface DocsContent { + root: DocsContentItems; + components: DocsContentItems; + [type: string]: DocsContentItems; +} + +export interface DocsContentItems { + [key: string]: DocsContentItem; +} + +export interface DocsContentItem { + id: string; + type: DocsType; + displayName: string; + description: string; + docs: DocsContentDocs[]; +} + +export interface DocsConfig { + spec: { + id: string; + displayName: string; + description: string; + type: string; + }; +} + +export interface DocsContentDocs { + order: string; + title: string; + type?: string; + source: string; + [key: string]: string; +} + +/* Docs Navigation */ +export type DocsType = "root" | "component"; + +export interface DocsNavigation { + topics: DocsNavigationTopic[]; +} + +export interface DocsNavigationTopic { + id: string; + contentType: DocsType; + sections: DocsNavigationTopicSection[]; +} + +export interface DocsNavigationTopicSection { + topicType?: string; + anchor: string; + name: string; + titles?: DocsNavigationSectionTitles[]; +} + +export interface DocsNavigationSectionTitles { + name: string; + anchor: string; +} + +/* Docs Manifest */ +export interface DocsManifest { + metadata: { + name: string; + }; + spec: ManifestSpec; +} + +export interface ManifestSpec { + root: ManifestItem[]; + components: ManifestItem[]; + [type: string]: ManifestItem[]; +} + +export interface ManifestItem { + displayName: string; + id: string; +} diff --git a/gatsby/helpers.js b/gatsby/pages/helpers.ts similarity index 63% rename from gatsby/helpers.js rename to gatsby/pages/helpers.ts index 82196a2989..0e7bec3be4 100644 --- a/gatsby/helpers.js +++ b/gatsby/pages/helpers.ts @@ -1,23 +1,36 @@ -const i18nConfig = require("../config").i18n; - -const createIntlPage = ({ actions }) => { - const { createPage, createRedirect } = actions; - - return ({ path, component, context }) => { +import { Actions } from "gatsby"; +import { CreatePageFn, CreateRedirectFn } from "../types"; + +interface Intl { + [lang: string]: { + path: string; + locale: string; + default?: boolean; + }; +} +const i18nConfig: Intl = require("../../config").i18n; + +export const createIntlPage = (actions: Actions): CreatePageFn => { + const { createPage, createRedirect: cr } = actions; + + return ({ + path, + component, + context, + }: { + path: string; + component: string; + context: Record; + }) => { Object.keys(i18nConfig).map(lang => { - const isDefaultLang = i18nConfig[lang].default; + const isDefaultLang: boolean | undefined = i18nConfig[lang].default; + path = path.startsWith("/") ? path : `/${path}`; let localizedPath = isDefaultLang ? path - : `${i18nConfig[lang].path}${path}`; - - // localizedPath = localizedPath.endsWith("/") - // ? localizedPath.slice(0, -1) - // : localizedPath; - localizedPath = localizedPath.startsWith("/") - ? localizedPath - : `/${localizedPath}`; + : `/${i18nConfig[lang].path}${path}`; + const createRedirect = cr as CreateRedirectFn; createRedirects({ createRedirect, lang, @@ -42,6 +55,11 @@ const createRedirects = ({ lang, isDefaultLang, localizedPath, +}: { + createRedirect: CreateRedirectFn; + lang: string; + isDefaultLang?: boolean; + localizedPath: string; }) => { if (localizedPath === "/") { createRedirect({ @@ -73,12 +91,6 @@ const createRedirects = ({ return; } - // createRedirect({ - // fromPath: `${localizedPath}/`, - // redirectInBrowser: true, - // toPath: localizedPath, - // }); - createRedirect({ fromPath: `${localizedPath}.html`, redirectInBrowser: true, @@ -92,12 +104,6 @@ const createRedirects = ({ toPath: localizedPath, }); - // createRedirect({ - // fromPath: `/${i18nConfig[lang].path}${localizedPath}/`, - // redirectInBrowser: true, - // toPath: localizedPath, - // }); - createRedirect({ fromPath: `/${i18nConfig[lang].path}${localizedPath}.html`, redirectInBrowser: true, @@ -105,5 +111,3 @@ const createRedirects = ({ }); } }; - -module.exports = { createIntlPage }; diff --git a/gatsby/pages/index.ts b/gatsby/pages/index.ts new file mode 100644 index 0000000000..1ec75414e9 --- /dev/null +++ b/gatsby/pages/index.ts @@ -0,0 +1,20 @@ +import { CreatePagesArgs } from "gatsby"; +import { createIntlPage } from "./helpers"; +import { CreateRedirectFn } from "../types"; + +import { createBlogPages } from "./blog"; +import { createDocsPages } from "./docs"; +import { createRoadmapPages } from "./roadmap"; +import { onCreatePage } from "./onCreatePage"; + +const createPages = async ({ graphql, actions }: CreatePagesArgs) => { + const createPage = createIntlPage(actions); + const { createRedirect: cr } = actions; + const createRedirect = cr as CreateRedirectFn; + + await createBlogPages({ graphql, createPage, createRedirect }); + await createDocsPages({ graphql, createPage }); + await createRoadmapPages({ graphql, createPage, createRedirect }); +}; + +export { createPages, onCreatePage }; diff --git a/gatsby/pages/onCreatePage.ts b/gatsby/pages/onCreatePage.ts new file mode 100644 index 0000000000..3848ab95d3 --- /dev/null +++ b/gatsby/pages/onCreatePage.ts @@ -0,0 +1,22 @@ +import { CreatePageArgs } from "gatsby"; +import { createIntlPage } from "./helpers"; + +export const onCreatePage = async ({ page, actions }: CreatePageArgs) => { + const createPage = createIntlPage(actions); + const { deletePage } = actions; + + return new Promise(resolve => { + if (page.path && page.component && page.context) { + deletePage({ + path: page.path, + component: page.component, + }); + createPage({ + path: page.path, + component: page.component, + context: page.context, + }); + } + resolve(); + }); +}; diff --git a/gatsby/pages/roadmap/helpers.ts b/gatsby/pages/roadmap/helpers.ts new file mode 100644 index 0000000000..d158757858 --- /dev/null +++ b/gatsby/pages/roadmap/helpers.ts @@ -0,0 +1,77 @@ +import { + CapabilityQL, + RoadmapNavigationNode, + CapabilityDisplayNameReferencesToId, +} from "./types"; + +export const getCapabilities = async ( + graphql: Function, +): Promise => { + const result = await graphql(` + { + allMarkdownRemark( + sort: { order: DESC, fields: [fields___slug] } + filter: { fileAbsolutePath: { regex: "/roadmap/capabilities/" } } + ) { + edges { + node { + frontmatter { + displayName + epicsLabels + id + } + } + } + } + } + `); + if (result.errors) { + throw new Error(result.errors); + } + + return sortCapabilities(result.data.allMarkdownRemark.edges.map( + (e: any) => e.node, + ) as CapabilityQL[]); +}; + +const sortCapabilities = (capabilities: CapabilityQL[]): CapabilityQL[] => { + return capabilities.sort((a, b) => { + const orderA = a.frontmatter.displayName.toLowerCase(); + const orderB = b.frontmatter.displayName.toLowerCase(); + + if (orderA > orderB) { + return 1; + } + if (orderA < orderB) { + return -1; + } + return 0; + }); +}; + +export const generateCapabilitiesNavigation = ( + capabilities: CapabilityQL[], +): RoadmapNavigationNode[] => { + const navigation: RoadmapNavigationNode[] = []; + + capabilities.map(capability => { + navigation.push({ + displayName: capability.frontmatter.displayName, + id: capability.frontmatter.id, + }); + }); + + return navigation; +}; + +export const generateMapOfDisplayNameToId = ( + capabilities: CapabilityQL[], +): CapabilityDisplayNameReferencesToId => { + const map: CapabilityDisplayNameReferencesToId = {}; + + capabilities.map(capability => { + map[capability.frontmatter.displayName] = capability.frontmatter.id; + }); + + return map; +}; diff --git a/gatsby/pages/roadmap/index.ts b/gatsby/pages/roadmap/index.ts new file mode 100644 index 0000000000..e0400a6c50 --- /dev/null +++ b/gatsby/pages/roadmap/index.ts @@ -0,0 +1,16 @@ +import { CreateRoadmapPages } from "./types"; +import { getCapabilities } from "./helpers"; + +import { createRootPage } from "./rootPage"; +import { createModalPage } from "./modalPage"; + +export const createRoadmapPages = async ({ + graphql, + createPage, + createRedirect, +}: CreateRoadmapPages) => { + const capabilities = await getCapabilities(graphql); + + createRootPage({ createPage, createRedirect, capabilities }); + createModalPage({ createPage, createRedirect, capabilities }); +}; diff --git a/gatsby/createPages/roadmapPages/modalPage.js b/gatsby/pages/roadmap/modalPage.ts similarity index 58% rename from gatsby/createPages/roadmapPages/modalPage.js rename to gatsby/pages/roadmap/modalPage.ts index 83b1a931d7..536523a1ce 100644 --- a/gatsby/createPages/roadmapPages/modalPage.js +++ b/gatsby/pages/roadmap/modalPage.ts @@ -1,15 +1,27 @@ -const { resolve } = require("path"); - -const releases = require("../../../content/roadmap/tickets.json"); - -const { +import { resolve } from "path"; +import { generateCapabilitiesNavigation, generateMapOfDisplayNameToId, -} = require("./helpers"); -const { ROADMAP_PATH_PREFIX } = require("../../constants"); - -module.exports = ({ createPage, createRedirect, capabilities }) => { - const roadmapTemplate = resolve( +} from "./helpers"; +import { CapabilityQL } from "./types"; +import { CreatePageFn, CreateRedirectFn } from "../../types"; +import { ROADMAP_PATH_PREFIX } from "../../constants"; +import { Tickets } from "../../../tools/content-loader/src/prepare-roadmap-content/types"; + +export interface CreateModalPageArgs { + createPage: CreatePageFn; + createRedirect: CreateRedirectFn; + capabilities: CapabilityQL[]; +} + +const releases: Tickets = require("../../../content/roadmap/tickets.json"); + +export const createModalPage = ({ + createPage, + createRedirect, + capabilities, +}: CreateModalPageArgs) => { + const roadmapTemplate: string = resolve( __dirname, "../../../src/templates/Roadmap.tsx", ); diff --git a/gatsby/createPages/roadmapPages/roadmapPage.js b/gatsby/pages/roadmap/rootPage.ts similarity index 52% rename from gatsby/createPages/roadmapPages/roadmapPage.js rename to gatsby/pages/roadmap/rootPage.ts index 309c11b604..65f8e0a7fd 100644 --- a/gatsby/createPages/roadmapPages/roadmapPage.js +++ b/gatsby/pages/roadmap/rootPage.ts @@ -1,13 +1,24 @@ -const { resolve } = require("path"); - -const { +import { resolve } from "path"; +import { generateCapabilitiesNavigation, generateMapOfDisplayNameToId, -} = require("./helpers"); -const { ROADMAP_PATH_PREFIX } = require("../../constants"); +} from "./helpers"; +import { CapabilityQL } from "./types"; +import { CreatePageFn, CreateRedirectFn } from "../../types"; +import { ROADMAP_PATH_PREFIX } from "../../constants"; + +export interface CreateRootPageArgs { + createPage: CreatePageFn; + createRedirect: CreateRedirectFn; + capabilities: CapabilityQL[]; +} -module.exports = ({ createPage, createRedirect, capabilities }) => { - const roadmapTemplate = resolve( +export const createRootPage = ({ + createPage, + createRedirect, + capabilities, +}: CreateRootPageArgs) => { + const roadmapTemplate: string = resolve( __dirname, "../../../src/templates/Roadmap.tsx", ); diff --git a/gatsby/pages/roadmap/types.ts b/gatsby/pages/roadmap/types.ts new file mode 100644 index 0000000000..f18c083138 --- /dev/null +++ b/gatsby/pages/roadmap/types.ts @@ -0,0 +1,24 @@ +import { CreatePageFn, CreateRedirectFn } from "../../types"; + +export interface CreateRoadmapPages { + graphql: Function; + createPage: CreatePageFn; + createRedirect: CreateRedirectFn; +} + +export interface CapabilityQL { + frontmatter: { + displayName: string; + epicsLabels: string[]; + id: string; + }; +} + +export interface RoadmapNavigationNode { + displayName: string; + id: string; +} + +export interface CapabilityDisplayNameReferencesToId { + [displayName: string]: string; +} diff --git a/gatsby/types.ts b/gatsby/types.ts new file mode 100644 index 0000000000..2d03a1931b --- /dev/null +++ b/gatsby/types.ts @@ -0,0 +1,25 @@ +interface ActionPlugin { + name: string; +} + +interface ActionOptions { + [key: string]: any; +} + +export type CreatePageFn = ( + args: { path: string; component: string; context: Record }, + plugin?: ActionPlugin, + option?: ActionOptions, +) => void; + +export type CreateRedirectFn = ( + redirect: { + fromPath: string; + toPath: string; + isPermanent?: boolean; + redirectInBrowser?: boolean; + force?: boolean; + statusCode?: number; + }, + plugin?: ActionPlugin, +) => void; diff --git a/gatsby/webpack/index.ts b/gatsby/webpack/index.ts new file mode 100644 index 0000000000..1594966f12 --- /dev/null +++ b/gatsby/webpack/index.ts @@ -0,0 +1 @@ +export { onCreateWebpackConfig } from "./onCreateWebpackConfig"; diff --git a/gatsby/webpack/onCreateWebpackConfig.ts b/gatsby/webpack/onCreateWebpackConfig.ts new file mode 100644 index 0000000000..35769c1899 --- /dev/null +++ b/gatsby/webpack/onCreateWebpackConfig.ts @@ -0,0 +1,17 @@ +import { CreateWebpackConfigArgs } from "gatsby"; +import { resolve } from "path"; + +export const onCreateWebpackConfig = ({ actions }: CreateWebpackConfigArgs) => { + actions.setWebpackConfig({ + resolve: { + alias: { + "@components": resolve(__dirname, "../../src/components"), + "@common": resolve(__dirname, "../../src/common"), + "@config": resolve(__dirname, "../../config.json"), + "@content": resolve(__dirname, "../../content"), + "@static": resolve(__dirname, "../../static"), + "@styled": resolve(__dirname, "../../src/common/styled"), + }, + }, + }); +}; diff --git a/package-lock.json b/package-lock.json index b9c62e8030..613d1ece57 100644 --- a/package-lock.json +++ b/package-lock.json @@ -949,11 +949,18 @@ } }, "@fortawesome/free-solid-svg-icons": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-5.7.2.tgz", - "integrity": "sha512-iujcXMyAvIbWM8W3jkOLpvJbR+rPpdN1QyqhZeJaLRdHPH4JmuovIAYP4vx5Sa1csZVXfRD1eDWqVZ/jGM620A==", + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-5.9.0.tgz", + "integrity": "sha512-U8YXPfWcSozsCW0psCtlRGKjjRs5+Am5JJwLOUmVHFZbIEWzaz4YbP84EoPwUsVmSAKrisu3QeNcVOtmGml0Xw==", "requires": { - "@fortawesome/fontawesome-common-types": "^0.2.15" + "@fortawesome/fontawesome-common-types": "^0.2.19" + }, + "dependencies": { + "@fortawesome/fontawesome-common-types": { + "version": "0.2.19", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-0.2.19.tgz", + "integrity": "sha512-nd2Ul/CUs8U9sjofQYAALzOGpgkVJQgEhIJnOHaoyVR/LeC3x2mVg4eB910a4kS6WgLPebAY0M2fApEI497raQ==" + } } }, "@fortawesome/react-fontawesome": { @@ -1384,6 +1391,15 @@ "resolved": "https://registry.npmjs.org/@types/events/-/events-3.0.0.tgz", "integrity": "sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g==" }, + "@types/fs-extra": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-8.0.0.tgz", + "integrity": "sha512-bCtL5v9zdbQW86yexOlXWTEGvLNqWxMFyi7gQA7Gcthbezr2cPSOb8SkESVKA937QD5cIwOFLDFt0MQoXOEr9Q==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, "@types/get-port": { "version": "0.0.4", "resolved": "https://registry.npmjs.org/@types/get-port/-/get-port-0.0.4.tgz", @@ -1409,6 +1425,12 @@ "resolved": "https://registry.npmjs.org/@types/jquery/-/jquery-2.0.53.tgz", "integrity": "sha512-MZKPWUhp5TKkoJ/58NSq6io+CSUCOHm2b3Z6U4+r9v70kktB0JM+eRjdp6YmDHtw0kK2XB7L2K7/FMIoziHjUA==" }, + "@types/js-yaml": { + "version": "3.12.1", + "resolved": "https://registry.npmjs.org/@types/js-yaml/-/js-yaml-3.12.1.tgz", + "integrity": "sha512-SGGAhXLHDx+PK4YLNcNGa6goPf9XRWQNAUUbffkwVGGXIxmDKWyGGL4inzq2sPmExu431Ekb9aEMn9BkPqEYFA==", + "dev": true + }, "@types/lodash": { "version": "4.14.132", "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.132.tgz", @@ -1881,6 +1903,12 @@ "readable-stream": "^2.0.6" } }, + "arg": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.0.tgz", + "integrity": "sha512-ZWc51jO3qegGkVh8Hwpv636EkbesNV5ZNQPCtRa+0qytRYPEs9IYT9qITY9buezqUH5uqyzlWLcufrzU2rffdg==", + "dev": true + }, "argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", @@ -4432,12 +4460,6 @@ "buffer-indexof": "^1.0.0" } }, - "docopt": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/docopt/-/docopt-0.6.2.tgz", - "integrity": "sha1-so6eIiDaXsSffqW7JKR3h0Be6xE=", - "dev": true - }, "doctrine": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", @@ -4543,9 +4565,9 @@ "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" }, "ejs": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.6.1.tgz", - "integrity": "sha512-0xy4A/twfrRCnkhfk8ErDi5DqdAsAqeGxht4xkCUrsvhhbQNs7E+4jV0CN7+NKIY0aHE72+XvqtBIXzD31ZbXQ==", + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.6.2.tgz", + "integrity": "sha512-PcW2a0tyTuPHz3tWyYqtK6r1fZ3gp+3Sop8Ph+ZYN81Ob5rwmbHEzaqs10N3BEsaGTkh/ooniXK+WwszGlc2+Q==", "dev": true }, "electron-to-chromium": { @@ -11295,6 +11317,15 @@ "mimic-fn": "^1.0.0" } }, + "open": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/open/-/open-6.4.0.tgz", + "integrity": "sha512-IFenVPgF70fSm1keSd2iDBIDIBZkroLeuffXq+wKTzTJlBpesFWojV9lb8mzOfaAzM1sr7HQHuO0vtV0zYekGg==", + "dev": true, + "requires": { + "is-wsl": "^1.1.0" + } + }, "opencollective": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/opencollective/-/opencollective-1.0.3.tgz", @@ -14526,20 +14557,274 @@ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" }, "source-map-explorer": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/source-map-explorer/-/source-map-explorer-1.8.0.tgz", - "integrity": "sha512-1Q0lNSw5J7pChKmjqniOCLbvLFi4KJfrtixk99CzvRcqFiGBJvRHMrw0PjLwKOvbuAo8rNOukJhEPA0Nj85xDw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/source-map-explorer/-/source-map-explorer-2.0.1.tgz", + "integrity": "sha512-mv2sv2b6oN2L9n18O/eLrYiP5zfWEHESLq4utWBqNw8GnkbuRuXs8twVCOhMT5hxRzfQgS7Yxh7HlQaW8oeiAQ==", "dev": true, "requires": { "btoa": "^1.2.1", + "chalk": "^2.4.2", "convert-source-map": "^1.6.0", - "docopt": "^0.6.2", - "ejs": "^2.6.1", - "fs-extra": "^7.0.1", - "glob": "^7.1.3", - "opn": "^5.5.0", - "source-map": "^0.5.1", - "temp": "^0.9.0" + "ejs": "^2.6.2", + "escape-html": "^1.0.3", + "glob": "^7.1.4", + "lodash": "^4.17.11", + "open": "^6.3.0", + "source-map": "^0.7.3", + "temp": "^0.9.0", + "yargs": "^13.2.4" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, + "cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "dev": true, + "requires": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + } + }, + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "dev": true, + "requires": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true + }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "glob": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", + "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "invert-kv": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", + "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "lcid": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", + "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", + "dev": true, + "requires": { + "invert-kv": "^2.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "mem": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", + "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==", + "dev": true, + "requires": { + "map-age-cleaner": "^0.1.1", + "mimic-fn": "^2.0.0", + "p-is-promise": "^2.0.0" + } + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true + }, + "os-locale": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", + "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", + "dev": true, + "requires": { + "execa": "^1.0.0", + "lcid": "^2.0.0", + "mem": "^4.0.0" + } + }, + "p-limit": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.0.tgz", + "integrity": "sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true + }, + "source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "dev": true + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + }, + "wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + } + }, + "y18n": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", + "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", + "dev": true + }, + "yargs": { + "version": "13.2.4", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.2.4.tgz", + "integrity": "sha512-HG/DWAJa1PAnHT9JAhNa8AbAv3FPaiLzioSjCcmuXXhP8MlpHO5vwls4g4j6n30Z74GVQj8Xa62dWVx1QCGklg==", + "dev": true, + "requires": { + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "os-locale": "^3.1.0", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.0" + } + }, + "yargs-parser": { + "version": "13.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.1.tgz", + "integrity": "sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } } }, "source-map-resolve": { @@ -15475,19 +15760,24 @@ } }, "ts-node": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-7.0.1.tgz", - "integrity": "sha512-BVwVbPJRspzNh2yfslyT1PSbl5uIk03EZlb493RKHN4qej/D06n1cEhjlOJG69oFsE7OT8XjpTUcYf6pKTLMhw==", + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-8.3.0.tgz", + "integrity": "sha512-dyNS/RqyVTDcmNM4NIBAeDMpsAdaQ+ojdf0GOLqE6nwJOgzEkdRNzJywhDfwnuvB10oa6NLVG1rUJQCpRN7qoQ==", "dev": true, "requires": { - "arrify": "^1.0.0", - "buffer-from": "^1.1.0", - "diff": "^3.1.0", + "arg": "^4.1.0", + "diff": "^4.0.1", "make-error": "^1.1.1", - "minimist": "^1.2.0", - "mkdirp": "^0.5.1", "source-map-support": "^0.5.6", - "yn": "^2.0.0" + "yn": "^3.0.0" + }, + "dependencies": { + "diff": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.1.tgz", + "integrity": "sha512-s2+XdvhPCOF01LRQBC8hf4vhbVmI2CGS5aZnxLJlT5FtdhPCDFq80q++zK2KlrVorVDdL5BOGZ/VfLrVtYNF+Q==", + "dev": true + } } }, "ts-pnp": { @@ -15496,9 +15786,9 @@ "integrity": "sha512-f5Knjh7XCyRIzoC/z1Su1yLLRrPrFCgtUAh/9fCSP6NKbATwpOL1+idQVXQokK9GRFURn/jYPGPfegIctwunoA==" }, "tslib": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz", - "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==" + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz", + "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==" }, "tslint": { "version": "5.12.1", @@ -15604,9 +15894,9 @@ "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" }, "typescript": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.5.1.tgz", - "integrity": "sha512-64HkdiRv1yYZsSe4xC1WVgamNigVYjlssIoaH2HcZF0+ijsk5YK2g0G34w9wJkze8+5ow4STd22AynfO6ZYYLw==", + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.5.2.tgz", + "integrity": "sha512-7KxJovlYhTX5RaRbUdkAXN1KUZ8PwWlTzQdHV6xNqvuFOs7+WBo10TQUqT19Q/Jz2hk5v9TQDIhyLhhJY4p5AA==", "dev": true }, "typography": { @@ -17268,9 +17558,9 @@ "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk=" }, "yn": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/yn/-/yn-2.0.0.tgz", - "integrity": "sha1-5a2ryKz0CPY4X8dklWhMiOavaJo=", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.0.tgz", + "integrity": "sha512-kKfnnYkbTfrAdd0xICNFw7Atm8nKpLcLv9AZGEt+kczL/WQVai4e2V6ZN8U/O+iI6WrNuJjNNOyu4zfhl9D3Hg==", "dev": true }, "yoga-layout-prebuilt": { diff --git a/package.json b/package.json index 308aef5193..e5fe56aac7 100755 --- a/package.json +++ b/package.json @@ -21,12 +21,13 @@ "k8s" ], "scripts": { - "start": "npm run clear-cache && npm run develop", + "start": "npm run clean && npm run develop", "develop": "gatsby develop --port 5000", "build": "npm run clear-cache && gatsby build", + "build:prod": "GATSBY_SITE_URL='https://kyma-project.io' gatsby build", "serve": "gatsby serve", "serve:out": "gatsby serve -H 0.0.0.0", - "build:prod": "GATSBY_SITE_URL='https://kyma-project.io' gatsby build", + "clean": "gatsby clean", "start:functions": "netlify-lambda serve netlify/functions", "build:functions": "netlify-lambda build netlify/functions", "lint-check": "tslint -c tslint.json --project tsconfig.json --format verbose && prettier --check '**/*.{ts,tsx,js,jsx,json,html,css,yaml}'", @@ -34,7 +35,6 @@ "conflict-check": "tslint-config-prettier-check ./tslint.json", "type-check": "tsc --noEmit", "markdownlint": "markdownlint **/*.md", - "clear-cache": "gatsby clean", "explore": "source-map-explorer \"public/*.js\"" }, "dependencies": { @@ -85,6 +85,8 @@ "devDependencies": { "@babel/preset-typescript": "^7.3.3", "@types/aws-lambda": "^8.10.24", + "@types/fs-extra": "^8.0.0", + "@types/js-yaml": "^3.12.1", "@types/lodash": "^4.14.132", "@types/node-fetch": "^2.3.3", "@types/qs": "^6.5.3", @@ -108,14 +110,14 @@ "lodash": "^4.17.11", "markdownlint-cli": "^0.13.0", "prettier": "^1.15.2", - "source-map-explorer": "^1.8.0", - "ts-node": "^7.0.1", - "tslib": "^1.9.3", + "source-map-explorer": "^2.0.1", + "ts-node": "^8.3.0", + "tslib": "^1.10.0", "tslint": "^5.10.0", "tslint-config-prettier": "^1.17.0", "tslint-react": "^3.6.0", "tslint-react-hooks": "^2.1.0", - "typescript": "^3.5.1", + "typescript": "^3.5.2", "utility-types": "^3.7.0" }, "bugs": { @@ -133,8 +135,7 @@ "git add" ], "src/**/*.{ts,tsx}": [ - "tslint -c tslint.json --project tsconfig.json --format verbose --fix", - "prettier --config .prettierrc --write", + "npm run lint-fix", "git add" ], "**/.md": [ diff --git a/tslint.json b/tslint.json index 1bb03ccfc6..0fcba25767 100755 --- a/tslint.json +++ b/tslint.json @@ -31,6 +31,6 @@ }, "jsRules": {}, "linterOptions": { - "exclude": ["node_modules/**/*", "tools/**/*"] + "exclude": ["*/node_modules/**/*"] } } From 4bcc64d7c1d107e1aaa6009371a466e51b4effa3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maciej=20Urba=C5=84czyk?= Date: Sat, 6 Jul 2019 16:56:25 +0200 Subject: [PATCH 2/9] Move gatsby-config to gatsby folder --- gatsby-config.js | 175 +----------------- gatsby/config/index.ts | 9 + gatsby/config/plugins.ts | 98 ++++++++++ gatsby/config/sitemetadata.ts | 7 + gatsby/index.js | 2 + gatsby/pages/docs/generator/index.ts | 2 +- .../{manifest.ts => loadManifest.ts} | 0 7 files changed, 119 insertions(+), 174 deletions(-) create mode 100644 gatsby/config/index.ts create mode 100644 gatsby/config/plugins.ts create mode 100644 gatsby/config/sitemetadata.ts rename gatsby/pages/docs/generator/{manifest.ts => loadManifest.ts} (100%) diff --git a/gatsby-config.js b/gatsby-config.js index 1431bdea12..f0d3f52667 100755 --- a/gatsby-config.js +++ b/gatsby-config.js @@ -1,174 +1,3 @@ -const siteMetadata = require("./config.json").siteMetadata; +const { config } = require("./gatsby"); -module.exports = { - siteMetadata, - plugins: [ - "gatsby-plugin-react-helmet", - { - resolve: "gatsby-plugin-styled-components", - options: { - ssr: false, - displayName: true, - }, - }, - "gatsby-plugin-lodash", - "gatsby-plugin-typescript", - { - resolve: "gatsby-source-filesystem", - options: { - name: "content", - path: `${__dirname}/content/`, - }, - }, - { - resolve: "gatsby-plugin-copy-files", - options: { - source: `${__dirname}/content`, - destination: "/assets", - extensions: ["jpeg", "jpg", "gif", "png", "svg", "json", "yaml", "yml"], - // add regex possibility - excludeDirs: ["i18n"], - excludeFiles: [ - "docs/versions.json", - "docs.config.json", - "manifest.yaml", - "events.yaml", - ], - }, - }, - { - resolve: "gatsby-plugin-anchor-behavior", - options: { - paths: { - "/docs/": { - defaultOffset: 16, - mobileOffset: 74, - }, - "/roadmap/": { - defaultOffset: 0, - mobileOffset: 0, - }, - }, - defaultOffset: 16, - mobileOffset: 74, - mobileOffsetInclude: ["/docs"], - }, - }, - "gatsby-plugin-banner-slides-yml", - "gatsby-plugin-early-adopters-yml", - { - resolve: "gatsby-transformer-remark", - options: { - excerpt_separator: ``, - }, - }, - { - resolve: "gatsby-plugin-manifest", - options: { - name: "Kyma", - short_name: "Kyma", - start_url: "/", - background_color: "#fff", - theme_color: "#0073e6", - display: "standalone", - icon: "static/android-chrome-512x512.png", - }, - }, - { - resolve: `gatsby-plugin-gtag`, - options: { - trackingId: "UA-122665881-1", - head: true, - anonymize: true, - }, - }, - `gatsby-plugin-sitemap`, - `gatsby-plugin-netlify`, - `gatsby-plugin-netlify-cache`, - { - resolve: `gatsby-plugin-env-variables`, - options: { - whitelist: ["GOOGLE_CSE", "ALGOLIA_API_KEY", "ALGOLIA_INDEX_NAME"], - }, - }, - { - resolve: `gatsby-plugin-feed`, - options: { - query: ` - { - site { - siteMetadata { - title - description - siteUrl - site_url: siteUrl - } - } - } - `, - feeds: [ - { - serialize: ({ query: { site, allMarkdownRemark } }) => { - return allMarkdownRemark.edges - .filter(arg => arg.node.fields.slug.startsWith("/blog/")) - .map(edge => { - const getAuthor = arg => { - if ( - arg.node.frontmatter.author && - !!arg.node.frontmatter.author.name - ) { - return arg.node.frontmatter.author.name; - } - return null; - }; - - const host = site.siteMetadata.siteUrl; - const link = `${ - host.endsWith("/") ? host : host + "/" - }${edge.node.fields.slug.slice(1)}`; - - return { - ...edge.node.frontmatter, - date: edge.node.frontmatter.date, - url: link, - guid: link, - author: getAuthor(edge), - description: edge.node.excerpt, - custom_elements: [{ "content:encoded": edge.node.html }], - }; - }); - }, - query: ` - { - allMarkdownRemark(sort: {order: DESC, fields: [fields___date]}) { - edges { - node { - excerpt - html - fields { - slug - date - } - frontmatter { - title - author { - name - } - } - } - } - } - } - `, - output: `${ - siteMetadata.feedUrl.startsWith("/") - ? siteMetadata.feedUrl - : "/" + siteMetadata.feedUrl - }`, - }, - ], - }, - }, - ], - pathPrefix: "/website", -}; +module.exports = config; diff --git a/gatsby/config/index.ts b/gatsby/config/index.ts new file mode 100644 index 0000000000..bd9d198a94 --- /dev/null +++ b/gatsby/config/index.ts @@ -0,0 +1,9 @@ +import { GatsbyConfig } from "gatsby"; +import { siteMetadata } from "./sitemetadata"; +import { plugins } from "./plugins"; + +export const config: GatsbyConfig = { + siteMetadata, + plugins, + pathPrefix: "/website", +}; diff --git a/gatsby/config/plugins.ts b/gatsby/config/plugins.ts new file mode 100644 index 0000000000..309d9da750 --- /dev/null +++ b/gatsby/config/plugins.ts @@ -0,0 +1,98 @@ +type Plugins = Array< + | string + | { + resolve: string; + options: Record; + } +>; + +export const plugins: Plugins = [ + "gatsby-plugin-react-helmet", + { + resolve: "gatsby-plugin-styled-components", + options: { + ssr: false, + displayName: true, + }, + }, + "gatsby-plugin-lodash", + "gatsby-plugin-typescript", + { + resolve: "gatsby-source-filesystem", + options: { + name: "content", + path: `${__dirname}/../../content/`, + }, + }, + { + resolve: "gatsby-plugin-copy-files", + options: { + source: `${__dirname}/../../content`, + destination: "/assets", + extensions: ["jpeg", "jpg", "gif", "png", "svg", "json", "yaml", "yml"], + // add regex possibility + excludeDirs: ["i18n"], + excludeFiles: [ + "docs/versions.json", + "docs.config.json", + "manifest.yaml", + "events.yaml", + ], + }, + }, + { + resolve: "gatsby-plugin-anchor-behavior", + options: { + paths: { + "/docs/": { + defaultOffset: 16, + mobileOffset: 74, + }, + "/roadmap/": { + defaultOffset: 0, + mobileOffset: 0, + }, + }, + defaultOffset: 16, + mobileOffset: 74, + mobileOffsetInclude: ["/docs"], + }, + }, + "gatsby-plugin-banner-slides-yml", + "gatsby-plugin-early-adopters-yml", + { + resolve: "gatsby-transformer-remark", + options: { + excerpt_separator: ``, + }, + }, + { + resolve: "gatsby-plugin-manifest", + options: { + name: "Kyma", + short_name: "Kyma", + start_url: "/", + background_color: "#fff", + theme_color: "#0073e6", + display: "standalone", + icon: "static/android-chrome-512x512.png", + }, + }, + { + resolve: `gatsby-plugin-gtag`, + options: { + trackingId: "UA-122665881-1", + head: true, + anonymize: true, + }, + }, + `gatsby-plugin-sitemap`, + `gatsby-plugin-netlify`, + `gatsby-plugin-netlify-cache`, + { + resolve: `gatsby-plugin-env-variables`, + options: { + whitelist: ["GOOGLE_CSE", "ALGOLIA_API_KEY", "ALGOLIA_INDEX_NAME"], + }, + }, +]; diff --git a/gatsby/config/sitemetadata.ts b/gatsby/config/sitemetadata.ts new file mode 100644 index 0000000000..a44e65b31a --- /dev/null +++ b/gatsby/config/sitemetadata.ts @@ -0,0 +1,7 @@ +const configSiteMetadata = require("../../config").siteMetadata; + +export const siteMetadata: Record = { + siteUrl: "https://kyma-project.io/", + twitterUsername: "kymaproject", + ...configSiteMetadata, +}; diff --git a/gatsby/index.js b/gatsby/index.js index 9f883a3586..8087e71459 100644 --- a/gatsby/index.js +++ b/gatsby/index.js @@ -8,11 +8,13 @@ require("ts-node").register({ }, }); +const { config } = require("./config"); const { onCreateWebpackConfig } = require("./webpack"); const { createPages, onCreatePage } = require("./pages"); const { onCreateNode } = require("./nodes"); module.exports = { + config, onCreateWebpackConfig, createPages, onCreateNode, diff --git a/gatsby/pages/docs/generator/index.ts b/gatsby/pages/docs/generator/index.ts index 1d167325f3..2459981c6c 100644 --- a/gatsby/pages/docs/generator/index.ts +++ b/gatsby/pages/docs/generator/index.ts @@ -1,6 +1,6 @@ import { DocsLoader } from "./docsLoader"; import { extractContent } from "./extractContent"; -import { loadManifest } from "./manifest"; +import { loadManifest } from "./loadManifest"; import { generateNavigation } from "./generateNavigation"; import { DocQL, Docs, DocsVersions } from "../types"; diff --git a/gatsby/pages/docs/generator/manifest.ts b/gatsby/pages/docs/generator/loadManifest.ts similarity index 100% rename from gatsby/pages/docs/generator/manifest.ts rename to gatsby/pages/docs/generator/loadManifest.ts From 716a0b837137a6ca0a766e918dace78d30a8447e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maciej=20Urba=C5=84czyk?= Date: Sat, 6 Jul 2019 17:13:12 +0200 Subject: [PATCH 3/9] Fix typo --- gatsby/pages/blog/index.ts | 9 +++++++-- gatsby/pages/blog/types.ts | 8 -------- gatsby/pages/docs/index.ts | 7 ++++++- gatsby/pages/docs/types.ts | 7 ------- gatsby/pages/roadmap/index.ts | 11 ++++++++--- gatsby/pages/roadmap/types.ts | 8 -------- 6 files changed, 21 insertions(+), 29 deletions(-) diff --git a/gatsby/pages/blog/index.ts b/gatsby/pages/blog/index.ts index 0580002cec..08e4598284 100644 --- a/gatsby/pages/blog/index.ts +++ b/gatsby/pages/blog/index.ts @@ -1,7 +1,12 @@ -import { CreateBlogPages } from "./types"; +import { createSingleBlogPost } from "./singlePostPage"; import { getPosts } from "./helpers"; +import { CreatePageFn, CreateRedirectFn } from "../../types"; -import { createSingleBlogPost } from "./singlePostPage"; +export interface CreateBlogPages { + graphql: Function; + createPage: CreatePageFn; + createRedirect: CreateRedirectFn; +} export const createBlogPages = async ({ graphql, diff --git a/gatsby/pages/blog/types.ts b/gatsby/pages/blog/types.ts index 26c667b5f3..3e02c7bb72 100644 --- a/gatsby/pages/blog/types.ts +++ b/gatsby/pages/blog/types.ts @@ -1,11 +1,3 @@ -import { CreatePageFn, CreateRedirectFn } from "../../types"; - -export interface CreateBlogPages { - graphql: Function; - createPage: CreatePageFn; - createRedirect: CreateRedirectFn; -} - export interface PostQL { fields: { slug: string; diff --git a/gatsby/pages/docs/index.ts b/gatsby/pages/docs/index.ts index e6c9af0d36..71bf230329 100644 --- a/gatsby/pages/docs/index.ts +++ b/gatsby/pages/docs/index.ts @@ -3,7 +3,6 @@ import { generator } from "./generator"; import { fixLinks } from "./fixLinks"; import { getDocs, getDocsVersions, populateObject } from "./helpers"; import { - CreateDocsPages, DocsContentItems, DocsContentItem, ManifestItem, @@ -17,6 +16,12 @@ import { DOCS_ROOT_TYPE, DOCS_KYMA_ID, } from "../../constants"; +import { CreatePageFn, CreateRedirectFn } from "../../types"; + +export interface CreateDocsPages { + graphql: Function; + createPage: CreatePageFn; +} export const createDocsPages = async ({ graphql, diff --git a/gatsby/pages/docs/types.ts b/gatsby/pages/docs/types.ts index 066d6614cd..4c38ab2ee7 100644 --- a/gatsby/pages/docs/types.ts +++ b/gatsby/pages/docs/types.ts @@ -1,10 +1,3 @@ -import { CreatePageFn, CreateRedirectFn } from "../../types"; - -export interface CreateDocsPages { - graphql: Function; - createPage: CreatePageFn; -} - export interface DocQL { rawMarkdownBody: string; fields: { diff --git a/gatsby/pages/roadmap/index.ts b/gatsby/pages/roadmap/index.ts index e0400a6c50..5258e8ca13 100644 --- a/gatsby/pages/roadmap/index.ts +++ b/gatsby/pages/roadmap/index.ts @@ -1,8 +1,13 @@ -import { CreateRoadmapPages } from "./types"; -import { getCapabilities } from "./helpers"; - import { createRootPage } from "./rootPage"; import { createModalPage } from "./modalPage"; +import { getCapabilities } from "./helpers"; +import { CreatePageFn, CreateRedirectFn } from "../../types"; + +export interface CreateRoadmapPages { + graphql: Function; + createPage: CreatePageFn; + createRedirect: CreateRedirectFn; +} export const createRoadmapPages = async ({ graphql, diff --git a/gatsby/pages/roadmap/types.ts b/gatsby/pages/roadmap/types.ts index f18c083138..324e02da87 100644 --- a/gatsby/pages/roadmap/types.ts +++ b/gatsby/pages/roadmap/types.ts @@ -1,11 +1,3 @@ -import { CreatePageFn, CreateRedirectFn } from "../../types"; - -export interface CreateRoadmapPages { - graphql: Function; - createPage: CreatePageFn; - createRedirect: CreateRedirectFn; -} - export interface CapabilityQL { frontmatter: { displayName: string; From a4e1ea74854c4f552ec9088f7e3b082a2e7a7a52 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maciej=20Urba=C5=84czyk?= Date: Sat, 6 Jul 2019 17:30:47 +0200 Subject: [PATCH 4/9] Fix typo issue with font-awesome --- package-lock.json | 30 +++++++++++++++--------------- package.json | 10 +++++----- 2 files changed, 20 insertions(+), 20 deletions(-) diff --git a/package-lock.json b/package-lock.json index 613d1ece57..d82f0b61b1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -920,32 +920,32 @@ "integrity": "sha512-4zAPlpDEh2VwXswwr/t8xGNDGg8RQiPxtxZ3qQEXyQsBV39ptTdESCjuBvGze1nLMVrxmTIKmnO/nAV8Tqjjzg==" }, "@fortawesome/fontawesome-common-types": { - "version": "0.2.15", - "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-0.2.15.tgz", - "integrity": "sha512-ATBRyKJw1d2ko+0DWN9+BXau0EK3I/Q6pPzPv3LhJD7r052YFAkAdfb1Bd7ZqhBsJrdse/S7jKxWUOZ61qBD4g==" + "version": "0.2.19", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-0.2.19.tgz", + "integrity": "sha512-nd2Ul/CUs8U9sjofQYAALzOGpgkVJQgEhIJnOHaoyVR/LeC3x2mVg4eB910a4kS6WgLPebAY0M2fApEI497raQ==" }, "@fortawesome/fontawesome-svg-core": { - "version": "1.2.15", - "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-1.2.15.tgz", - "integrity": "sha512-M/sHyl4g2VBtKYkay1Z+XImMyTVcaBPmehYtPw4HKD9zg2E7eovB7Yx98aUfZjPbroGqa+IL4/+KhWBMOGlHIQ==", + "version": "1.2.19", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-1.2.19.tgz", + "integrity": "sha512-D4ICXg9oU08eF9o7Or392gPpjmwwgJu8ecCFusthbID95CLVXOgIyd4mOKD9Nud5Ckz+Ty59pqkNtThDKR0erA==", "requires": { - "@fortawesome/fontawesome-common-types": "^0.2.15" + "@fortawesome/fontawesome-common-types": "^0.2.19" } }, "@fortawesome/free-brands-svg-icons": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/@fortawesome/free-brands-svg-icons/-/free-brands-svg-icons-5.7.2.tgz", - "integrity": "sha512-91rIjo00vy7PNrXg5auDsPOSTjmgzc+UUqMyUZHmIrXG5OXMHgjAYMTgEIgs91Lm5XcJtggFZCQz1u5fGFnj2A==", + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/@fortawesome/free-brands-svg-icons/-/free-brands-svg-icons-5.9.0.tgz", + "integrity": "sha512-sOz1wFyslaHUak8tY6IEhSAV1mAWbCLssBR8yFQV6f065k8nUCkjyrcxW4RVl9+wiLXmeG1CJUABUJV9DiW+7Q==", "requires": { - "@fortawesome/fontawesome-common-types": "^0.2.15" + "@fortawesome/fontawesome-common-types": "^0.2.19" } }, "@fortawesome/free-regular-svg-icons": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/@fortawesome/free-regular-svg-icons/-/free-regular-svg-icons-5.7.2.tgz", - "integrity": "sha512-ZO+zQcncfT7omTsTIjBkugj/dFXiSnoK44I5p0/WAoNX8aX2Au7j+uxq1qFX4bevkfGFGsPeJUYU1+Q1PB/5pQ==", + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/@fortawesome/free-regular-svg-icons/-/free-regular-svg-icons-5.9.0.tgz", + "integrity": "sha512-6ZO0jLhk/Yrso0u5pXeYYSfZiHCNoCF7SgtqStdlEX8WtWD4IOfAB1N+MlSnMo12P5KR4cmucX/K0NCOPrhJwg==", "requires": { - "@fortawesome/fontawesome-common-types": "^0.2.15" + "@fortawesome/fontawesome-common-types": "^0.2.19" } }, "@fortawesome/free-solid-svg-icons": { diff --git a/package.json b/package.json index e5fe56aac7..871daff344 100755 --- a/package.json +++ b/package.json @@ -38,10 +38,10 @@ "explore": "source-map-explorer \"public/*.js\"" }, "dependencies": { - "@fortawesome/fontawesome-svg-core": "^1.2.14", - "@fortawesome/free-brands-svg-icons": "^5.7.1", - "@fortawesome/free-regular-svg-icons": "^5.7.1", - "@fortawesome/free-solid-svg-icons": "^5.7.1", + "@fortawesome/fontawesome-svg-core": "^1.2.19", + "@fortawesome/free-brands-svg-icons": "^5.9.0", + "@fortawesome/free-regular-svg-icons": "^5.9.0", + "@fortawesome/free-solid-svg-icons": "^5.9.0", "@fortawesome/react-fontawesome": "^0.1.4", "@octokit/rest": "^16.25.1", "babel-plugin-styled-components": "^1.10.0", @@ -125,7 +125,7 @@ }, "husky": { "hooks": { - "pre-commit": "lint-staged" + "pre-commit": "lint-staged && npm run type-check" } }, "lint-staged": { From 730b1a1d8a444473e86d742d062b2f5a53233b1c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maciej=20Urba=C5=84czyk?= Date: Tue, 16 Jul 2019 18:17:03 +0200 Subject: [PATCH 5/9] After review --- gatsby/config/plugins.ts | 10 ++--- gatsby/config/rss-feed.ts | 80 +++++++++++++++++++++++++++++++++++ gatsby/config/sitemetadata.ts | 5 ++- gatsby/config/types.ts | 15 +++++++ gatsby/index.js | 7 +-- tslint.json | 7 ++- 6 files changed, 108 insertions(+), 16 deletions(-) create mode 100644 gatsby/config/rss-feed.ts create mode 100644 gatsby/config/types.ts diff --git a/gatsby/config/plugins.ts b/gatsby/config/plugins.ts index 309d9da750..a2dd611f23 100644 --- a/gatsby/config/plugins.ts +++ b/gatsby/config/plugins.ts @@ -1,10 +1,5 @@ -type Plugins = Array< - | string - | { - resolve: string; - options: Record; - } ->; +import { rssFeed } from "./rss-feed"; +import { Plugins } from "./types"; export const plugins: Plugins = [ "gatsby-plugin-react-helmet", @@ -95,4 +90,5 @@ export const plugins: Plugins = [ whitelist: ["GOOGLE_CSE", "ALGOLIA_API_KEY", "ALGOLIA_INDEX_NAME"], }, }, + rssFeed, ]; diff --git a/gatsby/config/rss-feed.ts b/gatsby/config/rss-feed.ts new file mode 100644 index 0000000000..23e1545efa --- /dev/null +++ b/gatsby/config/rss-feed.ts @@ -0,0 +1,80 @@ +import { siteMetadata } from "./sitemetadata"; + +export const rssFeed = { + resolve: `gatsby-plugin-feed`, + options: { + query: ` + { + site { + siteMetadata { + title + description + siteUrl + site_url: siteUrl + } + } + } + `, + feeds: [ + { + serialize: ({ query: { site, allMarkdownRemark } }) => { + return allMarkdownRemark.edges + .filter(arg => arg.node.fields.slug.startsWith("/blog/")) + .map(edge => { + const getAuthor = arg => { + if ( + arg.node.frontmatter.author && + !!arg.node.frontmatter.author.name + ) { + return arg.node.frontmatter.author.name; + } + return null; + }; + + const host = site.siteMetadata.siteUrl; + const link = `${ + host.endsWith("/") ? host : host + "/" + }${edge.node.fields.slug.slice(1)}`; + + return { + ...edge.node.frontmatter, + date: edge.node.frontmatter.date, + url: link, + guid: link, + author: getAuthor(edge), + description: edge.node.excerpt, + custom_elements: [{ "content:encoded": edge.node.html }], + }; + }); + }, + query: ` + { + allMarkdownRemark(sort: {order: DESC, fields: [fields___date]}) { + edges { + node { + excerpt + html + fields { + slug + date + } + frontmatter { + title + author { + name + } + } + } + } + } + } + `, + output: `${ + siteMetadata.feedUrl.startsWith("/") + ? siteMetadata.feedUrl + : "/" + siteMetadata.feedUrl + }`, + }, + ], + }, +}; diff --git a/gatsby/config/sitemetadata.ts b/gatsby/config/sitemetadata.ts index a44e65b31a..aa08406f6e 100644 --- a/gatsby/config/sitemetadata.ts +++ b/gatsby/config/sitemetadata.ts @@ -1,6 +1,7 @@ -const configSiteMetadata = require("../../config").siteMetadata; +import { SiteMetadata } from "./types"; +const configSiteMetadata: SiteMetadata = require("../../config").siteMetadata; -export const siteMetadata: Record = { +export const siteMetadata: SiteMetadata = { siteUrl: "https://kyma-project.io/", twitterUsername: "kymaproject", ...configSiteMetadata, diff --git a/gatsby/config/types.ts b/gatsby/config/types.ts new file mode 100644 index 0000000000..0629131368 --- /dev/null +++ b/gatsby/config/types.ts @@ -0,0 +1,15 @@ +export interface SiteMetadata { + siteUrl: string; + twitterUsername: string; + title: string; + description: string; + feedUrl: string; +} + +export type Plugins = Array< + | string + | { + resolve: string; + options: Record; + } +>; diff --git a/gatsby/index.js b/gatsby/index.js index 8087e71459..5c13f42048 100644 --- a/gatsby/index.js +++ b/gatsby/index.js @@ -1,12 +1,7 @@ "use strict"; require("source-map-support").install(); -require("ts-node").register({ - compilerOptions: { - module: "commonjs", - target: "es2017", - }, -}); +require("ts-node").register(); const { config } = require("./config"); const { onCreateWebpackConfig } = require("./webpack"); diff --git a/tslint.json b/tslint.json index 0fcba25767..f98c58b377 100755 --- a/tslint.json +++ b/tslint.json @@ -32,5 +32,10 @@ "jsRules": {}, "linterOptions": { "exclude": ["*/node_modules/**/*"] - } + }, + "ban-types": [ + true, + ["Object", "Use {} instead."], + ["Function", "Use more precise type"] + ] } From 29f9e4e48db9c8b60f3b98d261918c3f28180cdc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maciej=20Urba=C5=84czyk?= Date: Tue, 16 Jul 2019 18:22:04 +0200 Subject: [PATCH 6/9] Fix type --- gatsby/config/types.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gatsby/config/types.ts b/gatsby/config/types.ts index 0629131368..8e5d898578 100644 --- a/gatsby/config/types.ts +++ b/gatsby/config/types.ts @@ -1,4 +1,4 @@ -export interface SiteMetadata { +export interface SiteMetadata extends Record { siteUrl: string; twitterUsername: string; title: string; From 805db74dcf7fe9d5a5c01d503ceda4e580303410 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maciej=20Urba=C5=84czyk?= Date: Tue, 16 Jul 2019 18:56:01 +0200 Subject: [PATCH 7/9] Fix bugs in feed plugin resolver --- gatsby/config/index.ts | 2 +- gatsby/config/rss-feed.ts | 41 +++++++++++++++++++++++++++++++++++---- gatsby/config/types.ts | 2 +- package.json | 4 ++-- 4 files changed, 41 insertions(+), 8 deletions(-) diff --git a/gatsby/config/index.ts b/gatsby/config/index.ts index bd9d198a94..36fa4dd8a1 100644 --- a/gatsby/config/index.ts +++ b/gatsby/config/index.ts @@ -3,7 +3,7 @@ import { siteMetadata } from "./sitemetadata"; import { plugins } from "./plugins"; export const config: GatsbyConfig = { - siteMetadata, + siteMetadata: siteMetadata as Record, plugins, pathPrefix: "/website", }; diff --git a/gatsby/config/rss-feed.ts b/gatsby/config/rss-feed.ts index 23e1545efa..4b7614f9c6 100644 --- a/gatsby/config/rss-feed.ts +++ b/gatsby/config/rss-feed.ts @@ -1,4 +1,33 @@ import { siteMetadata } from "./sitemetadata"; +import { SiteMetadata } from "./types"; + +interface Edge { + node: { + excerpt: string; + html: string; + fields: { + slug: string; + date: string; + }; + frontmatter: { + title: string; + author: { + name: string; + }; + }; + }; +} + +interface QueryType { + query: { + site: { + siteMetadata: SiteMetadata; + }; + allMarkdownRemark: { + edges: Edge[]; + }; + }; +} export const rssFeed = { resolve: `gatsby-plugin-feed`, @@ -17,11 +46,15 @@ export const rssFeed = { `, feeds: [ { - serialize: ({ query: { site, allMarkdownRemark } }) => { + serialize: ({ query: { site, allMarkdownRemark } }: QueryType) => { return allMarkdownRemark.edges - .filter(arg => arg.node.fields.slug.startsWith("/blog/")) + .filter(arg => + arg.node.fields.slug + ? arg.node.fields.slug.startsWith("/blog/") + : false, + ) .map(edge => { - const getAuthor = arg => { + const getAuthor = (arg: Edge) => { if ( arg.node.frontmatter.author && !!arg.node.frontmatter.author.name @@ -38,7 +71,7 @@ export const rssFeed = { return { ...edge.node.frontmatter, - date: edge.node.frontmatter.date, + date: edge.node.fields.date, url: link, guid: link, author: getAuthor(edge), diff --git a/gatsby/config/types.ts b/gatsby/config/types.ts index 8e5d898578..0629131368 100644 --- a/gatsby/config/types.ts +++ b/gatsby/config/types.ts @@ -1,4 +1,4 @@ -export interface SiteMetadata extends Record { +export interface SiteMetadata { siteUrl: string; twitterUsername: string; title: string; diff --git a/package.json b/package.json index 871daff344..b9bc6dd642 100755 --- a/package.json +++ b/package.json @@ -23,8 +23,8 @@ "scripts": { "start": "npm run clean && npm run develop", "develop": "gatsby develop --port 5000", - "build": "npm run clear-cache && gatsby build", - "build:prod": "GATSBY_SITE_URL='https://kyma-project.io' gatsby build", + "build": "npm run clean && gatsby build", + "build:prod": "npm run clean && GATSBY_SITE_URL='https://kyma-project.io' gatsby build", "serve": "gatsby serve", "serve:out": "gatsby serve -H 0.0.0.0", "clean": "gatsby clean", From 39c0b8d4d5a9723765933bd5ddf00c99a9691cf9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maciej=20Urba=C5=84czyk?= Date: Wed, 17 Jul 2019 15:35:33 +0200 Subject: [PATCH 8/9] =?UTF-8?q?Niech=20ci=20Mateusz=20ju=C5=BC=20b=C4=99dz?= =?UTF-8?q?ie...?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- gatsby/config/rss-feed.ts | 2 +- tslint.json | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/gatsby/config/rss-feed.ts b/gatsby/config/rss-feed.ts index 4b7614f9c6..0b0d3f3711 100644 --- a/gatsby/config/rss-feed.ts +++ b/gatsby/config/rss-feed.ts @@ -6,7 +6,7 @@ interface Edge { excerpt: string; html: string; fields: { - slug: string; + slug?: string; date: string; }; frontmatter: { diff --git a/tslint.json b/tslint.json index f98c58b377..9cd5ba3e9b 100755 --- a/tslint.json +++ b/tslint.json @@ -36,6 +36,7 @@ "ban-types": [ true, ["Object", "Use {} instead."], + ["String"], ["Function", "Use more precise type"] ] } From c43443daf5122ce543c0931580d6fa981f4aa258 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maciej=20Urba=C5=84czyk?= Date: Wed, 17 Jul 2019 15:42:10 +0200 Subject: [PATCH 9/9] Lol znowu --- gatsby/config/rss-feed.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/gatsby/config/rss-feed.ts b/gatsby/config/rss-feed.ts index 0b0d3f3711..fddd6457e9 100644 --- a/gatsby/config/rss-feed.ts +++ b/gatsby/config/rss-feed.ts @@ -65,9 +65,9 @@ export const rssFeed = { }; const host = site.siteMetadata.siteUrl; - const link = `${ - host.endsWith("/") ? host : host + "/" - }${edge.node.fields.slug.slice(1)}`; + const link = `${host.endsWith("/") ? host : host + "/"}${ + edge.node.fields.slug ? edge.node.fields.slug.slice(1) : "" + }`; return { ...edge.node.frontmatter,