├── .DS_Store
├── final
├── .DS_Store
├── .gitignore
├── client
│ ├── .gitignore
│ ├── README.md
│ ├── package-lock.json
│ ├── package.json
│ ├── public
│ │ ├── favicon.ico
│ │ ├── index.html
│ │ ├── logo192.png
│ │ ├── logo512.png
│ │ ├── manifest.json
│ │ └── robots.txt
│ └── src
│ │ ├── App.css
│ │ ├── App.js
│ │ ├── App.test.js
│ │ ├── assets
│ │ ├── image
│ │ │ ├── cat.jpg
│ │ │ ├── cham.jpg
│ │ │ ├── dockey.jpg
│ │ │ ├── dolphin.jpg
│ │ │ ├── ele.jpg
│ │ │ ├── gorilla.jpg
│ │ │ ├── horse.jpg
│ │ │ ├── kang.jpg
│ │ │ ├── lion.png
│ │ │ ├── lion2.jpg
│ │ │ ├── ostrich.jpg
│ │ │ ├── penguin.png
│ │ │ ├── penguin2.jpg
│ │ │ ├── rhino.png
│ │ │ ├── snake.jpeg
│ │ │ ├── stingray.jpg
│ │ │ ├── tiger.jpeg
│ │ │ └── tiger.png
│ │ ├── images.js
│ │ └── svg
│ │ │ ├── loupe.svg
│ │ │ ├── s.svg
│ │ │ ├── shopping-cart.svg
│ │ │ └── star.svg
│ │ ├── components
│ │ ├── Card
│ │ │ ├── Card.css
│ │ │ └── Card.js
│ │ ├── CardDisplay
│ │ │ └── CardDisplay.js
│ │ ├── CategoryDisplay
│ │ │ ├── CategoryDisplay.css
│ │ │ └── CategoryDisplay.jsx
│ │ ├── MainHero
│ │ │ ├── MainHero.css
│ │ │ └── MainHero.js
│ │ └── Nav
│ │ │ ├── Nav.css
│ │ │ └── Nav.js
│ │ ├── index.css
│ │ ├── index.js
│ │ ├── logo.svg
│ │ ├── pages
│ │ ├── AnimalPage
│ │ │ ├── AnimalPage.css
│ │ │ └── AnimalPage.js
│ │ ├── CategoryPage.js
│ │ └── LandingPage.js
│ │ ├── reportWebVitals.js
│ │ └── setupTests.js
└── server
│ ├── db.js
│ ├── index.js
│ ├── package-lock.json
│ ├── package.json
│ ├── resolvers
│ ├── Animal.js
│ ├── Category.js
│ ├── Mutation.js
│ └── Query.js
│ └── schema.js
└── start
├── .DS_Store
└── client
├── .gitignore
├── README.md
├── package-lock.json
├── package.json
├── public
├── favicon.ico
├── index.html
├── logo192.png
├── logo512.png
├── manifest.json
└── robots.txt
└── src
├── App.css
├── App.js
├── App.test.js
├── assets
├── image
│ ├── cat.jpg
│ ├── cham.jpg
│ ├── dockey.jpg
│ ├── dolphin.jpg
│ ├── ele.jpg
│ ├── gorilla.jpg
│ ├── horse.jpg
│ ├── kang.jpg
│ ├── lion.png
│ ├── lion2.jpg
│ ├── ostrich.jpg
│ ├── penguin.png
│ ├── penguin2.jpg
│ ├── rhino.png
│ ├── snake.jpeg
│ ├── stingray.jpg
│ ├── tiger.jpeg
│ └── tiger.png
├── images.js
└── svg
│ ├── loupe.svg
│ ├── s.svg
│ ├── shopping-cart.svg
│ └── star.svg
├── components
├── Card
│ ├── Card.css
│ └── Card.js
├── CardDisplay
│ └── CardDisplay.js
├── CategoryDisplay
│ ├── CategoryDisplay.css
│ └── CategoryDisplay.jsx
├── MainHero
│ ├── MainHero.css
│ └── MainHero.js
└── Nav
│ ├── Nav.css
│ └── Nav.js
├── index.css
├── index.js
├── logo.svg
├── pages
├── AnimalPage
│ ├── AnimalPage.css
│ └── AnimalPage.js
├── CategoryPage.js
└── LandingPage.js
├── reportWebVitals.js
└── setupTests.js
/.DS_Store:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/harblaith7/GraphQL-Crash-Course/a02b725969b689d59b85262aa04572d817ca0a38/.DS_Store
--------------------------------------------------------------------------------
/final/.DS_Store:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/harblaith7/GraphQL-Crash-Course/a02b725969b689d59b85262aa04572d817ca0a38/final/.DS_Store
--------------------------------------------------------------------------------
/final/.gitignore:
--------------------------------------------------------------------------------
1 | node_modules
--------------------------------------------------------------------------------
/final/client/.gitignore:
--------------------------------------------------------------------------------
1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
2 |
3 | # dependencies
4 | /node_modules
5 | /.pnp
6 | .pnp.js
7 |
8 | # testing
9 | /coverage
10 |
11 | # production
12 | /build
13 |
14 | # misc
15 | .DS_Store
16 | .env.local
17 | .env.development.local
18 | .env.test.local
19 | .env.production.local
20 |
21 | npm-debug.log*
22 | yarn-debug.log*
23 | yarn-error.log*
24 |
--------------------------------------------------------------------------------
/final/client/README.md:
--------------------------------------------------------------------------------
1 | # Getting Started with Create React App
2 |
3 | This project was bootstrapped with [Create React App](https://github.com/facebook/create-react-app).
4 |
5 | ## Available Scripts
6 |
7 | In the project directory, you can run:
8 |
9 | ### `yarn start`
10 |
11 | Runs the app in the development mode.\
12 | Open [http://localhost:3000](http://localhost:3000) to view it in the browser.
13 |
14 | The page will reload if you make edits.\
15 | You will also see any lint errors in the console.
16 |
17 | ### `yarn test`
18 |
19 | Launches the test runner in the interactive watch mode.\
20 | See the section about [running tests](https://facebook.github.io/create-react-app/docs/running-tests) for more information.
21 |
22 | ### `yarn build`
23 |
24 | Builds the app for production to the `build` folder.\
25 | It correctly bundles React in production mode and optimizes the build for the best performance.
26 |
27 | The build is minified and the filenames include the hashes.\
28 | Your app is ready to be deployed!
29 |
30 | See the section about [deployment](https://facebook.github.io/create-react-app/docs/deployment) for more information.
31 |
32 | ### `yarn eject`
33 |
34 | **Note: this is a one-way operation. Once you `eject`, you can’t go back!**
35 |
36 | If you aren’t satisfied with the build tool and configuration choices, you can `eject` at any time. This command will remove the single build dependency from your project.
37 |
38 | Instead, it will copy all the configuration files and the transitive dependencies (webpack, Babel, ESLint, etc) right into your project so you have full control over them. All of the commands except `eject` will still work, but they will point to the copied scripts so you can tweak them. At this point you’re on your own.
39 |
40 | You don’t have to ever use `eject`. The curated feature set is suitable for small and middle deployments, and you shouldn’t feel obligated to use this feature. However we understand that this tool wouldn’t be useful if you couldn’t customize it when you are ready for it.
41 |
42 | ## Learn More
43 |
44 | You can learn more in the [Create React App documentation](https://facebook.github.io/create-react-app/docs/getting-started).
45 |
46 | To learn React, check out the [React documentation](https://reactjs.org/).
47 |
48 | ### Code Splitting
49 |
50 | This section has moved here: [https://facebook.github.io/create-react-app/docs/code-splitting](https://facebook.github.io/create-react-app/docs/code-splitting)
51 |
52 | ### Analyzing the Bundle Size
53 |
54 | This section has moved here: [https://facebook.github.io/create-react-app/docs/analyzing-the-bundle-size](https://facebook.github.io/create-react-app/docs/analyzing-the-bundle-size)
55 |
56 | ### Making a Progressive Web App
57 |
58 | This section has moved here: [https://facebook.github.io/create-react-app/docs/making-a-progressive-web-app](https://facebook.github.io/create-react-app/docs/making-a-progressive-web-app)
59 |
60 | ### Advanced Configuration
61 |
62 | This section has moved here: [https://facebook.github.io/create-react-app/docs/advanced-configuration](https://facebook.github.io/create-react-app/docs/advanced-configuration)
63 |
64 | ### Deployment
65 |
66 | This section has moved here: [https://facebook.github.io/create-react-app/docs/deployment](https://facebook.github.io/create-react-app/docs/deployment)
67 |
68 | ### `yarn build` fails to minify
69 |
70 | This section has moved here: [https://facebook.github.io/create-react-app/docs/troubleshooting#npm-run-build-fails-to-minify](https://facebook.github.io/create-react-app/docs/troubleshooting#npm-run-build-fails-to-minify)
71 |
--------------------------------------------------------------------------------
/final/client/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "client",
3 | "version": "0.1.0",
4 | "private": true,
5 | "dependencies": {
6 | "@apollo/client": "^3.3.10",
7 | "@testing-library/jest-dom": "^5.11.4",
8 | "@testing-library/react": "^11.1.0",
9 | "@testing-library/user-event": "^12.1.10",
10 | "bootstrap": "^4.6.0",
11 | "graphql": "^15.5.0",
12 | "react": "^17.0.1",
13 | "react-bootstrap": "^1.4.3",
14 | "react-dom": "^17.0.1",
15 | "react-router-dom": "^5.2.0",
16 | "react-scripts": "4.0.2",
17 | "reactstrap": "^8.9.0",
18 | "web-vitals": "^1.0.1"
19 | },
20 | "scripts": {
21 | "start": "react-scripts start",
22 | "build": "react-scripts build",
23 | "test": "react-scripts test",
24 | "eject": "react-scripts eject"
25 | },
26 | "eslintConfig": {
27 | "extends": [
28 | "react-app",
29 | "react-app/jest"
30 | ]
31 | },
32 | "browserslist": {
33 | "production": [
34 | ">0.2%",
35 | "not dead",
36 | "not op_mini all"
37 | ],
38 | "development": [
39 | "last 1 chrome version",
40 | "last 1 firefox version",
41 | "last 1 safari version"
42 | ]
43 | }
44 | }
45 |
--------------------------------------------------------------------------------
/final/client/public/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/harblaith7/GraphQL-Crash-Course/a02b725969b689d59b85262aa04572d817ca0a38/final/client/public/favicon.ico
--------------------------------------------------------------------------------
/final/client/public/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
17 |
18 |
22 |
23 |
32 | Animazon
33 |
34 |
35 |
36 |
37 |
47 |
48 |
49 |
--------------------------------------------------------------------------------
/final/client/public/logo192.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/harblaith7/GraphQL-Crash-Course/a02b725969b689d59b85262aa04572d817ca0a38/final/client/public/logo192.png
--------------------------------------------------------------------------------
/final/client/public/logo512.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/harblaith7/GraphQL-Crash-Course/a02b725969b689d59b85262aa04572d817ca0a38/final/client/public/logo512.png
--------------------------------------------------------------------------------
/final/client/public/manifest.json:
--------------------------------------------------------------------------------
1 | {
2 | "short_name": "React App",
3 | "name": "Create React App Sample",
4 | "icons": [
5 | {
6 | "src": "favicon.ico",
7 | "sizes": "64x64 32x32 24x24 16x16",
8 | "type": "image/x-icon"
9 | },
10 | {
11 | "src": "logo192.png",
12 | "type": "image/png",
13 | "sizes": "192x192"
14 | },
15 | {
16 | "src": "logo512.png",
17 | "type": "image/png",
18 | "sizes": "512x512"
19 | }
20 | ],
21 | "start_url": ".",
22 | "display": "standalone",
23 | "theme_color": "#000000",
24 | "background_color": "#ffffff"
25 | }
26 |
--------------------------------------------------------------------------------
/final/client/public/robots.txt:
--------------------------------------------------------------------------------
1 | # https://www.robotstxt.org/robotstxt.html
2 | User-agent: *
3 | Disallow:
4 |
--------------------------------------------------------------------------------
/final/client/src/App.css:
--------------------------------------------------------------------------------
1 | * {
2 | padding: 0;
3 | margin: 0;
4 | box-sizing: border-box;
5 | font-family: "Lato";
6 | }
7 |
--------------------------------------------------------------------------------
/final/client/src/App.js:
--------------------------------------------------------------------------------
1 | import logo from './logo.svg';
2 | import './App.css';
3 | import Nav from './components/Nav/Nav';
4 | import { Switch, Route, BrowserRouter } from "react-router-dom"
5 | import LandingPage from './pages/LandingPage';
6 | import CategoryPage from './pages/CategoryPage';
7 | import AnimalPage from './pages/AnimalPage/AnimalPage';
8 | import { ApolloClient, InMemoryCache, ApolloProvider } from "@apollo/client";
9 |
10 | const client = new ApolloClient({
11 | uri: "http://localhost:4000",
12 | cache: new InMemoryCache()
13 | })
14 |
15 | function App() {
16 | return (
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 | );
30 | }
31 |
32 | export default App;
33 |
--------------------------------------------------------------------------------
/final/client/src/App.test.js:
--------------------------------------------------------------------------------
1 | import { render, screen } from '@testing-library/react';
2 | import App from './App';
3 |
4 | test('renders learn react link', () => {
5 | render();
6 | const linkElement = screen.getByText(/learn react/i);
7 | expect(linkElement).toBeInTheDocument();
8 | });
9 |
--------------------------------------------------------------------------------
/final/client/src/assets/image/cat.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/harblaith7/GraphQL-Crash-Course/a02b725969b689d59b85262aa04572d817ca0a38/final/client/src/assets/image/cat.jpg
--------------------------------------------------------------------------------
/final/client/src/assets/image/cham.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/harblaith7/GraphQL-Crash-Course/a02b725969b689d59b85262aa04572d817ca0a38/final/client/src/assets/image/cham.jpg
--------------------------------------------------------------------------------
/final/client/src/assets/image/dockey.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/harblaith7/GraphQL-Crash-Course/a02b725969b689d59b85262aa04572d817ca0a38/final/client/src/assets/image/dockey.jpg
--------------------------------------------------------------------------------
/final/client/src/assets/image/dolphin.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/harblaith7/GraphQL-Crash-Course/a02b725969b689d59b85262aa04572d817ca0a38/final/client/src/assets/image/dolphin.jpg
--------------------------------------------------------------------------------
/final/client/src/assets/image/ele.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/harblaith7/GraphQL-Crash-Course/a02b725969b689d59b85262aa04572d817ca0a38/final/client/src/assets/image/ele.jpg
--------------------------------------------------------------------------------
/final/client/src/assets/image/gorilla.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/harblaith7/GraphQL-Crash-Course/a02b725969b689d59b85262aa04572d817ca0a38/final/client/src/assets/image/gorilla.jpg
--------------------------------------------------------------------------------
/final/client/src/assets/image/horse.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/harblaith7/GraphQL-Crash-Course/a02b725969b689d59b85262aa04572d817ca0a38/final/client/src/assets/image/horse.jpg
--------------------------------------------------------------------------------
/final/client/src/assets/image/kang.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/harblaith7/GraphQL-Crash-Course/a02b725969b689d59b85262aa04572d817ca0a38/final/client/src/assets/image/kang.jpg
--------------------------------------------------------------------------------
/final/client/src/assets/image/lion.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/harblaith7/GraphQL-Crash-Course/a02b725969b689d59b85262aa04572d817ca0a38/final/client/src/assets/image/lion.png
--------------------------------------------------------------------------------
/final/client/src/assets/image/lion2.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/harblaith7/GraphQL-Crash-Course/a02b725969b689d59b85262aa04572d817ca0a38/final/client/src/assets/image/lion2.jpg
--------------------------------------------------------------------------------
/final/client/src/assets/image/ostrich.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/harblaith7/GraphQL-Crash-Course/a02b725969b689d59b85262aa04572d817ca0a38/final/client/src/assets/image/ostrich.jpg
--------------------------------------------------------------------------------
/final/client/src/assets/image/penguin.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/harblaith7/GraphQL-Crash-Course/a02b725969b689d59b85262aa04572d817ca0a38/final/client/src/assets/image/penguin.png
--------------------------------------------------------------------------------
/final/client/src/assets/image/penguin2.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/harblaith7/GraphQL-Crash-Course/a02b725969b689d59b85262aa04572d817ca0a38/final/client/src/assets/image/penguin2.jpg
--------------------------------------------------------------------------------
/final/client/src/assets/image/rhino.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/harblaith7/GraphQL-Crash-Course/a02b725969b689d59b85262aa04572d817ca0a38/final/client/src/assets/image/rhino.png
--------------------------------------------------------------------------------
/final/client/src/assets/image/snake.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/harblaith7/GraphQL-Crash-Course/a02b725969b689d59b85262aa04572d817ca0a38/final/client/src/assets/image/snake.jpeg
--------------------------------------------------------------------------------
/final/client/src/assets/image/stingray.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/harblaith7/GraphQL-Crash-Course/a02b725969b689d59b85262aa04572d817ca0a38/final/client/src/assets/image/stingray.jpg
--------------------------------------------------------------------------------
/final/client/src/assets/image/tiger.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/harblaith7/GraphQL-Crash-Course/a02b725969b689d59b85262aa04572d817ca0a38/final/client/src/assets/image/tiger.jpeg
--------------------------------------------------------------------------------
/final/client/src/assets/image/tiger.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/harblaith7/GraphQL-Crash-Course/a02b725969b689d59b85262aa04572d817ca0a38/final/client/src/assets/image/tiger.png
--------------------------------------------------------------------------------
/final/client/src/assets/images.js:
--------------------------------------------------------------------------------
1 | import lion from "./image/lion2.jpg"
2 | import cham from "./image/cham.jpg"
3 | import dolphin from "./image/dolphin.jpg"
4 | import gorilla from "./image/gorilla.jpg"
5 | import horse from "./image/horse.jpg"
6 | import kang from "./image/kang.jpg"
7 | import ele from "./image/ele.jpg"
8 | import donkey from "./image/dockey.jpg"
9 | import tiger from "./image/tiger.jpeg"
10 | import snake from "./image/snake.jpeg"
11 | import stingray from "./image/stingray.jpg"
12 | import ostrich from "./image/ostrich.jpg"
13 | import penguin from "./image/penguin2.jpg"
14 | import cat from "./image/cat.jpg"
15 | import rhino from "./image/rhino.png"
16 |
17 | export default {
18 | lion,
19 | cham,
20 | dolphin,
21 | gorilla,
22 | horse,
23 | kang,
24 | ele,
25 | donkey,
26 | tiger,
27 | snake,
28 | stingray,
29 | ostrich,
30 | penguin,
31 | cat,
32 | rhino
33 | }
--------------------------------------------------------------------------------
/final/client/src/assets/svg/loupe.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
44 |
--------------------------------------------------------------------------------
/final/client/src/assets/svg/s.svg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/harblaith7/GraphQL-Crash-Course/a02b725969b689d59b85262aa04572d817ca0a38/final/client/src/assets/svg/s.svg
--------------------------------------------------------------------------------
/final/client/src/assets/svg/shopping-cart.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/final/client/src/assets/svg/star.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/final/client/src/components/Card/Card.css:
--------------------------------------------------------------------------------
1 | .card-display {
2 | }
3 |
4 | .card-display-container {
5 | display: flex;
6 | justify-content: space-between;
7 | flex-wrap: wrap;
8 | }
9 |
10 | .main-img {
11 | height: 12.5rem;
12 | }
13 |
14 | .Card {
15 | width: 23%;
16 | margin-top: 2rem;
17 | cursor: pointer;
18 | color: black
19 | }
20 |
21 | .Card:hover {
22 | text-decoration: none;
23 | color: black
24 | }
25 |
26 | .Card img {
27 | width: 100%;
28 | }
29 |
30 | .Card h4 {
31 | font-size: 1rem;
32 | line-height: 1.5rem;
33 | margin-top: 0.2rem;
34 | }
35 |
36 | .card-start {
37 | margin-top: 0.2rem;
38 | display: flex;
39 | }
40 |
41 | .card-start img {
42 | width: 1.2rem;
43 | margin-right: 0.2rem;
44 | }
45 |
46 | .card-price {
47 | display: flex;
48 | margin-top: 0.5rem;
49 | }
50 |
51 | .card-price p {
52 | font-size: 0.75rem;
53 | margin-top: 0.25rem;
54 | margin-right: 0.05rem;
55 | }
56 |
57 | .card-price h4 {
58 | font-size: 1.25rem;
59 | font-weight: 400;
60 | }
61 |
62 | .card-prime {
63 | margin-top: 0.2rem;
64 | font-size: 1.25rem
65 | }
66 |
67 | .card-prime span {
68 | color: rgb(33, 145, 193);
69 | font-weight: 700;
70 | margin-right: 0.2rem;
71 | font-size: 1.25rem;
72 | }
73 |
74 | .card-prime .bold {
75 | color: black;
76 | }
77 |
--------------------------------------------------------------------------------
/final/client/src/components/Card/Card.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import lion from "../../assets/image/lion2.jpg"
3 | import "./Card.css"
4 | import star from "../../assets/svg/star.svg"
5 | import animal from "../../assets/images"
6 | import { Link } from 'react-router-dom'
7 |
8 | function Card(props) {
9 | return (
10 |
11 |
12 |
13 | {props.animal.title}
14 |
15 |
16 |

17 |

18 |

19 |

20 |

21 |
22 |
23 |
CAD $
24 |
{props.animal.price}
25 |
26 |
27 | prime FREE delivery by Tuesday, Feb 16
28 |
29 |
30 | )
31 | }
32 |
33 | export default Card
34 |
--------------------------------------------------------------------------------
/final/client/src/components/CardDisplay/CardDisplay.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import Card from '../Card/Card'
3 | import {Container} from "react-bootstrap"
4 |
5 | function CardDisplay({animals}) {
6 |
7 | return (
8 |
9 |
10 | {animals.map(animal => {
11 | return
12 | })}
13 |
14 |
15 | )
16 | }
17 |
18 | export default CardDisplay
19 |
--------------------------------------------------------------------------------
/final/client/src/components/CategoryDisplay/CategoryDisplay.css:
--------------------------------------------------------------------------------
1 | .CategoryDisplay {
2 | padding-top: 2rem
3 | }
4 | .CategoryDisplay-card {
5 | border-radius: 100%;
6 | overflow: hidden;
7 | width: 15rem;
8 | height: 15rem;
9 | padding-bottom: 2rem;
10 | }
11 |
12 | .CategoryDisplay-card-container {
13 | width: 15rem;
14 | text-align: center;
15 | }
16 |
17 | .CategoryDisplay-card img {
18 | height: 100%;
19 | width: 100%
20 | }
21 |
22 | .CategoryDisplay-card-container h3 {
23 | text-align: center;
24 | margin-top: -2rem;
25 | }
26 |
27 | .CategoryDisplay-container {
28 | display: flex;
29 | justify-content: space-between;
30 | }
--------------------------------------------------------------------------------
/final/client/src/components/CategoryDisplay/CategoryDisplay.jsx:
--------------------------------------------------------------------------------
1 | import React, { useState } from 'react'
2 | import "./CategoryDisplay.css"
3 | import { Container } from 'react-bootstrap'
4 | import animals from '../../assets/images'
5 | import { useQuery, gql } from "@apollo/client"
6 | import { Link } from "react-router-dom"
7 |
8 | const CATEGORIES_QUERY = gql`
9 | {
10 | categories {
11 | id
12 | category
13 | image
14 | slug
15 | }
16 | }
17 | `
18 |
19 | function CategoryDisplay() {
20 |
21 | const { loading, error, data } = useQuery(CATEGORIES_QUERY);
22 |
23 | if(loading) return Loading...
;
24 |
25 | if(error) return Error....
26 |
27 | return (
28 |
29 |
30 | {data.categories.map(category => {
31 | return (
32 |
33 |
34 |

35 |
36 | {category.category}
37 |
38 | )
39 | })}
40 |
41 |
42 | )
43 | }
44 |
45 | export default CategoryDisplay
46 |
--------------------------------------------------------------------------------
/final/client/src/components/MainHero/MainHero.css:
--------------------------------------------------------------------------------
1 | .MainHero {
2 | background-color: rgb(218, 247, 255);
3 | padding-bottom: 2rem;
4 | }
5 |
6 | .header-container {
7 | padding: 3rem;
8 | text-align: center;
9 | display: flex;
10 | align-items: center;
11 | justify-content: center;
12 | }
13 |
14 | .header-container h2 {
15 | font-size: 2.75rem;
16 | margin-right: 2rem;
17 | }
18 |
19 | .header-container img {
20 | width: 15rem;
21 | }
22 |
23 | .cards-container {
24 | display: flex;
25 | justify-content: space-between;
26 | }
27 |
28 | .card {
29 | width: 32%;
30 | background-color: white;
31 | height: 25rem;
32 | padding: 1rem;
33 | padding-bottom: 6rem;
34 | }
35 |
36 | .card p {
37 | font-weight: 900;
38 | margin-top: 1rem;
39 | font-size: 0.75rem;
40 | }
41 |
42 | .card img {
43 | width: 100%;
44 | height: 100%;
45 | margin-top: 1rem;
46 | }
47 |
48 | .boxs-container {
49 | display: flex;
50 | justify-content: space-between;
51 | flex-wrap: wrap;
52 | margin-top: 0.5rem;
53 | }
54 |
55 | .box-container {
56 | background-color: rgba(238, 130, 238, 0.151);
57 | width: 49%;
58 | height: 5rem;
59 | display: flex;
60 | align-items: flex-start;
61 | justify-content: center;
62 | margin-top: 1rem;
63 | }
64 |
65 | .box-container img {
66 | width: 5rem;
67 | }
68 |
--------------------------------------------------------------------------------
/final/client/src/components/MainHero/MainHero.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import "./MainHero.css"
3 | import animals from "../../assets/images"
4 | import {Container} from "reactstrap";
5 | import { useQuery, gql } from "@apollo/client"
6 |
7 | const FETCH_MAIN_CARDS = gql`
8 | {
9 | mainCards {
10 | image
11 | title
12 | }
13 | }
14 | `
15 |
16 | function MainHero() {
17 |
18 | const { loading, error, data } = useQuery(FETCH_MAIN_CARDS)
19 |
20 | console.log(data)
21 |
22 | if(loading) return loading...
23 |
24 | if(error) return Some error happen
25 |
26 | return (
27 |
28 |
29 |
30 |
Find your
new four-legged
best friend
31 |

32 |
33 |
34 | {data.mainCards.map(card => {
35 | return (
36 |
37 |
{card.title}
38 |

39 |
40 | )
41 | })}
42 |
43 |
44 |
45 | )
46 | }
47 |
48 | export default MainHero
49 |
--------------------------------------------------------------------------------
/final/client/src/components/Nav/Nav.css:
--------------------------------------------------------------------------------
1 | .Nav {
2 | background-color: rgb(19, 25, 33);
3 | height: 7.5vh;
4 | display: flex;
5 | align-items: center;
6 | padding: 0 2rem;
7 | }
8 |
9 | .nav-container {
10 | display: flex;
11 | width: 100%;
12 | align-items: center;
13 | }
14 |
15 | .header {
16 | font-family: "Poppins", sans-serif;
17 | color: white;
18 | font-size: 1.4rem;
19 | }
20 |
21 | .header span {
22 | font-size: 0.95rem;
23 | font-weight: 400;
24 | }
25 |
26 | .nav-delivery-info-container {
27 | margin-left: 2rem;
28 | font-size: 0.7rem;
29 | color: rgb(184, 181, 181);
30 | font-weight: 700;
31 | }
32 |
33 | .nav-delivery-info-container h2 {
34 | color: white;
35 | font-size: 1rem;
36 | }
37 |
38 | .nav-delivery-info-container p {
39 | margin-bottom: 0;
40 | }
41 |
42 | .nav-input-container {
43 | margin-left: 2rem;
44 | display: flex;
45 | height: 2.25rem;
46 | align-self: center;
47 | width: 75%
48 | }
49 |
50 | .nav-input-container select {
51 | height: 100%;
52 | border-radius: 0.2rem 0 0 0.2rem;
53 | padding: 0.2rem;
54 | background-color: rgb(218, 218, 218);
55 | border-color: rgba(128, 128, 128, 0.315);
56 | }
57 |
58 | .nav-input-container input {
59 | height: 100%;
60 | padding: 0.2rem;
61 | border: none;
62 | width: 100%;
63 | }
64 |
65 | .nav-input-container select:focus {
66 | outline: none;
67 | }
68 |
69 | .nav-btn {
70 | background-color: rgb(254, 189, 105);
71 | width: 3rem;
72 | border: none;
73 | border-radius: 0 0.2rem 0.2rem 0;
74 | height: 2.25rem;
75 | }
76 |
77 | .nav-btn img {
78 | width: 1.35rem;
79 | }
80 |
81 | .nav-cart-container {
82 | margin-left: 2rem;
83 | display: flex;
84 | color: white;
85 | }
86 |
87 | .nav-cart-container img {
88 | width: 2rem;
89 | }
90 | .nav-cart-container h2 {
91 | margin-top: 0.75rem;
92 | font-size: 1.25rem;
93 | margin-left: 0.25rem;
94 | }
95 |
--------------------------------------------------------------------------------
/final/client/src/components/Nav/Nav.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import "./Nav.css";
3 | import { Container } from "react-bootstrap"
4 | import search from '../../assets/svg/loupe.svg'
5 | import cart from '../../assets/svg/shopping-cart.svg'
6 |
7 | export default function Nav() {
8 | return (
9 |
10 |
11 |
animazon.com
12 |
13 |
Deliver to Laith
14 |
432 Park Avenue
15 |
16 |
17 |
20 |
21 |
24 |
25 |
26 |
Hello, Laith
27 |
Account & Lists
28 |
29 |
30 |
Returns
31 |
& Orders
32 |
33 |
34 |

35 |
cart
36 |
37 |
38 |
39 | )
40 | }
41 |
--------------------------------------------------------------------------------
/final/client/src/index.css:
--------------------------------------------------------------------------------
1 | html {
2 | padding: 0;
3 | margin: 0;
4 | box-sizing: border-box;
5 | }
6 |
7 |
--------------------------------------------------------------------------------
/final/client/src/index.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import ReactDOM from 'react-dom';
3 | import './index.css';
4 | import App from './App';
5 | import reportWebVitals from './reportWebVitals';
6 | import "./index.css"
7 |
8 | ReactDOM.render(
9 |
10 |
11 | ,
12 | document.getElementById('root')
13 | );
14 |
15 | // If you want to start measuring performance in your app, pass a function
16 | // to log results (for example: reportWebVitals(console.log))
17 | // or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals
18 | reportWebVitals();
19 |
--------------------------------------------------------------------------------
/final/client/src/logo.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/final/client/src/pages/AnimalPage/AnimalPage.css:
--------------------------------------------------------------------------------
1 | .product-img {
2 | width: 40%
3 | }
4 |
5 | .text-container {
6 | width: 40%;
7 | }
8 |
9 | .text-container h1 {
10 | font-size: 1.25rem;
11 | line-height: 2rem;
12 | }
13 |
14 | .star-container img {
15 | width: 1rem
16 | }
17 |
18 | .star-container {
19 | display: flex;
20 | }
21 |
22 | .star-container p {
23 | color: rgb(33, 145, 193);
24 | margin-top: 1rem;
25 | margin-left: 0.5rem;
26 | }
27 |
28 | .about-container h4 {
29 | font-size: 1.15rem;
30 | font-weight: 700;
31 | }
32 |
33 |
34 |
35 | .cart-container {
36 | border-radius: 1rem;
37 | width: 20%;
38 | margin-left: 2rem;
39 | padding: 1rem
40 | }
41 |
42 | .cart-container button {
43 | width: 100%;
44 | border: none;
45 | background-color: #F2CB6A;
46 | padding: 0.35rem 0;
47 | font-size: 0.85rem;
48 | margin: 0.25rem 0
49 | }
50 |
51 | .price {
52 | color: rgb(141, 6, 6);
53 |
54 | }
55 |
56 | .delivery-time {
57 | padding-bottom: 4rem;
58 | }
59 |
60 | .buy-now-btn {
61 | margin-top: 1rem;
62 | }
63 |
64 |
65 | .rating-stock-container {
66 | width: 100%;
67 | display: flex;
68 | justify-content: space-between;
69 | }
--------------------------------------------------------------------------------
/final/client/src/pages/AnimalPage/AnimalPage.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import { Container } from 'react-bootstrap'
3 | import animals from "../../assets/images"
4 | import star from "../../assets/svg/star.svg"
5 | import "./AnimalPage.css"
6 | import { useParams } from "react-router-dom"
7 | import { useQuery, gql } from "@apollo/client"
8 |
9 | const ANIMAL_QUERY = gql`
10 | query($slug: String!){
11 | animal(slug: $slug) {
12 | title
13 | image
14 | stock
15 | description
16 | price
17 | }
18 | }
19 | `
20 |
21 | function AnimalPage() {
22 |
23 | const { slug } = useParams();
24 |
25 | const { data, loading, error } = useQuery(ANIMAL_QUERY, {
26 | variables: {
27 | slug
28 | }
29 | })
30 |
31 | if(loading) return loading...
32 |
33 | if(error) return error...
34 | console.log(data)
35 |
36 | return (
37 |
38 |
39 |
40 |

41 |
42 |
{data.animal.title}
43 |
44 |

45 |

46 |

47 |

48 |

49 |
50 |
1402 rating
51 |
{data.animal.stock} in stock
52 |
53 |
54 |
55 |
56 |
About this Animal
57 | {data.animal.description.map(description => {
58 | return {description}
59 | })}
60 |
61 |
62 |
63 |
CAD$ {data.animal.price}
64 |
FREE delivery: Thursday, Feb 25 Details
65 |
68 |
71 |
72 |
73 |
74 |
75 |
76 | )
77 | }
78 |
79 | export default AnimalPage
80 |
--------------------------------------------------------------------------------
/final/client/src/pages/CategoryPage.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import { useParams } from "react-router-dom"
3 | import { Container } from 'react-bootstrap'
4 | import CardDisplay from '../components/CardDisplay/CardDisplay'
5 | import { useQuery, gql } from "@apollo/client"
6 |
7 | const CATEGORY_QUERY = gql`
8 | query($slug: String!){
9 | category(slug: $slug) {
10 | id
11 | category
12 | slug
13 | animals {
14 | id
15 | title
16 | price
17 | image
18 | }
19 | }
20 | }
21 | `
22 |
23 | function CategoryPage() {
24 |
25 | const { slug } = useParams();
26 |
27 | const {error, data, loading } = useQuery(CATEGORY_QUERY, {
28 | variables: {
29 | slug
30 | }
31 | })
32 |
33 | if(loading) return Loading...
;
34 |
35 | if(error) return Error....
36 |
37 | console.log(data)
38 |
39 | return (
40 |
41 |
42 |
43 | {data.category.category}
44 |
47 |
48 |
49 |
50 | )
51 | }
52 |
53 | export default CategoryPage
54 |
--------------------------------------------------------------------------------
/final/client/src/pages/LandingPage.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import MainHero from "../components/MainHero/MainHero"
3 | import CategoryDisplay from "../components/CategoryDisplay/CategoryDisplay"
4 | import CardDisplay from "../components/CardDisplay/CardDisplay"
5 | import { useQuery, useMutation, gql } from "@apollo/client"
6 |
7 | const ANIMALS_QUERY = gql`
8 | {
9 | animals {
10 | image
11 | id
12 | title
13 | price
14 | slug
15 | image
16 | }
17 | }
18 | `
19 |
20 | const ADD_ANIMAL_MUTATION = gql`
21 | mutation(
22 | $image: String!,
23 | $category: String!,
24 | $title: String!,
25 | $stock: Int!,
26 | $price: String!,
27 | $description: [String!]!
28 | $rating: Float
29 | $slug: String!
30 | ) {
31 | addAnimal(
32 | image: $image,
33 | category: $category,
34 | title: $title,
35 | stock: $stock,
36 | price: $price,
37 | description: $description,
38 | rating: $rating,
39 | slug: $slug,
40 | ) {
41 | id
42 | }
43 | }
44 | `
45 |
46 | function LandingPage() {
47 |
48 | const { loading, error, data } = useQuery(ANIMALS_QUERY);
49 | const [addAnimal] = useMutation(ADD_ANIMAL_MUTATION)
50 |
51 | if(loading) return Loading...
;
52 |
53 | if(error) return Error....
54 |
55 | return (
56 |
57 |
58 |
59 |
60 |
74 |
75 | )
76 | }
77 |
78 | export default LandingPage
79 |
--------------------------------------------------------------------------------
/final/client/src/reportWebVitals.js:
--------------------------------------------------------------------------------
1 | const reportWebVitals = onPerfEntry => {
2 | if (onPerfEntry && onPerfEntry instanceof Function) {
3 | import('web-vitals').then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => {
4 | getCLS(onPerfEntry);
5 | getFID(onPerfEntry);
6 | getFCP(onPerfEntry);
7 | getLCP(onPerfEntry);
8 | getTTFB(onPerfEntry);
9 | });
10 | }
11 | };
12 |
13 | export default reportWebVitals;
14 |
--------------------------------------------------------------------------------
/final/client/src/setupTests.js:
--------------------------------------------------------------------------------
1 | // jest-dom adds custom jest matchers for asserting on DOM nodes.
2 | // allows you to do things like:
3 | // expect(element).toHaveTextContent(/react/i)
4 | // learn more: https://github.com/testing-library/jest-dom
5 | import '@testing-library/jest-dom';
6 |
--------------------------------------------------------------------------------
/final/server/db.js:
--------------------------------------------------------------------------------
1 | const mainCards = [
2 | {
3 | title: "Recently Viewed",
4 | image: "lion",
5 | },
6 | {
7 | title: 'Looking for a Gift?',
8 | image: 'penguin',
9 | },
10 | {
11 | title: 'Best Behaved',
12 | image: 'cat',
13 | },
14 | ];
15 |
16 | const animals = [
17 | {
18 | id: "1",
19 | image: "lion",
20 | title: "7-year Male Lion with Large Well Kept Main with a Beautiful Yellow/Brownish Color",
21 | rating: 5.0,
22 | price: "23,322",
23 | description: [
24 | "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.",
25 | "Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.",
26 | "Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.",
27 | "Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."
28 | ],
29 | stock: 14,
30 | onSale: false,
31 | slug: "lion",
32 | category: "1"
33 | },
34 | {
35 | id: "2",
36 | image: "cham",
37 | title: "Beautiful Highly Specialized Clade Lizard with 202 Different Color Combinations",
38 | price: "1,522",
39 | description: [
40 | "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.",
41 | "Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.",
42 | "Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.",
43 | "Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."
44 | ],
45 | stock: 14,
46 | onSale: false,
47 | slug: "chameleons",
48 | category: "2"
49 | },
50 | {
51 | id: "3",
52 | image: "dolphin",
53 | title: "Fast and Swift Aquatic Dolphin with Great Accordatic Skills in the Air",
54 | price: "101,432",
55 | description: [
56 | "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.",
57 | "Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.",
58 | "Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.",
59 | "Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."
60 | ],
61 | stock: 14,
62 | onSale: false,
63 | slug: "dolphin",
64 | category: "3"
65 | },
66 | {
67 | id: "4",
68 | image: "gorilla",
69 | title: "Black Haired Gorilla with Broad Chest and Shoulder. Would be an Excellent Spot at the Gym",
70 | price: "47,775",
71 | description: [
72 | "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.",
73 | "Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.",
74 | "Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.",
75 | "Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."
76 | ],
77 | stock: 14,
78 | onSale: false,
79 | slug: "gorilla",
80 | category: "4"
81 | },
82 | {
83 | id: "5",
84 | image: "horse",
85 | title: "17-year Female Horse with a Luxury Brown Exterior and a Beautiful Red Interior",
86 | price: "13,432",
87 | description: [
88 | "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.",
89 | "Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.",
90 | "Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.",
91 | "Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."
92 | ],
93 | stock: 14,
94 | onSale: false,
95 | slug: "horse",
96 | category: "4"
97 | },
98 | {
99 | id: "6",
100 | image: "kang",
101 | title: "Large Kangaroo with Muscular Leg and Tail and Pointly Teeth and Ears",
102 | price: "42,453",
103 | description: [
104 | "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.",
105 | "Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.",
106 | "Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.",
107 | "Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."
108 | ],
109 | stock: 14,
110 | onSale: false,
111 | slug: "kangaroo",
112 | category: "4"
113 | },
114 | {
115 | id: "7",
116 | image: "ele",
117 | title: "Grey Male 17 year Elephant with 12 Meter Truck and 5 Meter Tusk",
118 | price: "101,432",
119 | description: [
120 | "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.",
121 | "Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.",
122 | "Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.",
123 | "Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."
124 | ],
125 | stock: 14,
126 | onSale: false,
127 | slug: "elephant",
128 | category: "4"
129 | },
130 | {
131 | id: "8",
132 | image: "donkey",
133 | title: "This is the Voice Actor from the Dockey for Shrek.",
134 | price: "179,731",
135 | description: [
136 | "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.",
137 | "Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.",
138 | "Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.",
139 | "Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."
140 | ],
141 | stock: 14,
142 | onSale: false,
143 | slug: "donkey",
144 | category: "4"
145 | }
146 | ]
147 |
148 | const categories = [
149 | {
150 | id: "1",
151 | image: "tiger",
152 | category: "cats",
153 | slug: "cats"
154 | },
155 | {
156 | id: "2",
157 | image: "snake",
158 | category: "reptiles",
159 | slug: "reptiles"
160 | },
161 | {
162 | id: "3",
163 | image: "stingray",
164 | category: "ocean creatures",
165 | slug: "ocean-creatures"
166 | },
167 | {
168 | id: "4",
169 | image: "donkey",
170 | category: "mammals",
171 | slug: "mammals"
172 | }
173 | ]
174 |
175 | module.exports = {
176 | mainCards,
177 | animals,
178 | categories
179 | }
--------------------------------------------------------------------------------
/final/server/index.js:
--------------------------------------------------------------------------------
1 | const { ApolloServer } = require('apollo-server');
2 | const { mainCards, animals, categories } = require('./db')
3 | const typeDefs = require('./schema')
4 | const Query = require("./resolvers/Query")
5 | const Mutation = require("./resolvers/Mutation")
6 | const Animal = require("./resolvers/Animal")
7 | const Category = require("./resolvers/Category")
8 |
9 | const server = new ApolloServer({
10 | typeDefs,
11 | resolvers: {
12 | Query,
13 | Mutation,
14 | Animal,
15 | Category
16 | },
17 | context: {
18 | mainCards,
19 | animals,
20 | categories
21 | }
22 | });
23 |
24 | // The `listen` method launches a web server.
25 | server.listen().then(({ url }) => {
26 | console.log(`🚀 Server ready at ${url}`);
27 | });
--------------------------------------------------------------------------------
/final/server/package-lock.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "server",
3 | "version": "1.0.0",
4 | "lockfileVersion": 1,
5 | "requires": true,
6 | "dependencies": {
7 | "@apollo/protobufjs": {
8 | "version": "1.0.5",
9 | "resolved": "https://registry.npmjs.org/@apollo/protobufjs/-/protobufjs-1.0.5.tgz",
10 | "integrity": "sha512-ZtyaBH1icCgqwIGb3zrtopV2D5Q8yxibkJzlaViM08eOhTQc7rACdYu0pfORFfhllvdMZ3aq69vifYHszY4gNA==",
11 | "requires": {
12 | "@protobufjs/aspromise": "^1.1.2",
13 | "@protobufjs/base64": "^1.1.2",
14 | "@protobufjs/codegen": "^2.0.4",
15 | "@protobufjs/eventemitter": "^1.1.0",
16 | "@protobufjs/fetch": "^1.1.0",
17 | "@protobufjs/float": "^1.0.2",
18 | "@protobufjs/inquire": "^1.1.0",
19 | "@protobufjs/path": "^1.1.2",
20 | "@protobufjs/pool": "^1.1.0",
21 | "@protobufjs/utf8": "^1.1.0",
22 | "@types/long": "^4.0.0",
23 | "@types/node": "^10.1.0",
24 | "long": "^4.0.0"
25 | },
26 | "dependencies": {
27 | "@types/node": {
28 | "version": "10.17.54",
29 | "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.54.tgz",
30 | "integrity": "sha512-c8Lm7+hXdSPmWH4B9z/P/xIXhFK3mCQin4yCYMd2p1qpMG5AfgyJuYZ+3q2dT7qLiMMMGMd5dnkFpdqJARlvtQ=="
31 | }
32 | }
33 | },
34 | "@apollographql/apollo-tools": {
35 | "version": "0.4.9",
36 | "resolved": "https://registry.npmjs.org/@apollographql/apollo-tools/-/apollo-tools-0.4.9.tgz",
37 | "integrity": "sha512-M50pk8oo3CGTu4waGOklIX3YtTZoPfWG9K/G9WB8NpyQGA1OwYTiBFv94XqUtKElTDoFwoMXpMQd3Wy5dINvxA==",
38 | "requires": {
39 | "apollo-env": "^0.6.6"
40 | }
41 | },
42 | "@apollographql/graphql-playground-html": {
43 | "version": "1.6.26",
44 | "resolved": "https://registry.npmjs.org/@apollographql/graphql-playground-html/-/graphql-playground-html-1.6.26.tgz",
45 | "integrity": "sha512-XAwXOIab51QyhBxnxySdK3nuMEUohhDsHQ5Rbco/V1vjlP75zZ0ZLHD9dTpXTN8uxKxopb2lUvJTq+M4g2Q0HQ==",
46 | "requires": {
47 | "xss": "^1.0.6"
48 | }
49 | },
50 | "@apollographql/graphql-upload-8-fork": {
51 | "version": "8.1.3",
52 | "resolved": "https://registry.npmjs.org/@apollographql/graphql-upload-8-fork/-/graphql-upload-8-fork-8.1.3.tgz",
53 | "integrity": "sha512-ssOPUT7euLqDXcdVv3Qs4LoL4BPtfermW1IOouaqEmj36TpHYDmYDIbKoSQxikd9vtMumFnP87OybH7sC9fJ6g==",
54 | "requires": {
55 | "@types/express": "*",
56 | "@types/fs-capacitor": "*",
57 | "@types/koa": "*",
58 | "busboy": "^0.3.1",
59 | "fs-capacitor": "^2.0.4",
60 | "http-errors": "^1.7.3",
61 | "object-path": "^0.11.4"
62 | }
63 | },
64 | "@protobufjs/aspromise": {
65 | "version": "1.1.2",
66 | "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz",
67 | "integrity": "sha1-m4sMxmPWaafY9vXQiToU00jzD78="
68 | },
69 | "@protobufjs/base64": {
70 | "version": "1.1.2",
71 | "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz",
72 | "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg=="
73 | },
74 | "@protobufjs/codegen": {
75 | "version": "2.0.4",
76 | "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz",
77 | "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg=="
78 | },
79 | "@protobufjs/eventemitter": {
80 | "version": "1.1.0",
81 | "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz",
82 | "integrity": "sha1-NVy8mLr61ZePntCV85diHx0Ga3A="
83 | },
84 | "@protobufjs/fetch": {
85 | "version": "1.1.0",
86 | "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz",
87 | "integrity": "sha1-upn7WYYUr2VwDBYZ/wbUVLDYTEU=",
88 | "requires": {
89 | "@protobufjs/aspromise": "^1.1.1",
90 | "@protobufjs/inquire": "^1.1.0"
91 | }
92 | },
93 | "@protobufjs/float": {
94 | "version": "1.0.2",
95 | "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz",
96 | "integrity": "sha1-Xp4avctz/Ap8uLKR33jIy9l7h9E="
97 | },
98 | "@protobufjs/inquire": {
99 | "version": "1.1.0",
100 | "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz",
101 | "integrity": "sha1-/yAOPnzyQp4tyvwRQIKOjMY48Ik="
102 | },
103 | "@protobufjs/path": {
104 | "version": "1.1.2",
105 | "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz",
106 | "integrity": "sha1-bMKyDFya1q0NzP0hynZz2Nf79o0="
107 | },
108 | "@protobufjs/pool": {
109 | "version": "1.1.0",
110 | "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz",
111 | "integrity": "sha1-Cf0V8tbTq/qbZbw2ZQbWrXhG/1Q="
112 | },
113 | "@protobufjs/utf8": {
114 | "version": "1.1.0",
115 | "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz",
116 | "integrity": "sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA="
117 | },
118 | "@types/accepts": {
119 | "version": "1.3.5",
120 | "resolved": "https://registry.npmjs.org/@types/accepts/-/accepts-1.3.5.tgz",
121 | "integrity": "sha512-jOdnI/3qTpHABjM5cx1Hc0sKsPoYCp+DP/GJRGtDlPd7fiV9oXGGIcjW/ZOxLIvjGz8MA+uMZI9metHlgqbgwQ==",
122 | "requires": {
123 | "@types/node": "*"
124 | }
125 | },
126 | "@types/body-parser": {
127 | "version": "1.19.0",
128 | "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.0.tgz",
129 | "integrity": "sha512-W98JrE0j2K78swW4ukqMleo8R7h/pFETjM2DQ90MF6XK2i4LO4W3gQ71Lt4w3bfm2EvVSyWHplECvB5sK22yFQ==",
130 | "requires": {
131 | "@types/connect": "*",
132 | "@types/node": "*"
133 | }
134 | },
135 | "@types/connect": {
136 | "version": "3.4.34",
137 | "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.34.tgz",
138 | "integrity": "sha512-ePPA/JuI+X0vb+gSWlPKOY0NdNAie/rPUqX2GUPpbZwiKTkSPhjXWuee47E4MtE54QVzGCQMQkAL6JhV2E1+cQ==",
139 | "requires": {
140 | "@types/node": "*"
141 | }
142 | },
143 | "@types/content-disposition": {
144 | "version": "0.5.3",
145 | "resolved": "https://registry.npmjs.org/@types/content-disposition/-/content-disposition-0.5.3.tgz",
146 | "integrity": "sha512-P1bffQfhD3O4LW0ioENXUhZ9OIa0Zn+P7M+pWgkCKaT53wVLSq0mrKksCID/FGHpFhRSxRGhgrQmfhRuzwtKdg=="
147 | },
148 | "@types/cookies": {
149 | "version": "0.7.6",
150 | "resolved": "https://registry.npmjs.org/@types/cookies/-/cookies-0.7.6.tgz",
151 | "integrity": "sha512-FK4U5Qyn7/Sc5ih233OuHO0qAkOpEcD/eG6584yEiLKizTFRny86qHLe/rej3HFQrkBuUjF4whFliAdODbVN/w==",
152 | "requires": {
153 | "@types/connect": "*",
154 | "@types/express": "*",
155 | "@types/keygrip": "*",
156 | "@types/node": "*"
157 | }
158 | },
159 | "@types/cors": {
160 | "version": "2.8.8",
161 | "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.8.tgz",
162 | "integrity": "sha512-fO3gf3DxU2Trcbr75O7obVndW/X5k8rJNZkLXlQWStTHhP71PkRqjwPIEI0yMnJdg9R9OasjU+Bsr+Hr1xy/0w==",
163 | "requires": {
164 | "@types/express": "*"
165 | }
166 | },
167 | "@types/express": {
168 | "version": "4.17.11",
169 | "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.11.tgz",
170 | "integrity": "sha512-no+R6rW60JEc59977wIxreQVsIEOAYwgCqldrA/vkpCnbD7MqTefO97lmoBe4WE0F156bC4uLSP1XHDOySnChg==",
171 | "requires": {
172 | "@types/body-parser": "*",
173 | "@types/express-serve-static-core": "^4.17.18",
174 | "@types/qs": "*",
175 | "@types/serve-static": "*"
176 | }
177 | },
178 | "@types/express-serve-static-core": {
179 | "version": "4.17.18",
180 | "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.18.tgz",
181 | "integrity": "sha512-m4JTwx5RUBNZvky/JJ8swEJPKFd8si08pPF2PfizYjGZOKr/svUWPcoUmLow6MmPzhasphB7gSTINY67xn3JNA==",
182 | "requires": {
183 | "@types/node": "*",
184 | "@types/qs": "*",
185 | "@types/range-parser": "*"
186 | }
187 | },
188 | "@types/fs-capacitor": {
189 | "version": "2.0.0",
190 | "resolved": "https://registry.npmjs.org/@types/fs-capacitor/-/fs-capacitor-2.0.0.tgz",
191 | "integrity": "sha512-FKVPOCFbhCvZxpVAMhdBdTfVfXUpsh15wFHgqOKxh9N9vzWZVuWCSijZ5T4U34XYNnuj2oduh6xcs1i+LPI+BQ==",
192 | "requires": {
193 | "@types/node": "*"
194 | }
195 | },
196 | "@types/http-assert": {
197 | "version": "1.5.1",
198 | "resolved": "https://registry.npmjs.org/@types/http-assert/-/http-assert-1.5.1.tgz",
199 | "integrity": "sha512-PGAK759pxyfXE78NbKxyfRcWYA/KwW17X290cNev/qAsn9eQIxkH4shoNBafH37wewhDG/0p1cHPbK6+SzZjWQ=="
200 | },
201 | "@types/http-errors": {
202 | "version": "1.8.0",
203 | "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-1.8.0.tgz",
204 | "integrity": "sha512-2aoSC4UUbHDj2uCsCxcG/vRMXey/m17bC7UwitVm5hn22nI8O8Y9iDpA76Orc+DWkQ4zZrOKEshCqR/jSuXAHA=="
205 | },
206 | "@types/keygrip": {
207 | "version": "1.0.2",
208 | "resolved": "https://registry.npmjs.org/@types/keygrip/-/keygrip-1.0.2.tgz",
209 | "integrity": "sha512-GJhpTepz2udxGexqos8wgaBx4I/zWIDPh/KOGEwAqtuGDkOUJu5eFvwmdBX4AmB8Odsr+9pHCQqiAqDL/yKMKw=="
210 | },
211 | "@types/koa": {
212 | "version": "2.13.0",
213 | "resolved": "https://registry.npmjs.org/@types/koa/-/koa-2.13.0.tgz",
214 | "integrity": "sha512-hNs1Z2lX+R5sZroIy/WIGbPlH/719s/Nd5uIjSIAdHn9q+g7z6mxOnhwMjK1urE4/NUP0SOoYUOD4MnvD9FRNw==",
215 | "requires": {
216 | "@types/accepts": "*",
217 | "@types/content-disposition": "*",
218 | "@types/cookies": "*",
219 | "@types/http-assert": "*",
220 | "@types/http-errors": "*",
221 | "@types/keygrip": "*",
222 | "@types/koa-compose": "*",
223 | "@types/node": "*"
224 | }
225 | },
226 | "@types/koa-compose": {
227 | "version": "3.2.5",
228 | "resolved": "https://registry.npmjs.org/@types/koa-compose/-/koa-compose-3.2.5.tgz",
229 | "integrity": "sha512-B8nG/OoE1ORZqCkBVsup/AKcvjdgoHnfi4pZMn5UwAPCbhk/96xyv284eBYW8JlQbQ7zDmnpFr68I/40mFoIBQ==",
230 | "requires": {
231 | "@types/koa": "*"
232 | }
233 | },
234 | "@types/long": {
235 | "version": "4.0.1",
236 | "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.1.tgz",
237 | "integrity": "sha512-5tXH6Bx/kNGd3MgffdmP4dy2Z+G4eaXw0SE81Tq3BNadtnMR5/ySMzX4SLEzHJzSmPNn4HIdpQsBvXMUykr58w=="
238 | },
239 | "@types/mime": {
240 | "version": "1.3.2",
241 | "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz",
242 | "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw=="
243 | },
244 | "@types/node": {
245 | "version": "14.14.31",
246 | "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.31.tgz",
247 | "integrity": "sha512-vFHy/ezP5qI0rFgJ7aQnjDXwAMrG0KqqIH7tQG5PPv3BWBayOPIQNBjVc/P6hhdZfMx51REc6tfDNXHUio893g=="
248 | },
249 | "@types/node-fetch": {
250 | "version": "2.5.7",
251 | "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.5.7.tgz",
252 | "integrity": "sha512-o2WVNf5UhWRkxlf6eq+jMZDu7kjgpgJfl4xVNlvryc95O/6F2ld8ztKX+qu+Rjyet93WAWm5LjeX9H5FGkODvw==",
253 | "requires": {
254 | "@types/node": "*",
255 | "form-data": "^3.0.0"
256 | }
257 | },
258 | "@types/qs": {
259 | "version": "6.9.5",
260 | "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.5.tgz",
261 | "integrity": "sha512-/JHkVHtx/REVG0VVToGRGH2+23hsYLHdyG+GrvoUGlGAd0ErauXDyvHtRI/7H7mzLm+tBCKA7pfcpkQ1lf58iQ=="
262 | },
263 | "@types/range-parser": {
264 | "version": "1.2.3",
265 | "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.3.tgz",
266 | "integrity": "sha512-ewFXqrQHlFsgc09MK5jP5iR7vumV/BYayNC6PgJO2LPe8vrnNFyjQjSppfEngITi0qvfKtzFvgKymGheFM9UOA=="
267 | },
268 | "@types/serve-static": {
269 | "version": "1.13.9",
270 | "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.9.tgz",
271 | "integrity": "sha512-ZFqF6qa48XsPdjXV5Gsz0Zqmux2PerNd3a/ktL45mHpa19cuMi/cL8tcxdAx497yRh+QtYPuofjT9oWw9P7nkA==",
272 | "requires": {
273 | "@types/mime": "^1",
274 | "@types/node": "*"
275 | }
276 | },
277 | "@types/ws": {
278 | "version": "7.4.0",
279 | "resolved": "https://registry.npmjs.org/@types/ws/-/ws-7.4.0.tgz",
280 | "integrity": "sha512-Y29uQ3Uy+58bZrFLhX36hcI3Np37nqWE7ky5tjiDoy1GDZnIwVxS0CgF+s+1bXMzjKBFy+fqaRfb708iNzdinw==",
281 | "requires": {
282 | "@types/node": "*"
283 | }
284 | },
285 | "@wry/equality": {
286 | "version": "0.1.11",
287 | "resolved": "https://registry.npmjs.org/@wry/equality/-/equality-0.1.11.tgz",
288 | "integrity": "sha512-mwEVBDUVODlsQQ5dfuLUS5/Tf7jqUKyhKYHmVi4fPB6bDMOfWvUPJmKgS1Z7Za/sOI3vzWt4+O7yCiL/70MogA==",
289 | "requires": {
290 | "tslib": "^1.9.3"
291 | }
292 | },
293 | "accepts": {
294 | "version": "1.3.7",
295 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz",
296 | "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==",
297 | "requires": {
298 | "mime-types": "~2.1.24",
299 | "negotiator": "0.6.2"
300 | }
301 | },
302 | "apollo-cache-control": {
303 | "version": "0.11.6",
304 | "resolved": "https://registry.npmjs.org/apollo-cache-control/-/apollo-cache-control-0.11.6.tgz",
305 | "integrity": "sha512-YZ+uuIG+fPy+mkpBS2qKF0v1qlzZ3PW6xZVaDukeK3ed3iAs4L/2YnkTqau3OmoF/VPzX2FmSkocX/OVd59YSw==",
306 | "requires": {
307 | "apollo-server-env": "^3.0.0",
308 | "apollo-server-plugin-base": "^0.10.4"
309 | }
310 | },
311 | "apollo-datasource": {
312 | "version": "0.7.3",
313 | "resolved": "https://registry.npmjs.org/apollo-datasource/-/apollo-datasource-0.7.3.tgz",
314 | "integrity": "sha512-PE0ucdZYjHjUyXrFWRwT02yLcx2DACsZ0jm1Mp/0m/I9nZu/fEkvJxfsryXB6JndpmQO77gQHixf/xGCN976kA==",
315 | "requires": {
316 | "apollo-server-caching": "^0.5.3",
317 | "apollo-server-env": "^3.0.0"
318 | }
319 | },
320 | "apollo-env": {
321 | "version": "0.6.6",
322 | "resolved": "https://registry.npmjs.org/apollo-env/-/apollo-env-0.6.6.tgz",
323 | "integrity": "sha512-hXI9PjJtzmD34XviBU+4sPMOxnifYrHVmxpjykqI/dUD2G3yTiuRaiQqwRwB2RCdwC1Ug/jBfoQ/NHDTnnjndQ==",
324 | "requires": {
325 | "@types/node-fetch": "2.5.7",
326 | "core-js": "^3.0.1",
327 | "node-fetch": "^2.2.0",
328 | "sha.js": "^2.4.11"
329 | }
330 | },
331 | "apollo-graphql": {
332 | "version": "0.6.1",
333 | "resolved": "https://registry.npmjs.org/apollo-graphql/-/apollo-graphql-0.6.1.tgz",
334 | "integrity": "sha512-ZRXAV+k+hboCVS+FW86FW/QgnDR7gm/xMUwJPGXEbV53OLGuQQdIT0NCYK7AzzVkCfsbb7NJ3mmEclkZY9uuxQ==",
335 | "requires": {
336 | "apollo-env": "^0.6.6",
337 | "lodash.sortby": "^4.7.0"
338 | }
339 | },
340 | "apollo-link": {
341 | "version": "1.2.14",
342 | "resolved": "https://registry.npmjs.org/apollo-link/-/apollo-link-1.2.14.tgz",
343 | "integrity": "sha512-p67CMEFP7kOG1JZ0ZkYZwRDa369w5PIjtMjvrQd/HnIV8FRsHRqLqK+oAZQnFa1DDdZtOtHTi+aMIW6EatC2jg==",
344 | "requires": {
345 | "apollo-utilities": "^1.3.0",
346 | "ts-invariant": "^0.4.0",
347 | "tslib": "^1.9.3",
348 | "zen-observable-ts": "^0.8.21"
349 | }
350 | },
351 | "apollo-reporting-protobuf": {
352 | "version": "0.6.2",
353 | "resolved": "https://registry.npmjs.org/apollo-reporting-protobuf/-/apollo-reporting-protobuf-0.6.2.tgz",
354 | "integrity": "sha512-WJTJxLM+MRHNUxt1RTl4zD0HrLdH44F2mDzMweBj1yHL0kSt8I1WwoiF/wiGVSpnG48LZrBegCaOJeuVbJTbtw==",
355 | "requires": {
356 | "@apollo/protobufjs": "^1.0.3"
357 | }
358 | },
359 | "apollo-server": {
360 | "version": "2.21.0",
361 | "resolved": "https://registry.npmjs.org/apollo-server/-/apollo-server-2.21.0.tgz",
362 | "integrity": "sha512-OqngjOSB0MEH6VKGWHcrqt4y39HlhYh9CrMvn4PhadTt53IPYRmBglk5qSRA8xMorGqy60iKrOReqj5YfCjTOg==",
363 | "requires": {
364 | "apollo-server-core": "^2.21.0",
365 | "apollo-server-express": "^2.21.0",
366 | "express": "^4.0.0",
367 | "graphql-subscriptions": "^1.0.0",
368 | "graphql-tools": "^4.0.8",
369 | "stoppable": "^1.1.0"
370 | }
371 | },
372 | "apollo-server-caching": {
373 | "version": "0.5.3",
374 | "resolved": "https://registry.npmjs.org/apollo-server-caching/-/apollo-server-caching-0.5.3.tgz",
375 | "integrity": "sha512-iMi3087iphDAI0U2iSBE9qtx9kQoMMEWr6w+LwXruBD95ek9DWyj7OeC2U/ngLjRsXM43DoBDXlu7R+uMjahrQ==",
376 | "requires": {
377 | "lru-cache": "^6.0.0"
378 | }
379 | },
380 | "apollo-server-core": {
381 | "version": "2.21.0",
382 | "resolved": "https://registry.npmjs.org/apollo-server-core/-/apollo-server-core-2.21.0.tgz",
383 | "integrity": "sha512-GtIiq2F0dVDLzzIuO5+dK/pGq/sGxYlKCqAuQQqzYg0fvZ7fukyluXtcTe0tMI+FJZjU0j0WnKgiLsboCoAlPQ==",
384 | "requires": {
385 | "@apollographql/apollo-tools": "^0.4.3",
386 | "@apollographql/graphql-playground-html": "1.6.26",
387 | "@apollographql/graphql-upload-8-fork": "^8.1.3",
388 | "@types/ws": "^7.0.0",
389 | "apollo-cache-control": "^0.11.6",
390 | "apollo-datasource": "^0.7.3",
391 | "apollo-graphql": "^0.6.0",
392 | "apollo-reporting-protobuf": "^0.6.2",
393 | "apollo-server-caching": "^0.5.3",
394 | "apollo-server-env": "^3.0.0",
395 | "apollo-server-errors": "^2.4.2",
396 | "apollo-server-plugin-base": "^0.10.4",
397 | "apollo-server-types": "^0.6.3",
398 | "apollo-tracing": "^0.12.2",
399 | "async-retry": "^1.2.1",
400 | "fast-json-stable-stringify": "^2.0.0",
401 | "graphql-extensions": "^0.12.8",
402 | "graphql-tag": "^2.11.0",
403 | "graphql-tools": "^4.0.8",
404 | "loglevel": "^1.6.7",
405 | "lru-cache": "^6.0.0",
406 | "sha.js": "^2.4.11",
407 | "subscriptions-transport-ws": "^0.9.11",
408 | "uuid": "^8.0.0",
409 | "ws": "^6.0.0"
410 | }
411 | },
412 | "apollo-server-env": {
413 | "version": "3.0.0",
414 | "resolved": "https://registry.npmjs.org/apollo-server-env/-/apollo-server-env-3.0.0.tgz",
415 | "integrity": "sha512-tPSN+VttnPsoQAl/SBVUpGbLA97MXG990XIwq6YUnJyAixrrsjW1xYG7RlaOqetxm80y5mBZKLrRDiiSsW/vog==",
416 | "requires": {
417 | "node-fetch": "^2.1.2",
418 | "util.promisify": "^1.0.0"
419 | }
420 | },
421 | "apollo-server-errors": {
422 | "version": "2.4.2",
423 | "resolved": "https://registry.npmjs.org/apollo-server-errors/-/apollo-server-errors-2.4.2.tgz",
424 | "integrity": "sha512-FeGxW3Batn6sUtX3OVVUm7o56EgjxDlmgpTLNyWcLb0j6P8mw9oLNyAm3B+deHA4KNdNHO5BmHS2g1SJYjqPCQ=="
425 | },
426 | "apollo-server-express": {
427 | "version": "2.21.0",
428 | "resolved": "https://registry.npmjs.org/apollo-server-express/-/apollo-server-express-2.21.0.tgz",
429 | "integrity": "sha512-zbOSNGuxUjlOFZnRrbMpga3pKDEroitF4NAqoVxgBivx7v2hGsE7rljct3PucTx2cMN90AyYe3cU4oA8jBxZIQ==",
430 | "requires": {
431 | "@apollographql/graphql-playground-html": "1.6.26",
432 | "@types/accepts": "^1.3.5",
433 | "@types/body-parser": "1.19.0",
434 | "@types/cors": "2.8.8",
435 | "@types/express": "4.17.7",
436 | "@types/express-serve-static-core": "4.17.18",
437 | "accepts": "^1.3.5",
438 | "apollo-server-core": "^2.21.0",
439 | "apollo-server-types": "^0.6.3",
440 | "body-parser": "^1.18.3",
441 | "cors": "^2.8.4",
442 | "express": "^4.17.1",
443 | "graphql-subscriptions": "^1.0.0",
444 | "graphql-tools": "^4.0.8",
445 | "parseurl": "^1.3.2",
446 | "subscriptions-transport-ws": "^0.9.16",
447 | "type-is": "^1.6.16"
448 | },
449 | "dependencies": {
450 | "@types/express": {
451 | "version": "4.17.7",
452 | "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.7.tgz",
453 | "integrity": "sha512-dCOT5lcmV/uC2J9k0rPafATeeyz+99xTt54ReX11/LObZgfzJqZNcW27zGhYyX+9iSEGXGt5qLPwRSvBZcLvtQ==",
454 | "requires": {
455 | "@types/body-parser": "*",
456 | "@types/express-serve-static-core": "*",
457 | "@types/qs": "*",
458 | "@types/serve-static": "*"
459 | }
460 | }
461 | }
462 | },
463 | "apollo-server-plugin-base": {
464 | "version": "0.10.4",
465 | "resolved": "https://registry.npmjs.org/apollo-server-plugin-base/-/apollo-server-plugin-base-0.10.4.tgz",
466 | "integrity": "sha512-HRhbyHgHFTLP0ImubQObYhSgpmVH4Rk1BinnceZmwudIVLKrqayIVOELdyext/QnSmmzg5W7vF3NLGBcVGMqDg==",
467 | "requires": {
468 | "apollo-server-types": "^0.6.3"
469 | }
470 | },
471 | "apollo-server-types": {
472 | "version": "0.6.3",
473 | "resolved": "https://registry.npmjs.org/apollo-server-types/-/apollo-server-types-0.6.3.tgz",
474 | "integrity": "sha512-aVR7SlSGGY41E1f11YYz5bvwA89uGmkVUtzMiklDhZ7IgRJhysT5Dflt5IuwDxp+NdQkIhVCErUXakopocFLAg==",
475 | "requires": {
476 | "apollo-reporting-protobuf": "^0.6.2",
477 | "apollo-server-caching": "^0.5.3",
478 | "apollo-server-env": "^3.0.0"
479 | }
480 | },
481 | "apollo-tracing": {
482 | "version": "0.12.2",
483 | "resolved": "https://registry.npmjs.org/apollo-tracing/-/apollo-tracing-0.12.2.tgz",
484 | "integrity": "sha512-SYN4o0C0wR1fyS3+P0FthyvsQVHFopdmN3IU64IaspR/RZScPxZ3Ae8uu++fTvkQflAkglnFM0aX6DkZERBp6w==",
485 | "requires": {
486 | "apollo-server-env": "^3.0.0",
487 | "apollo-server-plugin-base": "^0.10.4"
488 | }
489 | },
490 | "apollo-utilities": {
491 | "version": "1.3.4",
492 | "resolved": "https://registry.npmjs.org/apollo-utilities/-/apollo-utilities-1.3.4.tgz",
493 | "integrity": "sha512-pk2hiWrCXMAy2fRPwEyhvka+mqwzeP60Jr1tRYi5xru+3ko94HI9o6lK0CT33/w4RDlxWchmdhDCrvdr+pHCig==",
494 | "requires": {
495 | "@wry/equality": "^0.1.2",
496 | "fast-json-stable-stringify": "^2.0.0",
497 | "ts-invariant": "^0.4.0",
498 | "tslib": "^1.10.0"
499 | }
500 | },
501 | "array-flatten": {
502 | "version": "1.1.1",
503 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
504 | "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI="
505 | },
506 | "async-limiter": {
507 | "version": "1.0.1",
508 | "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz",
509 | "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ=="
510 | },
511 | "async-retry": {
512 | "version": "1.3.1",
513 | "resolved": "https://registry.npmjs.org/async-retry/-/async-retry-1.3.1.tgz",
514 | "integrity": "sha512-aiieFW/7h3hY0Bq5d+ktDBejxuwR78vRu9hDUdR8rNhSaQ29VzPL4AoIRG7D/c7tdenwOcKvgPM6tIxB3cB6HA==",
515 | "requires": {
516 | "retry": "0.12.0"
517 | }
518 | },
519 | "asynckit": {
520 | "version": "0.4.0",
521 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
522 | "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k="
523 | },
524 | "backo2": {
525 | "version": "1.0.2",
526 | "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz",
527 | "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc="
528 | },
529 | "body-parser": {
530 | "version": "1.19.0",
531 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz",
532 | "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==",
533 | "requires": {
534 | "bytes": "3.1.0",
535 | "content-type": "~1.0.4",
536 | "debug": "2.6.9",
537 | "depd": "~1.1.2",
538 | "http-errors": "1.7.2",
539 | "iconv-lite": "0.4.24",
540 | "on-finished": "~2.3.0",
541 | "qs": "6.7.0",
542 | "raw-body": "2.4.0",
543 | "type-is": "~1.6.17"
544 | },
545 | "dependencies": {
546 | "http-errors": {
547 | "version": "1.7.2",
548 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz",
549 | "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==",
550 | "requires": {
551 | "depd": "~1.1.2",
552 | "inherits": "2.0.3",
553 | "setprototypeof": "1.1.1",
554 | "statuses": ">= 1.5.0 < 2",
555 | "toidentifier": "1.0.0"
556 | }
557 | },
558 | "inherits": {
559 | "version": "2.0.3",
560 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
561 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
562 | },
563 | "setprototypeof": {
564 | "version": "1.1.1",
565 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz",
566 | "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw=="
567 | }
568 | }
569 | },
570 | "busboy": {
571 | "version": "0.3.1",
572 | "resolved": "https://registry.npmjs.org/busboy/-/busboy-0.3.1.tgz",
573 | "integrity": "sha512-y7tTxhGKXcyBxRKAni+awqx8uqaJKrSFSNFSeRG5CsWNdmy2BIK+6VGWEW7TZnIO/533mtMEA4rOevQV815YJw==",
574 | "requires": {
575 | "dicer": "0.3.0"
576 | }
577 | },
578 | "bytes": {
579 | "version": "3.1.0",
580 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz",
581 | "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg=="
582 | },
583 | "call-bind": {
584 | "version": "1.0.2",
585 | "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
586 | "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
587 | "requires": {
588 | "function-bind": "^1.1.1",
589 | "get-intrinsic": "^1.0.2"
590 | }
591 | },
592 | "combined-stream": {
593 | "version": "1.0.8",
594 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
595 | "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
596 | "requires": {
597 | "delayed-stream": "~1.0.0"
598 | }
599 | },
600 | "commander": {
601 | "version": "2.20.3",
602 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
603 | "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ=="
604 | },
605 | "content-disposition": {
606 | "version": "0.5.3",
607 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz",
608 | "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==",
609 | "requires": {
610 | "safe-buffer": "5.1.2"
611 | },
612 | "dependencies": {
613 | "safe-buffer": {
614 | "version": "5.1.2",
615 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
616 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
617 | }
618 | }
619 | },
620 | "content-type": {
621 | "version": "1.0.4",
622 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz",
623 | "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA=="
624 | },
625 | "cookie": {
626 | "version": "0.4.0",
627 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz",
628 | "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg=="
629 | },
630 | "cookie-signature": {
631 | "version": "1.0.6",
632 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
633 | "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw="
634 | },
635 | "core-js": {
636 | "version": "3.9.0",
637 | "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.9.0.tgz",
638 | "integrity": "sha512-PyFBJaLq93FlyYdsndE5VaueA9K5cNB7CGzeCj191YYLhkQM0gdZR2SKihM70oF0wdqKSKClv/tEBOpoRmdOVQ=="
639 | },
640 | "cors": {
641 | "version": "2.8.5",
642 | "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz",
643 | "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==",
644 | "requires": {
645 | "object-assign": "^4",
646 | "vary": "^1"
647 | }
648 | },
649 | "cssfilter": {
650 | "version": "0.0.10",
651 | "resolved": "https://registry.npmjs.org/cssfilter/-/cssfilter-0.0.10.tgz",
652 | "integrity": "sha1-xtJnJjKi5cg+AT5oZKQs6N79IK4="
653 | },
654 | "debug": {
655 | "version": "2.6.9",
656 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
657 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
658 | "requires": {
659 | "ms": "2.0.0"
660 | }
661 | },
662 | "define-properties": {
663 | "version": "1.1.3",
664 | "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz",
665 | "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==",
666 | "requires": {
667 | "object-keys": "^1.0.12"
668 | }
669 | },
670 | "delayed-stream": {
671 | "version": "1.0.0",
672 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
673 | "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk="
674 | },
675 | "depd": {
676 | "version": "1.1.2",
677 | "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
678 | "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak="
679 | },
680 | "deprecated-decorator": {
681 | "version": "0.1.6",
682 | "resolved": "https://registry.npmjs.org/deprecated-decorator/-/deprecated-decorator-0.1.6.tgz",
683 | "integrity": "sha1-AJZjF7ehL+kvPMgx91g68ym4bDc="
684 | },
685 | "destroy": {
686 | "version": "1.0.4",
687 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz",
688 | "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA="
689 | },
690 | "dicer": {
691 | "version": "0.3.0",
692 | "resolved": "https://registry.npmjs.org/dicer/-/dicer-0.3.0.tgz",
693 | "integrity": "sha512-MdceRRWqltEG2dZqO769g27N/3PXfcKl04VhYnBlo2YhH7zPi88VebsjTKclaOyiuMaGU72hTfw3VkUitGcVCA==",
694 | "requires": {
695 | "streamsearch": "0.1.2"
696 | }
697 | },
698 | "ee-first": {
699 | "version": "1.1.1",
700 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
701 | "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0="
702 | },
703 | "encodeurl": {
704 | "version": "1.0.2",
705 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
706 | "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k="
707 | },
708 | "es-abstract": {
709 | "version": "1.18.0-next.2",
710 | "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.2.tgz",
711 | "integrity": "sha512-Ih4ZMFHEtZupnUh6497zEL4y2+w8+1ljnCyaTa+adcoafI1GOvMwFlDjBLfWR7y9VLfrjRJe9ocuHY1PSR9jjw==",
712 | "requires": {
713 | "call-bind": "^1.0.2",
714 | "es-to-primitive": "^1.2.1",
715 | "function-bind": "^1.1.1",
716 | "get-intrinsic": "^1.0.2",
717 | "has": "^1.0.3",
718 | "has-symbols": "^1.0.1",
719 | "is-callable": "^1.2.2",
720 | "is-negative-zero": "^2.0.1",
721 | "is-regex": "^1.1.1",
722 | "object-inspect": "^1.9.0",
723 | "object-keys": "^1.1.1",
724 | "object.assign": "^4.1.2",
725 | "string.prototype.trimend": "^1.0.3",
726 | "string.prototype.trimstart": "^1.0.3"
727 | }
728 | },
729 | "es-to-primitive": {
730 | "version": "1.2.1",
731 | "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz",
732 | "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==",
733 | "requires": {
734 | "is-callable": "^1.1.4",
735 | "is-date-object": "^1.0.1",
736 | "is-symbol": "^1.0.2"
737 | }
738 | },
739 | "escape-html": {
740 | "version": "1.0.3",
741 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
742 | "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg="
743 | },
744 | "etag": {
745 | "version": "1.8.1",
746 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
747 | "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc="
748 | },
749 | "eventemitter3": {
750 | "version": "3.1.2",
751 | "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.2.tgz",
752 | "integrity": "sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q=="
753 | },
754 | "express": {
755 | "version": "4.17.1",
756 | "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz",
757 | "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==",
758 | "requires": {
759 | "accepts": "~1.3.7",
760 | "array-flatten": "1.1.1",
761 | "body-parser": "1.19.0",
762 | "content-disposition": "0.5.3",
763 | "content-type": "~1.0.4",
764 | "cookie": "0.4.0",
765 | "cookie-signature": "1.0.6",
766 | "debug": "2.6.9",
767 | "depd": "~1.1.2",
768 | "encodeurl": "~1.0.2",
769 | "escape-html": "~1.0.3",
770 | "etag": "~1.8.1",
771 | "finalhandler": "~1.1.2",
772 | "fresh": "0.5.2",
773 | "merge-descriptors": "1.0.1",
774 | "methods": "~1.1.2",
775 | "on-finished": "~2.3.0",
776 | "parseurl": "~1.3.3",
777 | "path-to-regexp": "0.1.7",
778 | "proxy-addr": "~2.0.5",
779 | "qs": "6.7.0",
780 | "range-parser": "~1.2.1",
781 | "safe-buffer": "5.1.2",
782 | "send": "0.17.1",
783 | "serve-static": "1.14.1",
784 | "setprototypeof": "1.1.1",
785 | "statuses": "~1.5.0",
786 | "type-is": "~1.6.18",
787 | "utils-merge": "1.0.1",
788 | "vary": "~1.1.2"
789 | },
790 | "dependencies": {
791 | "safe-buffer": {
792 | "version": "5.1.2",
793 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
794 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
795 | },
796 | "setprototypeof": {
797 | "version": "1.1.1",
798 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz",
799 | "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw=="
800 | }
801 | }
802 | },
803 | "fast-json-stable-stringify": {
804 | "version": "2.1.0",
805 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
806 | "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="
807 | },
808 | "finalhandler": {
809 | "version": "1.1.2",
810 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz",
811 | "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==",
812 | "requires": {
813 | "debug": "2.6.9",
814 | "encodeurl": "~1.0.2",
815 | "escape-html": "~1.0.3",
816 | "on-finished": "~2.3.0",
817 | "parseurl": "~1.3.3",
818 | "statuses": "~1.5.0",
819 | "unpipe": "~1.0.0"
820 | }
821 | },
822 | "for-each": {
823 | "version": "0.3.3",
824 | "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz",
825 | "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==",
826 | "requires": {
827 | "is-callable": "^1.1.3"
828 | }
829 | },
830 | "form-data": {
831 | "version": "3.0.1",
832 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz",
833 | "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==",
834 | "requires": {
835 | "asynckit": "^0.4.0",
836 | "combined-stream": "^1.0.8",
837 | "mime-types": "^2.1.12"
838 | }
839 | },
840 | "forwarded": {
841 | "version": "0.1.2",
842 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz",
843 | "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ="
844 | },
845 | "fresh": {
846 | "version": "0.5.2",
847 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
848 | "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac="
849 | },
850 | "fs-capacitor": {
851 | "version": "2.0.4",
852 | "resolved": "https://registry.npmjs.org/fs-capacitor/-/fs-capacitor-2.0.4.tgz",
853 | "integrity": "sha512-8S4f4WsCryNw2mJJchi46YgB6CR5Ze+4L1h8ewl9tEpL4SJ3ZO+c/bS4BWhB8bK+O3TMqhuZarTitd0S0eh2pA=="
854 | },
855 | "function-bind": {
856 | "version": "1.1.1",
857 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
858 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
859 | },
860 | "get-intrinsic": {
861 | "version": "1.1.1",
862 | "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz",
863 | "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==",
864 | "requires": {
865 | "function-bind": "^1.1.1",
866 | "has": "^1.0.3",
867 | "has-symbols": "^1.0.1"
868 | }
869 | },
870 | "graphql": {
871 | "version": "15.5.0",
872 | "resolved": "https://registry.npmjs.org/graphql/-/graphql-15.5.0.tgz",
873 | "integrity": "sha512-OmaM7y0kaK31NKG31q4YbD2beNYa6jBBKtMFT6gLYJljHLJr42IqJ8KX08u3Li/0ifzTU5HjmoOOrwa5BRLeDA=="
874 | },
875 | "graphql-extensions": {
876 | "version": "0.12.8",
877 | "resolved": "https://registry.npmjs.org/graphql-extensions/-/graphql-extensions-0.12.8.tgz",
878 | "integrity": "sha512-xjsSaB6yKt9jarFNNdivl2VOx52WySYhxPgf8Y16g6GKZyAzBoIFiwyGw5PJDlOSUa6cpmzn6o7z8fVMbSAbkg==",
879 | "requires": {
880 | "@apollographql/apollo-tools": "^0.4.3",
881 | "apollo-server-env": "^3.0.0",
882 | "apollo-server-types": "^0.6.3"
883 | }
884 | },
885 | "graphql-subscriptions": {
886 | "version": "1.2.0",
887 | "resolved": "https://registry.npmjs.org/graphql-subscriptions/-/graphql-subscriptions-1.2.0.tgz",
888 | "integrity": "sha512-uXvp729fztqwa7HFUFaAqKwNMwwOfsvu4HwOu7/35Cd44bNrMPCn97mNGN0ybuuZE36CPXBTaW/4U/xyOS4D9w==",
889 | "requires": {
890 | "iterall": "^1.3.0"
891 | }
892 | },
893 | "graphql-tag": {
894 | "version": "2.11.0",
895 | "resolved": "https://registry.npmjs.org/graphql-tag/-/graphql-tag-2.11.0.tgz",
896 | "integrity": "sha512-VmsD5pJqWJnQZMUeRwrDhfgoyqcfwEkvtpANqcoUG8/tOLkwNgU9mzub/Mc78OJMhHjx7gfAMTxzdG43VGg3bA=="
897 | },
898 | "graphql-tools": {
899 | "version": "4.0.8",
900 | "resolved": "https://registry.npmjs.org/graphql-tools/-/graphql-tools-4.0.8.tgz",
901 | "integrity": "sha512-MW+ioleBrwhRjalKjYaLQbr+920pHBgy9vM/n47sswtns8+96sRn5M/G+J1eu7IMeKWiN/9p6tmwCHU7552VJg==",
902 | "requires": {
903 | "apollo-link": "^1.2.14",
904 | "apollo-utilities": "^1.0.1",
905 | "deprecated-decorator": "^0.1.6",
906 | "iterall": "^1.1.3",
907 | "uuid": "^3.1.0"
908 | },
909 | "dependencies": {
910 | "uuid": {
911 | "version": "3.4.0",
912 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz",
913 | "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A=="
914 | }
915 | }
916 | },
917 | "has": {
918 | "version": "1.0.3",
919 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
920 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
921 | "requires": {
922 | "function-bind": "^1.1.1"
923 | }
924 | },
925 | "has-symbols": {
926 | "version": "1.0.1",
927 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz",
928 | "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg=="
929 | },
930 | "http-errors": {
931 | "version": "1.8.0",
932 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.0.tgz",
933 | "integrity": "sha512-4I8r0C5JDhT5VkvI47QktDW75rNlGVsUf/8hzjCC/wkWI/jdTRmBb9aI7erSG82r1bjKY3F6k28WnsVxB1C73A==",
934 | "requires": {
935 | "depd": "~1.1.2",
936 | "inherits": "2.0.4",
937 | "setprototypeof": "1.2.0",
938 | "statuses": ">= 1.5.0 < 2",
939 | "toidentifier": "1.0.0"
940 | }
941 | },
942 | "iconv-lite": {
943 | "version": "0.4.24",
944 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
945 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
946 | "requires": {
947 | "safer-buffer": ">= 2.1.2 < 3"
948 | }
949 | },
950 | "inherits": {
951 | "version": "2.0.4",
952 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
953 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
954 | },
955 | "ipaddr.js": {
956 | "version": "1.9.1",
957 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
958 | "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g=="
959 | },
960 | "is-callable": {
961 | "version": "1.2.3",
962 | "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.3.tgz",
963 | "integrity": "sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ=="
964 | },
965 | "is-date-object": {
966 | "version": "1.0.2",
967 | "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz",
968 | "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g=="
969 | },
970 | "is-negative-zero": {
971 | "version": "2.0.1",
972 | "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz",
973 | "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w=="
974 | },
975 | "is-regex": {
976 | "version": "1.1.2",
977 | "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.2.tgz",
978 | "integrity": "sha512-axvdhb5pdhEVThqJzYXwMlVuZwC+FF2DpcOhTS+y/8jVq4trxyPgfcwIxIKiyeuLlSQYKkmUaPQJ8ZE4yNKXDg==",
979 | "requires": {
980 | "call-bind": "^1.0.2",
981 | "has-symbols": "^1.0.1"
982 | }
983 | },
984 | "is-symbol": {
985 | "version": "1.0.3",
986 | "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz",
987 | "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==",
988 | "requires": {
989 | "has-symbols": "^1.0.1"
990 | }
991 | },
992 | "iterall": {
993 | "version": "1.3.0",
994 | "resolved": "https://registry.npmjs.org/iterall/-/iterall-1.3.0.tgz",
995 | "integrity": "sha512-QZ9qOMdF+QLHxy1QIpUHUU1D5pS2CG2P69LF6L6CPjPYA/XMOmKV3PZpawHoAjHNyB0swdVTRxdYT4tbBbxqwg=="
996 | },
997 | "lodash.sortby": {
998 | "version": "4.7.0",
999 | "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz",
1000 | "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg="
1001 | },
1002 | "loglevel": {
1003 | "version": "1.7.1",
1004 | "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.7.1.tgz",
1005 | "integrity": "sha512-Hesni4s5UkWkwCGJMQGAh71PaLUmKFM60dHvq0zi/vDhhrzuk+4GgNbTXJ12YYQJn6ZKBDNIjYcuQGKudvqrIw=="
1006 | },
1007 | "long": {
1008 | "version": "4.0.0",
1009 | "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz",
1010 | "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA=="
1011 | },
1012 | "lru-cache": {
1013 | "version": "6.0.0",
1014 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
1015 | "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
1016 | "requires": {
1017 | "yallist": "^4.0.0"
1018 | }
1019 | },
1020 | "media-typer": {
1021 | "version": "0.3.0",
1022 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
1023 | "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g="
1024 | },
1025 | "merge-descriptors": {
1026 | "version": "1.0.1",
1027 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
1028 | "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E="
1029 | },
1030 | "methods": {
1031 | "version": "1.1.2",
1032 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
1033 | "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4="
1034 | },
1035 | "mime": {
1036 | "version": "1.6.0",
1037 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
1038 | "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg=="
1039 | },
1040 | "mime-db": {
1041 | "version": "1.46.0",
1042 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.46.0.tgz",
1043 | "integrity": "sha512-svXaP8UQRZ5K7or+ZmfNhg2xX3yKDMUzqadsSqi4NCH/KomcH75MAMYAGVlvXn4+b/xOPhS3I2uHKRUzvjY7BQ=="
1044 | },
1045 | "mime-types": {
1046 | "version": "2.1.29",
1047 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.29.tgz",
1048 | "integrity": "sha512-Y/jMt/S5sR9OaqteJtslsFZKWOIIqMACsJSiHghlCAyhf7jfVYjKBmLiX8OgpWeW+fjJ2b+Az69aPFPkUOY6xQ==",
1049 | "requires": {
1050 | "mime-db": "1.46.0"
1051 | }
1052 | },
1053 | "ms": {
1054 | "version": "2.0.0",
1055 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
1056 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
1057 | },
1058 | "negotiator": {
1059 | "version": "0.6.2",
1060 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz",
1061 | "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw=="
1062 | },
1063 | "node-fetch": {
1064 | "version": "2.6.1",
1065 | "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz",
1066 | "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw=="
1067 | },
1068 | "object-assign": {
1069 | "version": "4.1.1",
1070 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
1071 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM="
1072 | },
1073 | "object-inspect": {
1074 | "version": "1.9.0",
1075 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.9.0.tgz",
1076 | "integrity": "sha512-i3Bp9iTqwhaLZBxGkRfo5ZbE07BQRT7MGu8+nNgwW9ItGp1TzCTw2DLEoWwjClxBjOFI/hWljTAmYGCEwmtnOw=="
1077 | },
1078 | "object-keys": {
1079 | "version": "1.1.1",
1080 | "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
1081 | "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA=="
1082 | },
1083 | "object-path": {
1084 | "version": "0.11.5",
1085 | "resolved": "https://registry.npmjs.org/object-path/-/object-path-0.11.5.tgz",
1086 | "integrity": "sha512-jgSbThcoR/s+XumvGMTMf81QVBmah+/Q7K7YduKeKVWL7N111unR2d6pZZarSk6kY/caeNxUDyxOvMWyzoU2eg=="
1087 | },
1088 | "object.assign": {
1089 | "version": "4.1.2",
1090 | "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz",
1091 | "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==",
1092 | "requires": {
1093 | "call-bind": "^1.0.0",
1094 | "define-properties": "^1.1.3",
1095 | "has-symbols": "^1.0.1",
1096 | "object-keys": "^1.1.1"
1097 | }
1098 | },
1099 | "object.getownpropertydescriptors": {
1100 | "version": "2.1.1",
1101 | "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.1.tgz",
1102 | "integrity": "sha512-6DtXgZ/lIZ9hqx4GtZETobXLR/ZLaa0aqV0kzbn80Rf8Z2e/XFnhA0I7p07N2wH8bBBltr2xQPi6sbKWAY2Eng==",
1103 | "requires": {
1104 | "call-bind": "^1.0.0",
1105 | "define-properties": "^1.1.3",
1106 | "es-abstract": "^1.18.0-next.1"
1107 | }
1108 | },
1109 | "on-finished": {
1110 | "version": "2.3.0",
1111 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
1112 | "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=",
1113 | "requires": {
1114 | "ee-first": "1.1.1"
1115 | }
1116 | },
1117 | "parseurl": {
1118 | "version": "1.3.3",
1119 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
1120 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ=="
1121 | },
1122 | "path-to-regexp": {
1123 | "version": "0.1.7",
1124 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
1125 | "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w="
1126 | },
1127 | "proxy-addr": {
1128 | "version": "2.0.6",
1129 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz",
1130 | "integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==",
1131 | "requires": {
1132 | "forwarded": "~0.1.2",
1133 | "ipaddr.js": "1.9.1"
1134 | }
1135 | },
1136 | "qs": {
1137 | "version": "6.7.0",
1138 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz",
1139 | "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ=="
1140 | },
1141 | "range-parser": {
1142 | "version": "1.2.1",
1143 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
1144 | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg=="
1145 | },
1146 | "raw-body": {
1147 | "version": "2.4.0",
1148 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz",
1149 | "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==",
1150 | "requires": {
1151 | "bytes": "3.1.0",
1152 | "http-errors": "1.7.2",
1153 | "iconv-lite": "0.4.24",
1154 | "unpipe": "1.0.0"
1155 | },
1156 | "dependencies": {
1157 | "http-errors": {
1158 | "version": "1.7.2",
1159 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz",
1160 | "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==",
1161 | "requires": {
1162 | "depd": "~1.1.2",
1163 | "inherits": "2.0.3",
1164 | "setprototypeof": "1.1.1",
1165 | "statuses": ">= 1.5.0 < 2",
1166 | "toidentifier": "1.0.0"
1167 | }
1168 | },
1169 | "inherits": {
1170 | "version": "2.0.3",
1171 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
1172 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
1173 | },
1174 | "setprototypeof": {
1175 | "version": "1.1.1",
1176 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz",
1177 | "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw=="
1178 | }
1179 | }
1180 | },
1181 | "retry": {
1182 | "version": "0.12.0",
1183 | "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz",
1184 | "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs="
1185 | },
1186 | "safe-buffer": {
1187 | "version": "5.2.1",
1188 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
1189 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="
1190 | },
1191 | "safer-buffer": {
1192 | "version": "2.1.2",
1193 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
1194 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
1195 | },
1196 | "send": {
1197 | "version": "0.17.1",
1198 | "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz",
1199 | "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==",
1200 | "requires": {
1201 | "debug": "2.6.9",
1202 | "depd": "~1.1.2",
1203 | "destroy": "~1.0.4",
1204 | "encodeurl": "~1.0.2",
1205 | "escape-html": "~1.0.3",
1206 | "etag": "~1.8.1",
1207 | "fresh": "0.5.2",
1208 | "http-errors": "~1.7.2",
1209 | "mime": "1.6.0",
1210 | "ms": "2.1.1",
1211 | "on-finished": "~2.3.0",
1212 | "range-parser": "~1.2.1",
1213 | "statuses": "~1.5.0"
1214 | },
1215 | "dependencies": {
1216 | "http-errors": {
1217 | "version": "1.7.3",
1218 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.3.tgz",
1219 | "integrity": "sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==",
1220 | "requires": {
1221 | "depd": "~1.1.2",
1222 | "inherits": "2.0.4",
1223 | "setprototypeof": "1.1.1",
1224 | "statuses": ">= 1.5.0 < 2",
1225 | "toidentifier": "1.0.0"
1226 | }
1227 | },
1228 | "ms": {
1229 | "version": "2.1.1",
1230 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
1231 | "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg=="
1232 | },
1233 | "setprototypeof": {
1234 | "version": "1.1.1",
1235 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz",
1236 | "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw=="
1237 | }
1238 | }
1239 | },
1240 | "serve-static": {
1241 | "version": "1.14.1",
1242 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz",
1243 | "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==",
1244 | "requires": {
1245 | "encodeurl": "~1.0.2",
1246 | "escape-html": "~1.0.3",
1247 | "parseurl": "~1.3.3",
1248 | "send": "0.17.1"
1249 | }
1250 | },
1251 | "setprototypeof": {
1252 | "version": "1.2.0",
1253 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
1254 | "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="
1255 | },
1256 | "sha.js": {
1257 | "version": "2.4.11",
1258 | "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz",
1259 | "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==",
1260 | "requires": {
1261 | "inherits": "^2.0.1",
1262 | "safe-buffer": "^5.0.1"
1263 | }
1264 | },
1265 | "statuses": {
1266 | "version": "1.5.0",
1267 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
1268 | "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow="
1269 | },
1270 | "stoppable": {
1271 | "version": "1.1.0",
1272 | "resolved": "https://registry.npmjs.org/stoppable/-/stoppable-1.1.0.tgz",
1273 | "integrity": "sha512-KXDYZ9dszj6bzvnEMRYvxgeTHU74QBFL54XKtP3nyMuJ81CFYtABZ3bAzL2EdFUaEwJOBOgENyFj3R7oTzDyyw=="
1274 | },
1275 | "streamsearch": {
1276 | "version": "0.1.2",
1277 | "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-0.1.2.tgz",
1278 | "integrity": "sha1-gIudDlb8Jz2Am6VzOOkpkZoanxo="
1279 | },
1280 | "string.prototype.trimend": {
1281 | "version": "1.0.3",
1282 | "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.3.tgz",
1283 | "integrity": "sha512-ayH0pB+uf0U28CtjlLvL7NaohvR1amUvVZk+y3DYb0Ey2PUV5zPkkKy9+U1ndVEIXO8hNg18eIv9Jntbii+dKw==",
1284 | "requires": {
1285 | "call-bind": "^1.0.0",
1286 | "define-properties": "^1.1.3"
1287 | }
1288 | },
1289 | "string.prototype.trimstart": {
1290 | "version": "1.0.3",
1291 | "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.3.tgz",
1292 | "integrity": "sha512-oBIBUy5lea5tt0ovtOFiEQaBkoBBkyJhZXzJYrSmDo5IUUqbOPvVezuRs/agBIdZ2p2Eo1FD6bD9USyBLfl3xg==",
1293 | "requires": {
1294 | "call-bind": "^1.0.0",
1295 | "define-properties": "^1.1.3"
1296 | }
1297 | },
1298 | "subscriptions-transport-ws": {
1299 | "version": "0.9.18",
1300 | "resolved": "https://registry.npmjs.org/subscriptions-transport-ws/-/subscriptions-transport-ws-0.9.18.tgz",
1301 | "integrity": "sha512-tztzcBTNoEbuErsVQpTN2xUNN/efAZXyCyL5m3x4t6SKrEiTL2N8SaKWBFWM4u56pL79ULif3zjyeq+oV+nOaA==",
1302 | "requires": {
1303 | "backo2": "^1.0.2",
1304 | "eventemitter3": "^3.1.0",
1305 | "iterall": "^1.2.1",
1306 | "symbol-observable": "^1.0.4",
1307 | "ws": "^5.2.0"
1308 | },
1309 | "dependencies": {
1310 | "ws": {
1311 | "version": "5.2.2",
1312 | "resolved": "https://registry.npmjs.org/ws/-/ws-5.2.2.tgz",
1313 | "integrity": "sha512-jaHFD6PFv6UgoIVda6qZllptQsMlDEJkTQcybzzXDYM1XO9Y8em691FGMPmM46WGyLU4z9KMgQN+qrux/nhlHA==",
1314 | "requires": {
1315 | "async-limiter": "~1.0.0"
1316 | }
1317 | }
1318 | }
1319 | },
1320 | "symbol-observable": {
1321 | "version": "1.2.0",
1322 | "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz",
1323 | "integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ=="
1324 | },
1325 | "toidentifier": {
1326 | "version": "1.0.0",
1327 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz",
1328 | "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw=="
1329 | },
1330 | "ts-invariant": {
1331 | "version": "0.4.4",
1332 | "resolved": "https://registry.npmjs.org/ts-invariant/-/ts-invariant-0.4.4.tgz",
1333 | "integrity": "sha512-uEtWkFM/sdZvRNNDL3Ehu4WVpwaulhwQszV8mrtcdeE8nN00BV9mAmQ88RkrBhFgl9gMgvjJLAQcZbnPXI9mlA==",
1334 | "requires": {
1335 | "tslib": "^1.9.3"
1336 | }
1337 | },
1338 | "tslib": {
1339 | "version": "1.14.1",
1340 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
1341 | "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="
1342 | },
1343 | "type-is": {
1344 | "version": "1.6.18",
1345 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
1346 | "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
1347 | "requires": {
1348 | "media-typer": "0.3.0",
1349 | "mime-types": "~2.1.24"
1350 | }
1351 | },
1352 | "unpipe": {
1353 | "version": "1.0.0",
1354 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
1355 | "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw="
1356 | },
1357 | "util.promisify": {
1358 | "version": "1.1.1",
1359 | "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.1.1.tgz",
1360 | "integrity": "sha512-/s3UsZUrIfa6xDhr7zZhnE9SLQ5RIXyYfiVnMMyMDzOc8WhWN4Nbh36H842OyurKbCDAesZOJaVyvmSl6fhGQw==",
1361 | "requires": {
1362 | "call-bind": "^1.0.0",
1363 | "define-properties": "^1.1.3",
1364 | "for-each": "^0.3.3",
1365 | "has-symbols": "^1.0.1",
1366 | "object.getownpropertydescriptors": "^2.1.1"
1367 | }
1368 | },
1369 | "utils-merge": {
1370 | "version": "1.0.1",
1371 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
1372 | "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM="
1373 | },
1374 | "uuid": {
1375 | "version": "8.3.2",
1376 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
1377 | "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg=="
1378 | },
1379 | "vary": {
1380 | "version": "1.1.2",
1381 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
1382 | "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw="
1383 | },
1384 | "ws": {
1385 | "version": "6.2.1",
1386 | "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz",
1387 | "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==",
1388 | "requires": {
1389 | "async-limiter": "~1.0.0"
1390 | }
1391 | },
1392 | "xss": {
1393 | "version": "1.0.8",
1394 | "resolved": "https://registry.npmjs.org/xss/-/xss-1.0.8.tgz",
1395 | "integrity": "sha512-3MgPdaXV8rfQ/pNn16Eio6VXYPTkqwa0vc7GkiymmY/DqR1SE/7VPAAVZz1GJsJFrllMYO3RHfEaiUGjab6TNw==",
1396 | "requires": {
1397 | "commander": "^2.20.3",
1398 | "cssfilter": "0.0.10"
1399 | }
1400 | },
1401 | "yallist": {
1402 | "version": "4.0.0",
1403 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
1404 | "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
1405 | },
1406 | "zen-observable": {
1407 | "version": "0.8.15",
1408 | "resolved": "https://registry.npmjs.org/zen-observable/-/zen-observable-0.8.15.tgz",
1409 | "integrity": "sha512-PQ2PC7R9rslx84ndNBZB/Dkv8V8fZEpk83RLgXtYd0fwUgEjseMn1Dgajh2x6S8QbZAFa9p2qVCEuYZNgve0dQ=="
1410 | },
1411 | "zen-observable-ts": {
1412 | "version": "0.8.21",
1413 | "resolved": "https://registry.npmjs.org/zen-observable-ts/-/zen-observable-ts-0.8.21.tgz",
1414 | "integrity": "sha512-Yj3yXweRc8LdRMrCC8nIc4kkjWecPAUVh0TI0OUrWXx6aX790vLcDlWca6I4vsyCGH3LpWxq0dJRcMOFoVqmeg==",
1415 | "requires": {
1416 | "tslib": "^1.9.3",
1417 | "zen-observable": "^0.8.0"
1418 | }
1419 | }
1420 | }
1421 | }
1422 |
--------------------------------------------------------------------------------
/final/server/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "server",
3 | "version": "1.0.0",
4 | "description": "",
5 | "main": "index.js",
6 | "scripts": {
7 | "start": "nodemon index.js"
8 | },
9 | "keywords": [],
10 | "author": "",
11 | "license": "ISC",
12 | "dependencies": {
13 | "apollo-server": "^2.21.0",
14 | "graphql": "^15.5.0",
15 | "uuid": "^8.3.2"
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/final/server/resolvers/Animal.js:
--------------------------------------------------------------------------------
1 | const Animal = {
2 | category: (parent, args, { categories }) => {
3 | return categories.find((category) => {
4 | return category.id === parent.category
5 | })
6 | }
7 | }
8 |
9 | module.exports = Animal
--------------------------------------------------------------------------------
/final/server/resolvers/Category.js:
--------------------------------------------------------------------------------
1 |
2 | const Category = {
3 | animals: (parent, args, { animals }) => {
4 | return animals.filter(animal => {
5 | return animal.category === parent.id
6 | })
7 | }
8 | }
9 |
10 | module.exports = Category
--------------------------------------------------------------------------------
/final/server/resolvers/Mutation.js:
--------------------------------------------------------------------------------
1 | const { v4 } = require("uuid")
2 |
3 | const Mutation = {
4 | addAnimal: (parent, {image, title, rating, price, description, slug, stock, onSale, category}, {animals}) => {
5 | let newAnimal = {
6 | id: v4(),
7 | image,
8 | title,
9 | rating,
10 | price,
11 | description,
12 | slug,
13 | stock,
14 | onSale,
15 | category,
16 | }
17 |
18 | animals.push(newAnimal)
19 |
20 | return newAnimal
21 | },
22 |
23 | removeAnimal: (parent, { id }, { animals }) => {
24 | let index = animals.findIndex((animal) => {
25 | return animal.id === id
26 | });
27 |
28 | animals.splice(index, 1);
29 |
30 | return true
31 | }
32 | }
33 |
34 | module.exports = Mutation
35 |
36 | // type Animal {
37 | // id: ID!
38 | // image: String!
39 | // title: String!
40 | // rating: Float
41 | // price: String!
42 | // description: [String!]!
43 | // slug: String!
44 | // stock: Int!
45 | // onSale: Boolean
46 | // category: Category
47 | // }
--------------------------------------------------------------------------------
/final/server/resolvers/Query.js:
--------------------------------------------------------------------------------
1 | const Query = {
2 | mainCards: (parent, args, { mainCards }) => mainCards,
3 | animals: (parent, args, { animals }) => animals,
4 | animal: (parent, args, { animals }) => {
5 | let animal = animals.find((animal) => {
6 | return animal.slug === args.slug
7 | })
8 | return animal
9 | },
10 | categories: (parent, args, { categories }) => categories,
11 | category: (parent, args, { categories }) => {
12 | let category = categories.find((category) => {
13 | return category.slug === args.slug
14 | });
15 | return category;
16 | }
17 | }
18 |
19 | module.exports = Query
20 |
21 |
--------------------------------------------------------------------------------
/final/server/schema.js:
--------------------------------------------------------------------------------
1 | const { gql } = require('apollo-server');
2 |
3 | const typeDefs = gql`
4 |
5 | type MainCard {
6 | title: String!
7 | image: String!
8 | }
9 |
10 | type Animal {
11 | id: ID!
12 | image: String!
13 | title: String!
14 | rating: Float
15 | price: String!
16 | description: [String!]!
17 | slug: String!
18 | stock: Int!
19 | onSale: Boolean
20 | category: Category
21 | }
22 |
23 | type Category {
24 | id: ID!
25 | image: String!
26 | category: String!
27 | slug: String!
28 | animals: [Animal!]!
29 | }
30 |
31 | type Query {
32 | mainCards: [MainCard]
33 | animals: [Animal!]!
34 | animal(slug: String!): Animal
35 | categories: [Category!]!
36 | category(slug: String!): Category
37 | }
38 |
39 | type Mutation {
40 | addAnimal(
41 | image: String!
42 | title: String!
43 | rating: Float
44 | price: String!
45 | description: [String!]!
46 | slug: String!
47 | stock: Int!
48 | onSale: Boolean
49 | category: String!
50 | ): Animal
51 | removeAnimal(id: ID!): Boolean!
52 | }
53 |
54 | `;
55 |
56 | module.exports = typeDefs
--------------------------------------------------------------------------------
/start/.DS_Store:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/harblaith7/GraphQL-Crash-Course/a02b725969b689d59b85262aa04572d817ca0a38/start/.DS_Store
--------------------------------------------------------------------------------
/start/client/.gitignore:
--------------------------------------------------------------------------------
1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
2 |
3 | # dependencies
4 | /node_modules
5 | /.pnp
6 | .pnp.js
7 |
8 | # testing
9 | /coverage
10 |
11 | # production
12 | /build
13 |
14 | # misc
15 | .DS_Store
16 | .env.local
17 | .env.development.local
18 | .env.test.local
19 | .env.production.local
20 |
21 | npm-debug.log*
22 | yarn-debug.log*
23 | yarn-error.log*
24 |
--------------------------------------------------------------------------------
/start/client/README.md:
--------------------------------------------------------------------------------
1 | # Getting Started with Create React App
2 |
3 | This project was bootstrapped with [Create React App](https://github.com/facebook/create-react-app).
4 |
5 | ## Available Scripts
6 |
7 | In the project directory, you can run:
8 |
9 | ### `yarn start`
10 |
11 | Runs the app in the development mode.\
12 | Open [http://localhost:3000](http://localhost:3000) to view it in the browser.
13 |
14 | The page will reload if you make edits.\
15 | You will also see any lint errors in the console.
16 |
17 | ### `yarn test`
18 |
19 | Launches the test runner in the interactive watch mode.\
20 | See the section about [running tests](https://facebook.github.io/create-react-app/docs/running-tests) for more information.
21 |
22 | ### `yarn build`
23 |
24 | Builds the app for production to the `build` folder.\
25 | It correctly bundles React in production mode and optimizes the build for the best performance.
26 |
27 | The build is minified and the filenames include the hashes.\
28 | Your app is ready to be deployed!
29 |
30 | See the section about [deployment](https://facebook.github.io/create-react-app/docs/deployment) for more information.
31 |
32 | ### `yarn eject`
33 |
34 | **Note: this is a one-way operation. Once you `eject`, you can’t go back!**
35 |
36 | If you aren’t satisfied with the build tool and configuration choices, you can `eject` at any time. This command will remove the single build dependency from your project.
37 |
38 | Instead, it will copy all the configuration files and the transitive dependencies (webpack, Babel, ESLint, etc) right into your project so you have full control over them. All of the commands except `eject` will still work, but they will point to the copied scripts so you can tweak them. At this point you’re on your own.
39 |
40 | You don’t have to ever use `eject`. The curated feature set is suitable for small and middle deployments, and you shouldn’t feel obligated to use this feature. However we understand that this tool wouldn’t be useful if you couldn’t customize it when you are ready for it.
41 |
42 | ## Learn More
43 |
44 | You can learn more in the [Create React App documentation](https://facebook.github.io/create-react-app/docs/getting-started).
45 |
46 | To learn React, check out the [React documentation](https://reactjs.org/).
47 |
48 | ### Code Splitting
49 |
50 | This section has moved here: [https://facebook.github.io/create-react-app/docs/code-splitting](https://facebook.github.io/create-react-app/docs/code-splitting)
51 |
52 | ### Analyzing the Bundle Size
53 |
54 | This section has moved here: [https://facebook.github.io/create-react-app/docs/analyzing-the-bundle-size](https://facebook.github.io/create-react-app/docs/analyzing-the-bundle-size)
55 |
56 | ### Making a Progressive Web App
57 |
58 | This section has moved here: [https://facebook.github.io/create-react-app/docs/making-a-progressive-web-app](https://facebook.github.io/create-react-app/docs/making-a-progressive-web-app)
59 |
60 | ### Advanced Configuration
61 |
62 | This section has moved here: [https://facebook.github.io/create-react-app/docs/advanced-configuration](https://facebook.github.io/create-react-app/docs/advanced-configuration)
63 |
64 | ### Deployment
65 |
66 | This section has moved here: [https://facebook.github.io/create-react-app/docs/deployment](https://facebook.github.io/create-react-app/docs/deployment)
67 |
68 | ### `yarn build` fails to minify
69 |
70 | This section has moved here: [https://facebook.github.io/create-react-app/docs/troubleshooting#npm-run-build-fails-to-minify](https://facebook.github.io/create-react-app/docs/troubleshooting#npm-run-build-fails-to-minify)
71 |
--------------------------------------------------------------------------------
/start/client/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "client",
3 | "version": "0.1.0",
4 | "private": true,
5 | "dependencies": {
6 | "@apollo/client": "^3.3.10",
7 | "@testing-library/jest-dom": "^5.11.4",
8 | "@testing-library/react": "^11.1.0",
9 | "@testing-library/user-event": "^12.1.10",
10 | "bootstrap": "^4.6.0",
11 | "graphql": "^15.5.0",
12 | "react": "^17.0.1",
13 | "react-bootstrap": "^1.4.3",
14 | "react-dom": "^17.0.1",
15 | "react-router-dom": "^5.2.0",
16 | "react-scripts": "4.0.2",
17 | "reactstrap": "^8.9.0",
18 | "web-vitals": "^1.0.1"
19 | },
20 | "scripts": {
21 | "start": "react-scripts start",
22 | "build": "react-scripts build",
23 | "test": "react-scripts test",
24 | "eject": "react-scripts eject"
25 | },
26 | "eslintConfig": {
27 | "extends": [
28 | "react-app",
29 | "react-app/jest"
30 | ]
31 | },
32 | "browserslist": {
33 | "production": [
34 | ">0.2%",
35 | "not dead",
36 | "not op_mini all"
37 | ],
38 | "development": [
39 | "last 1 chrome version",
40 | "last 1 firefox version",
41 | "last 1 safari version"
42 | ]
43 | }
44 | }
45 |
--------------------------------------------------------------------------------
/start/client/public/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/harblaith7/GraphQL-Crash-Course/a02b725969b689d59b85262aa04572d817ca0a38/start/client/public/favicon.ico
--------------------------------------------------------------------------------
/start/client/public/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
17 |
18 |
22 |
23 |
32 | Animazon
33 |
34 |
35 |
36 |
37 |
47 |
48 |
49 |
--------------------------------------------------------------------------------
/start/client/public/logo192.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/harblaith7/GraphQL-Crash-Course/a02b725969b689d59b85262aa04572d817ca0a38/start/client/public/logo192.png
--------------------------------------------------------------------------------
/start/client/public/logo512.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/harblaith7/GraphQL-Crash-Course/a02b725969b689d59b85262aa04572d817ca0a38/start/client/public/logo512.png
--------------------------------------------------------------------------------
/start/client/public/manifest.json:
--------------------------------------------------------------------------------
1 | {
2 | "short_name": "React App",
3 | "name": "Create React App Sample",
4 | "icons": [
5 | {
6 | "src": "favicon.ico",
7 | "sizes": "64x64 32x32 24x24 16x16",
8 | "type": "image/x-icon"
9 | },
10 | {
11 | "src": "logo192.png",
12 | "type": "image/png",
13 | "sizes": "192x192"
14 | },
15 | {
16 | "src": "logo512.png",
17 | "type": "image/png",
18 | "sizes": "512x512"
19 | }
20 | ],
21 | "start_url": ".",
22 | "display": "standalone",
23 | "theme_color": "#000000",
24 | "background_color": "#ffffff"
25 | }
26 |
--------------------------------------------------------------------------------
/start/client/public/robots.txt:
--------------------------------------------------------------------------------
1 | # https://www.robotstxt.org/robotstxt.html
2 | User-agent: *
3 | Disallow:
4 |
--------------------------------------------------------------------------------
/start/client/src/App.css:
--------------------------------------------------------------------------------
1 | * {
2 | padding: 0;
3 | margin: 0;
4 | box-sizing: border-box;
5 | font-family: "Lato";
6 | }
7 |
--------------------------------------------------------------------------------
/start/client/src/App.js:
--------------------------------------------------------------------------------
1 | import logo from './logo.svg';
2 | import './App.css';
3 | import Nav from './components/Nav/Nav';
4 | import { Switch, Route, BrowserRouter } from "react-router-dom"
5 | import LandingPage from './pages/LandingPage';
6 | import CategoryPage from './pages/CategoryPage';
7 | import AnimalPage from './pages/AnimalPage/AnimalPage';
8 |
9 | function App() {
10 | return (
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 | );
22 | }
23 |
24 | export default App;
25 |
--------------------------------------------------------------------------------
/start/client/src/App.test.js:
--------------------------------------------------------------------------------
1 | import { render, screen } from '@testing-library/react';
2 | import App from './App';
3 |
4 | test('renders learn react link', () => {
5 | render();
6 | const linkElement = screen.getByText(/learn react/i);
7 | expect(linkElement).toBeInTheDocument();
8 | });
9 |
--------------------------------------------------------------------------------
/start/client/src/assets/image/cat.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/harblaith7/GraphQL-Crash-Course/a02b725969b689d59b85262aa04572d817ca0a38/start/client/src/assets/image/cat.jpg
--------------------------------------------------------------------------------
/start/client/src/assets/image/cham.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/harblaith7/GraphQL-Crash-Course/a02b725969b689d59b85262aa04572d817ca0a38/start/client/src/assets/image/cham.jpg
--------------------------------------------------------------------------------
/start/client/src/assets/image/dockey.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/harblaith7/GraphQL-Crash-Course/a02b725969b689d59b85262aa04572d817ca0a38/start/client/src/assets/image/dockey.jpg
--------------------------------------------------------------------------------
/start/client/src/assets/image/dolphin.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/harblaith7/GraphQL-Crash-Course/a02b725969b689d59b85262aa04572d817ca0a38/start/client/src/assets/image/dolphin.jpg
--------------------------------------------------------------------------------
/start/client/src/assets/image/ele.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/harblaith7/GraphQL-Crash-Course/a02b725969b689d59b85262aa04572d817ca0a38/start/client/src/assets/image/ele.jpg
--------------------------------------------------------------------------------
/start/client/src/assets/image/gorilla.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/harblaith7/GraphQL-Crash-Course/a02b725969b689d59b85262aa04572d817ca0a38/start/client/src/assets/image/gorilla.jpg
--------------------------------------------------------------------------------
/start/client/src/assets/image/horse.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/harblaith7/GraphQL-Crash-Course/a02b725969b689d59b85262aa04572d817ca0a38/start/client/src/assets/image/horse.jpg
--------------------------------------------------------------------------------
/start/client/src/assets/image/kang.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/harblaith7/GraphQL-Crash-Course/a02b725969b689d59b85262aa04572d817ca0a38/start/client/src/assets/image/kang.jpg
--------------------------------------------------------------------------------
/start/client/src/assets/image/lion.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/harblaith7/GraphQL-Crash-Course/a02b725969b689d59b85262aa04572d817ca0a38/start/client/src/assets/image/lion.png
--------------------------------------------------------------------------------
/start/client/src/assets/image/lion2.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/harblaith7/GraphQL-Crash-Course/a02b725969b689d59b85262aa04572d817ca0a38/start/client/src/assets/image/lion2.jpg
--------------------------------------------------------------------------------
/start/client/src/assets/image/ostrich.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/harblaith7/GraphQL-Crash-Course/a02b725969b689d59b85262aa04572d817ca0a38/start/client/src/assets/image/ostrich.jpg
--------------------------------------------------------------------------------
/start/client/src/assets/image/penguin.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/harblaith7/GraphQL-Crash-Course/a02b725969b689d59b85262aa04572d817ca0a38/start/client/src/assets/image/penguin.png
--------------------------------------------------------------------------------
/start/client/src/assets/image/penguin2.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/harblaith7/GraphQL-Crash-Course/a02b725969b689d59b85262aa04572d817ca0a38/start/client/src/assets/image/penguin2.jpg
--------------------------------------------------------------------------------
/start/client/src/assets/image/rhino.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/harblaith7/GraphQL-Crash-Course/a02b725969b689d59b85262aa04572d817ca0a38/start/client/src/assets/image/rhino.png
--------------------------------------------------------------------------------
/start/client/src/assets/image/snake.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/harblaith7/GraphQL-Crash-Course/a02b725969b689d59b85262aa04572d817ca0a38/start/client/src/assets/image/snake.jpeg
--------------------------------------------------------------------------------
/start/client/src/assets/image/stingray.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/harblaith7/GraphQL-Crash-Course/a02b725969b689d59b85262aa04572d817ca0a38/start/client/src/assets/image/stingray.jpg
--------------------------------------------------------------------------------
/start/client/src/assets/image/tiger.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/harblaith7/GraphQL-Crash-Course/a02b725969b689d59b85262aa04572d817ca0a38/start/client/src/assets/image/tiger.jpeg
--------------------------------------------------------------------------------
/start/client/src/assets/image/tiger.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/harblaith7/GraphQL-Crash-Course/a02b725969b689d59b85262aa04572d817ca0a38/start/client/src/assets/image/tiger.png
--------------------------------------------------------------------------------
/start/client/src/assets/images.js:
--------------------------------------------------------------------------------
1 | import lion from "./image/lion2.jpg"
2 | import cham from "./image/cham.jpg"
3 | import dolphin from "./image/dolphin.jpg"
4 | import gorilla from "./image/gorilla.jpg"
5 | import horse from "./image/horse.jpg"
6 | import kang from "./image/kang.jpg"
7 | import ele from "./image/ele.jpg"
8 | import donkey from "./image/dockey.jpg"
9 | import tiger from "./image/tiger.jpeg"
10 | import snake from "./image/snake.jpeg"
11 | import stingray from "./image/stingray.jpg"
12 | import ostrich from "./image/ostrich.jpg"
13 | import penguin from "./image/penguin2.jpg"
14 | import cat from "./image/cat.jpg"
15 | import rhino from "./image/rhino.png"
16 |
17 | export default {
18 | lion,
19 | cham,
20 | dolphin,
21 | gorilla,
22 | horse,
23 | kang,
24 | ele,
25 | donkey,
26 | tiger,
27 | snake,
28 | stingray,
29 | ostrich,
30 | penguin,
31 | cat,
32 | rhino
33 | }
--------------------------------------------------------------------------------
/start/client/src/assets/svg/loupe.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
44 |
--------------------------------------------------------------------------------
/start/client/src/assets/svg/s.svg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/harblaith7/GraphQL-Crash-Course/a02b725969b689d59b85262aa04572d817ca0a38/start/client/src/assets/svg/s.svg
--------------------------------------------------------------------------------
/start/client/src/assets/svg/shopping-cart.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/start/client/src/assets/svg/star.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/start/client/src/components/Card/Card.css:
--------------------------------------------------------------------------------
1 | .card-display {
2 | }
3 |
4 | .card-display-container {
5 | display: flex;
6 | justify-content: space-between;
7 | flex-wrap: wrap;
8 | }
9 |
10 | .main-img {
11 | height: 12.5rem;
12 | }
13 |
14 | .Card {
15 | width: 23%;
16 | margin-top: 2rem;
17 | cursor: pointer;
18 | color: black
19 | }
20 |
21 | .Card:hover {
22 | text-decoration: none;
23 | color: black
24 | }
25 |
26 | .Card img {
27 | width: 100%;
28 | }
29 |
30 | .Card h4 {
31 | font-size: 1rem;
32 | line-height: 1.5rem;
33 | margin-top: 0.2rem;
34 | }
35 |
36 | .card-start {
37 | margin-top: 0.2rem;
38 | display: flex;
39 | }
40 |
41 | .card-start img {
42 | width: 1.2rem;
43 | margin-right: 0.2rem;
44 | }
45 |
46 | .card-price {
47 | display: flex;
48 | margin-top: 0.5rem;
49 | }
50 |
51 | .card-price p {
52 | font-size: 0.75rem;
53 | margin-top: 0.25rem;
54 | margin-right: 0.05rem;
55 | }
56 |
57 | .card-price h4 {
58 | font-size: 1.25rem;
59 | font-weight: 400;
60 | }
61 |
62 | .card-prime {
63 | margin-top: 0.2rem;
64 | font-size: 1.25rem
65 | }
66 |
67 | .card-prime span {
68 | color: rgb(33, 145, 193);
69 | font-weight: 700;
70 | margin-right: 0.2rem;
71 | font-size: 1.25rem;
72 | }
73 |
74 | .card-prime .bold {
75 | color: black;
76 | }
77 |
--------------------------------------------------------------------------------
/start/client/src/components/Card/Card.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import lion from "../../assets/image/lion2.jpg"
3 | import "./Card.css"
4 | import star from "../../assets/svg/star.svg"
5 | import animal from "../../assets/images"
6 | import { Link } from 'react-router-dom'
7 |
8 | function Card(props) {
9 | return (
10 |
11 |
12 |
13 | {props.animal.title}
14 |
15 |
16 |

17 |

18 |

19 |

20 |

21 |
22 |
23 |
CAD $
24 |
{props.animal.price}
25 |
26 |
27 | prime FREE delivery by Tuesday, Feb 16
28 |
29 |
30 | )
31 | }
32 |
33 | export default Card
34 |
--------------------------------------------------------------------------------
/start/client/src/components/CardDisplay/CardDisplay.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import Card from '../Card/Card'
3 | import {Container} from "react-bootstrap"
4 |
5 | function CardDisplay({animals}) {
6 |
7 | return (
8 |
9 |
10 | {animals.map(animal => {
11 | return
12 | })}
13 |
14 |
15 | )
16 | }
17 |
18 | export default CardDisplay
19 |
--------------------------------------------------------------------------------
/start/client/src/components/CategoryDisplay/CategoryDisplay.css:
--------------------------------------------------------------------------------
1 | .CategoryDisplay {
2 | padding-top: 2rem
3 | }
4 | .CategoryDisplay-card {
5 | border-radius: 100%;
6 | overflow: hidden;
7 | width: 15rem;
8 | height: 15rem;
9 | padding-bottom: 2rem;
10 | }
11 |
12 | .CategoryDisplay-card-container {
13 | width: 15rem;
14 | text-align: center;
15 | }
16 |
17 | .CategoryDisplay-card img {
18 | height: 100%;
19 | width: 100%
20 | }
21 |
22 | .CategoryDisplay-card-container h3 {
23 | text-align: center;
24 | margin-top: -2rem;
25 | }
26 |
27 | .CategoryDisplay-container {
28 | display: flex;
29 | justify-content: space-between;
30 | }
--------------------------------------------------------------------------------
/start/client/src/components/CategoryDisplay/CategoryDisplay.jsx:
--------------------------------------------------------------------------------
1 | import React, { useState } from 'react'
2 | import "./CategoryDisplay.css"
3 | import { Container } from 'react-bootstrap'
4 | import animals from '../../assets/images'
5 |
6 | import { Link } from "react-router-dom"
7 |
8 |
9 | function CategoryDisplay() {
10 |
11 | return (
12 |
13 |
14 | {[].map(category => {
15 | return (
16 |
17 |
18 |

19 |
20 | {category.category}
21 |
22 | )
23 | })}
24 |
25 |
26 | )
27 | }
28 |
29 | export default CategoryDisplay
30 |
--------------------------------------------------------------------------------
/start/client/src/components/MainHero/MainHero.css:
--------------------------------------------------------------------------------
1 | .MainHero {
2 | background-color: rgb(218, 247, 255);
3 | padding-bottom: 2rem;
4 | }
5 |
6 | .header-container {
7 | padding: 3rem;
8 | text-align: center;
9 | display: flex;
10 | align-items: center;
11 | justify-content: center;
12 | }
13 |
14 | .header-container h2 {
15 | font-size: 2.75rem;
16 | margin-right: 2rem;
17 | }
18 |
19 | .header-container img {
20 | width: 15rem;
21 | }
22 |
23 | .cards-container {
24 | display: flex;
25 | justify-content: space-between;
26 | }
27 |
28 | .card {
29 | width: 32%;
30 | background-color: white;
31 | height: 25rem;
32 | padding: 1rem;
33 | padding-bottom: 6rem;
34 | }
35 |
36 | .card p {
37 | font-weight: 900;
38 | margin-top: 1rem;
39 | font-size: 0.75rem;
40 | }
41 |
42 | .card img {
43 | width: 100%;
44 | height: 100%;
45 | margin-top: 1rem;
46 | }
47 |
48 | .boxs-container {
49 | display: flex;
50 | justify-content: space-between;
51 | flex-wrap: wrap;
52 | margin-top: 0.5rem;
53 | }
54 |
55 | .box-container {
56 | background-color: rgba(238, 130, 238, 0.151);
57 | width: 49%;
58 | height: 5rem;
59 | display: flex;
60 | align-items: flex-start;
61 | justify-content: center;
62 | margin-top: 1rem;
63 | }
64 |
65 | .box-container img {
66 | width: 5rem;
67 | }
68 |
--------------------------------------------------------------------------------
/start/client/src/components/MainHero/MainHero.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import "./MainHero.css"
3 | import animals from "../../assets/images"
4 | import {Container} from "reactstrap"
5 |
6 | function MainHero() {
7 |
8 | return (
9 |
10 |
11 |
12 |
Find your
new four-legged
best friend
13 |

14 |
15 |
16 | {[].map(card => {
17 | return (
18 |
19 |
{card.title}
20 |

21 |
22 | )
23 | })}
24 |
25 |
26 |
27 | )
28 | }
29 |
30 | export default MainHero
31 |
--------------------------------------------------------------------------------
/start/client/src/components/Nav/Nav.css:
--------------------------------------------------------------------------------
1 | .Nav {
2 | background-color: rgb(19, 25, 33);
3 | height: 7.5vh;
4 | display: flex;
5 | align-items: center;
6 | padding: 0 2rem;
7 | }
8 |
9 | .nav-container {
10 | display: flex;
11 | width: 100%;
12 | align-items: center;
13 | }
14 |
15 | .header {
16 | font-family: "Poppins", sans-serif;
17 | color: white;
18 | font-size: 1.4rem;
19 | }
20 |
21 | .header span {
22 | font-size: 0.95rem;
23 | font-weight: 400;
24 | }
25 |
26 | .nav-delivery-info-container {
27 | margin-left: 2rem;
28 | font-size: 0.7rem;
29 | color: rgb(184, 181, 181);
30 | font-weight: 700;
31 | }
32 |
33 | .nav-delivery-info-container h2 {
34 | color: white;
35 | font-size: 1rem;
36 | }
37 |
38 | .nav-delivery-info-container p {
39 | margin-bottom: 0;
40 | }
41 |
42 | .nav-input-container {
43 | margin-left: 2rem;
44 | display: flex;
45 | height: 2.25rem;
46 | align-self: center;
47 | width: 75%
48 | }
49 |
50 | .nav-input-container select {
51 | height: 100%;
52 | border-radius: 0.2rem 0 0 0.2rem;
53 | padding: 0.2rem;
54 | background-color: rgb(218, 218, 218);
55 | border-color: rgba(128, 128, 128, 0.315);
56 | }
57 |
58 | .nav-input-container input {
59 | height: 100%;
60 | padding: 0.2rem;
61 | border: none;
62 | width: 100%;
63 | }
64 |
65 | .nav-input-container select:focus {
66 | outline: none;
67 | }
68 |
69 | .nav-btn {
70 | background-color: rgb(254, 189, 105);
71 | width: 3rem;
72 | border: none;
73 | border-radius: 0 0.2rem 0.2rem 0;
74 | height: 2.25rem;
75 | }
76 |
77 | .nav-btn img {
78 | width: 1.35rem;
79 | }
80 |
81 | .nav-cart-container {
82 | margin-left: 2rem;
83 | display: flex;
84 | color: white;
85 | }
86 |
87 | .nav-cart-container img {
88 | width: 2rem;
89 | }
90 | .nav-cart-container h2 {
91 | margin-top: 0.75rem;
92 | font-size: 1.25rem;
93 | margin-left: 0.25rem;
94 | }
95 |
--------------------------------------------------------------------------------
/start/client/src/components/Nav/Nav.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import "./Nav.css";
3 | import { Container } from "react-bootstrap"
4 | import search from '../../assets/svg/loupe.svg'
5 | import cart from '../../assets/svg/shopping-cart.svg'
6 |
7 | export default function Nav() {
8 | return (
9 |
10 |
11 |
animazon.com
12 |
13 |
Deliver to Laith
14 |
432 Park Avenue
15 |
16 |
17 |
20 |
21 |
24 |
25 |
26 |
Hello, Laith
27 |
Account & Lists
28 |
29 |
30 |
Returns
31 |
& Orders
32 |
33 |
34 |

35 |
cart
36 |
37 |
38 |
39 | )
40 | }
41 |
--------------------------------------------------------------------------------
/start/client/src/index.css:
--------------------------------------------------------------------------------
1 | html {
2 | padding: 0;
3 | margin: 0;
4 | box-sizing: border-box;
5 | }
6 |
7 |
--------------------------------------------------------------------------------
/start/client/src/index.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import ReactDOM from 'react-dom';
3 | import './index.css';
4 | import App from './App';
5 | import reportWebVitals from './reportWebVitals';
6 | import "./index.css"
7 |
8 | ReactDOM.render(
9 |
10 |
11 | ,
12 | document.getElementById('root')
13 | );
14 |
15 | // If you want to start measuring performance in your app, pass a function
16 | // to log results (for example: reportWebVitals(console.log))
17 | // or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals
18 | reportWebVitals();
19 |
--------------------------------------------------------------------------------
/start/client/src/logo.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/start/client/src/pages/AnimalPage/AnimalPage.css:
--------------------------------------------------------------------------------
1 | .product-img {
2 | width: 40%
3 | }
4 |
5 | .text-container {
6 | width: 40%;
7 | }
8 |
9 | .text-container h1 {
10 | font-size: 1.25rem;
11 | line-height: 2rem;
12 | }
13 |
14 | .star-container img {
15 | width: 1rem
16 | }
17 |
18 | .star-container {
19 | display: flex;
20 | }
21 |
22 | .star-container p {
23 | color: rgb(33, 145, 193);
24 | margin-top: 1rem;
25 | margin-left: 0.5rem;
26 | }
27 |
28 | .about-container h4 {
29 | font-size: 1.15rem;
30 | font-weight: 700;
31 | }
32 |
33 |
34 |
35 | .cart-container {
36 | border-radius: 1rem;
37 | width: 20%;
38 | margin-left: 2rem;
39 | padding: 1rem
40 | }
41 |
42 | .cart-container button {
43 | width: 100%;
44 | border: none;
45 | background-color: #F2CB6A;
46 | padding: 0.35rem 0;
47 | font-size: 0.85rem;
48 | margin: 0.25rem 0
49 | }
50 |
51 | .price {
52 | color: rgb(141, 6, 6);
53 |
54 | }
55 |
56 | .delivery-time {
57 | padding-bottom: 4rem;
58 | }
59 |
60 | .buy-now-btn {
61 | margin-top: 1rem;
62 | }
63 |
64 |
65 | .rating-stock-container {
66 | width: 100%;
67 | display: flex;
68 | justify-content: space-between;
69 | }
--------------------------------------------------------------------------------
/start/client/src/pages/AnimalPage/AnimalPage.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import { Container } from 'react-bootstrap'
3 | import animals from "../../assets/images"
4 | import star from "../../assets/svg/star.svg"
5 | import "./AnimalPage.css"
6 | import { useParams } from "react-router-dom"
7 |
8 | function AnimalPage() {
9 |
10 | const { slug } = useParams();
11 |
12 |
13 | return (
14 |
15 |
16 |
17 |
![]()
18 |
19 |
{}
20 |
21 |

22 |

23 |

24 |

25 |

26 |
27 |
1402 rating
28 |
{} in stock
29 |
30 |
31 |
32 |
33 |
About this Animal
34 | Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
35 | Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
36 | Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.
37 | Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
38 |
39 |
40 |
41 |
CAD$ {}
42 |
FREE delivery: Thursday, Feb 25 Details
43 |
46 |
49 |
50 |
51 |
52 |
53 |
54 | )
55 | }
56 |
57 | export default AnimalPage
58 |
--------------------------------------------------------------------------------
/start/client/src/pages/CategoryPage.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import { useParams } from "react-router-dom"
3 | import { Container } from 'react-bootstrap'
4 | import CardDisplay from '../components/CardDisplay/CardDisplay'
5 |
6 | function CategoryPage() {
7 |
8 | const { slug } = useParams()
9 |
10 | return (
11 |
12 |
13 |
14 | {}
15 |
18 |
19 |
20 |
21 | )
22 | }
23 |
24 | export default CategoryPage
25 |
--------------------------------------------------------------------------------
/start/client/src/pages/LandingPage.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import MainHero from "../components/MainHero/MainHero"
3 | import CategoryDisplay from "../components/CategoryDisplay/CategoryDisplay"
4 | import CardDisplay from "../components/CardDisplay/CardDisplay"
5 |
6 | function LandingPage() {
7 |
8 | return (
9 |
10 |
11 |
12 |
13 |
14 | )
15 | }
16 |
17 | export default LandingPage
18 |
--------------------------------------------------------------------------------
/start/client/src/reportWebVitals.js:
--------------------------------------------------------------------------------
1 | const reportWebVitals = onPerfEntry => {
2 | if (onPerfEntry && onPerfEntry instanceof Function) {
3 | import('web-vitals').then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => {
4 | getCLS(onPerfEntry);
5 | getFID(onPerfEntry);
6 | getFCP(onPerfEntry);
7 | getLCP(onPerfEntry);
8 | getTTFB(onPerfEntry);
9 | });
10 | }
11 | };
12 |
13 | export default reportWebVitals;
14 |
--------------------------------------------------------------------------------
/start/client/src/setupTests.js:
--------------------------------------------------------------------------------
1 | // jest-dom adds custom jest matchers for asserting on DOM nodes.
2 | // allows you to do things like:
3 | // expect(element).toHaveTextContent(/react/i)
4 | // learn more: https://github.com/testing-library/jest-dom
5 | import '@testing-library/jest-dom';
6 |
--------------------------------------------------------------------------------