├── .github └── ISSUE_TEMPLATE │ └── help.md ├── .gitignore ├── .prettierignore ├── .prettierrc ├── LICENSE ├── README.md ├── gatsby-browser.js ├── gatsby-config.js ├── gatsby-node.js ├── gatsby-ssr.js ├── package.json ├── postcss.config.js ├── src ├── assets │ ├── about.jpg │ ├── arrow-left.svg │ ├── arrow-right.svg │ ├── github.svg │ └── github_black.svg ├── components │ ├── buttons │ │ ├── FrameworkButton.js │ │ ├── GithubButtton.js │ │ ├── RedBlockButton.js │ │ └── RedOutlineButton.js │ ├── cards │ │ └── StackCard.js │ ├── chapters │ │ ├── ChapterBox.js │ │ ├── Chapters.js │ │ └── SideChapterBox.js │ ├── header.js │ ├── image.js │ ├── landing │ │ ├── TechStack.js │ │ └── hero.js │ ├── layout.css │ ├── layout.js │ ├── navs │ │ └── Footer.js │ ├── partners │ │ └── index.js │ ├── seo.js │ └── typography │ │ ├── BodyOne.js │ │ ├── HeadingOne.js │ │ ├── HeadingThree.js │ │ └── HeadingTwo.js ├── constants.js ├── content │ ├── a-case-for-graphql.md │ ├── adding-listings-to-dynamo.md │ ├── adding-the-aws-sdk.md │ ├── complete-get-a-listing-query.md │ ├── complete-listing-query.md │ ├── complete-mutation.md │ ├── create-all-listings-pagge.md │ ├── create-backend-repo.md │ ├── create-blue-block-button-1.md │ ├── create-blue-block-button.md │ ├── create-booking-component.md │ ├── create-booking-forms-pt-1.md │ ├── create-booking-forms-pt-2.md │ ├── create-booking-forms-pt-3.md │ ├── create-booking-forms.md │ ├── create-home-component.md │ ├── create-input-1.md │ ├── create-input.md │ ├── create-listing-card.md │ ├── create-listing-component.md │ ├── create-nav-and-header-1.md │ ├── create-nav-and-header.md │ ├── create-red-block-button-1.md │ ├── create-red-block-button.md │ ├── create-red-outline-button-1.md │ ├── create-red-outline-button.md │ ├── create-remove-button-1.md │ ├── create-remove-button.md │ ├── create-schema-for-a-listings.md │ ├── create-tour-card.md │ ├── create-typography-components-1.md │ ├── create-typography-components.md │ ├── create-view-a-listing-page.md │ ├── creating-our-graphql-schema.md │ ├── creating-the-frontend-repo-with-vue-cli.md │ ├── creating-the-mutation-in-the-schema.md │ ├── credits.md │ ├── deploy-backend-code.md │ ├── deploy-react-app.md │ ├── deploy-vue-app.md │ ├── execute-booking-mutation.md │ ├── execute-booking-mutatuion.md │ ├── export-listing-functions.md │ ├── export-the-mutation-function.md │ ├── getting-setup.md │ ├── installing-tailwind.md │ ├── introduction.md │ ├── resources.md │ ├── running-our-lambda-locally.md │ ├── set-up-tables-1.md │ ├── setting-up-advanced-forms.md │ ├── setting-up-seed.md │ ├── setting-up-stripe.md │ ├── setting-up-tailwind.md │ ├── setup-apollo-cache.md │ ├── setup-apollo-vue.md │ ├── setup-mutation-workflow.md │ ├── spawn-react-frontend.md │ ├── unit-testing-mutations.md │ └── unit-testing-queries.md ├── frameworkContext.js ├── frameworkProvider.js ├── html.js ├── images │ ├── Upload.svg │ ├── airtable.svg │ ├── ant.jpg │ ├── ant.svg │ ├── apollo.svg │ ├── astro.svg │ ├── aws-cognito.svg │ ├── aws-dynamodb.svg │ ├── aws-lambda.svg │ ├── aws.svg │ ├── favicon.png │ ├── figma.svg │ ├── fsgql_logo.png │ ├── gatsby-icon.png │ ├── github.svg │ ├── graphql.svg │ ├── hero_image.svg │ ├── launch.svg │ ├── miro.svg │ ├── netlify.svg │ ├── postmark.jpeg │ ├── react-icon.svg │ ├── seed.png │ ├── seed.svg │ ├── serverless.png │ ├── serverless.svg │ ├── stripe.svg │ ├── tailwind.png │ ├── tailwind.svg │ └── vue.svg ├── pages │ ├── 404.js │ ├── index.js │ └── page-2.js └── templates │ └── post.js ├── static ├── admin │ ├── config.yml │ ├── index.html │ └── index.js └── uploads │ ├── 1-seed.png │ ├── 1.png │ ├── 2-seed.png │ ├── 2.png │ ├── 3-seed.png │ ├── 4-seed.png │ ├── 5-seed.png │ ├── 6-seed.png │ ├── blueoutline.png │ ├── get-a-listing.png │ ├── github_step.png │ ├── hello-world-.png │ ├── input.png │ ├── landing.png │ ├── landingheader.png │ ├── mutation_bk.png │ ├── net_r_1.png │ ├── net_r_2.png │ ├── net_r_3.png │ ├── net_r_4.png │ ├── net_r_5.png │ ├── net_v_1.png │ ├── net_v_2.png │ ├── net_v_3.png │ ├── playground2.png │ ├── redblock.png │ ├── redoutline.png │ ├── remove.png │ ├── screenshot-2020-05-17-at-21.57.43.png │ ├── screenshot-2020-05-17-at-21.58.50.png │ ├── screenshot-2020-05-17-at-22.00.19.png │ ├── screenshot-2020-05-17-at-22.01.44.png │ ├── screenshot-2020-05-17-at-22.03.11.png │ ├── step_1.png │ ├── step_2.png │ ├── step_3.png │ ├── step_5.png │ ├── step_five_cli.png │ ├── step_four_cli.png │ ├── step_one_cli.png │ ├── step_six_cli.png │ ├── step_three_cli.png │ ├── step_two_cli.png │ ├── stripe_step1.png │ ├── stripe_step2.png │ ├── stripe_step3.png │ ├── tailwind_conf.png │ ├── task_1.png │ ├── task_2.png │ ├── task_3.png │ ├── test.jpg │ ├── tourcard.png │ └── viewlisting.png ├── tailwind.config.js └── yarn.lock /.github/ISSUE_TEMPLATE/help.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Help 3 | about: Please describe what issue you are experiencing with tutorial so we can help 4 | you out. 5 | title: '' 6 | labels: '' 7 | assignees: '' 8 | 9 | --- 10 | 11 | 15 | 16 | ## Steps To Reproduce 17 | 18 | 1. 19 | 2. 20 | 21 | 26 | 27 | Link to code example: 28 | 29 | 36 | 37 | 39 | 40 | Title of post you're stuck on: 41 | 42 | ## The current behavior 43 | 44 | 45 | ## The expected behavior 46 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | 8 | # Runtime data 9 | pids 10 | *.pid 11 | *.seed 12 | *.pid.lock 13 | 14 | # Directory for instrumented libs generated by jscoverage/JSCover 15 | lib-cov 16 | 17 | # Coverage directory used by tools like istanbul 18 | coverage 19 | 20 | # nyc test coverage 21 | .nyc_output 22 | 23 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) 24 | .grunt 25 | 26 | # Bower dependency directory (https://bower.io/) 27 | bower_components 28 | 29 | # node-waf configuration 30 | .lock-wscript 31 | 32 | # Compiled binary addons (http://nodejs.org/api/addons.html) 33 | build/Release 34 | 35 | # Dependency directories 36 | node_modules/ 37 | jspm_packages/ 38 | 39 | # Typescript v1 declaration files 40 | typings/ 41 | 42 | # Optional npm cache directory 43 | .npm 44 | 45 | # Optional eslint cache 46 | .eslintcache 47 | 48 | # Optional REPL history 49 | .node_repl_history 50 | 51 | # Output of 'npm pack' 52 | *.tgz 53 | 54 | # dotenv environment variable files 55 | .env* 56 | 57 | # gatsby files 58 | .cache/ 59 | public 60 | 61 | # Mac files 62 | .DS_Store 63 | 64 | # Yarn 65 | yarn-error.log 66 | .pnp/ 67 | .pnp.js 68 | # Yarn Integrity file 69 | .yarn-integrity 70 | .env -------------------------------------------------------------------------------- /.prettierignore: -------------------------------------------------------------------------------- 1 | .cache 2 | package.json 3 | package-lock.json 4 | public 5 | -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "endOfLine": "lf", 3 | "semi": false, 4 | "singleQuote": false, 5 | "tabWidth": 2, 6 | "trailingComma": "es5" 7 | } 8 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2015 gatsbyjs 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | 23 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |

2 | 3 | fsgql 4 | 5 |

6 | 7 |

8 | Learn how to build Fullstack GraphQL Apps with Serverless, React and Vue 9 |

10 | 11 |

12 | 13 |

14 | 15 | [Fullstack Serverless GraphQL](https://fullstack-serverless-graphql.netlify.app/) is a course that will teach you how to build a Serverless GraphQL backend on AWS Lambda, while allowing you to choose your own adventure for building out the frontend in either Vue or React. 16 | 17 | After completing the course you would've made the Lunar Tour, which is an app that allows customers to book vactions to moon. 18 | 19 | This project is meant to be a tool amongst many to be able to build bleeding edge applications. Everything mentioned in this course has been used on production workloads so this is something you can pick up today and implement the next day. Mastery of the content makes you employable or in a good place to launch your own startup! 20 | 21 | ## Links to Demo Apps 22 | 23 | - [Lunar Tour API](https://github.com/Fullstack-Serverless-GraphQL/lunar-tour-api) 24 | - [Lunar Tour React](https://github.com/Fullstack-Serverless-GraphQL/lunar-tour-react) 25 | - [Lunar Tour Vue](https://github.com/Fullstack-Serverless-GraphQL/lunar-tour-frontend) 26 | 27 | ## Where can you get help? 28 | 29 | Each post has a button where you can open a Github Issue and I will try to assist you as soon as possible. 30 | 31 | ## 🚀 Quick start for contributing 32 | 33 | 1. **Clone the repo.** 34 | 35 | 36 | ```shell 37 | git clone https://github.com/Fullstack-Serverless-GraphQL/fullstack-serverless-graphql-docs.git 38 | ``` 39 | 40 | 2. **Start developing.** 41 | 42 | Navigate into your new site’s directory and start it up. 43 | 44 | ```shell 45 | cd Fullstack-Serverless-GraphQL/ 46 | gatsby develop 47 | ``` 48 | 49 | then install the dependancies : 50 | 51 | ```shell 52 | yarn install 53 | ``` 54 | 55 | 1. **Open the source code and start editing!** 56 | 57 | Your site is now running at `http://localhost:8000`! 58 | 59 | _Note: You'll also see a second link: _`http://localhost:8000/___graphql`_. This is a tool you can use to experiment with querying your data. Learn more about using this tool in the [Gatsby tutorial](https://www.gatsbyjs.org/tutorial/part-five/#introducing-graphiql)._ 60 | 61 | ## 🧐 What's inside? 62 | 63 | A quick look at the top-level files and directories you'll see in a Gatsby project. 64 | 65 | . 66 | ├── node_modules 67 | ├── src 68 | ├── .gitignore 69 | ├── .prettierrc 70 | ├── gatsby-browser.js 71 | ├── gatsby-config.js 72 | ├── gatsby-node.js 73 | ├── gatsby-ssr.js 74 | ├── LICENSE 75 | ├── package-lock.json 76 | ├── package.json 77 | └── README.md 78 | 79 | ## Contributing 80 | 81 | We welcome contributions to Fullstack Serverless GraphQL! 82 | 83 | - 📥 Pull requests and 🌟 Stars are always welcome. 84 | 85 | ## 💫 Deploy 86 | 87 | [![Deploy to Netlify](https://www.netlify.com/img/deploy/button.svg)](https://github.com/Fullstack-Serverless-GraphQL/fullstack-serverless-graphql-docs.git) 88 | 89 | ## License 90 | 91 | [MIT](https://github.com/Fullstack-Serverless-GraphQL/fullstack-serverless-graphql-docs/blob/master/LICENSE) 92 | -------------------------------------------------------------------------------- /gatsby-browser.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Implement Gatsby's Browser APIs in this file. 3 | * 4 | * See: https://www.gatsbyjs.org/docs/browser-apis/ 5 | */ 6 | 7 | // You can delete this file if you're not using it 8 | require("prismjs/themes/prism-solarizedlight.css") 9 | -------------------------------------------------------------------------------- /gatsby-config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | siteMetadata: { 3 | title: `Fullstack Serverless GraphQL`, 4 | description: `Fullstack Serverless GraphQL enables you to master GraphQL on AWS Lambda, while showing you how create bleeding edge frontends in React or Vue.`, 5 | author: `Amo Moloko`, 6 | }, 7 | plugins: [ 8 | `gatsby-plugin-netlify-cms`, 9 | `gatsby-plugin-postcss`, 10 | `gatsby-plugin-react-helmet`, 11 | { 12 | resolve: `gatsby-source-filesystem`, 13 | options: { 14 | name: `images`, 15 | path: `${__dirname}/src/images`, 16 | }, 17 | }, 18 | { 19 | resolve: `gatsby-transformer-remark`, 20 | options: { 21 | plugins: [ 22 | { 23 | resolve: `gatsby-remark-prismjs`, 24 | options: {}, 25 | }, 26 | ], 27 | }, 28 | }, 29 | `gatsby-transformer-sharp`, 30 | `gatsby-plugin-sharp`, 31 | { 32 | resolve: `gatsby-plugin-manifest`, 33 | options: { 34 | name: `Fullstack Serverless GraphQL`, 35 | short_name: `FSGQL`, 36 | start_url: `/`, 37 | background_color: `#663399`, 38 | theme_color: `#663399`, 39 | display: `minimal-ui`, 40 | icon: `src/images/favicon.png`, // This path is relative to the root of the site. 41 | }, 42 | }, 43 | 44 | { 45 | resolve: `gatsby-source-filesystem`, 46 | options: { 47 | name: `content && code`, 48 | path: `${__dirname}/src/content/`, 49 | }, 50 | }, 51 | // this (optional) plugin enables Progressive Web App + Offline functionality 52 | // To learn more, visit: https://gatsby.dev/offline 53 | // `gatsby-plugin-offline`, 54 | ], 55 | } 56 | -------------------------------------------------------------------------------- /gatsby-node.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Implement Gatsby's Node APIs in this file. 3 | * 4 | * See: https://www.gatsbyjs.org/docs/node-apis/ 5 | */ 6 | 7 | // You can delete this file if you're not using it 8 | const path = require(`path`) 9 | 10 | exports.createPages = async ({ actions, graphql }) => { 11 | const { createPage } = actions 12 | const result = await graphql(` 13 | { 14 | allMarkdownRemark { 15 | edges { 16 | node { 17 | frontmatter { 18 | path 19 | postnumber 20 | } 21 | } 22 | } 23 | } 24 | } 25 | `) 26 | 27 | if (result.errors) { 28 | console.error(result.errors) 29 | } 30 | 31 | const results = result.data.allMarkdownRemark.edges 32 | 33 | // console.log("rrr", results) 34 | result.data.allMarkdownRemark.edges 35 | .sort( 36 | (a, b) => a.node.frontmatter.postnumber - b.node.frontmatter.postnumber 37 | ) 38 | .forEach((node, index) => { 39 | const previous = index === results.length - 1 ? null : results[index + 1] 40 | 41 | const next = index === 0 ? null : results[index - 1] 42 | 43 | createPage({ 44 | path: node.node.frontmatter.path, 45 | component: path.resolve(`src/templates/post.js`), 46 | previous: previous, 47 | context: { 48 | path: node.node.frontmatter.path, 49 | previous, 50 | next, 51 | }, 52 | }) 53 | }) 54 | } 55 | -------------------------------------------------------------------------------- /gatsby-ssr.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Implement Gatsby's SSR (Server Side Rendering) APIs in this file. 3 | * 4 | * See: https://www.gatsbyjs.org/docs/ssr-apis/ 5 | */ 6 | 7 | // You can delete this file if you're not using it 8 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "gatsby-starter-default", 3 | "private": true, 4 | "description": "A simple starter to get up and developing quickly with Gatsby", 5 | "version": "0.1.0", 6 | "author": "Kyle Mathews ", 7 | "dependencies": { 8 | "@reach/router": "^1.3.4", 9 | "gatsby": "^2.19.45", 10 | "gatsby-image": "^2.2.44", 11 | "gatsby-link": "^2.6.0", 12 | "gatsby-plugin-manifest": "^2.2.48", 13 | "gatsby-plugin-netlify-cms": "^4.2.2", 14 | "gatsby-plugin-offline": "^3.0.41", 15 | "gatsby-plugin-react-helmet": "^3.1.24", 16 | "gatsby-plugin-sharp": "^2.4.13", 17 | "gatsby-react-router-scroll": "^3.2.0", 18 | "gatsby-remark-prismjs": "^3.4.1", 19 | "gatsby-source-filesystem": "^2.2.2", 20 | "gatsby-transformer-remark": "^2.7.1", 21 | "gatsby-transformer-sharp": "^2.3.19", 22 | "mixpanel-browser": "^2.39.0", 23 | "netlify-cms-app": "^2.12.4", 24 | "prismjs": "^1.20.0", 25 | "prop-types": "^15.7.2", 26 | "react": "^16.12.0", 27 | "react-dom": "^16.12.0", 28 | "react-helmet": "^5.2.1" 29 | }, 30 | "devDependencies": { 31 | "gatsby-plugin-postcss": "^2.2.1", 32 | "prettier": "^1.19.1", 33 | "tailwindcss": "^1.2.0" 34 | }, 35 | "keywords": [ 36 | "gatsby" 37 | ], 38 | "license": "MIT", 39 | "scripts": { 40 | "build": "gatsby build", 41 | "develop": "gatsby develop", 42 | "format": "prettier --write \"**/*.{js,jsx,json,md}\"", 43 | "start": "npm run develop", 44 | "serve": "gatsby serve", 45 | "clean": "gatsby clean", 46 | "test": "echo \"Write tests! -> https://gatsby.dev/unit-testing\" && exit 1" 47 | }, 48 | "repository": { 49 | "type": "git", 50 | "url": "https://github.com/gatsbyjs/gatsby-starter-default" 51 | }, 52 | "bugs": { 53 | "url": "https://github.com/gatsbyjs/gatsby/issues" 54 | } 55 | } 56 | -------------------------------------------------------------------------------- /postcss.config.js: -------------------------------------------------------------------------------- 1 | module.exports = () => ({ 2 | plugins: [require("tailwindcss")], 3 | }) 4 | -------------------------------------------------------------------------------- /src/assets/about.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fullstack-Serverless-GraphQL/fullstack-serverless-graphql-docs/a99346a73a7f87fc1ea26839f1f7627989d8cd3e/src/assets/about.jpg -------------------------------------------------------------------------------- /src/assets/arrow-left.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/assets/arrow-right.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/assets/github.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/assets/github_black.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 12 | 13 | -------------------------------------------------------------------------------- /src/components/buttons/FrameworkButton.js: -------------------------------------------------------------------------------- 1 | import PropTypes from "prop-types" 2 | import React from "react" 3 | 4 | const FrameworkButton = ({ children, className, img, onClick }) => ( 5 | 12 | ) 13 | 14 | FrameworkButton.propTypes = { 15 | children: PropTypes.string, 16 | className: PropTypes.string, 17 | onClick: PropTypes.func, 18 | img: PropTypes.string, 19 | } 20 | 21 | FrameworkButton.defaultProps = { 22 | className: `font-display rounded-px text-center `, 23 | } 24 | export default FrameworkButton 25 | -------------------------------------------------------------------------------- /src/components/buttons/GithubButtton.js: -------------------------------------------------------------------------------- 1 | import PropTypes from "prop-types" 2 | import React from "react" 3 | import Github from "../../assets/github_black.svg" 4 | const GithubButton = ({ children, className, href }) => ( 5 | 11 | {children} framework 12 | 13 | ) 14 | 15 | GithubButton.propTypes = { 16 | children: PropTypes.string, 17 | className: PropTypes.string, 18 | href: PropTypes.string, 19 | } 20 | 21 | GithubButton.defaultProps = { 22 | className: `font-display rounded-px px-6 py-2 border border-black border-3`, 23 | } 24 | export default GithubButton 25 | -------------------------------------------------------------------------------- /src/components/buttons/RedBlockButton.js: -------------------------------------------------------------------------------- 1 | import PropTypes from "prop-types" 2 | import React from "react" 3 | 4 | const RedBlockButton = ({ children, className }) => ( 5 | 10 | ) 11 | 12 | RedBlockButton.propTypes = { 13 | children: PropTypes.string, 14 | className: PropTypes.string, 15 | } 16 | 17 | RedBlockButton.defaultProps = { 18 | className: ``, 19 | } 20 | export default RedBlockButton 21 | -------------------------------------------------------------------------------- /src/components/buttons/RedOutlineButton.js: -------------------------------------------------------------------------------- 1 | import PropTypes from "prop-types" 2 | import React from "react" 3 | 4 | const RedOutlineButton = ({ children, className, onClick }) => ( 5 | 11 | ) 12 | 13 | RedOutlineButton.propTypes = { 14 | children: PropTypes.string, 15 | className: PropTypes.string, 16 | onClick: PropTypes.func, 17 | } 18 | 19 | RedOutlineButton.defaultProps = { 20 | className: ``, 21 | } 22 | export default RedOutlineButton 23 | -------------------------------------------------------------------------------- /src/components/cards/StackCard.js: -------------------------------------------------------------------------------- 1 | import PropTypes from "prop-types" 2 | import React from "react" 3 | import HeadingThree from "../typography/HeadingThree" 4 | import BodyOne from "../typography/BodyOne" 5 | import NewTab from "../../images/launch.svg" 6 | const StackCard = ({ Title, className, url, linkURL }) => ( 7 |
10 | card logo 11 | {Title} 12 |
13 | 19 | new_tab_icon 20 | Docs 21 | 22 |
23 |
24 | ) 25 | 26 | StackCard.propTypes = { 27 | url: PropTypes.string, 28 | className: PropTypes.string, 29 | linkURL: PropTypes.string, 30 | Title: PropTypes.string, 31 | } 32 | 33 | StackCard.defaultProps = { 34 | className: ``, 35 | } 36 | export default StackCard 37 | -------------------------------------------------------------------------------- /src/components/chapters/ChapterBox.js: -------------------------------------------------------------------------------- 1 | import React, { useState } from "react" 2 | import { Link } from "gatsby" 3 | import HeadingThree from "../typography/HeadingThree" 4 | import BodyOne from "../typography/BodyOne" 5 | import PropTypes from "prop-types" 6 | 7 | const ChapterBox = ({ text, edges, collapse, color }) => { 8 | const [open, setOpen] = useState(false) 9 | 10 | const openChapters = () => { 11 | setOpen(!open) 12 | } 13 | return ( 14 | <> 15 |
16 | {collapse ? ( 17 | <> 18 | {" "} 19 | 25 | 26 | {open === true && ( 27 | <> 28 | {edges.map(edge => ( 29 | 30 | 31 | {edge.node.frontmatter.title} 32 | 33 | 34 | ))} 35 | 36 | )} 37 | 38 | 39 | ) : ( 40 | <> 41 | {text} 42 | 43 | {edges.map(edge => ( 44 | 45 | 46 | {edge.node.frontmatter.title} 47 | 48 | 49 | ))} 50 | 51 | )} 52 |
53 | 54 | ) 55 | } 56 | 57 | ChapterBox.propTypes = { 58 | text: PropTypes.string, 59 | edges: PropTypes.array, 60 | } 61 | export default ChapterBox 62 | -------------------------------------------------------------------------------- /src/components/header.js: -------------------------------------------------------------------------------- 1 | import { Link } from "gatsby" 2 | import PropTypes from "prop-types" 3 | import React from "react" 4 | import Github from "../assets/github.svg" 5 | import FSGQLogo from "../images/fsgql_logo.png" 6 | const Header = ({ siteTitle }) => ( 7 |
8 |
9 |

10 | 16 | github icon 17 | 18 |

19 |
20 | 21 | 27 | github icon 28 | 29 | 30 |
31 | ) 32 | 33 | Header.propTypes = { 34 | siteTitle: PropTypes.string, 35 | } 36 | 37 | Header.defaultProps = { 38 | siteTitle: ``, 39 | } 40 | 41 | export default Header 42 | -------------------------------------------------------------------------------- /src/components/image.js: -------------------------------------------------------------------------------- 1 | import React from "react" 2 | import { useStaticQuery, graphql } from "gatsby" 3 | import Img from "gatsby-image" 4 | 5 | /* 6 | * This component is built using `gatsby-image` to automatically serve optimized 7 | * images with lazy loading and reduced file sizes. The image is loaded using a 8 | * `useStaticQuery`, which allows us to load the image from directly within this 9 | * component, rather than having to pass the image data down from pages. 10 | * 11 | * For more information, see the docs: 12 | * - `gatsby-image`: https://gatsby.dev/gatsby-image 13 | * - `useStaticQuery`: https://www.gatsbyjs.org/docs/use-static-query/ 14 | */ 15 | 16 | const Image = () => { 17 | const data = useStaticQuery(graphql` 18 | query { 19 | placeholderImage: file(relativePath: { eq: "gatsby-astronaut.png" }) { 20 | childImageSharp { 21 | fluid(maxWidth: 300) { 22 | ...GatsbyImageSharpFluid 23 | } 24 | } 25 | } 26 | } 27 | `) 28 | 29 | return 30 | } 31 | 32 | export default Image 33 | -------------------------------------------------------------------------------- /src/components/landing/TechStack.js: -------------------------------------------------------------------------------- 1 | import React from "react" 2 | import HeadingTwo from "../typography/HeadingTwo" 3 | import HeadingThree from "../typography/HeadingThree" 4 | import BodyOne from "../typography/BodyOne" 5 | import StackCard from "../cards/StackCard" 6 | import constants from "../../constants" 7 | const TechStack = () => ( 8 | <> 9 |
10 | Tech stack 11 | 12 | Frontend 13 | 14 | 15 | On the frontend, you can create the Lunar Tour in either Vue or React. 16 | On the Vue side you uncover how to persist state in multiple components. 17 | While in the React course, you can learn how to use Apollo's Local Cache 18 | as an alternative for Rdux. 19 | 20 |
21 | {constants.techStack.map(t => ( 22 | 23 | ))} 24 |
25 | 26 | 27 | Backend 28 | 29 | 30 | Using the Serverless Framework, you will be able to create a GraphQL 31 | Lambda powered by Apollo Server. 32 | 33 |
34 | {constants.backendTechStack.map(t => ( 35 | 36 | ))} 37 |
38 |
39 | 40 | ) 41 | 42 | export default TechStack 43 | -------------------------------------------------------------------------------- /src/components/landing/hero.js: -------------------------------------------------------------------------------- 1 | import React from "react" 2 | import { Link } from "gatsby" 3 | import HeadingOne from "../typography/HeadingOne" 4 | import BodyOne from "../typography/BodyOne" 5 | import RedBlockButton from "../buttons/RedBlockButton" 6 | import RedOutlineButton from "../buttons/RedOutlineButton" 7 | import constants from "../../constants" 8 | const Hero = () => ( 9 | <> 10 |
11 |
12 | {/*
13 | hero 18 |
*/} 19 | 20 | Build a fullstack app that books vacations to the moon 21 | 22 | 23 | 24 | This course like resource will you teach how to use GraphQL with AWS 25 | Lambda and DynamoDB with JavaScript on the backend. While you can 26 | choose your own adventure on the frontend side of things with{" "} 27 | 33 | Vue 34 | {" "} 35 | or{" "} 36 | 42 | React 43 | 44 | . Both tracks will cover use of their respective Apollo Client 45 | libraries, while using Stripe for payments. 46 | 47 | 48 | Learn now! 49 | 50 | 51 | constants.track("App.RedirctToDemo")} 54 | > 55 | 61 | What you'll build 62 | 63 | 64 |
65 |
66 | 67 | ) 68 | 69 | export default Hero 70 | -------------------------------------------------------------------------------- /src/components/layout.css: -------------------------------------------------------------------------------- 1 | @tailwind base; 2 | .markdown h4, 3 | h5, 4 | h6 { 5 | @apply font-display; 6 | } 7 | 8 | .markdown h1 { 9 | @apply font-display text-3xl; 10 | } 11 | 12 | .markdown h2 { 13 | @apply font-display text-2xl; 14 | } 15 | 16 | .markdown h3 { 17 | @apply font-display text-xl; 18 | } 19 | 20 | .markdown p { 21 | @apply font-display text-sm; 22 | } 23 | 24 | .markdown img { 25 | @apply w-full; 26 | margin-left: auto; 27 | margin-right: auto; 28 | @apply p-3; 29 | } 30 | 31 | .gatsby-highlight { 32 | max-width: 980px; 33 | } 34 | /* .markdown code { 35 | background-color: #272822; 36 | color: #f8f8f2; 37 | border-radius: 0.3em; 38 | padding: 4px 5px 6px; 39 | white-space: nowrap; 40 | } */ 41 | @tailwind components; 42 | 43 | @tailwind utilities; 44 | body { 45 | margin: 0; 46 | padding: 0; 47 | -webkit-font-smoothing: antialiased; 48 | -moz-osx-font-smoothing: grayscale; 49 | } 50 | 51 | @import url("https://fonts.googleapis.com/css?family=Saira&display=swap"); 52 | -------------------------------------------------------------------------------- /src/components/layout.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Layout component that queries for data 3 | * with Gatsby's useStaticQuery component 4 | * 5 | * See: https://www.gatsbyjs.org/docs/use-static-query/ 6 | */ 7 | 8 | import React from "react" 9 | import PropTypes from "prop-types" 10 | import { useStaticQuery, graphql } from "gatsby" 11 | import Footer from "./navs/Footer" 12 | import Header from "./header" 13 | import "./layout.css" 14 | 15 | const Layout = ({ children }) => { 16 | const data = useStaticQuery(graphql` 17 | query SiteTitleQuery { 18 | site { 19 | siteMetadata { 20 | title 21 | } 22 | } 23 | } 24 | `) 25 | 26 | return ( 27 | <> 28 |
29 | 30 |
{children}
31 | 32 |