diff --git a/.eslintignore b/.eslintignore index 25e8090..2041a34 100644 --- a/.eslintignore +++ b/.eslintignore @@ -1 +1,2 @@ prisma/generated/ +__playground__/ diff --git a/.eslintrc.json b/.eslintrc.json index b2adf13..a5fc36a 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -1,34 +1,39 @@ { - "extends": ["esnext", "plugin:react/recommended", "prettier"], - "plugins": ["react-hooks", "babel"], - "settings": { - "react": { - "version": "16.9.0" - } - }, - "parser": "babel-eslint", - "parserOptions": { - "ecmaFeatures": { - "jsx": true, - "modules": true - } - }, - "env": { - "browser": true, - "es6": true, - "node": true - }, + "extends": ["kentcdodds", "kentcdodds/react", "kentcdodds/jsx-a11y"], "rules": { "react/prop-types": 0, - "no-use-before-define": ["error", { "variables": false }], - "no-console": "error", - "import/no-commonjs": 0, + "no-use-before-define": 0, "react/react-in-jsx-scope": 0, - "react/no-unescaped-entities": 0, - "import/no-namespace": 0, - "import/no-nodejs-modules": 0 + "react-hooks/exhaustive-deps": 0, + "consistent-return": 0 }, "globals": { "cssTheme": "readonly" - } + }, + "overrides": [ + { + "files": ["**/*.ts"], + "parser": "@typescript-eslint/parser", + "plugins": ["@typescript-eslint"], + "extends": [ + "eslint:recommended", + "plugin:@typescript-eslint/eslint-recommended", + "plugin:@typescript-eslint/recommended", + "prettier", + "prettier/@typescript-eslint" + ], + "rules": { + "@typescript-eslint/ban-ts-ignore": 0, + "@typescript-eslint/no-explicit-any": 0 + }, + "settings": { + "import/resolver": { + "typescript": { + "alwaysTryTypes": true, + "directory": "tsconfig.json" + } + } + } + } + ] } diff --git a/.gitignore b/.gitignore index ad46b30..1d235be 100644 --- a/.gitignore +++ b/.gitignore @@ -56,6 +56,13 @@ typings/ # dotenv environment variables file .env +*.env + + +# Config folder +.config # next.js build output .next + +__playground__/ diff --git a/.prettierrc b/.prettierrc index 083ae08..906a630 100644 --- a/.prettierrc +++ b/.prettierrc @@ -1,5 +1,17 @@ { + "arrowParens": "avoid", + "bracketSpacing": true, + "htmlWhitespaceSensitivity": "css", + "insertPragma": false, + "jsxBracketSameLine": false, + "jsxSingleQuote": false, + "printWidth": 80, + "proseWrap": "always", + "quoteProps": "as-needed", + "requirePragma": false, "semi": false, - "singleQuote": false, - "trailingComma": "es5" + "singleQuote": true, + "tabWidth": 2, + "trailingComma": "all", + "useTabs": false } diff --git a/README.md b/README.md index 792e8bb..e9c6559 100644 --- a/README.md +++ b/README.md @@ -1 +1 @@ -# Snapeat \ No newline at end of file +# SnapEat diff --git a/app.json b/app.json new file mode 100644 index 0000000..35d74c5 --- /dev/null +++ b/app.json @@ -0,0 +1,10 @@ +{ + "name": "snapeat", + "description": "", + "scripts": {}, + "buildpacks": [ + { + "url": "heroku/nodejs" + } + ] +} diff --git a/apps/AuthenticatedApp.js b/apps/AuthenticatedApp.js new file mode 100644 index 0000000..2093252 --- /dev/null +++ b/apps/AuthenticatedApp.js @@ -0,0 +1,35 @@ +import React, { useEffect } from 'react' +import AuthenticatedAppProviders from '../context/AuthenicatedAppProviders' +import { useAuth } from '../context/authContext' + +import views from '../views' + +import { CHANGE_VIEW, HOME, ONBOARDING } from '../utils/constants' + +import { useRouteState, useRouteDispatch } from '../context/routeContext' + +const AuthenticatedApp = () => { + const { currentView } = useRouteState() + const routeDispatch = useRouteDispatch() + + const { snapeatUser } = useAuth() + + useEffect(() => { + routeDispatch({ + type: CHANGE_VIEW, + view: snapeatUser ? HOME : ONBOARDING, + }) + + return () => ({}) + }, []) + + const CurrentView = views[currentView] + + return ( + + + + ) +} + +export default AuthenticatedApp diff --git a/apps/UnauthenticatedApp.js b/apps/UnauthenticatedApp.js new file mode 100644 index 0000000..9c84f35 --- /dev/null +++ b/apps/UnauthenticatedApp.js @@ -0,0 +1,15 @@ +import React from 'react' + +import views from '../views' + +import { useRouteStateUnauth } from '../context/unauthRouteContext' + +const UnauthenticatedApp = () => { + const { currentView } = useRouteStateUnauth() + + const CurrentView = views[currentView] + + return +} + +export default UnauthenticatedApp diff --git a/components/BugButton.js b/components/BugButton.js new file mode 100644 index 0000000..c15d85d --- /dev/null +++ b/components/BugButton.js @@ -0,0 +1,24 @@ +import styled from 'styled-components' + +import bugIcon from '../public/icons/bug_icon.svg' + +const BugButton = () => { + return ( + + + + ) +} + +const Icon = styled.img.attrs({ + className: 'absolute w-10', +})` + top: 2%; + right: 20%; +` + +export default BugButton diff --git a/components/Header.js b/components/Header.js new file mode 100644 index 0000000..fa95fc4 --- /dev/null +++ b/components/Header.js @@ -0,0 +1,43 @@ +import styled from 'styled-components' +import { useRouteDispatch } from '../context/routeContext' +import { CHANGE_VIEW, MENU } from '../utils/constants' +import snapeatLogo from '../public/logos/logo2.svg' +import menuIcon from '../public/icons/menu.svg' +import menuBG from '../public/backgrounds/menu_bg.svg' + +const MenuContainer = styled.div.attrs({ + className: 'w-screen px-6 pt-5d5', +})` + display: grid; + grid-template-columns: 1fr 12.5%; + grid-template-rows: 40% 1fr; + align-items: center; + background: url(${menuBG}) left top/cover no-repeat; +` + +const SnapeatLogo = styled.img.attrs({ + className: 'w-auto sm:w-25', +})` + margin-left: calc((100vw - 48px - 80px) / 2); + + @media ${cssTheme('media.sm')} { + margin-left: calc((100vw - 48px - 100px) / 2); + } +` + +const HeaderWithLogo = () => { + const routeDispatch = useRouteDispatch() + return ( + + +
routeDispatch({ type: CHANGE_VIEW, view: MENU })} + onKeyPress={() => routeDispatch({ type: CHANGE_VIEW, view: MENU })} + > + menu +
+
+ ) +} + +export { HeaderWithLogo } diff --git a/components/Input.js b/components/Input.js new file mode 100644 index 0000000..6efe4b8 --- /dev/null +++ b/components/Input.js @@ -0,0 +1,85 @@ +import styled from 'styled-components' +import * as R from 'ramda' +import { Field, ErrorMessage } from 'formik' + +import dropdown from '../public/icons/dropdown.svg' + +const TextInput = styled(Field).attrs(({ placeholder, name, ...attrs }) => ({ + className: 'bg-lightgray w-full border-b-2 border-navy', + type: 'text', + name, + placeholder, + ...attrs, +}))`` + +const SelectInput = ({ options, placeholder, name, ...attrs }) => { + const emptyOption = ( + + ) + + const optionComponents = R.pipe( + R.map(({ label, value }) => ( + + )), + R.prepend(emptyOption), + )(options) + + return +} + +const Select = styled.select.attrs(({ className, ...attrs }) => { + return { + className: `border-b-2 border-navy block w-full + bg-transparent text-center ${className}`, + ...attrs, + } +})` + -moz-appearance: none; + -webkit-appearance: none; + appearance: none; + background-image: url(${dropdown}); + background-repeat: no-repeat, repeat; + background-position: right 0 top 50%, 0 0; +` + +const RadioLabel = styled.label.attrs({ + className: 'ml-2d5', +})`` + +const Radio = styled(Field).attrs(({ name, ...attrs }) => ({ + type: 'radio', + id: name, + name, + ...attrs, +}))`` + +const RadioInput = ({ name, children, id, ...attrs }) => ( +
+ + {children} +
+) + +const ErrorContainer = styled.div.attrs({ + className: 'text-red', +})`` + +const Error = ({ name, className }) => ( + {msg}} + /> +) + +const Input = ({ Component, ...attrs }) => ( +
+ + +
+) + +export { Input, TextInput, RadioInput, SelectInput, Error } diff --git a/components/ProportionExamples.js b/components/ProportionExamples.js new file mode 100644 index 0000000..f655f63 --- /dev/null +++ b/components/ProportionExamples.js @@ -0,0 +1,81 @@ +import styled from 'styled-components' +import * as R from 'ramda' + +import Quarter from '../public/images/example_quarter.png' +import Half from '../public/images/example_half.png' +import Mostly from '../public/images/example_mostly.png' +import Whole from '../public/images/example_whole.png' +import closeIcon from '../public/icons/close.svg' + +import { CardBackground } from './foodData/shared' + +const proportionArray = [ + { + name: 'Quarter', + img: Quarter, + }, + { + name: 'Half', + img: Half, + }, + { + name: 'Mostly', + img: Mostly, + }, + { + name: 'Whole', + img: Whole, + }, +] + +const ProportionExamples = ({ toggleExamples }) => { + return ( + + + Close + +

+ It can be hard to know how much fruit or veg there is on a plate. Here + are some examples to help. +

+ + + {R.map(prop => ( + + {`Example + {prop.name} + + ))(proportionArray)} + + +

+ If you're still not sure, just share your best guess! +

+
+ ) +} + +const CloseButton = styled.button.attrs({ + className: 'cursor-pointer block', +})` + margin: 2rem 2rem 1rem auto; +` + +const Text = styled.p.attrs({ + className: 'w-11/12 mx-auto font-xl text-center mb-3 mt-3', +})`` + +const ExampleContainer = styled.section.attrs({ + className: 'w-9/12 mx-auto', +})` + display: grid; + grid-template-columns: 1fr 1fr; + grid-template-rows: auto; + grid-gap: 1rem; +` + +const Example = styled.section.attrs({ + className: 'flex flex-col', +})`` + +export default ProportionExamples diff --git a/components/SecurityPages.js b/components/SecurityPages.js new file mode 100644 index 0000000..4455cc6 --- /dev/null +++ b/components/SecurityPages.js @@ -0,0 +1,99 @@ +import styled from 'styled-components' +import logo from '../public/logos/gstc-logo.png' +import securityMenuBG from '../public/backgrounds/termsConditionsBackground.svg' +import closeIconGrey from '../public/icons/close.svg' +import closeIconWhite from '../public/icons/close_white.svg' + +const Header = styled.header.attrs({ + className: 'w-full min-h-65', +})` + display: grid; + grid-template-rows: 1fr 4rem; + align-items: center; + min-height: ${cssTheme('spacing.65')}; + background: url(${securityMenuBG}) left top/cover no-repeat; +` + +const H1 = styled.h1.attrs({ + className: 'text-center font-header font-thin mx-17', +})`` + +const GSTCLogo = styled.img.attrs({ + src: logo, + alt: 'Guy's & St Thomas' Charity logo', + className: 'mx-auto', +})` + width: 4rem; +` + +const CloseButton = styled.button.attrs({ + className: 'w-5 h-5 mt-6 mr-6 absolute top-0 right-0', +})` + justify-self: end; +` + +const Text = styled.p.attrs({ + className: 'm-4 font-xl font-thin', +})`` + +const Footer = styled.footer.attrs({ + className: 'bg-white shadow-tooltip rounded-card px-4 pb-10', +})`` + +const Grid = styled.section.attrs({ + className: ' py-5', +})` + display: grid; + grid-template-columns: 45px 1fr; +` + +const Checkbox = styled.input.attrs({ + className: 'w-4', +})`` + +const Label = styled.label.attrs({ + className: 'font-sm', +})` + align-self: center; +` + +const Button = styled.button.attrs(({ active }) => ({ + className: `bg-navy shadow-button rounded-button w-full text-white py-4 ${ + active + ? 'opacity-100 pointer-events-auto' + : 'opacity-40 pointer-events-none' + }`, +}))`` + +const Close = ({ close, closeColour }) => { + return ( + + Close + + ) +} + +const HeaderWithGSTCLogo = ({ text, close, closeColour }) => { + return ( +
+ {close && } +

{text}

+ +
+ ) +} + +export { + HeaderWithGSTCLogo, + Button, + Text, + H1, + Label, + Grid, + Checkbox, + Footer, + Close, +} diff --git a/components/Tooltip.js b/components/Tooltip.js new file mode 100644 index 0000000..8482ada --- /dev/null +++ b/components/Tooltip.js @@ -0,0 +1,21 @@ +import styled from 'styled-components' +import close from '../public/icons/close.svg' + +const TooltipLink = styled.button.attrs({ + type: 'button', + className: 'border-0 underline text-blue bg-transparent self-start mt-2d5', +})`` + +const Tooltip = styled.aside.attrs({ + className: + 'text-center fixed z-20 bg-white left-0 bottom-0 pt-6 pb-20 px-4 shadow-tooltip rounded-tooltip', +})`` + +const TooltipClose = styled.button.attrs({ + className: 'border-0 bg-transparent w-5 h-5 block ml-auto mb-15', + type: 'button', + alt: 'Close tooltip', +})` + background: url(${close}); +` +export { Tooltip, TooltipLink, TooltipClose } diff --git a/components/foodData/Categories.js b/components/foodData/Categories.js new file mode 100644 index 0000000..45b2792 --- /dev/null +++ b/components/foodData/Categories.js @@ -0,0 +1,182 @@ +import { + FRUIT, + VEGETABLES, + MEAT, + FISH, + DAIRY, + EGG, + PASTA, + RICE, + POTATO, + BREAD, + NUTS, + DESSERT, + OIL, + BUTTER, + WATER, + FIZZY_DRINK, +} from '../../utils/constants' + +// import clicked and unclicked variants of all icons +import fruitIcon from '../../public/icons/categories/regular/fruit_icn.svg' +import fruitIconSelected from '../../public/icons/categories/selected/fruit_icn-white.svg' +import vegIcon from '../../public/icons/categories/regular/vegan.svg' +import vegIconSelected from '../../public/icons/categories/selected/vegs-white.svg' +import meatIcon from '../../public/icons/categories/regular/meat.svg' +import meatIconSelected from '../../public/icons/categories/selected/meat-white.svg' +import fishIcon from '../../public/icons/categories/regular/fish.svg' +import fishIconSelected from '../../public/icons/categories/selected/fish-white.svg' +import dairyIcon from '../../public/icons/categories/regular/dairy.svg' +import dairyIconSelected from '../../public/icons/categories/selected/dairy-white.svg' +import eggIcon from '../../public/icons/categories/regular/egg.svg' +import eggIconSelected from '../../public/icons/categories/selected/egg-white.svg' +import pastaIcon from '../../public/icons/categories/regular/pasta.svg' +import pastaIconSelected from '../../public/icons/categories/selected/pasta-white.svg' +import riceIcon from '../../public/icons/categories/regular/rice.svg' +import riceIconSelected from '../../public/icons/categories/selected/rice-white.svg' +import potatoIcon from '../../public/icons/categories/regular/potato.svg' +import potatoIconSelected from '../../public/icons/categories/selected/potato-white.svg' +import breadIcon from '../../public/icons/categories/regular/bread.svg' +import breadIconSelected from '../../public/icons/categories/selected/bread-white.svg' +import nutsIcon from '../../public/icons/categories/regular/nuts.svg' +import nutsIconSelected from '../../public/icons/categories/selected/nuts-white.svg' +import dessertIcon from '../../public/icons/categories/regular/dessert.svg' +import dessertIconSelected from '../../public/icons/categories/selected/dessert-white.svg' +import oilIcon from '../../public/icons/categories/regular/oil.svg' +import oilIconSelected from '../../public/icons/categories/selected/oil-white.svg' +import butterIcon from '../../public/icons/categories/regular/butter.svg' +import butterIconSelected from '../../public/icons/categories/selected/butter.svg' +import waterIcon from '../../public/icons/categories/regular/water.svg' +import waterIconSelected from '../../public/icons/categories/selected/water-white.svg' +import fizzyDrinkIcon from '../../public/icons/categories/regular/fizzy-drink.svg' +import fizzyDrinkIconSelected from '../../public/icons/categories/selected/fizzy-drink-white.svg' + +import { Title, CardBackground, CheckboxTile, TileContainer } from './shared' + +import * as Steps from '.' + +const Categories = () => { + return ( + + What's on their plate? + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ) +} + +Categories.componentName = Steps.Categories + +export default Categories diff --git a/components/foodData/Error.js b/components/foodData/Error.js new file mode 100644 index 0000000..8dd1690 --- /dev/null +++ b/components/foodData/Error.js @@ -0,0 +1,47 @@ +import styled from 'styled-components' + +import logo from '../../public/logos/logo1.svg' +import emptyplate from '../../public/images/empty-plate.jpg' + +const Text = styled.p.attrs({ + className: 'font-xxl text-center mb-5 mt-5', +})`` + +const Error = () => { + return ( +
+ Snapeat logo + checkmark + + Oh no, it looks like something went wrong. + +

+ Please let us know what happened by{' '} + + filling in this form + {' '} + and then try again. +

+ {/*

+ If the problem persists, don't hesitate to{' '} + + contact us. + +

*/} +
+ ) +} + +Error.componentName = 'Error' + +export default Error diff --git a/components/foodData/FoodDataStep.js b/components/foodData/FoodDataStep.js new file mode 100644 index 0000000..ec9ca04 --- /dev/null +++ b/components/foodData/FoodDataStep.js @@ -0,0 +1,29 @@ +import { useState } from 'react' +import { Tooltip, TooltipLink, TooltipClose } from '../Tooltip' +import { CardBackground, Title } from './shared' + +const FoodDataStep = ({ children, h1, tooltipTitle, tooltipContents }) => { + const [showTooltip, setShowTooltip] = useState(false) + return ( + + {h1} + {children} + + {tooltipTitle && ( + setShowTooltip(true)}> + Why do you need this? + + )} + + {showTooltip && ( + + setShowTooltip(false)} /> + {tooltipTitle} + {tooltipContents} + + )} + + ) +} + +export default FoodDataStep diff --git a/components/foodData/FruitProportion.js b/components/foodData/FruitProportion.js new file mode 100644 index 0000000..4bf60d0 --- /dev/null +++ b/components/foodData/FruitProportion.js @@ -0,0 +1,86 @@ +import allIcon from '../../public/icons/quantities/regular/all.svg' +import allIconSelected from '../../public/icons/quantities/selected/all-selected.svg' +import halfIcon from '../../public/icons/quantities/regular/half.svg' +import halfIconSelected from '../../public/icons/quantities/selected/half-selected.svg' +import mostlyIcon from '../../public/icons/quantities/regular/mostly.svg' +import mostlyIconSelected from '../../public/icons/quantities/selected/mostly-selected.svg' +import quarterIcon from '../../public/icons/quantities/regular/quarter.svg' +import quarterIconSelected from '../../public/icons/quantities/selected/quarter-selected.svg' +import fruitIcon from '../../public/icons/categories/regular/fruit_icn.svg' + +import ProportionExamples from '../ProportionExamples' + +import { + Title, + CardBackground, + RadioTile, + TileContainer, + FruitVegTile, + ExamplesButton, +} from './shared' + +import * as Steps from '.' + +const FruitProportion = ({ toggleExamples, showExamples }) => { + return showExamples ? ( + + ) : ( + + You tagged Fruit + + +
+

Fruit

+ + + + Roughly, how much of the plate is fruit? + + + + + + + + + + + Not sure? Check out these examples + + + ) +} + +FruitProportion.componentName = Steps.FruitProportion + +export default FruitProportion diff --git a/components/foodData/Results.js b/components/foodData/Results.js new file mode 100644 index 0000000..28d900b --- /dev/null +++ b/components/foodData/Results.js @@ -0,0 +1,180 @@ +import styled from 'styled-components' + +import { + FRUIT, + VEGETABLES, + MEAT, + FISH, + DAIRY, + EGG, + PASTA, + RICE, + POTATO, + BREAD, + NUTS, + DESSERT, + OIL, + BUTTER, + WATER, + FIZZY_DRINK, +} from '../../utils/constants' + +import fruitIcon from '../../public/icons/categories/regular/fruit_icn.svg' +import vegIcon from '../../public/icons/categories/regular/vegan.svg' +import meatIcon from '../../public/icons/categories/regular/meat.svg' +import fishIcon from '../../public/icons/categories/regular/fish.svg' +import dairyIcon from '../../public/icons/categories/regular/dairy.svg' +import eggIcon from '../../public/icons/categories/regular/egg.svg' +import pastaIcon from '../../public/icons/categories/regular/pasta.svg' +import riceIcon from '../../public/icons/categories/regular/rice.svg' +import potatoIcon from '../../public/icons/categories/regular/potato.svg' +import breadIcon from '../../public/icons/categories/regular/bread.svg' +import nutsIcon from '../../public/icons/categories/regular/nuts.svg' +import dessertIcon from '../../public/icons/categories/regular/dessert.svg' +import oilIcon from '../../public/icons/categories/regular/oil.svg' +import butterIcon from '../../public/icons/categories/regular/butter.svg' +import waterIcon from '../../public/icons/categories/regular/water.svg' +import fizzyDrinkIcon from '../../public/icons/categories/regular/fizzy-drink.svg' + +import allIcon from '../../public/icons/quantities/regular/all.svg' +import halfIcon from '../../public/icons/quantities/regular/half.svg' +import mostlyIcon from '../../public/icons/quantities/regular/mostly.svg' +import quarterIcon from '../../public/icons/quantities/regular/quarter.svg' + +import * as Steps from '.' + +import { + TagButton, + CardBackground, + Title, + FruitVegTile, + TileContainer, +} from './shared' + +const categoryIcons = { + [FRUIT]: fruitIcon, + [VEGETABLES]: vegIcon, + [MEAT]: meatIcon, + [FISH]: fishIcon, + [DAIRY]: dairyIcon, + [EGG]: eggIcon, + [PASTA]: pastaIcon, + [RICE]: riceIcon, + [POTATO]: potatoIcon, + [BREAD]: breadIcon, + [NUTS]: nutsIcon, + [DESSERT]: dessertIcon, + [OIL]: oilIcon, + [BUTTER]: butterIcon, + [WATER]: waterIcon, + [FIZZY_DRINK]: fizzyDrinkIcon, +} + +const proportionIcons = { + all: allIcon, + half: halfIcon, + mostly: mostlyIcon, + quarter: quarterIcon, +} + +const CategoryTile = ({ category, updatePage }) => ( + +) + +const TagsContainer = styled.div.attrs({ + className: 'flex flex-wrap justify-around w-4/5 center m-auto', +})`` + +const FruitVegProportion = ({ proportion, category, updatePage }) => { + const page = category === 'fruit' ? 'FruitProportion' : 'VegetableProportion' + return ( + <> + Roughly, the amount of {category} on the plate was: + + + ) +} + +const Results = ({ values, updatePage }) => { + const { categories, proportionFruit, proportionVeg, tags } = values + + return ( + + + In summary, tonight's meal was composed of + + + + {categories.map(category => ( + + ))} + + {proportionVeg && ( + + )} + {proportionFruit && ( + + )} + and it was: + + {tags.map(tag => ( + + ))} + + + ) +} + +Results.componentName = Steps.Results + +export default Results diff --git a/components/foodData/Spinner.js b/components/foodData/Spinner.js new file mode 100644 index 0000000..65dd947 --- /dev/null +++ b/components/foodData/Spinner.js @@ -0,0 +1,26 @@ +import styled from 'styled-components' + +import loading from '../../public/icons/loading.svg' + +const Text = styled.p.attrs({ + className: 'font-xxl text-center text-white mb-5 mt-5', +})`` + +// eslint-disable-next-line no-unused-vars +const Spinner = ({ values }) => { + // eslint-disable-next-line no-unused-vars + const { categories, proportionFruit, proportionVeg, tags } = values + + return ( +
+
+ Loading + Uploading... +
+
+ ) +} + +Spinner.componentName = 'Spinner' + +export default Spinner diff --git a/components/foodData/Success.js b/components/foodData/Success.js new file mode 100644 index 0000000..ddc93ea --- /dev/null +++ b/components/foodData/Success.js @@ -0,0 +1,29 @@ +import styled from 'styled-components' + +import logo from '../../public/logos/logo1.svg' +import checkmark from '../../public/illustrations/checkmark.svg' + +const Text = styled.p.attrs({ + className: 'font-xxl text-center mb-5 mt-5', +})`` + +// eslint-disable-next-line no-unused-vars +const Success = ({ values }) => { + // eslint-disable-next-line no-unused-vars + const { categories, proportionFruit, proportionVeg, tags } = values + + return ( +
+ Snapeat logo + checkmark + All done! + Thanks for logging what your child had for dinner today. +
+ Have a great evening. +
+ ) +} + +Success.componentName = 'Success' + +export default Success diff --git a/components/foodData/Tags.js b/components/foodData/Tags.js new file mode 100644 index 0000000..80d9aa8 --- /dev/null +++ b/components/foodData/Tags.js @@ -0,0 +1,20 @@ +import { TAG_ARRAY } from '../../utils/constants' +import FoodDataStep from './FoodDataStep' + +import { TagButton, TagsContainer } from './shared' + +import * as Steps from '.' + +const Tags = () => ( + + + {TAG_ARRAY.map(tag => ( + {tag} + ))} + + +) + +Tags.componentName = Steps.Tags + +export default Tags diff --git a/components/foodData/VegetableProportion.js b/components/foodData/VegetableProportion.js new file mode 100644 index 0000000..7c3ef67 --- /dev/null +++ b/components/foodData/VegetableProportion.js @@ -0,0 +1,86 @@ +import allIcon from '../../public/icons/quantities/regular/all.svg' +import allIconSelected from '../../public/icons/quantities/selected/all-selected.svg' +import halfIcon from '../../public/icons/quantities/regular/half.svg' +import halfIconSelected from '../../public/icons/quantities/selected/half-selected.svg' +import mostlyIcon from '../../public/icons/quantities/regular/mostly.svg' +import mostlyIconSelected from '../../public/icons/quantities/selected/mostly-selected.svg' +import quarterIcon from '../../public/icons/quantities/regular/quarter.svg' +import quarterIconSelected from '../../public/icons/quantities/selected/quarter-selected.svg' +import vegIcon from '../../public/icons/categories/regular/vegan.svg' + +import ProportionExamples from '../ProportionExamples' + +import { + Title, + CardBackground, + RadioTile, + TileContainer, + FruitVegTile, + ExamplesButton, +} from './shared' + +import * as Steps from '.' + +const VegetableProportion = ({ toggleExamples, showExamples }) => { + return showExamples ? ( + + ) : ( + + You tagged Vegetables + +
+

Vegetables

+ + + + Roughly, how much of the plate is vegetables? + + + + + + + + + + + + Not sure? Check out these examples + + + ) +} + +VegetableProportion.componentName = Steps.VegetableProportion + +export default VegetableProportion diff --git a/components/foodData/index.js b/components/foodData/index.js new file mode 100644 index 0000000..62403d2 --- /dev/null +++ b/components/foodData/index.js @@ -0,0 +1,8 @@ +export const Categories = 'Categories' +export const VegetableProportion = 'VegetableProportion' +export const FruitProportion = 'FruitProportion' +export const Tags = 'Tags' +export const Results = 'Results' +export const Success = 'Success' +export const Error = 'Error' +export const Spinner = 'Spinner' diff --git a/components/foodData/shared.js b/components/foodData/shared.js new file mode 100644 index 0000000..f4b6836 --- /dev/null +++ b/components/foodData/shared.js @@ -0,0 +1,201 @@ +import styled from 'styled-components' +import { Field } from 'formik' + +const TileContainer = styled.section.attrs({ + className: '', +})` + display: grid; + grid-template-columns: 1fr 1fr; + grid-gap: 1rem; + justify-items: center; + max-width: 90%; + width: 90%; + margin: 0 auto; +` + +const InputContainer = styled.label.attrs({ + className: 'block relative cursor-pointer select-none', +})` + width: 100%; + /* Hide the browser's default checkbox */ + input { + position: absolute; + opacity: 0; + cursor: pointer; + height: 0; + width: 0; + } + + div { + width: 100%; + height: 6rem; + border: 1px solid ${cssTheme('colors.navy')}; + border-radius: 1rem; + display: flex; + flex-flow: column nowrap; + justify-content: center; + text-align: center; + } + + /* Create a custom checkbox */ + .checkmark { + width: 100%; + height: 4rem; + background-image: url(${props => props.icon}); + background-repeat: no-repeat; + background-position: center; + display: block; + } + /* When the checkbox is checked, add a blue background */ + input:checked ~ .background > .checkmark { + background-image: url(${props => props.iconSelected}); + } + + input:checked ~ .background { + background-color: ${cssTheme('colors.navy')}; + color: white; + } + + input:checked .parent { + background-color: blue; + } +` + +const CheckboxTile = ({ label, icon, iconSelected, name }) => { + const text = label.charAt(0).toUpperCase() + label.slice(1) + return ( + + +
+ + {text} +
+
+ ) +} + +const RadioInput = ({ + field: { name, value, onChange, onBlur }, + id, + label, + ...props +}) => { + return ( + + ) +} + +const RadioTile = ({ name, icon, iconSelected, label, id }) => { + const text = label.charAt(0).toUpperCase() + label.slice(1) + return ( + + +
+ + {text} +
+
+ ) +} + +const CardBackground = styled.section.attrs({ + className: 'z-10 w-screen bg-white shadow-tooltip pb-4', +})` + border-top-left-radius: 4em; + border-top-right-radius: 4em; +` + +const Title = styled.h1.attrs({ + className: 'font-xxl text-center py-5', +})`` + +const FruitVegTile = styled.div` + width: ${({ width = '190px' }) => width}; + height: 6rem; + border: 1px solid ${cssTheme('colors.navy')}; + border-radius: 1rem; + + .checkmark { + background-image: url(${({ icon }) => icon}); + height: 4rem; + background-repeat: no-repeat; + background-position: center; + } +` + +const TagsContainer = styled.div.attrs({ + className: 'flex flex-wrap justify-around w-4/5 center m-auto', +})`` + +const CheckboxContainer = styled.label.attrs({ + className: 'relative cursor-pointer select-none', +})` + input { + display: none; + } + + .checkmark { + display: inline-flex; + justify-content: center; + align-items: center; + margin-bottom: ${cssTheme('spacing.2')}; + padding: ${cssTheme('spacing.1')}; + padding-left: ${cssTheme('spacing.3')}; + padding-right: ${cssTheme('spacing.3')}; + border: 1px solid ${cssTheme('colors.navy')}; + border-radius: ${cssTheme('spacing.12')}; + + background: white; + color: ${cssTheme('colors.navy')}; + } + + input:checked ~ .checkmark { + background: ${cssTheme('colors.navy')}; + color: white; + } +` +const TagButton = ({ children }) => { + return ( + + + {children} + + ) +} + +const ExamplesButton = styled.button.attrs({ + className: 'w-11/12 font-base text-center mt-4 underline block mx-auto', +})` + color: ${cssTheme('colors.blue')}; +` + +export { + Title, + TileContainer, + CardBackground, + CheckboxTile, + RadioTile, + FruitVegTile, + TagsContainer, + TagButton, + ExamplesButton, +} diff --git a/components/onboarding/Ages.js b/components/onboarding/Ages.js new file mode 100644 index 0000000..4930143 --- /dev/null +++ b/components/onboarding/Ages.js @@ -0,0 +1,104 @@ +import { useEffect } from 'react' +import * as Yup from 'yup' +import { FieldArray, Field } from 'formik' +import * as R from 'ramda' +import R_ from '../../utils/R_' +import createArrayOfLength from '../../utils/createArrayOfLength' + +import { NEXT_NOT_ATTEMPTED } from '../../utils/constants' + +import { RadioInput } from '../Input' +import OnboardingStep, { SubQuestion } from './OnboardingStep' + +const validation = Yup.object().shape({ + ages: Yup.array().of( + Yup.string().test( + 'childs-age-selected', + "Please make sure you have selected your child's age", + value => !!value, + ), + ), +}) + +const tooltipContents = ( + <> +

+ At the SnapEat Project we want to learn what children in Lambeth and + Southwark are eating when they are at home. +

+

+ By securely sharing this additional information, you will help us to make + sure we are hearing and learning from a range of different households. +

+ +) + +const AgesError = ({ name }) => ( + + value || status === NEXT_NOT_ATTEMPTED ? null : ( +
{error}
+ ) + } + /> +) + +const AgeComponent = (_, i) => { + return ( +
+ Age range — Child {i + 1} + + + 0 - 4 + + + 5 - 8 + + + 9 - 12 + + + 13 - 15 + + + 16 - 18 + + +
+ ) +} + +const childrenQuestions = R.pipe( + createArrayOfLength, + R_.mapIndexed(AgeComponent), +) + +const Ages = ({ values: { numberOfChildren }, setFieldValue }) => { + useEffect(() => { + setFieldValue('ages', createArrayOfLength(numberOfChildren)) + }, []) + + return ( + + childrenQuestions(numberOfChildren)} + /> + + ) +} + +Ages.componentName = 'Ages' +Ages.validation = validation + +export default Ages diff --git a/components/onboarding/Confirmation.js b/components/onboarding/Confirmation.js new file mode 100644 index 0000000..c97f0e3 --- /dev/null +++ b/components/onboarding/Confirmation.js @@ -0,0 +1,4 @@ +const Confirmation = () =>
Confirmation
+Confirmation.componentName = 'Confirmation' + +export default Confirmation diff --git a/components/onboarding/Error.js b/components/onboarding/Error.js new file mode 100644 index 0000000..2d6ba24 --- /dev/null +++ b/components/onboarding/Error.js @@ -0,0 +1,48 @@ +import styled from 'styled-components' + +import logo from '../../public/logos/logo1.svg' +import emptyplate from '../../public/images/empty-plate.jpg' + +const Text = styled.p.attrs({ + className: 'font-xxl text-center mb-5 mt-5', +})`` + +const Error = () => { + return ( +
+ Snapeat logo + checkmark + + Oh no, it looks like something went wrong. + +

Please try again.

+

+ Please let us know what happened by{' '} + + filling in this form + {' '} + and then try again. +

+ {/*

+ If the problem persists, don't hesitate to{' '} + + contact us. + +

*/} +
+ ) +} + +Error.componentName = 'Error' + +export default Error diff --git a/components/onboarding/NumberOfChildren.js b/components/onboarding/NumberOfChildren.js new file mode 100644 index 0000000..19e8951 --- /dev/null +++ b/components/onboarding/NumberOfChildren.js @@ -0,0 +1,56 @@ +import * as Yup from 'yup' +import { Input, TextInput } from '../Input' +import keepFieldCleanOnChange from '../../utils/keepFieldCleanOnChange' +import OnboardingStep from './OnboardingStep' + +const tooltipContents = ( + <> +

+ At the SnapEat Project we want to learn what children in Lambeth and + Southwark are eating when they are at home. +

+

+ By securely sharing this additional information, you will help us to make + sure we are hearing and learning from a range of different households. +

+ +) + +const validation = Yup.object().shape({ + numberOfChildren: Yup.string() + .required('Please enter a number') + .notOneOf( + ['0', '00'], + 'You must have children under 18 to sign up to SnapEat', + ), +}) + +const NumberOfChildren = ({ setFieldValue, values }) => ( + + + +) + +NumberOfChildren.componentName = 'NumberOfChildren' +NumberOfChildren.validation = validation + +export default NumberOfChildren diff --git a/components/onboarding/OnboardingStep.js b/components/onboarding/OnboardingStep.js new file mode 100644 index 0000000..b993783 --- /dev/null +++ b/components/onboarding/OnboardingStep.js @@ -0,0 +1,70 @@ +import React, { useState } from 'react' +import styled from 'styled-components' + +import { Tooltip, TooltipLink, TooltipClose } from '../Tooltip' + +const Container = styled.main.attrs({ + className: 'flex flex-col w-full', +})`` +const H1 = styled.h1.attrs({ + className: 'font-xxl font-bold text-center mb-5', +})`` + +const H2 = styled.h2.attrs({ + className: 'font-xl text-center mb-5', +})`` + +const Question = styled.label.attrs({ + className: 'font-xl w-full', +})`` + +const SubQuestion = styled.label.attrs({ + className: 'font-base w-full block', +})`` + +const Description = styled.p.attrs({ + className: 'font-xs w-full mb-10', +})`` + +const OnboardingStep = ({ + children, + h1, + h2, + question, + description, + tooltipTitle, + tooltipContents, + className, +}) => { + const [showTooltip, setShowTooltip] = useState(false) + + return ( + +

{h1}

+

{h2}

+ 1 ? 'div' : 'label'}>{question} + {description} + {children} + setShowTooltip(true)}> + Why do you need this? + + {showTooltip && ( + + setShowTooltip(false)} /> +

{tooltipTitle}

+ {tooltipContents} + + Something wrong? Tell us here + +
+ )} +
+ ) +} + +export { OnboardingStep as default, SubQuestion } diff --git a/components/onboarding/Phone.js b/components/onboarding/Phone.js new file mode 100644 index 0000000..2cacc5b --- /dev/null +++ b/components/onboarding/Phone.js @@ -0,0 +1,90 @@ +import axios from 'axios' +import * as Yup from 'yup' +import { parsePhoneNumberFromString } from 'libphonenumber-js' +import { Input, TextInput } from '../Input' +import keepFieldCleanOnChange from '../../utils/keepFieldCleanOnChange' +import OnboardingStep from './OnboardingStep' + +const validation = Yup.object().shape({ + phoneNumber: Yup.string().required( + 'You need to enter your phone number to continue', + ), +}) + +const doesPhoneNumberExist = async ({ phoneNumber }) => { + const encodedPhoneNumber = encodeURIComponent(phoneNumber) + const res = await axios( + `${process.env.HOST}/api/does-phonenumber-exist?phonenumber=${encodedPhoneNumber}`, + ) + + const { + data: { phoneNumberExists }, + } = res + + return phoneNumberExists +} + +const validatePhoneNumber = async value => { + const phoneNumber = parsePhoneNumberFromString(value, 'GB') + if (!phoneNumber) { + return 'Please enter a complete phone number.' + } + if (phoneNumber.countryCallingCode !== '44') { + return 'Please enter a valid UK number' + } + if (!phoneNumber.isValid()) { + return 'Sorry, this phone number is not valid.' + } + + const phoneNumberExists = await doesPhoneNumberExist({ + phoneNumber: phoneNumber.number, + }) + + if (phoneNumberExists) { + return 'This phone number is already registered with SnapEat. Do you already have an account?' + } +} + +const tooltipContents = ( + <> +

+ We need this information so we can send you regular reminders which will + help you stick to schedule. +

+

+ By securely sharing this additional information, you will help us to make + sure we are hearing and learning from a range of different households. +

+ +) + +const Phone = ({ setFieldValue }) => { + return ( + + + + ) +} +Phone.componentName = 'Phone' +Phone.validation = validation + +export default Phone diff --git a/components/onboarding/PostCode.js b/components/onboarding/PostCode.js new file mode 100644 index 0000000..9dcfa50 --- /dev/null +++ b/components/onboarding/PostCode.js @@ -0,0 +1,73 @@ +import * as Yup from 'yup' +import axios from 'axios' +import { Input, TextInput } from '../Input' +import OnboardingStep from './OnboardingStep' + +const validation = Yup.object().shape({ + postCode: Yup.string().required( + 'Please enter the start of your postcode to continue', + ), +}) + +const isPostCodeValid = async ({ postCode }) => { + const { + data: { postCodeArray }, + } = await axios( + `${process.env.HOST}/api/is-postcode-valid?postcode=${postCode}`, + ) + + if (postCodeArray === null) { + return { error: 'Not a valid UK postcode' } + } else if (postCode.split(' ').join('').length > 5) { + return { error: "Please don't enter more than the start of your postcode" } + } + + return { error: '' } +} + +const validatePostCode = async value => { + const { error } = await isPostCodeValid({ postCode: value }) + + return error +} + +const tooltipContents = ( + <> +

+ SnapEat uses the start of your postcode to understand where in Lambeth and + Southwark our snappers come from. +

+

+ The start of a postcode only tells us the general area you live in and + nothing else. +

+

+ Fun fact: on average 8,200 buildings + will have the same start to their postcode as you. +

+ +) + +const PostCode = () => ( + + + +) +PostCode.componentName = 'PostCode' +PostCode.validation = validation + +export default PostCode diff --git a/components/onboarding/Projects.js b/components/onboarding/Projects.js new file mode 100644 index 0000000..30a3085 --- /dev/null +++ b/components/onboarding/Projects.js @@ -0,0 +1,86 @@ +import { useState, useEffect } from 'react' +import axios from 'axios' +import * as Yup from 'yup' +import * as R from 'ramda' +import { Input, SelectInput } from '../Input' +import OnboardingStep from './OnboardingStep' + +const validation = Yup.object().shape({ + project: Yup.string().required('You need to select a project to continue'), +}) + +const tooltipContents = ( + <> +

+ At the SnapEat Project we want to learn what children in Lambeth and + Southwark are eating when they are at home. +

+

+ By securely sharing this additional information, you will help us to make + sure we are hearing and learning from a range of different households. +

+ +) + +const Projects = ({ values, setFieldValue }) => { + const [availableProjects, setAvailableProjects] = useState([]) + + useEffect(() => { + const source = axios.CancelToken.source() + + const getOptions = async () => { + try { + const { + data: { projects }, + } = await axios.get(`${process.env.HOST}/api/get-available-projects`, { + cancelToken: source.token, + }) + + return R.pipe( + R.map(({ name, slug }) => ({ + label: name, + value: slug, + })), + setAvailableProjects, + )(projects) + } catch (e) { + // eslint-disable-next-line + console.log('Inside useEffect catch') + } + } + + getOptions() + + return () => { + source.cancel() + } + }, []) + + return ( + + setFieldValue('project', value)} + placeholder="Select a project..." + className={values.project ? 'text-navy' : 'text-lightnavy'} + /> + + ) +} +Projects.componentName = 'Projects' +Projects.validation = validation + +export default Projects diff --git a/components/onboarding/Spinner.js b/components/onboarding/Spinner.js new file mode 100644 index 0000000..ce34323 --- /dev/null +++ b/components/onboarding/Spinner.js @@ -0,0 +1,20 @@ +import styled from 'styled-components' + +import loading from '../../public/icons/loading.svg' + +const Text = styled.p.attrs({ + className: 'font-xxl text-center text-white mb-5 mt-5', +})`` + +const Spinner = () => ( +
+
+ Loading + Uploading... +
+
+) + +Spinner.componentName = 'Spinner' + +export default Spinner diff --git a/components/onboarding/Success.js b/components/onboarding/Success.js new file mode 100644 index 0000000..bf9f80f --- /dev/null +++ b/components/onboarding/Success.js @@ -0,0 +1,43 @@ +import { useEffect } from 'react' +import styled from 'styled-components' + +import { useRouteDispatch } from '../../context/routeContext' +import { CHANGE_VIEW, HOME } from '../../utils/constants' + +import logo from '../../public/logos/logo1.svg' +import successBG from '../../public/backgrounds/success_bg.svg' + +const Success = () => { + const routeDispatch = useRouteDispatch() + + useEffect(() => { + const timeout = window.setTimeout( + () => routeDispatch({ type: CHANGE_VIEW, view: HOME }), + 2000, + ) + return () => { + window.clearTimeout(timeout) + } + }, [routeDispatch]) + + return ( + + SnapEat logo + All set + + ) +} + +const Container = styled.div.attrs({ + className: 'pt-5d5 w-screen h-screen font-xxl text-center', +})` + background: url(${successBG}) center 35% / 95% no-repeat; +` + +const Heading = styled.h1.attrs({ + className: 'font-bold absolute', +})` + bottom: calc(100vh - 35% - (0.95 * 100vw * 0.75)); + left: calc((100vw - 68px) / 2); +` +export default Success diff --git a/components/onboarding/index.js b/components/onboarding/index.js new file mode 100644 index 0000000..9b3cc1b --- /dev/null +++ b/components/onboarding/index.js @@ -0,0 +1,6 @@ +export const PostCode = 'PostCode' +export const NumberOfChildren = 'NumberOfChildren' +export const Ages = 'Ages' +export const Projects = 'Projects' +export const Phone = 'Phone' +export const Confirmation = 'Confirmation' diff --git a/context/AuthenicatedAppProviders.js b/context/AuthenicatedAppProviders.js new file mode 100644 index 0000000..6bb5d9e --- /dev/null +++ b/context/AuthenicatedAppProviders.js @@ -0,0 +1,7 @@ +import { FoodDataProvider } from './foodDataContext' + +const AppProviders = ({ children }) => ( + {children} +) + +export default AppProviders diff --git a/context/authContext.js b/context/authContext.js new file mode 100644 index 0000000..31ef539 --- /dev/null +++ b/context/authContext.js @@ -0,0 +1,116 @@ +import React, { useState, useEffect } from 'react' +import axios from 'axios' +import Spinner from '../views/Spinner' + +const AuthContext = React.createContext() + +const fetchAuth0User = async () => { + if (typeof window !== 'undefined' && window.__user) { + return window.__user + } + + try { + const { data: auth0User } = await axios.get('/api/me') + + if (typeof window !== 'undefined') { + window.__user = auth0User + } + return auth0User + } catch (err) { + delete window.__user + } +} + +const fetchSnapeatUser = async email => { + try { + const { + data: { doesUserExist: snapeatUserExists }, + } = await axios.get(`/api/does-user-exist?email=${email}`) + + if (snapeatUserExists) { + const { + data: { user: snapeatUser }, + } = await axios.get(`/api/get-user?email=${email}`) + + return snapeatUser + } + + return null + } catch (err) { + //eslint-disable-next-line + console.log('error fetching user', err) + } +} + +const AuthProvider = props => { + const [auth0Loading, setAuth0Loading] = useState( + () => !(typeof window !== 'undefined' && window.__user), + ) + + const [auth0User, setAuth0User] = useState(() => { + if (typeof window === 'undefined') { + return null + } + return window.__user || null + }) + + const [snapeatLoading, setSnapeatLoading] = useState(false) + const [snapeatUser, setSnapeatUser] = useState(null) + + useEffect(() => { + if (!auth0Loading && auth0User) { + return + } + setAuth0Loading(true) + + fetchAuth0User().then(fetchedAuth0User => { + if (!fetchedAuth0User) { + setAuth0Loading(false) + return + } + setAuth0User(fetchedAuth0User) + setAuth0Loading(false) + }) + }, []) + + useEffect(() => { + if (!auth0User) return + if (!snapeatLoading && snapeatUser) return + + setSnapeatLoading(true) + + fetchSnapeatUser(auth0User.name) + .then(fetchedSnapeatUser => { + if (!fetchedSnapeatUser) { + setSnapeatLoading(false) + return + } + setSnapeatUser(fetchedSnapeatUser) + setSnapeatLoading(false) + }) + .catch(e => { + // eslint-disable-next-line + console.log('Error fetching snapeat user', e) + return null + }) + }, [auth0User]) + + if (auth0Loading || snapeatLoading) return + + return ( + + ) +} + +const useAuth = () => { + const context = React.useContext(AuthContext) + if (context === undefined) { + throw new Error(`useAuth must be used within a AuthProvider`) + } + return context +} + +export { AuthProvider, useAuth } diff --git a/context/consentContext.js b/context/consentContext.js new file mode 100644 index 0000000..fb1c6b6 --- /dev/null +++ b/context/consentContext.js @@ -0,0 +1,46 @@ +import React from 'react' +import { NO_CONSENT_FROM_USER, SET_CONSENT } from '../utils/constants' + +const initialState = NO_CONSENT_FROM_USER + +const ConsentStateContext = React.createContext() +const ConsentDispatchContext = React.createContext() + +const consentReducer = (_, { consent, type }) => { + switch (type) { + case SET_CONSENT: + return consent + + default: + throw Error('Consent reducer action not recognised') + } +} + +const ConsentProvider = ({ children }) => { + const [state, dispatch] = React.useReducer(consentReducer, initialState) + return ( + + + {children} + + + ) +} + +const useConsentState = () => { + const context = React.useContext(ConsentStateContext) + if (context === undefined) { + throw new Error(`useConsentState must be used within a ConsentProvider`) + } + return context +} + +const useConsentDispatch = () => { + const context = React.useContext(ConsentDispatchContext) + if (context === undefined) { + throw new Error(`useConsentDispatch must be used within a ConsentProvider`) + } + return context +} + +export { ConsentProvider, useConsentState, useConsentDispatch } diff --git a/context/foodDataContext.js b/context/foodDataContext.js new file mode 100644 index 0000000..fd1358f --- /dev/null +++ b/context/foodDataContext.js @@ -0,0 +1,52 @@ +import React from 'react' +import { SET_FOOD_PHOTO } from '../utils/constants' + +const initialState = { + foodPhoto: {}, +} + +const FoodDataStateContext = React.createContext() +const FoodDataDispatchContext = React.createContext() + +const foodDataReducer = (state, { payload, type }) => { + switch (type) { + case SET_FOOD_PHOTO: + return { + foodPhoto: payload, + } + + default: + throw Error('FoodData reducer action not recognised') + } +} + +const FoodDataProvider = ({ children }) => { + const [state, dispatch] = React.useReducer(foodDataReducer, initialState) + return ( + + + {children} + + + ) +} + +const useFoodDataState = () => { + const context = React.useContext(FoodDataStateContext) + if (context === undefined) { + throw new Error(`useFoodDataState must be used within a FoodDataProvider`) + } + return context +} + +const useFoodDataDispatch = () => { + const context = React.useContext(FoodDataDispatchContext) + if (context === undefined) { + throw new Error( + `useFoodDataDispatch must be used within a FoodDataProvider`, + ) + } + return context +} + +export { FoodDataProvider, useFoodDataState, useFoodDataDispatch } diff --git a/context/projectContext.js b/context/projectContext.js new file mode 100644 index 0000000..02a2b54 --- /dev/null +++ b/context/projectContext.js @@ -0,0 +1,46 @@ +import React from 'react' + +import { NO_PROJECT, CHANGE_PROJECT } from '../utils/constants' + +const initialState = { project: undefined, error: NO_PROJECT } + +const ProjectStateContext = React.createContext() +const ProjectDispatchContext = React.createContext() + +const projectReducer = (_, { project, type }) => { + switch (type) { + case CHANGE_PROJECT: + return project + default: + return { error: NO_PROJECT } + } +} + +const ProjectProvider = ({ children }) => { + const [state, dispatch] = React.useReducer(projectReducer, initialState) + return ( + + + {children} + + + ) +} + +const useProjectState = () => { + const context = React.useContext(ProjectStateContext) + if (context === undefined) { + throw new Error(`useProjectState must be used within a ProjectProvider`) + } + return context +} + +const useProjectDispatch = () => { + const context = React.useContext(ProjectDispatchContext) + if (context === undefined) { + throw new Error(`useProjectDispatch must be used within a ProjectProvider`) + } + return context +} + +export { ProjectProvider, useProjectState, useProjectDispatch } diff --git a/utils/routeContext.js b/context/routeContext.js similarity index 80% rename from utils/routeContext.js rename to context/routeContext.js index 2b51784..a661bdb 100644 --- a/utils/routeContext.js +++ b/context/routeContext.js @@ -1,10 +1,10 @@ -import React from "react" -import { HOME, CHANGE_VIEW, GO_BACK } from "./constants" -import * as R from "ramda" +import React from 'react' +import * as R from 'ramda' +import { SPINNER, CHANGE_VIEW, GO_BACK } from '../utils/constants' const initialState = { - currentView: HOME, - history: [HOME], + currentView: SPINNER, + history: [SPINNER], } const RouteStateContext = React.createContext() @@ -24,6 +24,9 @@ const routeReducer = (state, { view, type }) => { currentView: lastView, history: [...state.history, lastView], } + + default: + throw Error('Route reducer action not recognised') } } @@ -54,4 +57,4 @@ const useRouteDispatch = () => { return context } -export { RouteProvider, useRouteState, useRouteDispatch } \ No newline at end of file +export { RouteProvider, useRouteState, useRouteDispatch } diff --git a/context/unauthRouteContext.js b/context/unauthRouteContext.js new file mode 100644 index 0000000..42ccfd3 --- /dev/null +++ b/context/unauthRouteContext.js @@ -0,0 +1,66 @@ +import React from 'react' +import * as R from 'ramda' +import { LANDING, CHANGE_VIEW, GO_BACK } from '../utils/constants' + +const initialState = { + currentView: LANDING, + history: [LANDING], +} + +const UnauthRouteStateContext = React.createContext() +const UnauthRouteDispatchContext = React.createContext() + +const unauthRouteReducer = (state, { view, type }) => { + const lastView = R.nth(-2)(state.history) + + switch (type) { + case CHANGE_VIEW: + return { + currentView: view, + history: [...state.history, view], + } + case GO_BACK: + return { + currentView: lastView, + history: [...state.history, lastView], + } + + default: + throw Error( + 'Route reducer action not recognised (from unathRouteContext)', + ) + } +} + +const UnauthRouteProvider = ({ children }) => { + const [state, dispatch] = React.useReducer(unauthRouteReducer, initialState) + return ( + + + {children} + + + ) +} + +const useRouteStateUnauth = () => { + const context = React.useContext(UnauthRouteStateContext) + if (context === undefined) { + throw new Error( + `useRouteState must be used within a RouteProvider (from unathRouteContext)`, + ) + } + return context +} + +const useRouteDispatchUnauth = () => { + const context = React.useContext(UnauthRouteDispatchContext) + if (context === undefined) { + throw new Error( + `useRouteDispatch must be used within a RouteProvider (from unathRouteContext)`, + ) + } + return context +} + +export { UnauthRouteProvider, useRouteStateUnauth, useRouteDispatchUnauth } diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..ab0632e --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,30 @@ +version: '3' +services: + prisma: + image: prismagraphql/prisma:1.34.10 + restart: always + ports: + - '4466:4466' + environment: + PRISMA_CONFIG: | + port: 4466 + managementApiSecret: ${PRISMA_MANAGEMENT_API_SECRET:?err} + databases: + default: + connector: postgres + host: postgres + port: 5432 + user: prisma + password: prisma + postgres: + image: postgres:10.3 + restart: always + ports: + - '5432:5432' + environment: + POSTGRES_USER: prisma + POSTGRES_PASSWORD: prisma + volumes: + - postgres:/var/lib/postgresql/data +volumes: + postgres: ~ diff --git a/jest.config.js b/jest.config.js new file mode 100644 index 0000000..36b10a3 --- /dev/null +++ b/jest.config.js @@ -0,0 +1,4 @@ +module.exports = { + ...require('./test/jest-common'), + projects: ['./test/jest.lint.js'], +} diff --git a/lib/auth0.js b/lib/auth0.js new file mode 100644 index 0000000..d70d59f --- /dev/null +++ b/lib/auth0.js @@ -0,0 +1,14 @@ +import { initAuth0 } from '@auth0/nextjs-auth0' + +export default initAuth0({ + clientId: process.env.AUTH0_CLIENT_ID, + clientSecret: process.env.AUTH0_CLIENT_SECRET, + scope: 'openid profile', + domain: process.env.AUTH0_DOMAIN, + redirectUri: `${process.env.HOST}/api/callback`, + postLogoutRedirectUri: process.env.HOST, + session: { + cookieSecret: process.env.SESSION_COOKIE_SECRET, + cookieLifetime: 60 * 60 * 24 * 180, + }, +}) diff --git a/lint-staged.config.js b/lint-staged.config.js new file mode 100644 index 0000000..5df1181 --- /dev/null +++ b/lint-staged.config.js @@ -0,0 +1,26 @@ +const escape = require('shell-quote').quote +const isWin = process.platform === 'win32' + +module.exports = { + '**/*.{js,jsx,ts,tsx}': filenames => { + const escapedFileNames = filenames + .map(filename => `"${isWin ? filename : escape([filename])}"`) + .join(' ') + return [ + `prettier --write ${escapedFileNames}`, + `jest --config test/jest.lint.js --passWithNoTests ${filenames + .map(f => `"${f}"`) + .join(' ')}`, + `git add ${escapedFileNames}`, + ] + }, + '**/*.{json,md,mdx,css,html,yml,yaml,scss,sass}': filenames => { + const escapedFileNames = filenames + .map(filename => `"${isWin ? filename : escape([filename])}"`) + .join(' ') + return [ + `prettier --write ${escapedFileNames}`, + `git add ${escapedFileNames}`, + ] + }, +} diff --git a/next.config.js b/next.config.js index fabb1b4..6ff7248 100644 --- a/next.config.js +++ b/next.config.js @@ -1,32 +1,39 @@ -const webpack = require("webpack") //eslint-disable-line -const path = require("path") //eslint-disable-line -const withPlugins = require("next-compose-plugins") -const withImages = require("next-images") -const withCSS = require("@zeit/next-css") -const withFonts = require("next-fonts") -const FRONTEND_ENV_KEYS = ["NODE_ENV", "HOST"] +const webpack = require('webpack') //eslint-disable-line +const path = require('path') //eslint-disable-line +const withPlugins = require('next-compose-plugins') +const withImages = require('next-images') +const withOffline = require('next-offline') +const withCSS = require('@zeit/next-css') +const withFonts = require('next-fonts') + +const FRONTEND_ENV_KEYS = ['NODE_ENV', 'HOST'] + +if (process.env.HEROKU_APP_NAME) { + process.env.HOST = `https://${process.env.HEROKU_APP_NAME}.herokuapp.com` +} + const envPlugin = FRONTEND_ENV_KEYS.reduce( - (result, key) => - Object.assign({}, result, { - [`process.env.${key}`]: JSON.stringify(process.env[key]), - }), - {} + (result, key) => ({ + ...result, + [`process.env.${key}`]: JSON.stringify(process.env[key]), + }), + {}, ) -module.exports = withPlugins([withImages, withCSS, withFonts], { +module.exports = withPlugins([withImages, withCSS, withFonts, withOffline], { webpack: (config, { isServer }) => { // adds access to specific env variables on front end config.plugins.push(new webpack.DefinePlugin(envPlugin)) // Fixes npm packages that depend on `fs` module if (!isServer) { config.node = { - fs: "empty", + fs: 'empty', } } config.plugins.push( new webpack.ProvidePlugin({ - cssTheme: path.resolve(path.join(__dirname, "utils/cssTheme")), - }) + cssTheme: path.resolve(path.join(__dirname, 'utils/cssTheme')), + }), ) return config }, -}) \ No newline at end of file +}) diff --git a/package.json b/package.json index f898487..33c429c 100644 --- a/package.json +++ b/package.json @@ -3,26 +3,73 @@ "version": "0.1.0", "private": true, "scripts": { - "dev": "next dev", - "build": "next build", - "start": "next start" + "==next==": "------------------------------------------------------------------------------------------", + "dev:nodemon": " nodemon --exec \"env-cmd -f ./.config/dev.env node --inspect server.js\" -w ./server.js -w ./next.config.js -w ./.config/dev.env", + "build": "NODE_ENV=production next build", + "start": "NODE_ENV=production node server.js", + "==lint&format==": "-----------------------------------------------------------------------------------", + "lint": "jest --config test/jest.lint.js", + "format": "npm run prettier -- --write", + "prettier": "prettier \"**/*.+(js|jsx|json|yml|yaml|css|less|scss|ts|tsx|md|graphql|mdx)\"", + "validate": "npm run lint && npm run prettier -- --list-different", + "==docker&prisma==": "---------------------------------------------------------------------------------", + "up": "docker-compose up -d", + "down": "docker-compose down --remove-orphans", + "deploy": "prisma deploy", + "schema": "prisma generate", + "token": "prisma token", + "==prisma-dev==": "--------------------------------------------------------------------------------------", + "dev:deploy": "env-cmd -f ./.config/dev.env npm run deploy && npm run dev:schema", + "dev:schema": "env-cmd -f ./.config/dev.env npm run schema", + "dev:token": "env-cmd -f ./.config/dev.env npm run token", + "dev:up": "env-cmd -f ./.config/dev.env npm run up", + "dev:down": "env-cmd -f ./.config/dev.env npm run down", + "dev:seed": "env-cmd -f ./.config/dev.env ts-node -O '{\"module\": \"commonjs\"}' ./prisma/seeds.ts", + "dev:flushdb": "env-cmd -f ./.config/dev.env ts-node -O '{\"module\": \"commonjs\"}' ./prisma/flushDB.ts", + "==prisma:staging==": "------------------------------------------------------------------------------------", + "staging:deploy": "env-cmd -f ./.config/staging.env npm run deploy && npm run staging:schema", + "staging:schema": "env-cmd -f ./.config/staging.env npm run schema", + "staging:token": "env-cmd -f ./.config/staging.env npm run token", + "staging:up": "env-cmd -f ./.config/staging.env npm run up", + "staging:down": "env-cmd -f ./.config/staging.env npm run down" + }, + "husky": { + "hooks": { + "pre-commit": "lint-staged" + } + }, + "jest-runner-eslint": { + "cliOptions": { + "fix": true, + "ext": [ + ".js", + ".ts" + ] + } }, "dependencies": { + "@auth0/nextjs-auth0": "^0.5.0", "@zeit/next-css": "^1.0.1", + "airtable": "^0.8.1", "axios": "^0.19.0", + "cloudinary": "^1.17.0", "connect-redis": "^4.0.3", "express": "^4.17.1", "express-session": "^1.17.0", "express-sslify": "^1.2.0", "formidable": "^1.2.1", - "formik": "^2.0.3", + "formik": "^2.0.4", "graphql": "^14.5.8", "graphql-tag": "^2.10.1", - "next": "9.1.3", + "libphonenumber-js": "^1.7.29", + "moment": "^2.24.0", + "next": "^9.1.4", "next-compose-plugins": "^2.2.0", "next-cookies": "^2.0.1", "next-fonts": "^0.19.0", "next-images": "^1.2.0", + "next-offline": "^4.0.6", + "node-cron": "^2.0.3", "passport": "^0.4.0", "passport-auth0": "^1.2.1", "prisma": "^1.34.10", @@ -32,28 +79,33 @@ "react-toastify": "^5.4.1", "redis": "^2.8.0", "styled-components": "^4.4.1", - "tailwindcss": "^1.1.3" + "tailwindcss": "^1.1.3", + "twilio": "^3.37.1", + "yup": "^0.27.0" }, "devDependencies": { "@types/formidable": "^1.0.31", "@types/node": "^12.12.7", - "@types/ramda": "^0.26.33", + "@types/ramda": "^0.26.34", "@types/react": "^16.9.11", - "babel-eslint": "^10.0.3", + "@typescript-eslint/eslint-plugin": "^2.9.0", + "@typescript-eslint/parser": "^2.9.0", + "autoprefixer": "^9.7.1", "concurrently": "^5.0.0", - "cors": "^2.8.5", "env-cmd": "^10.0.1", "eslint": "^6.6.0", - "eslint-config-esnext": "^4.0.0", - "eslint-config-node": "^4.0.0", - "eslint-config-prettier": "^6.5.0", - "eslint-plugin-babel": "^5.3.0", - "eslint-plugin-import": "^2.18.2", - "eslint-plugin-react": "^7.16.0", - "eslint-plugin-react-hooks": "^2.2.0", + "eslint-config-kentcdodds": "^14.6.1", + "eslint-config-prettier": "^6.7.0", + "eslint-import-resolver-typescript": "^2.0.0", + "husky": "^3.0.9", + "jest": "^24.9.0", + "jest-runner-eslint": "^0.7.5", + "lint-staged": "^9.4.3", "nodemon": "^1.19.4", "postcss-import": "^12.0.1", "prettier": "^1.19.1", + "shell-quote": "^1.7.2", + "tachyons": "^4.11.1", "typescript": "^3.7.2" } } diff --git a/pages/_app.js b/pages/_app.js index d123be4..147998a 100644 --- a/pages/_app.js +++ b/pages/_app.js @@ -1,15 +1,29 @@ -import React from "react" +import React from 'react' +import App from 'next/app' +import { ThemeProvider } from 'styled-components' +import { toast } from 'react-toastify' +import resolveConfig from 'tailwindcss/resolveConfig' -import App from "next/app" -import { RouteProvider } from "../utils/routeContext" +import { AuthProvider } from '../context/authContext' + +import tailwindConfig from '../tailwind.config' + +import 'react-toastify/dist/ReactToastify.min.css' +import '../styles/index.css' + +toast.configure() + +const { theme } = resolveConfig(tailwindConfig) class Snapeat extends App { render() { const { Component, pageProps } = this.props return ( - - - + + + + + ) } } diff --git a/pages/_error.js b/pages/_error.js new file mode 100644 index 0000000..28c45e7 --- /dev/null +++ b/pages/_error.js @@ -0,0 +1,58 @@ +import React from 'react' +import styled from 'styled-components' + +import logo from '../public/logos/logo1.svg' +import robot from '../public/icons/404-robot.svg' + +function Error({ statusCode }) { + return ( +
+ + Snapeat logo + + A cute little error robot +
+ + Oooops, it's {statusCode ? `a ${statusCode}` : 'an error'}! + + + We noticed you lost your way. Not to worry though! + + + Go back to the homepage but first, please{' '} + { + + tell us what happened{' '} + + } + . + +
+ +
+ ) +} + +const Text = styled.p.attrs({ + className: 'text-xl text-center m-5 sm:m-8', +})`` + +Error.getInitialProps = ({ res, err }) => { + const statusCode = res ? res.statusCode : err ? err.statusCode : 404 + return { statusCode } +} + +export default Error diff --git a/pages/api/callback.js b/pages/api/callback.js new file mode 100644 index 0000000..c334427 --- /dev/null +++ b/pages/api/callback.js @@ -0,0 +1,11 @@ +import auth0 from '../../lib/auth0' + +export default async function callback(req, res) { + try { + await auth0.handleCallback(req, res, { redirectTo: '/' }) + } catch (error) { + //eslint-disable-next-line no-console + console.error(error) + res.status(error.status || 500).end(error.message) + } +} diff --git a/pages/api/create-user.ts b/pages/api/create-user.ts new file mode 100644 index 0000000..00d0b4a --- /dev/null +++ b/pages/api/create-user.ts @@ -0,0 +1,49 @@ +import * as R from 'ramda' +import { NextApiRequest, NextApiResponse } from 'next' +//eslint-disable-next-line +import { prisma } from '../../prisma/generated/ts' + +interface Request { + postCode: string + ages: string[] + project: string + phoneNumber: string + email: string +} + +//eslint-disable-next-line +export default async (req: NextApiRequest, res: NextApiResponse) => { + try { + const { postCode, ages, project, phoneNumber, email }: Request = req.body + + const ageToChildren = R.map((age: string) => ({ age }))(ages) + + const user = await prisma.createUser({ + consentGDPR: true, + postCode, + email, + projects: { + connect: [ + { + slug: project, + }, + ], + }, + children: { + create: ageToChildren, + }, + phoneNumber, + }) + + if (user) { + return res.status(200).json({ user }) + } + + if (!user) { + return res.status(500).end() + } + } catch (e) { + console.log(`Error creating user`, e) //eslint-disable-line no-console + return res.status(400).end() + } +} diff --git a/pages/api/does-phonenumber-exist.ts b/pages/api/does-phonenumber-exist.ts new file mode 100644 index 0000000..dbb21aa --- /dev/null +++ b/pages/api/does-phonenumber-exist.ts @@ -0,0 +1,15 @@ +import { NextApiRequest, NextApiResponse } from 'next' + +//eslint-disable-next-line +import { prisma } from '../../prisma/generated/ts' + +export default async ( + req: NextApiRequest, + res: NextApiResponse, +): Promise => { + const doesPhoneNumberExist = await prisma.$exists.user({ + phoneNumber: req.query.phonenumber as string, + }) + + return res.status(200).json({ doesPhoneNumberExist }) +} diff --git a/pages/api/does-user-exist.ts b/pages/api/does-user-exist.ts new file mode 100644 index 0000000..133d5b0 --- /dev/null +++ b/pages/api/does-user-exist.ts @@ -0,0 +1,10 @@ +import { NextApiRequest, NextApiResponse } from 'next' +import { prisma } from '../../prisma/generated/ts' + +export default async (req: NextApiRequest, res: NextApiResponse) => { + const doesUserExist = await prisma.$exists.user({ + email: req.query.email as string, + }) + + return res.status(200).json({ doesUserExist }) +} diff --git a/pages/api/get-available-projects.ts b/pages/api/get-available-projects.ts new file mode 100644 index 0000000..8a3212a --- /dev/null +++ b/pages/api/get-available-projects.ts @@ -0,0 +1,19 @@ +import { NextApiRequest, NextApiResponse } from 'next' +//eslint-disable-next-line +import { prisma } from '../../prisma/generated/ts' +import { PROJECT_NOT_FOUND } from '../../utils/constants' + +//eslint-disable-next-line +export default async (req: NextApiRequest, res: NextApiResponse) => { + try { + const projects = await prisma.projects() + if (!projects) { + return res.status(404).json({ projects: { error: PROJECT_NOT_FOUND } }) + } + + return res.status(200).json({ projects }) + } catch (e) { + console.log(`Error getting available projects`, e) //eslint-disable-line no-console + return res.status(404).json({ projects: { error: PROJECT_NOT_FOUND } }) + } +} diff --git a/pages/api/get-project-from-slug.ts b/pages/api/get-project-from-slug.ts new file mode 100644 index 0000000..d8e05c4 --- /dev/null +++ b/pages/api/get-project-from-slug.ts @@ -0,0 +1,20 @@ +import { NextApiRequest, NextApiResponse } from 'next' +//eslint-disable-next-line +import { prisma } from '../../prisma/generated/ts' +import { PROJECT_NOT_FOUND } from '../../utils/constants' + +//eslint-disable-next-line +export default async (req: NextApiRequest, res: NextApiResponse) => { + const slug = req.query.slug as string + try { + const project = await prisma.project({ slug }) + if (!project) { + return res.status(404).json({ project: { error: PROJECT_NOT_FOUND } }) + } + + return res.status(200).json({ project }) + } catch (e) { + console.log(`Error getting project from slug ${slug}`, e) //eslint-disable-line no-console + return res.status(404).json({ project: { error: PROJECT_NOT_FOUND } }) + } +} diff --git a/pages/api/get-user.ts b/pages/api/get-user.ts new file mode 100644 index 0000000..7163a11 --- /dev/null +++ b/pages/api/get-user.ts @@ -0,0 +1,34 @@ +import { NextApiRequest, NextApiResponse } from 'next' + +//eslint-disable-next-line +import { prisma } from '../../prisma/generated/ts' + +import { USER_NOT_FOUND } from '../../utils/constants' + +const fragment = ` +fragment UserWithProjects on User { + id + consentGDPR + email + airtableId + projects { + slug + } +} +` + +//eslint-disable-next-line +export default async (req: NextApiRequest, res: NextApiResponse) => { + const email = req.query.email as string + try { + const user = await prisma.user({ email }).$fragment(fragment) + if (!user) { + return res.status(404).json({ user: { error: USER_NOT_FOUND } }) + } + + return res.status(200).json({ user }) + } catch (e) { + console.log(`Error getting user ${email}`, e) //eslint-disable-line no-console + return res.status(404).json({ project: { error: USER_NOT_FOUND } }) + } +} diff --git a/pages/api/is-postcode-valid.ts b/pages/api/is-postcode-valid.ts new file mode 100644 index 0000000..b356541 --- /dev/null +++ b/pages/api/is-postcode-valid.ts @@ -0,0 +1,23 @@ +import { NextApiRequest, NextApiResponse } from 'next' +import axios from 'axios' + +export default async ( + req: NextApiRequest, + res: NextApiResponse, +): Promise => { + const postcode = req.query.postcode as string + + try { + if (postcode) { + const { + data: { result }, + } = await axios.get( + `https://api.postcodes.io/postcodes/${postcode}/autocomplete`, + ) + return res.status(200).json({ postCodeArray: result }) + } + return res.status(200).json({ postCodeArray: null }) + } catch (e) { + console.log('Error validating postcode') //eslint-disable-line no-console + } +} diff --git a/pages/api/login.js b/pages/api/login.js new file mode 100644 index 0000000..6ebf128 --- /dev/null +++ b/pages/api/login.js @@ -0,0 +1,11 @@ +import auth0 from '../../lib/auth0' + +export default async function login(req, res) { + try { + await auth0.handleLogin(req, res) + } catch (error) { + //eslint-disable-next-line no-console + console.error(error) + res.status(error.status || 500).end(error.message) + } +} diff --git a/pages/api/logout.js b/pages/api/logout.js new file mode 100644 index 0000000..8ddb7fa --- /dev/null +++ b/pages/api/logout.js @@ -0,0 +1,11 @@ +import auth0 from '../../lib/auth0' + +export default async function logout(req, res) { + try { + await auth0.handleLogout(req, res) + } catch (error) { + //eslint-disable-next-line no-console + console.error(error) + res.status(error.status || 500).end(error.message) + } +} diff --git a/pages/api/me.js b/pages/api/me.js new file mode 100644 index 0000000..912b535 --- /dev/null +++ b/pages/api/me.js @@ -0,0 +1,14 @@ +import auth0 from '../../lib/auth0' + +//eslint-disable-next-line +import { prisma } from '../../prisma/generated/ts' + +export default async function me(req, res) { + try { + await auth0.handleProfile(req, res) + } catch (error) { + //eslint-disable-next-line no-console + console.error(error) + res.status(error.status || 500).end(error.message) + } +} diff --git a/pages/api/submit-food-data.ts b/pages/api/submit-food-data.ts new file mode 100644 index 0000000..2c071eb --- /dev/null +++ b/pages/api/submit-food-data.ts @@ -0,0 +1,89 @@ +import { NextApiRequest, NextApiResponse } from 'next' +import * as R from 'ramda' + +//eslint-disable-next-line +import { prisma } from '../../prisma/generated/ts' + +//eslint-disable-next-line +export default async (req: NextApiRequest, res: NextApiResponse) => { + try { + const { + imageURL, + categories, + proportionFruit, + proportionVeg, + tags, + user, + } = req.body + + //create meal + + const connectVeg = proportionVeg + ? { + proportionVeg: { + connect: { + name: proportionVeg, + }, + }, + } + : {} + + const connectFruit = proportionFruit + ? { + proportionFruit: { + connect: { + name: proportionFruit, + }, + }, + } + : {} + + const meal = await prisma.createMeal({ + imageURL, + user: { connect: { email: user.email } }, + ...connectVeg, + ...connectFruit, + }) + + //update meal categories + + await Promise.all( + R.map((category: string) => + prisma.updateMeal({ + data: { + categories: { + connect: { + name: category, + }, + }, + }, + where: { + id: meal.id, + }, + }), + )(categories), + ) + + await Promise.all( + R.map((tag: string) => + prisma.updateMeal({ + data: { + tags: { + connect: { + name: tag, + }, + }, + }, + where: { + id: meal.id, + }, + }), + )(tags), + ) + + res.status(200).json({ meal }) + } catch (e) { + //eslint-disable-next-line no-console + console.log('There was an error in submit food data:', e) + } +} diff --git a/pages/api/upload-meal-to-airtable.ts b/pages/api/upload-meal-to-airtable.ts new file mode 100644 index 0000000..c7db77b --- /dev/null +++ b/pages/api/upload-meal-to-airtable.ts @@ -0,0 +1,76 @@ +import { NextApiRequest, NextApiResponse } from 'next' +import Airtable from 'airtable' +import moment from 'moment' +import * as R from 'ramda' + +//eslint-disable-next-line +import { prisma } from '../../prisma/generated/ts' + +Airtable.configure({ + endpointUrl: 'https://api.airtable.com', + apiKey: process.env.AIRTABLE_API_KEY, +}) + +const base = Airtable.base(process.env.AIRTABLE_BASE) + +//eslint-disable-next-line +export default async (req: NextApiRequest, res: NextApiResponse) => { + try { + const { + imageURL, + categories, + proportionFruit, + proportionVeg, + tags, + userAirtableId, + mealId, + } = req.body + + const dbCategories = await prisma.categories() + const dbTags = await prisma.tags() + const dbProportions = await prisma.proportions() + interface AirtableDbLink { + name: string + airtableId: string + } + + const getAirtableIds = (airtableArray: AirtableDbLink[], prismaArray) => + R.pipe( + x => R.filter(({ name }) => R.contains(name)(airtableArray))(x), + x => R.map(({ airtableId }) => airtableId)(x as AirtableDbLink[]), + )(prismaArray) + + const Categories = getAirtableIds(categories, dbCategories) + const Tags = getAirtableIds(tags, dbTags) + const ProportionFruit = getAirtableIds([proportionFruit], dbProportions) + const ProportionVeg = getAirtableIds([proportionVeg], dbProportions) + + const [{ id: airtableMeal }] = await base('Meals').create([ + { + fields: { + Image: [ + { + url: imageURL, + }, + ], + 'User ID': [userAirtableId], + 'Proportion of Fruit': ProportionFruit, + 'Proportion of Veg': ProportionVeg, + Categories, + Tags, + 'Date and Time': moment(), + }, + }, + ]) + + await prisma.updateMeal({ + data: { airtableId: airtableMeal }, + where: { id: mealId }, + }) + return res.status(200).json({}) + } catch (e) { + //eslint-disable-next-line no-console + console.log('There was an error in upload-meal-to-airtable:', e) + return res.status(400).json({}) + } +} diff --git a/pages/api/upload-photo.ts b/pages/api/upload-photo.ts new file mode 100644 index 0000000..505b541 --- /dev/null +++ b/pages/api/upload-photo.ts @@ -0,0 +1,50 @@ +import { NextApiRequest, NextApiResponse } from 'next' +import formidable from 'formidable' +// import axios from 'axios' + +// import { prisma } from '../../prisma/generated/ts' + +const cloudinary = require('cloudinary').v2 + +cloudinary.config({ + //eslint-disable-next-line + cloud_name: process.env.CLOUDINARY_CLOUD_NAME, + //eslint-disable-next-line + api_key: process.env.CLOUDINARY_API_KEY, + //eslint-disable-next-line + api_secret: process.env.CLOUDINARY_API_SECRET, +}) + +//eslint-disable-next-line +export default async (req: NextApiRequest, res: NextApiResponse) => { + try { + const form = new formidable.IncomingForm() + form.parse(req, (err, _fields, files) => { + if (err) { + //eslint-disable-next-line no-console + console.error('form parsing error', err) + } + + const { photo } = files + + cloudinary.uploader.upload(`${photo.path}`, (error: any, result: any) => { + if (error) { + //eslint-disable-next-line no-console + console.error('cloudinary error error', error) + } + + const { url } = result + + res.status(200).json({ url }) + }) + }) + } catch (e) { + console.log('There was an error uploading the photo:', e) //eslint-disable-line no-console + } +} + +export const config = { + api: { + bodyParser: false, + }, +} diff --git a/pages/api/upload-user-to-airtable.ts b/pages/api/upload-user-to-airtable.ts new file mode 100644 index 0000000..419c615 --- /dev/null +++ b/pages/api/upload-user-to-airtable.ts @@ -0,0 +1,58 @@ +import { NextApiRequest, NextApiResponse } from 'next' +import Airtable from 'airtable' +import * as R from 'ramda' + +//eslint-disable-next-line +import { prisma } from '../../prisma/generated/ts' + +Airtable.configure({ + endpointUrl: 'https://api.airtable.com', + apiKey: process.env.AIRTABLE_API_KEY, +}) + +const base = Airtable.base(process.env.AIRTABLE_BASE) + +export default async (req: NextApiRequest, res: NextApiResponse) => { + try { + const { ages, postCode, project, consentGDPR = true, user } = req.body + + const fragment = ` + fragment ProjectId on Project { + airtableId + }` + + const { airtableId } = await prisma + .project({ slug: project }) + .$fragment(fragment) + + const [{ id: airtableParent }] = await base('Users').create([ + { + fields: { + Project: [airtableId], + 'Postcode Area': postCode, + 'Consent for Data Usage': consentGDPR, + }, + }, + ]) + + await base('Children').create( + R.map(age => ({ + fields: { + Parent: [airtableParent], + 'Age Group': age, + }, + }))(ages), + ) + + const updatedUser = await prisma.updateUser({ + data: { airtableId: airtableParent }, + where: { id: user.id }, + }) + + return res.status(200).json({ updatedUser }) + } catch (e) { + //eslint-disable-next-line no-console + console.log('There was an error in upload-user-to-airtable:', e) + return res.status(400).json({}) + } +} diff --git a/pages/index.js b/pages/index.js index d070655..210a043 100644 --- a/pages/index.js +++ b/pages/index.js @@ -1,22 +1,57 @@ -import React from "react" -import Head from "next/head" -import getView from "../views/getView" -import { useRouteState } from "../utils/routeContext" +import React, { useEffect } from 'react' +import Head from 'next/head' +import styled from 'styled-components' + +import { useAuth } from '../context/authContext' + +import { RouteProvider } from '../context/routeContext' +import { UnauthRouteProvider } from '../context/unauthRouteContext' +import { ConsentProvider } from '../context/consentContext' + +import AuthenticatedApp from '../apps/AuthenticatedApp' +import UnauthenticatedApp from '../apps/UnauthenticatedApp' + +const Container = styled.section.attrs({ + className: 'bg-lightgray w-screen h-screen', +})`` + +// TODO: check that everything that was in _app.js and pages/index.js (ie toast and css and ting) is still in new setup const Index = () => { - const { currentView } = useRouteState() + const { auth0User } = useAuth() + + useEffect(() => { + const iOS = + !!navigator.platform && /iPad|iPhone|iPod/.test(navigator.platform) + + if (iOS) { + const manifestLink = document.getElementById('manifest-link') + manifestLink.parentNode.removeChild(manifestLink) + } + }, []) return ( <> - App + SnapEat + + -
-

Welcome to Snapeat

- {getView(currentView)} -
+ + + {auth0User ? ( + + + + ) : ( + + + + )} + + ) } diff --git a/postcss.config.js b/postcss.config.js index 7c22d2e..c9dbc3a 100644 --- a/postcss.config.js +++ b/postcss.config.js @@ -1,7 +1,7 @@ module.exports = { plugins: [ - require("postcss-import"), - require("tailwindcss"), - require("autoprefixer") - ] -}; + require('postcss-import'), + require('tailwindcss'), + require('autoprefixer'), + ], +} diff --git a/prisma/datamodel.prisma b/prisma/datamodel.prisma new file mode 100644 index 0000000..277fdce --- /dev/null +++ b/prisma/datamodel.prisma @@ -0,0 +1,74 @@ +type User { + id: ID! @id + airtableId: String @unique + consentGDPR: Boolean! + postCode: String! + email: String! @unique + meals: [Meal] @relation(onDelete: CASCADE) + projects: [Project!] @relation(onDelete: SET_NULL) + children: [Child!] @relation(onDelete: CASCADE) + phoneNumber: String! @unique + updatedAt: DateTime! @updatedAt + createdAt: DateTime! @createdAt +} + +type Child { + id: ID! @id + airtableId: String @unique + Parent: User! @relation(onDelete: SET_NULL) + age: String! + updatedAt: DateTime! @updatedAt + createdAt: DateTime! @createdAt +} + +type Meal { + id: ID! @id + airtableId: String @unique + user: User! + imageURL: String! + categories: [Category!] @relation(onDelete: SET_NULL) + tags: [Tag] @relation(onDelete: SET_NULL) + updatedAt: DateTime! @updatedAt + createdAt: DateTime! @createdAt + proportionFruit: Proportion @relation(name: "Fruit") + proportionVeg: Proportion @relation(name: "Veg") +} + +type Tag { + id: ID! @id + airtableId: String @unique + name: String! @unique + meals: [Meal] @relation(onDelete: SET_NULL) + updatedAt: DateTime! @updatedAt + createdAt: DateTime! @createdAt +} + +type Category { + id: ID! @id + airtableId: String @unique + name: String! @unique + meals: [Meal!] @relation(onDelete: SET_NULL) + updatedAt: DateTime! @updatedAt + createdAt: DateTime! @createdAt +} + + +type Project { + id: ID! @id + airtableId: String @unique + name: String! + slug: String! @unique + users: [User!] @relation(onDelete: CASCADE) + updatedAt: DateTime! @updatedAt + createdAt: DateTime! @createdAt +} + +type Proportion { + id: ID! @id + airtableId: String @unique + name: String! @unique + fruitMeals: [Meal] @relation(name: "Fruit") + vegMeals: [Meal] @relation(name: "Veg") + updatedAt: DateTime! @updatedAt + createdAt: DateTime! @createdAt +} \ No newline at end of file diff --git a/prisma/flushDB.ts b/prisma/flushDB.ts new file mode 100644 index 0000000..a59f541 --- /dev/null +++ b/prisma/flushDB.ts @@ -0,0 +1,40 @@ +import { prisma } from './generated/ts' + +const flushDB = async () => { + const deleteCategories = await prisma.deleteManyCategories({ + id_not: 0, + }) + + const deleteTags = await prisma.deleteManyTags({ + id_not: 0, + }) + + const deleteProportions = await prisma.deleteManyProportions({ + id_not: 0, + }) + const deleteMeals = await prisma.deleteManyMeals({ + id_not: 0, + }) + + const deleteUsers = await prisma.deleteManyUsers({ + id_not: 0, + }) + + const deleteProjects = await prisma.deleteManyProjects({ + id_not: 0, + }) + + const deleteChildren = await prisma.deleteManyChildren({ + id_not: 0, + }) + + console.log(JSON.stringify(deleteChildren, undefined, 2)) //eslint-disable-line no-console + console.log(JSON.stringify(deleteCategories, undefined, 2)) //eslint-disable-line no-console + console.log(JSON.stringify(deleteProjects, undefined, 2)) //eslint-disable-line no-console + console.log(JSON.stringify(deleteUsers, undefined, 2)) //eslint-disable-line no-console + console.log(JSON.stringify(deleteMeals, undefined, 2)) //eslint-disable-line no-console + console.log(JSON.stringify(deleteProportions, undefined, 2)) //eslint-disable-line no-console + console.log(JSON.stringify(deleteTags, undefined, 2)) //eslint-disable-line no-console +} + +export default flushDB diff --git a/prisma/generated/js/index.d.ts b/prisma/generated/js/index.d.ts new file mode 100644 index 0000000..382d838 --- /dev/null +++ b/prisma/generated/js/index.d.ts @@ -0,0 +1,3852 @@ +// Code generated by Prisma (prisma@1.34.10). DO NOT EDIT. +// Please don't change this file manually but run `prisma generate` to update it. +// For more information, please read the docs: https://www.prisma.io/docs/prisma-client/ + +import { DocumentNode } from "graphql"; +import { + makePrismaClientClass, + BaseClientOptions, + Model +} from "prisma-client-lib"; +import { typeDefs } from "./prisma-schema"; + +export type AtLeastOne }> = Partial & + U[keyof U]; + +export type Maybe = T | undefined | null; + +export interface Exists { + category: (where?: CategoryWhereInput) => Promise; + child: (where?: ChildWhereInput) => Promise; + meal: (where?: MealWhereInput) => Promise; + project: (where?: ProjectWhereInput) => Promise; + proportion: (where?: ProportionWhereInput) => Promise; + tag: (where?: TagWhereInput) => Promise; + user: (where?: UserWhereInput) => Promise; +} + +export interface Node {} + +export type FragmentableArray = Promise> & Fragmentable; + +export interface Fragmentable { + $fragment(fragment: string | DocumentNode): Promise; +} + +export interface Prisma { + $exists: Exists; + $graphql: ( + query: string, + variables?: { [key: string]: any } + ) => Promise; + + /** + * Queries + */ + + category: (where: CategoryWhereUniqueInput) => CategoryNullablePromise; + categories: (args?: { + where?: CategoryWhereInput; + orderBy?: CategoryOrderByInput; + skip?: Int; + after?: String; + before?: String; + first?: Int; + last?: Int; + }) => FragmentableArray; + categoriesConnection: (args?: { + where?: CategoryWhereInput; + orderBy?: CategoryOrderByInput; + skip?: Int; + after?: String; + before?: String; + first?: Int; + last?: Int; + }) => CategoryConnectionPromise; + child: (where: ChildWhereUniqueInput) => ChildNullablePromise; + children: (args?: { + where?: ChildWhereInput; + orderBy?: ChildOrderByInput; + skip?: Int; + after?: String; + before?: String; + first?: Int; + last?: Int; + }) => FragmentableArray; + childrenConnection: (args?: { + where?: ChildWhereInput; + orderBy?: ChildOrderByInput; + skip?: Int; + after?: String; + before?: String; + first?: Int; + last?: Int; + }) => ChildConnectionPromise; + meal: (where: MealWhereUniqueInput) => MealNullablePromise; + meals: (args?: { + where?: MealWhereInput; + orderBy?: MealOrderByInput; + skip?: Int; + after?: String; + before?: String; + first?: Int; + last?: Int; + }) => FragmentableArray; + mealsConnection: (args?: { + where?: MealWhereInput; + orderBy?: MealOrderByInput; + skip?: Int; + after?: String; + before?: String; + first?: Int; + last?: Int; + }) => MealConnectionPromise; + project: (where: ProjectWhereUniqueInput) => ProjectNullablePromise; + projects: (args?: { + where?: ProjectWhereInput; + orderBy?: ProjectOrderByInput; + skip?: Int; + after?: String; + before?: String; + first?: Int; + last?: Int; + }) => FragmentableArray; + projectsConnection: (args?: { + where?: ProjectWhereInput; + orderBy?: ProjectOrderByInput; + skip?: Int; + after?: String; + before?: String; + first?: Int; + last?: Int; + }) => ProjectConnectionPromise; + proportion: (where: ProportionWhereUniqueInput) => ProportionNullablePromise; + proportions: (args?: { + where?: ProportionWhereInput; + orderBy?: ProportionOrderByInput; + skip?: Int; + after?: String; + before?: String; + first?: Int; + last?: Int; + }) => FragmentableArray; + proportionsConnection: (args?: { + where?: ProportionWhereInput; + orderBy?: ProportionOrderByInput; + skip?: Int; + after?: String; + before?: String; + first?: Int; + last?: Int; + }) => ProportionConnectionPromise; + tag: (where: TagWhereUniqueInput) => TagNullablePromise; + tags: (args?: { + where?: TagWhereInput; + orderBy?: TagOrderByInput; + skip?: Int; + after?: String; + before?: String; + first?: Int; + last?: Int; + }) => FragmentableArray; + tagsConnection: (args?: { + where?: TagWhereInput; + orderBy?: TagOrderByInput; + skip?: Int; + after?: String; + before?: String; + first?: Int; + last?: Int; + }) => TagConnectionPromise; + user: (where: UserWhereUniqueInput) => UserNullablePromise; + users: (args?: { + where?: UserWhereInput; + orderBy?: UserOrderByInput; + skip?: Int; + after?: String; + before?: String; + first?: Int; + last?: Int; + }) => FragmentableArray; + usersConnection: (args?: { + where?: UserWhereInput; + orderBy?: UserOrderByInput; + skip?: Int; + after?: String; + before?: String; + first?: Int; + last?: Int; + }) => UserConnectionPromise; + node: (args: { id: ID_Output }) => Node; + + /** + * Mutations + */ + + createCategory: (data: CategoryCreateInput) => CategoryPromise; + updateCategory: (args: { + data: CategoryUpdateInput; + where: CategoryWhereUniqueInput; + }) => CategoryPromise; + updateManyCategories: (args: { + data: CategoryUpdateManyMutationInput; + where?: CategoryWhereInput; + }) => BatchPayloadPromise; + upsertCategory: (args: { + where: CategoryWhereUniqueInput; + create: CategoryCreateInput; + update: CategoryUpdateInput; + }) => CategoryPromise; + deleteCategory: (where: CategoryWhereUniqueInput) => CategoryPromise; + deleteManyCategories: (where?: CategoryWhereInput) => BatchPayloadPromise; + createChild: (data: ChildCreateInput) => ChildPromise; + updateChild: (args: { + data: ChildUpdateInput; + where: ChildWhereUniqueInput; + }) => ChildPromise; + updateManyChildren: (args: { + data: ChildUpdateManyMutationInput; + where?: ChildWhereInput; + }) => BatchPayloadPromise; + upsertChild: (args: { + where: ChildWhereUniqueInput; + create: ChildCreateInput; + update: ChildUpdateInput; + }) => ChildPromise; + deleteChild: (where: ChildWhereUniqueInput) => ChildPromise; + deleteManyChildren: (where?: ChildWhereInput) => BatchPayloadPromise; + createMeal: (data: MealCreateInput) => MealPromise; + updateMeal: (args: { + data: MealUpdateInput; + where: MealWhereUniqueInput; + }) => MealPromise; + updateManyMeals: (args: { + data: MealUpdateManyMutationInput; + where?: MealWhereInput; + }) => BatchPayloadPromise; + upsertMeal: (args: { + where: MealWhereUniqueInput; + create: MealCreateInput; + update: MealUpdateInput; + }) => MealPromise; + deleteMeal: (where: MealWhereUniqueInput) => MealPromise; + deleteManyMeals: (where?: MealWhereInput) => BatchPayloadPromise; + createProject: (data: ProjectCreateInput) => ProjectPromise; + updateProject: (args: { + data: ProjectUpdateInput; + where: ProjectWhereUniqueInput; + }) => ProjectPromise; + updateManyProjects: (args: { + data: ProjectUpdateManyMutationInput; + where?: ProjectWhereInput; + }) => BatchPayloadPromise; + upsertProject: (args: { + where: ProjectWhereUniqueInput; + create: ProjectCreateInput; + update: ProjectUpdateInput; + }) => ProjectPromise; + deleteProject: (where: ProjectWhereUniqueInput) => ProjectPromise; + deleteManyProjects: (where?: ProjectWhereInput) => BatchPayloadPromise; + createProportion: (data: ProportionCreateInput) => ProportionPromise; + updateProportion: (args: { + data: ProportionUpdateInput; + where: ProportionWhereUniqueInput; + }) => ProportionPromise; + updateManyProportions: (args: { + data: ProportionUpdateManyMutationInput; + where?: ProportionWhereInput; + }) => BatchPayloadPromise; + upsertProportion: (args: { + where: ProportionWhereUniqueInput; + create: ProportionCreateInput; + update: ProportionUpdateInput; + }) => ProportionPromise; + deleteProportion: (where: ProportionWhereUniqueInput) => ProportionPromise; + deleteManyProportions: (where?: ProportionWhereInput) => BatchPayloadPromise; + createTag: (data: TagCreateInput) => TagPromise; + updateTag: (args: { + data: TagUpdateInput; + where: TagWhereUniqueInput; + }) => TagPromise; + updateManyTags: (args: { + data: TagUpdateManyMutationInput; + where?: TagWhereInput; + }) => BatchPayloadPromise; + upsertTag: (args: { + where: TagWhereUniqueInput; + create: TagCreateInput; + update: TagUpdateInput; + }) => TagPromise; + deleteTag: (where: TagWhereUniqueInput) => TagPromise; + deleteManyTags: (where?: TagWhereInput) => BatchPayloadPromise; + createUser: (data: UserCreateInput) => UserPromise; + updateUser: (args: { + data: UserUpdateInput; + where: UserWhereUniqueInput; + }) => UserPromise; + updateManyUsers: (args: { + data: UserUpdateManyMutationInput; + where?: UserWhereInput; + }) => BatchPayloadPromise; + upsertUser: (args: { + where: UserWhereUniqueInput; + create: UserCreateInput; + update: UserUpdateInput; + }) => UserPromise; + deleteUser: (where: UserWhereUniqueInput) => UserPromise; + deleteManyUsers: (where?: UserWhereInput) => BatchPayloadPromise; + + /** + * Subscriptions + */ + + $subscribe: Subscription; +} + +export interface Subscription { + category: ( + where?: CategorySubscriptionWhereInput + ) => CategorySubscriptionPayloadSubscription; + child: ( + where?: ChildSubscriptionWhereInput + ) => ChildSubscriptionPayloadSubscription; + meal: ( + where?: MealSubscriptionWhereInput + ) => MealSubscriptionPayloadSubscription; + project: ( + where?: ProjectSubscriptionWhereInput + ) => ProjectSubscriptionPayloadSubscription; + proportion: ( + where?: ProportionSubscriptionWhereInput + ) => ProportionSubscriptionPayloadSubscription; + tag: ( + where?: TagSubscriptionWhereInput + ) => TagSubscriptionPayloadSubscription; + user: ( + where?: UserSubscriptionWhereInput + ) => UserSubscriptionPayloadSubscription; +} + +export interface ClientConstructor { + new (options?: BaseClientOptions): T; +} + +/** + * Types + */ + +export type MealOrderByInput = + | "id_ASC" + | "id_DESC" + | "airtableId_ASC" + | "airtableId_DESC" + | "imageURL_ASC" + | "imageURL_DESC" + | "updatedAt_ASC" + | "updatedAt_DESC" + | "createdAt_ASC" + | "createdAt_DESC"; + +export type ProjectOrderByInput = + | "id_ASC" + | "id_DESC" + | "airtableId_ASC" + | "airtableId_DESC" + | "name_ASC" + | "name_DESC" + | "slug_ASC" + | "slug_DESC" + | "updatedAt_ASC" + | "updatedAt_DESC" + | "createdAt_ASC" + | "createdAt_DESC"; + +export type UserOrderByInput = + | "id_ASC" + | "id_DESC" + | "airtableId_ASC" + | "airtableId_DESC" + | "consentGDPR_ASC" + | "consentGDPR_DESC" + | "postCode_ASC" + | "postCode_DESC" + | "email_ASC" + | "email_DESC" + | "phoneNumber_ASC" + | "phoneNumber_DESC" + | "updatedAt_ASC" + | "updatedAt_DESC" + | "createdAt_ASC" + | "createdAt_DESC"; + +export type ChildOrderByInput = + | "id_ASC" + | "id_DESC" + | "airtableId_ASC" + | "airtableId_DESC" + | "age_ASC" + | "age_DESC" + | "updatedAt_ASC" + | "updatedAt_DESC" + | "createdAt_ASC" + | "createdAt_DESC"; + +export type CategoryOrderByInput = + | "id_ASC" + | "id_DESC" + | "airtableId_ASC" + | "airtableId_DESC" + | "name_ASC" + | "name_DESC" + | "updatedAt_ASC" + | "updatedAt_DESC" + | "createdAt_ASC" + | "createdAt_DESC"; + +export type TagOrderByInput = + | "id_ASC" + | "id_DESC" + | "airtableId_ASC" + | "airtableId_DESC" + | "name_ASC" + | "name_DESC" + | "updatedAt_ASC" + | "updatedAt_DESC" + | "createdAt_ASC" + | "createdAt_DESC"; + +export type ProportionOrderByInput = + | "id_ASC" + | "id_DESC" + | "airtableId_ASC" + | "airtableId_DESC" + | "name_ASC" + | "name_DESC" + | "updatedAt_ASC" + | "updatedAt_DESC" + | "createdAt_ASC" + | "createdAt_DESC"; + +export type MutationType = "CREATED" | "UPDATED" | "DELETED"; + +export interface TagUpdateWithWhereUniqueWithoutMealsInput { + where: TagWhereUniqueInput; + data: TagUpdateWithoutMealsDataInput; +} + +export type CategoryWhereUniqueInput = AtLeastOne<{ + id: Maybe; + airtableId?: Maybe; + name?: Maybe; +}>; + +export interface TagUpdateManyDataInput { + airtableId?: Maybe; + name?: Maybe; +} + +export interface CategoryWhereInput { + id?: Maybe; + id_not?: Maybe; + id_in?: Maybe; + id_not_in?: Maybe; + id_lt?: Maybe; + id_lte?: Maybe; + id_gt?: Maybe; + id_gte?: Maybe; + id_contains?: Maybe; + id_not_contains?: Maybe; + id_starts_with?: Maybe; + id_not_starts_with?: Maybe; + id_ends_with?: Maybe; + id_not_ends_with?: Maybe; + airtableId?: Maybe; + airtableId_not?: Maybe; + airtableId_in?: Maybe; + airtableId_not_in?: Maybe; + airtableId_lt?: Maybe; + airtableId_lte?: Maybe; + airtableId_gt?: Maybe; + airtableId_gte?: Maybe; + airtableId_contains?: Maybe; + airtableId_not_contains?: Maybe; + airtableId_starts_with?: Maybe; + airtableId_not_starts_with?: Maybe; + airtableId_ends_with?: Maybe; + airtableId_not_ends_with?: Maybe; + name?: Maybe; + name_not?: Maybe; + name_in?: Maybe; + name_not_in?: Maybe; + name_lt?: Maybe; + name_lte?: Maybe; + name_gt?: Maybe; + name_gte?: Maybe; + name_contains?: Maybe; + name_not_contains?: Maybe; + name_starts_with?: Maybe; + name_not_starts_with?: Maybe; + name_ends_with?: Maybe; + name_not_ends_with?: Maybe; + meals_every?: Maybe; + meals_some?: Maybe; + meals_none?: Maybe; + updatedAt?: Maybe; + updatedAt_not?: Maybe; + updatedAt_in?: Maybe; + updatedAt_not_in?: Maybe; + updatedAt_lt?: Maybe; + updatedAt_lte?: Maybe; + updatedAt_gt?: Maybe; + updatedAt_gte?: Maybe; + createdAt?: Maybe; + createdAt_not?: Maybe; + createdAt_in?: Maybe; + createdAt_not_in?: Maybe; + createdAt_lt?: Maybe; + createdAt_lte?: Maybe; + createdAt_gt?: Maybe; + createdAt_gte?: Maybe; + AND?: Maybe; + OR?: Maybe; + NOT?: Maybe; +} + +export interface ProportionUpdateOneWithoutFruitMealsInput { + create?: Maybe; + update?: Maybe; + upsert?: Maybe; + delete?: Maybe; + disconnect?: Maybe; + connect?: Maybe; +} + +export interface ProportionWhereInput { + id?: Maybe; + id_not?: Maybe; + id_in?: Maybe; + id_not_in?: Maybe; + id_lt?: Maybe; + id_lte?: Maybe; + id_gt?: Maybe; + id_gte?: Maybe; + id_contains?: Maybe; + id_not_contains?: Maybe; + id_starts_with?: Maybe; + id_not_starts_with?: Maybe; + id_ends_with?: Maybe; + id_not_ends_with?: Maybe; + airtableId?: Maybe; + airtableId_not?: Maybe; + airtableId_in?: Maybe; + airtableId_not_in?: Maybe; + airtableId_lt?: Maybe; + airtableId_lte?: Maybe; + airtableId_gt?: Maybe; + airtableId_gte?: Maybe; + airtableId_contains?: Maybe; + airtableId_not_contains?: Maybe; + airtableId_starts_with?: Maybe; + airtableId_not_starts_with?: Maybe; + airtableId_ends_with?: Maybe; + airtableId_not_ends_with?: Maybe; + name?: Maybe; + name_not?: Maybe; + name_in?: Maybe; + name_not_in?: Maybe; + name_lt?: Maybe; + name_lte?: Maybe; + name_gt?: Maybe; + name_gte?: Maybe; + name_contains?: Maybe; + name_not_contains?: Maybe; + name_starts_with?: Maybe; + name_not_starts_with?: Maybe; + name_ends_with?: Maybe; + name_not_ends_with?: Maybe; + fruitMeals_every?: Maybe; + fruitMeals_some?: Maybe; + fruitMeals_none?: Maybe; + vegMeals_every?: Maybe; + vegMeals_some?: Maybe; + vegMeals_none?: Maybe; + updatedAt?: Maybe; + updatedAt_not?: Maybe; + updatedAt_in?: Maybe; + updatedAt_not_in?: Maybe; + updatedAt_lt?: Maybe; + updatedAt_lte?: Maybe; + updatedAt_gt?: Maybe; + updatedAt_gte?: Maybe; + createdAt?: Maybe; + createdAt_not?: Maybe; + createdAt_in?: Maybe; + createdAt_not_in?: Maybe; + createdAt_lt?: Maybe; + createdAt_lte?: Maybe; + createdAt_gt?: Maybe; + createdAt_gte?: Maybe; + AND?: Maybe; + OR?: Maybe; + NOT?: Maybe; +} + +export interface UserUpdateWithoutMealsDataInput { + airtableId?: Maybe; + consentGDPR?: Maybe; + postCode?: Maybe; + email?: Maybe; + projects?: Maybe; + children?: Maybe; + phoneNumber?: Maybe; +} + +export interface MealUpdateManyMutationInput { + airtableId?: Maybe; + imageURL?: Maybe; +} + +export interface ProjectUpdateManyWithoutUsersInput { + create?: Maybe< + ProjectCreateWithoutUsersInput[] | ProjectCreateWithoutUsersInput + >; + delete?: Maybe; + connect?: Maybe; + set?: Maybe; + disconnect?: Maybe; + update?: Maybe< + | ProjectUpdateWithWhereUniqueWithoutUsersInput[] + | ProjectUpdateWithWhereUniqueWithoutUsersInput + >; + upsert?: Maybe< + | ProjectUpsertWithWhereUniqueWithoutUsersInput[] + | ProjectUpsertWithWhereUniqueWithoutUsersInput + >; + deleteMany?: Maybe; + updateMany?: Maybe< + | ProjectUpdateManyWithWhereNestedInput[] + | ProjectUpdateManyWithWhereNestedInput + >; +} + +export interface ProportionUpdateWithoutFruitMealsDataInput { + airtableId?: Maybe; + name?: Maybe; + vegMeals?: Maybe; +} + +export interface ProjectUpdateWithWhereUniqueWithoutUsersInput { + where: ProjectWhereUniqueInput; + data: ProjectUpdateWithoutUsersDataInput; +} + +export interface TagSubscriptionWhereInput { + mutation_in?: Maybe; + updatedFields_contains?: Maybe; + updatedFields_contains_every?: Maybe; + updatedFields_contains_some?: Maybe; + node?: Maybe; + AND?: Maybe; + OR?: Maybe; + NOT?: Maybe; +} + +export interface ProjectUpdateWithoutUsersDataInput { + airtableId?: Maybe; + name?: Maybe; + slug?: Maybe; +} + +export interface ProjectWhereInput { + id?: Maybe; + id_not?: Maybe; + id_in?: Maybe; + id_not_in?: Maybe; + id_lt?: Maybe; + id_lte?: Maybe; + id_gt?: Maybe; + id_gte?: Maybe; + id_contains?: Maybe; + id_not_contains?: Maybe; + id_starts_with?: Maybe; + id_not_starts_with?: Maybe; + id_ends_with?: Maybe; + id_not_ends_with?: Maybe; + airtableId?: Maybe; + airtableId_not?: Maybe; + airtableId_in?: Maybe; + airtableId_not_in?: Maybe; + airtableId_lt?: Maybe; + airtableId_lte?: Maybe; + airtableId_gt?: Maybe; + airtableId_gte?: Maybe; + airtableId_contains?: Maybe; + airtableId_not_contains?: Maybe; + airtableId_starts_with?: Maybe; + airtableId_not_starts_with?: Maybe; + airtableId_ends_with?: Maybe; + airtableId_not_ends_with?: Maybe; + name?: Maybe; + name_not?: Maybe; + name_in?: Maybe; + name_not_in?: Maybe; + name_lt?: Maybe; + name_lte?: Maybe; + name_gt?: Maybe; + name_gte?: Maybe; + name_contains?: Maybe; + name_not_contains?: Maybe; + name_starts_with?: Maybe; + name_not_starts_with?: Maybe; + name_ends_with?: Maybe; + name_not_ends_with?: Maybe; + slug?: Maybe; + slug_not?: Maybe; + slug_in?: Maybe; + slug_not_in?: Maybe; + slug_lt?: Maybe; + slug_lte?: Maybe; + slug_gt?: Maybe; + slug_gte?: Maybe; + slug_contains?: Maybe; + slug_not_contains?: Maybe; + slug_starts_with?: Maybe; + slug_not_starts_with?: Maybe; + slug_ends_with?: Maybe; + slug_not_ends_with?: Maybe; + users_every?: Maybe; + users_some?: Maybe; + users_none?: Maybe; + updatedAt?: Maybe; + updatedAt_not?: Maybe; + updatedAt_in?: Maybe; + updatedAt_not_in?: Maybe; + updatedAt_lt?: Maybe; + updatedAt_lte?: Maybe; + updatedAt_gt?: Maybe; + updatedAt_gte?: Maybe; + createdAt?: Maybe; + createdAt_not?: Maybe; + createdAt_in?: Maybe; + createdAt_not_in?: Maybe; + createdAt_lt?: Maybe; + createdAt_lte?: Maybe; + createdAt_gt?: Maybe; + createdAt_gte?: Maybe; + AND?: Maybe; + OR?: Maybe; + NOT?: Maybe; +} + +export interface ProjectUpsertWithWhereUniqueWithoutUsersInput { + where: ProjectWhereUniqueInput; + update: ProjectUpdateWithoutUsersDataInput; + create: ProjectCreateWithoutUsersInput; +} + +export interface MealSubscriptionWhereInput { + mutation_in?: Maybe; + updatedFields_contains?: Maybe; + updatedFields_contains_every?: Maybe; + updatedFields_contains_some?: Maybe; + node?: Maybe; + AND?: Maybe; + OR?: Maybe; + NOT?: Maybe; +} + +export interface ProjectScalarWhereInput { + id?: Maybe; + id_not?: Maybe; + id_in?: Maybe; + id_not_in?: Maybe; + id_lt?: Maybe; + id_lte?: Maybe; + id_gt?: Maybe; + id_gte?: Maybe; + id_contains?: Maybe; + id_not_contains?: Maybe; + id_starts_with?: Maybe; + id_not_starts_with?: Maybe; + id_ends_with?: Maybe; + id_not_ends_with?: Maybe; + airtableId?: Maybe; + airtableId_not?: Maybe; + airtableId_in?: Maybe; + airtableId_not_in?: Maybe; + airtableId_lt?: Maybe; + airtableId_lte?: Maybe; + airtableId_gt?: Maybe; + airtableId_gte?: Maybe; + airtableId_contains?: Maybe; + airtableId_not_contains?: Maybe; + airtableId_starts_with?: Maybe; + airtableId_not_starts_with?: Maybe; + airtableId_ends_with?: Maybe; + airtableId_not_ends_with?: Maybe; + name?: Maybe; + name_not?: Maybe; + name_in?: Maybe; + name_not_in?: Maybe; + name_lt?: Maybe; + name_lte?: Maybe; + name_gt?: Maybe; + name_gte?: Maybe; + name_contains?: Maybe; + name_not_contains?: Maybe; + name_starts_with?: Maybe; + name_not_starts_with?: Maybe; + name_ends_with?: Maybe; + name_not_ends_with?: Maybe; + slug?: Maybe; + slug_not?: Maybe; + slug_in?: Maybe; + slug_not_in?: Maybe; + slug_lt?: Maybe; + slug_lte?: Maybe; + slug_gt?: Maybe; + slug_gte?: Maybe; + slug_contains?: Maybe; + slug_not_contains?: Maybe; + slug_starts_with?: Maybe; + slug_not_starts_with?: Maybe; + slug_ends_with?: Maybe; + slug_not_ends_with?: Maybe; + updatedAt?: Maybe; + updatedAt_not?: Maybe; + updatedAt_in?: Maybe; + updatedAt_not_in?: Maybe; + updatedAt_lt?: Maybe; + updatedAt_lte?: Maybe; + updatedAt_gt?: Maybe; + updatedAt_gte?: Maybe; + createdAt?: Maybe; + createdAt_not?: Maybe; + createdAt_in?: Maybe; + createdAt_not_in?: Maybe; + createdAt_lt?: Maybe; + createdAt_lte?: Maybe; + createdAt_gt?: Maybe; + createdAt_gte?: Maybe; + AND?: Maybe; + OR?: Maybe; + NOT?: Maybe; +} + +export interface MealWhereInput { + id?: Maybe; + id_not?: Maybe; + id_in?: Maybe; + id_not_in?: Maybe; + id_lt?: Maybe; + id_lte?: Maybe; + id_gt?: Maybe; + id_gte?: Maybe; + id_contains?: Maybe; + id_not_contains?: Maybe; + id_starts_with?: Maybe; + id_not_starts_with?: Maybe; + id_ends_with?: Maybe; + id_not_ends_with?: Maybe; + airtableId?: Maybe; + airtableId_not?: Maybe; + airtableId_in?: Maybe; + airtableId_not_in?: Maybe; + airtableId_lt?: Maybe; + airtableId_lte?: Maybe; + airtableId_gt?: Maybe; + airtableId_gte?: Maybe; + airtableId_contains?: Maybe; + airtableId_not_contains?: Maybe; + airtableId_starts_with?: Maybe; + airtableId_not_starts_with?: Maybe; + airtableId_ends_with?: Maybe; + airtableId_not_ends_with?: Maybe; + user?: Maybe; + imageURL?: Maybe; + imageURL_not?: Maybe; + imageURL_in?: Maybe; + imageURL_not_in?: Maybe; + imageURL_lt?: Maybe; + imageURL_lte?: Maybe; + imageURL_gt?: Maybe; + imageURL_gte?: Maybe; + imageURL_contains?: Maybe; + imageURL_not_contains?: Maybe; + imageURL_starts_with?: Maybe; + imageURL_not_starts_with?: Maybe; + imageURL_ends_with?: Maybe; + imageURL_not_ends_with?: Maybe; + categories_every?: Maybe; + categories_some?: Maybe; + categories_none?: Maybe; + tags_every?: Maybe; + tags_some?: Maybe; + tags_none?: Maybe; + updatedAt?: Maybe; + updatedAt_not?: Maybe; + updatedAt_in?: Maybe; + updatedAt_not_in?: Maybe; + updatedAt_lt?: Maybe; + updatedAt_lte?: Maybe; + updatedAt_gt?: Maybe; + updatedAt_gte?: Maybe; + createdAt?: Maybe; + createdAt_not?: Maybe; + createdAt_in?: Maybe; + createdAt_not_in?: Maybe; + createdAt_lt?: Maybe; + createdAt_lte?: Maybe; + createdAt_gt?: Maybe; + createdAt_gte?: Maybe; + proportionFruit?: Maybe; + proportionVeg?: Maybe; + AND?: Maybe; + OR?: Maybe; + NOT?: Maybe; +} + +export interface ProjectUpdateManyWithWhereNestedInput { + where: ProjectScalarWhereInput; + data: ProjectUpdateManyDataInput; +} + +export interface CategorySubscriptionWhereInput { + mutation_in?: Maybe; + updatedFields_contains?: Maybe; + updatedFields_contains_every?: Maybe; + updatedFields_contains_some?: Maybe; + node?: Maybe; + AND?: Maybe< + CategorySubscriptionWhereInput[] | CategorySubscriptionWhereInput + >; + OR?: Maybe; + NOT?: Maybe< + CategorySubscriptionWhereInput[] | CategorySubscriptionWhereInput + >; +} + +export interface ProjectUpdateManyDataInput { + airtableId?: Maybe; + name?: Maybe; + slug?: Maybe; +} + +export interface UserUpdateInput { + airtableId?: Maybe; + consentGDPR?: Maybe; + postCode?: Maybe; + email?: Maybe; + meals?: Maybe; + projects?: Maybe; + children?: Maybe; + phoneNumber?: Maybe; +} + +export interface ChildUpdateManyWithoutParentInput { + create?: Maybe< + ChildCreateWithoutParentInput[] | ChildCreateWithoutParentInput + >; + delete?: Maybe; + connect?: Maybe; + set?: Maybe; + disconnect?: Maybe; + update?: Maybe< + | ChildUpdateWithWhereUniqueWithoutParentInput[] + | ChildUpdateWithWhereUniqueWithoutParentInput + >; + upsert?: Maybe< + | ChildUpsertWithWhereUniqueWithoutParentInput[] + | ChildUpsertWithWhereUniqueWithoutParentInput + >; + deleteMany?: Maybe; + updateMany?: Maybe< + ChildUpdateManyWithWhereNestedInput[] | ChildUpdateManyWithWhereNestedInput + >; +} + +export interface TagUpdateManyMutationInput { + airtableId?: Maybe; + name?: Maybe; +} + +export interface ChildUpdateWithWhereUniqueWithoutParentInput { + where: ChildWhereUniqueInput; + data: ChildUpdateWithoutParentDataInput; +} + +export interface MealUpsertWithWhereUniqueWithoutTagsInput { + where: MealWhereUniqueInput; + update: MealUpdateWithoutTagsDataInput; + create: MealCreateWithoutTagsInput; +} + +export interface ChildUpdateWithoutParentDataInput { + airtableId?: Maybe; + age?: Maybe; +} + +export interface MealUpdateWithWhereUniqueWithoutTagsInput { + where: MealWhereUniqueInput; + data: MealUpdateWithoutTagsDataInput; +} + +export interface ChildUpsertWithWhereUniqueWithoutParentInput { + where: ChildWhereUniqueInput; + update: ChildUpdateWithoutParentDataInput; + create: ChildCreateWithoutParentInput; +} + +export interface MealUpdateManyWithoutTagsInput { + create?: Maybe; + delete?: Maybe; + connect?: Maybe; + set?: Maybe; + disconnect?: Maybe; + update?: Maybe< + | MealUpdateWithWhereUniqueWithoutTagsInput[] + | MealUpdateWithWhereUniqueWithoutTagsInput + >; + upsert?: Maybe< + | MealUpsertWithWhereUniqueWithoutTagsInput[] + | MealUpsertWithWhereUniqueWithoutTagsInput + >; + deleteMany?: Maybe; + updateMany?: Maybe< + MealUpdateManyWithWhereNestedInput[] | MealUpdateManyWithWhereNestedInput + >; +} + +export interface ChildScalarWhereInput { + id?: Maybe; + id_not?: Maybe; + id_in?: Maybe; + id_not_in?: Maybe; + id_lt?: Maybe; + id_lte?: Maybe; + id_gt?: Maybe; + id_gte?: Maybe; + id_contains?: Maybe; + id_not_contains?: Maybe; + id_starts_with?: Maybe; + id_not_starts_with?: Maybe; + id_ends_with?: Maybe; + id_not_ends_with?: Maybe; + airtableId?: Maybe; + airtableId_not?: Maybe; + airtableId_in?: Maybe; + airtableId_not_in?: Maybe; + airtableId_lt?: Maybe; + airtableId_lte?: Maybe; + airtableId_gt?: Maybe; + airtableId_gte?: Maybe; + airtableId_contains?: Maybe; + airtableId_not_contains?: Maybe; + airtableId_starts_with?: Maybe; + airtableId_not_starts_with?: Maybe; + airtableId_ends_with?: Maybe; + airtableId_not_ends_with?: Maybe; + age?: Maybe; + age_not?: Maybe; + age_in?: Maybe; + age_not_in?: Maybe; + age_lt?: Maybe; + age_lte?: Maybe; + age_gt?: Maybe; + age_gte?: Maybe; + age_contains?: Maybe; + age_not_contains?: Maybe; + age_starts_with?: Maybe; + age_not_starts_with?: Maybe; + age_ends_with?: Maybe; + age_not_ends_with?: Maybe; + updatedAt?: Maybe; + updatedAt_not?: Maybe; + updatedAt_in?: Maybe; + updatedAt_not_in?: Maybe; + updatedAt_lt?: Maybe; + updatedAt_lte?: Maybe; + updatedAt_gt?: Maybe; + updatedAt_gte?: Maybe; + createdAt?: Maybe; + createdAt_not?: Maybe; + createdAt_in?: Maybe; + createdAt_not_in?: Maybe; + createdAt_lt?: Maybe; + createdAt_lte?: Maybe; + createdAt_gt?: Maybe; + createdAt_gte?: Maybe; + AND?: Maybe; + OR?: Maybe; + NOT?: Maybe; +} + +export interface MealCreateWithoutTagsInput { + id?: Maybe; + airtableId?: Maybe; + user: UserCreateOneWithoutMealsInput; + imageURL: String; + categories?: Maybe; + proportionFruit?: Maybe; + proportionVeg?: Maybe; +} + +export interface ChildUpdateManyWithWhereNestedInput { + where: ChildScalarWhereInput; + data: ChildUpdateManyDataInput; +} + +export interface MealCreateManyWithoutTagsInput { + create?: Maybe; + connect?: Maybe; +} + +export interface ChildUpdateManyDataInput { + airtableId?: Maybe; + age?: Maybe; +} + +export interface ProportionUpdateManyMutationInput { + airtableId?: Maybe; + name?: Maybe; +} + +export interface UserUpsertWithoutMealsInput { + update: UserUpdateWithoutMealsDataInput; + create: UserCreateWithoutMealsInput; +} + +export interface ProportionUpdateInput { + airtableId?: Maybe; + name?: Maybe; + fruitMeals?: Maybe; + vegMeals?: Maybe; +} + +export interface TagUpdateManyWithoutMealsInput { + create?: Maybe; + delete?: Maybe; + connect?: Maybe; + set?: Maybe; + disconnect?: Maybe; + update?: Maybe< + | TagUpdateWithWhereUniqueWithoutMealsInput[] + | TagUpdateWithWhereUniqueWithoutMealsInput + >; + upsert?: Maybe< + | TagUpsertWithWhereUniqueWithoutMealsInput[] + | TagUpsertWithWhereUniqueWithoutMealsInput + >; + deleteMany?: Maybe; + updateMany?: Maybe< + TagUpdateManyWithWhereNestedInput[] | TagUpdateManyWithWhereNestedInput + >; +} + +export interface ProjectUpdateManyMutationInput { + airtableId?: Maybe; + name?: Maybe; + slug?: Maybe; +} + +export interface ProjectUpdateInput { + airtableId?: Maybe; + name?: Maybe; + slug?: Maybe; + users?: Maybe; +} + +export type TagWhereUniqueInput = AtLeastOne<{ + id: Maybe; + airtableId?: Maybe; + name?: Maybe; +}>; + +export interface TagUpdateWithoutMealsDataInput { + airtableId?: Maybe; + name?: Maybe; +} + +export interface UserScalarWhereInput { + id?: Maybe; + id_not?: Maybe; + id_in?: Maybe; + id_not_in?: Maybe; + id_lt?: Maybe; + id_lte?: Maybe; + id_gt?: Maybe; + id_gte?: Maybe; + id_contains?: Maybe; + id_not_contains?: Maybe; + id_starts_with?: Maybe; + id_not_starts_with?: Maybe; + id_ends_with?: Maybe; + id_not_ends_with?: Maybe; + airtableId?: Maybe; + airtableId_not?: Maybe; + airtableId_in?: Maybe; + airtableId_not_in?: Maybe; + airtableId_lt?: Maybe; + airtableId_lte?: Maybe; + airtableId_gt?: Maybe; + airtableId_gte?: Maybe; + airtableId_contains?: Maybe; + airtableId_not_contains?: Maybe; + airtableId_starts_with?: Maybe; + airtableId_not_starts_with?: Maybe; + airtableId_ends_with?: Maybe; + airtableId_not_ends_with?: Maybe; + consentGDPR?: Maybe; + consentGDPR_not?: Maybe; + postCode?: Maybe; + postCode_not?: Maybe; + postCode_in?: Maybe; + postCode_not_in?: Maybe; + postCode_lt?: Maybe; + postCode_lte?: Maybe; + postCode_gt?: Maybe; + postCode_gte?: Maybe; + postCode_contains?: Maybe; + postCode_not_contains?: Maybe; + postCode_starts_with?: Maybe; + postCode_not_starts_with?: Maybe; + postCode_ends_with?: Maybe; + postCode_not_ends_with?: Maybe; + email?: Maybe; + email_not?: Maybe; + email_in?: Maybe; + email_not_in?: Maybe; + email_lt?: Maybe; + email_lte?: Maybe; + email_gt?: Maybe; + email_gte?: Maybe; + email_contains?: Maybe; + email_not_contains?: Maybe; + email_starts_with?: Maybe; + email_not_starts_with?: Maybe; + email_ends_with?: Maybe; + email_not_ends_with?: Maybe; + phoneNumber?: Maybe; + phoneNumber_not?: Maybe; + phoneNumber_in?: Maybe; + phoneNumber_not_in?: Maybe; + phoneNumber_lt?: Maybe; + phoneNumber_lte?: Maybe; + phoneNumber_gt?: Maybe; + phoneNumber_gte?: Maybe; + phoneNumber_contains?: Maybe; + phoneNumber_not_contains?: Maybe; + phoneNumber_starts_with?: Maybe; + phoneNumber_not_starts_with?: Maybe; + phoneNumber_ends_with?: Maybe; + phoneNumber_not_ends_with?: Maybe; + updatedAt?: Maybe; + updatedAt_not?: Maybe; + updatedAt_in?: Maybe; + updatedAt_not_in?: Maybe; + updatedAt_lt?: Maybe; + updatedAt_lte?: Maybe; + updatedAt_gt?: Maybe; + updatedAt_gte?: Maybe; + createdAt?: Maybe; + createdAt_not?: Maybe; + createdAt_in?: Maybe; + createdAt_not_in?: Maybe; + createdAt_lt?: Maybe; + createdAt_lte?: Maybe; + createdAt_gt?: Maybe; + createdAt_gte?: Maybe; + AND?: Maybe; + OR?: Maybe; + NOT?: Maybe; +} + +export interface TagUpsertWithWhereUniqueWithoutMealsInput { + where: TagWhereUniqueInput; + update: TagUpdateWithoutMealsDataInput; + create: TagCreateWithoutMealsInput; +} + +export type UserWhereUniqueInput = AtLeastOne<{ + id: Maybe; + airtableId?: Maybe; + email?: Maybe; + phoneNumber?: Maybe; +}>; + +export interface TagScalarWhereInput { + id?: Maybe; + id_not?: Maybe; + id_in?: Maybe; + id_not_in?: Maybe; + id_lt?: Maybe; + id_lte?: Maybe; + id_gt?: Maybe; + id_gte?: Maybe; + id_contains?: Maybe; + id_not_contains?: Maybe; + id_starts_with?: Maybe; + id_not_starts_with?: Maybe; + id_ends_with?: Maybe; + id_not_ends_with?: Maybe; + airtableId?: Maybe; + airtableId_not?: Maybe; + airtableId_in?: Maybe; + airtableId_not_in?: Maybe; + airtableId_lt?: Maybe; + airtableId_lte?: Maybe; + airtableId_gt?: Maybe; + airtableId_gte?: Maybe; + airtableId_contains?: Maybe; + airtableId_not_contains?: Maybe; + airtableId_starts_with?: Maybe; + airtableId_not_starts_with?: Maybe; + airtableId_ends_with?: Maybe; + airtableId_not_ends_with?: Maybe; + name?: Maybe; + name_not?: Maybe; + name_in?: Maybe; + name_not_in?: Maybe; + name_lt?: Maybe; + name_lte?: Maybe; + name_gt?: Maybe; + name_gte?: Maybe; + name_contains?: Maybe; + name_not_contains?: Maybe; + name_starts_with?: Maybe; + name_not_starts_with?: Maybe; + name_ends_with?: Maybe; + name_not_ends_with?: Maybe; + updatedAt?: Maybe; + updatedAt_not?: Maybe; + updatedAt_in?: Maybe; + updatedAt_not_in?: Maybe; + updatedAt_lt?: Maybe; + updatedAt_lte?: Maybe; + updatedAt_gt?: Maybe; + updatedAt_gte?: Maybe; + createdAt?: Maybe; + createdAt_not?: Maybe; + createdAt_in?: Maybe; + createdAt_not_in?: Maybe; + createdAt_lt?: Maybe; + createdAt_lte?: Maybe; + createdAt_gt?: Maybe; + createdAt_gte?: Maybe; + AND?: Maybe; + OR?: Maybe; + NOT?: Maybe; +} + +export interface UserUpdateWithWhereUniqueWithoutProjectsInput { + where: UserWhereUniqueInput; + data: UserUpdateWithoutProjectsDataInput; +} + +export interface TagUpdateManyWithWhereNestedInput { + where: TagScalarWhereInput; + data: TagUpdateManyDataInput; +} + +export interface MealCreateManyWithoutCategoriesInput { + create?: Maybe< + MealCreateWithoutCategoriesInput[] | MealCreateWithoutCategoriesInput + >; + connect?: Maybe; +} + +export interface TagWhereInput { + id?: Maybe; + id_not?: Maybe; + id_in?: Maybe; + id_not_in?: Maybe; + id_lt?: Maybe; + id_lte?: Maybe; + id_gt?: Maybe; + id_gte?: Maybe; + id_contains?: Maybe; + id_not_contains?: Maybe; + id_starts_with?: Maybe; + id_not_starts_with?: Maybe; + id_ends_with?: Maybe; + id_not_ends_with?: Maybe; + airtableId?: Maybe; + airtableId_not?: Maybe; + airtableId_in?: Maybe; + airtableId_not_in?: Maybe; + airtableId_lt?: Maybe; + airtableId_lte?: Maybe; + airtableId_gt?: Maybe; + airtableId_gte?: Maybe; + airtableId_contains?: Maybe; + airtableId_not_contains?: Maybe; + airtableId_starts_with?: Maybe; + airtableId_not_starts_with?: Maybe; + airtableId_ends_with?: Maybe; + airtableId_not_ends_with?: Maybe; + name?: Maybe; + name_not?: Maybe; + name_in?: Maybe; + name_not_in?: Maybe; + name_lt?: Maybe; + name_lte?: Maybe; + name_gt?: Maybe; + name_gte?: Maybe; + name_contains?: Maybe; + name_not_contains?: Maybe; + name_starts_with?: Maybe; + name_not_starts_with?: Maybe; + name_ends_with?: Maybe; + name_not_ends_with?: Maybe; + meals_every?: Maybe; + meals_some?: Maybe; + meals_none?: Maybe; + updatedAt?: Maybe; + updatedAt_not?: Maybe; + updatedAt_in?: Maybe; + updatedAt_not_in?: Maybe; + updatedAt_lt?: Maybe; + updatedAt_lte?: Maybe; + updatedAt_gt?: Maybe; + updatedAt_gte?: Maybe; + createdAt?: Maybe; + createdAt_not?: Maybe; + createdAt_in?: Maybe; + createdAt_not_in?: Maybe; + createdAt_lt?: Maybe; + createdAt_lte?: Maybe; + createdAt_gt?: Maybe; + createdAt_gte?: Maybe; + AND?: Maybe; + OR?: Maybe; + NOT?: Maybe; +} + +export interface UserCreateOneWithoutMealsInput { + create?: Maybe; + connect?: Maybe; +} + +export interface ChildWhereInput { + id?: Maybe; + id_not?: Maybe; + id_in?: Maybe; + id_not_in?: Maybe; + id_lt?: Maybe; + id_lte?: Maybe; + id_gt?: Maybe; + id_gte?: Maybe; + id_contains?: Maybe; + id_not_contains?: Maybe; + id_starts_with?: Maybe; + id_not_starts_with?: Maybe; + id_ends_with?: Maybe; + id_not_ends_with?: Maybe; + airtableId?: Maybe; + airtableId_not?: Maybe; + airtableId_in?: Maybe; + airtableId_not_in?: Maybe; + airtableId_lt?: Maybe; + airtableId_lte?: Maybe; + airtableId_gt?: Maybe; + airtableId_gte?: Maybe; + airtableId_contains?: Maybe; + airtableId_not_contains?: Maybe; + airtableId_starts_with?: Maybe; + airtableId_not_starts_with?: Maybe; + airtableId_ends_with?: Maybe; + airtableId_not_ends_with?: Maybe; + Parent?: Maybe; + age?: Maybe; + age_not?: Maybe; + age_in?: Maybe; + age_not_in?: Maybe; + age_lt?: Maybe; + age_lte?: Maybe; + age_gt?: Maybe; + age_gte?: Maybe; + age_contains?: Maybe; + age_not_contains?: Maybe; + age_starts_with?: Maybe; + age_not_starts_with?: Maybe; + age_ends_with?: Maybe; + age_not_ends_with?: Maybe; + updatedAt?: Maybe; + updatedAt_not?: Maybe; + updatedAt_in?: Maybe; + updatedAt_not_in?: Maybe; + updatedAt_lt?: Maybe; + updatedAt_lte?: Maybe; + updatedAt_gt?: Maybe; + updatedAt_gte?: Maybe; + createdAt?: Maybe; + createdAt_not?: Maybe; + createdAt_in?: Maybe; + createdAt_not_in?: Maybe; + createdAt_lt?: Maybe; + createdAt_lte?: Maybe; + createdAt_gt?: Maybe; + createdAt_gte?: Maybe; + AND?: Maybe; + OR?: Maybe; + NOT?: Maybe; +} + +export interface ProjectCreateManyWithoutUsersInput { + create?: Maybe< + ProjectCreateWithoutUsersInput[] | ProjectCreateWithoutUsersInput + >; + connect?: Maybe; +} + +export interface UserCreateWithoutProjectsInput { + id?: Maybe; + airtableId?: Maybe; + consentGDPR: Boolean; + postCode: String; + email: String; + meals?: Maybe; + children?: Maybe; + phoneNumber: String; +} + +export interface ChildCreateManyWithoutParentInput { + create?: Maybe< + ChildCreateWithoutParentInput[] | ChildCreateWithoutParentInput + >; + connect?: Maybe; +} + +export interface MealUpdateManyWithoutProportionVegInput { + create?: Maybe< + MealCreateWithoutProportionVegInput[] | MealCreateWithoutProportionVegInput + >; + delete?: Maybe; + connect?: Maybe; + set?: Maybe; + disconnect?: Maybe; + update?: Maybe< + | MealUpdateWithWhereUniqueWithoutProportionVegInput[] + | MealUpdateWithWhereUniqueWithoutProportionVegInput + >; + upsert?: Maybe< + | MealUpsertWithWhereUniqueWithoutProportionVegInput[] + | MealUpsertWithWhereUniqueWithoutProportionVegInput + >; + deleteMany?: Maybe; + updateMany?: Maybe< + MealUpdateManyWithWhereNestedInput[] | MealUpdateManyWithWhereNestedInput + >; +} + +export interface TagCreateManyWithoutMealsInput { + create?: Maybe; + connect?: Maybe; +} + +export interface MealUpdateWithWhereUniqueWithoutProportionVegInput { + where: MealWhereUniqueInput; + data: MealUpdateWithoutProportionVegDataInput; +} + +export interface ProportionCreateOneWithoutFruitMealsInput { + create?: Maybe; + connect?: Maybe; +} + +export interface MealUpdateWithoutProportionVegDataInput { + airtableId?: Maybe; + user?: Maybe; + imageURL?: Maybe; + categories?: Maybe; + tags?: Maybe; + proportionFruit?: Maybe; +} + +export interface MealCreateManyWithoutProportionVegInput { + create?: Maybe< + MealCreateWithoutProportionVegInput[] | MealCreateWithoutProportionVegInput + >; + connect?: Maybe; +} + +export interface CategoryUpdateManyWithoutMealsInput { + create?: Maybe< + CategoryCreateWithoutMealsInput[] | CategoryCreateWithoutMealsInput + >; + delete?: Maybe; + connect?: Maybe; + set?: Maybe; + disconnect?: Maybe; + update?: Maybe< + | CategoryUpdateWithWhereUniqueWithoutMealsInput[] + | CategoryUpdateWithWhereUniqueWithoutMealsInput + >; + upsert?: Maybe< + | CategoryUpsertWithWhereUniqueWithoutMealsInput[] + | CategoryUpsertWithWhereUniqueWithoutMealsInput + >; + deleteMany?: Maybe; + updateMany?: Maybe< + | CategoryUpdateManyWithWhereNestedInput[] + | CategoryUpdateManyWithWhereNestedInput + >; +} + +export interface CategoryCreateManyWithoutMealsInput { + create?: Maybe< + CategoryCreateWithoutMealsInput[] | CategoryCreateWithoutMealsInput + >; + connect?: Maybe; +} + +export interface CategoryUpdateWithWhereUniqueWithoutMealsInput { + where: CategoryWhereUniqueInput; + data: CategoryUpdateWithoutMealsDataInput; +} + +export interface ProportionCreateOneWithoutVegMealsInput { + create?: Maybe; + connect?: Maybe; +} + +export interface CategoryUpdateWithoutMealsDataInput { + airtableId?: Maybe; + name?: Maybe; +} + +export interface MealCreateManyWithoutProportionFruitInput { + create?: Maybe< + | MealCreateWithoutProportionFruitInput[] + | MealCreateWithoutProportionFruitInput + >; + connect?: Maybe; +} + +export interface CategoryUpsertWithWhereUniqueWithoutMealsInput { + where: CategoryWhereUniqueInput; + update: CategoryUpdateWithoutMealsDataInput; + create: CategoryCreateWithoutMealsInput; +} + +export interface CategoryUpdateInput { + airtableId?: Maybe; + name?: Maybe; + meals?: Maybe; +} + +export interface CategoryScalarWhereInput { + id?: Maybe; + id_not?: Maybe; + id_in?: Maybe; + id_not_in?: Maybe; + id_lt?: Maybe; + id_lte?: Maybe; + id_gt?: Maybe; + id_gte?: Maybe; + id_contains?: Maybe; + id_not_contains?: Maybe; + id_starts_with?: Maybe; + id_not_starts_with?: Maybe; + id_ends_with?: Maybe; + id_not_ends_with?: Maybe; + airtableId?: Maybe; + airtableId_not?: Maybe; + airtableId_in?: Maybe; + airtableId_not_in?: Maybe; + airtableId_lt?: Maybe; + airtableId_lte?: Maybe; + airtableId_gt?: Maybe; + airtableId_gte?: Maybe; + airtableId_contains?: Maybe; + airtableId_not_contains?: Maybe; + airtableId_starts_with?: Maybe; + airtableId_not_starts_with?: Maybe; + airtableId_ends_with?: Maybe; + airtableId_not_ends_with?: Maybe; + name?: Maybe; + name_not?: Maybe; + name_in?: Maybe; + name_not_in?: Maybe; + name_lt?: Maybe; + name_lte?: Maybe; + name_gt?: Maybe; + name_gte?: Maybe; + name_contains?: Maybe; + name_not_contains?: Maybe; + name_starts_with?: Maybe; + name_not_starts_with?: Maybe; + name_ends_with?: Maybe; + name_not_ends_with?: Maybe; + updatedAt?: Maybe; + updatedAt_not?: Maybe; + updatedAt_in?: Maybe; + updatedAt_not_in?: Maybe; + updatedAt_lt?: Maybe; + updatedAt_lte?: Maybe; + updatedAt_gt?: Maybe; + updatedAt_gte?: Maybe; + createdAt?: Maybe; + createdAt_not?: Maybe; + createdAt_in?: Maybe; + createdAt_not_in?: Maybe; + createdAt_lt?: Maybe; + createdAt_lte?: Maybe; + createdAt_gt?: Maybe; + createdAt_gte?: Maybe; + AND?: Maybe; + OR?: Maybe; + NOT?: Maybe; +} + +export interface MealUpdateWithWhereUniqueWithoutCategoriesInput { + where: MealWhereUniqueInput; + data: MealUpdateWithoutCategoriesDataInput; +} + +export interface CategoryUpdateManyWithWhereNestedInput { + where: CategoryScalarWhereInput; + data: CategoryUpdateManyDataInput; +} + +export interface UserUpdateOneRequiredWithoutMealsInput { + create?: Maybe; + update?: Maybe; + upsert?: Maybe; + connect?: Maybe; +} + +export interface CategoryUpdateManyDataInput { + airtableId?: Maybe; + name?: Maybe; +} + +export interface ProportionSubscriptionWhereInput { + mutation_in?: Maybe; + updatedFields_contains?: Maybe; + updatedFields_contains_every?: Maybe; + updatedFields_contains_some?: Maybe; + node?: Maybe; + AND?: Maybe< + ProportionSubscriptionWhereInput[] | ProportionSubscriptionWhereInput + >; + OR?: Maybe< + ProportionSubscriptionWhereInput[] | ProportionSubscriptionWhereInput + >; + NOT?: Maybe< + ProportionSubscriptionWhereInput[] | ProportionSubscriptionWhereInput + >; +} + +export interface MealUpsertWithWhereUniqueWithoutProportionVegInput { + where: MealWhereUniqueInput; + update: MealUpdateWithoutProportionVegDataInput; + create: MealCreateWithoutProportionVegInput; +} + +export interface UserWhereInput { + id?: Maybe; + id_not?: Maybe; + id_in?: Maybe; + id_not_in?: Maybe; + id_lt?: Maybe; + id_lte?: Maybe; + id_gt?: Maybe; + id_gte?: Maybe; + id_contains?: Maybe; + id_not_contains?: Maybe; + id_starts_with?: Maybe; + id_not_starts_with?: Maybe; + id_ends_with?: Maybe; + id_not_ends_with?: Maybe; + airtableId?: Maybe; + airtableId_not?: Maybe; + airtableId_in?: Maybe; + airtableId_not_in?: Maybe; + airtableId_lt?: Maybe; + airtableId_lte?: Maybe; + airtableId_gt?: Maybe; + airtableId_gte?: Maybe; + airtableId_contains?: Maybe; + airtableId_not_contains?: Maybe; + airtableId_starts_with?: Maybe; + airtableId_not_starts_with?: Maybe; + airtableId_ends_with?: Maybe; + airtableId_not_ends_with?: Maybe; + consentGDPR?: Maybe; + consentGDPR_not?: Maybe; + postCode?: Maybe; + postCode_not?: Maybe; + postCode_in?: Maybe; + postCode_not_in?: Maybe; + postCode_lt?: Maybe; + postCode_lte?: Maybe; + postCode_gt?: Maybe; + postCode_gte?: Maybe; + postCode_contains?: Maybe; + postCode_not_contains?: Maybe; + postCode_starts_with?: Maybe; + postCode_not_starts_with?: Maybe; + postCode_ends_with?: Maybe; + postCode_not_ends_with?: Maybe; + email?: Maybe; + email_not?: Maybe; + email_in?: Maybe; + email_not_in?: Maybe; + email_lt?: Maybe; + email_lte?: Maybe; + email_gt?: Maybe; + email_gte?: Maybe; + email_contains?: Maybe; + email_not_contains?: Maybe; + email_starts_with?: Maybe; + email_not_starts_with?: Maybe; + email_ends_with?: Maybe; + email_not_ends_with?: Maybe; + meals_every?: Maybe; + meals_some?: Maybe; + meals_none?: Maybe; + projects_every?: Maybe; + projects_some?: Maybe; + projects_none?: Maybe; + children_every?: Maybe; + children_some?: Maybe; + children_none?: Maybe; + phoneNumber?: Maybe; + phoneNumber_not?: Maybe; + phoneNumber_in?: Maybe; + phoneNumber_not_in?: Maybe; + phoneNumber_lt?: Maybe; + phoneNumber_lte?: Maybe; + phoneNumber_gt?: Maybe; + phoneNumber_gte?: Maybe; + phoneNumber_contains?: Maybe; + phoneNumber_not_contains?: Maybe; + phoneNumber_starts_with?: Maybe; + phoneNumber_not_starts_with?: Maybe; + phoneNumber_ends_with?: Maybe; + phoneNumber_not_ends_with?: Maybe; + updatedAt?: Maybe; + updatedAt_not?: Maybe; + updatedAt_in?: Maybe; + updatedAt_not_in?: Maybe; + updatedAt_lt?: Maybe; + updatedAt_lte?: Maybe; + updatedAt_gt?: Maybe; + updatedAt_gte?: Maybe; + createdAt?: Maybe; + createdAt_not?: Maybe; + createdAt_in?: Maybe; + createdAt_not_in?: Maybe; + createdAt_lt?: Maybe; + createdAt_lte?: Maybe; + createdAt_gt?: Maybe; + createdAt_gte?: Maybe; + AND?: Maybe; + OR?: Maybe; + NOT?: Maybe; +} + +export interface MealScalarWhereInput { + id?: Maybe; + id_not?: Maybe; + id_in?: Maybe; + id_not_in?: Maybe; + id_lt?: Maybe; + id_lte?: Maybe; + id_gt?: Maybe; + id_gte?: Maybe; + id_contains?: Maybe; + id_not_contains?: Maybe; + id_starts_with?: Maybe; + id_not_starts_with?: Maybe; + id_ends_with?: Maybe; + id_not_ends_with?: Maybe; + airtableId?: Maybe; + airtableId_not?: Maybe; + airtableId_in?: Maybe; + airtableId_not_in?: Maybe; + airtableId_lt?: Maybe; + airtableId_lte?: Maybe; + airtableId_gt?: Maybe; + airtableId_gte?: Maybe; + airtableId_contains?: Maybe; + airtableId_not_contains?: Maybe; + airtableId_starts_with?: Maybe; + airtableId_not_starts_with?: Maybe; + airtableId_ends_with?: Maybe; + airtableId_not_ends_with?: Maybe; + imageURL?: Maybe; + imageURL_not?: Maybe; + imageURL_in?: Maybe; + imageURL_not_in?: Maybe; + imageURL_lt?: Maybe; + imageURL_lte?: Maybe; + imageURL_gt?: Maybe; + imageURL_gte?: Maybe; + imageURL_contains?: Maybe; + imageURL_not_contains?: Maybe; + imageURL_starts_with?: Maybe; + imageURL_not_starts_with?: Maybe; + imageURL_ends_with?: Maybe; + imageURL_not_ends_with?: Maybe; + updatedAt?: Maybe; + updatedAt_not?: Maybe; + updatedAt_in?: Maybe; + updatedAt_not_in?: Maybe; + updatedAt_lt?: Maybe; + updatedAt_lte?: Maybe; + updatedAt_gt?: Maybe; + updatedAt_gte?: Maybe; + createdAt?: Maybe; + createdAt_not?: Maybe; + createdAt_in?: Maybe; + createdAt_not_in?: Maybe; + createdAt_lt?: Maybe; + createdAt_lte?: Maybe; + createdAt_gt?: Maybe; + createdAt_gte?: Maybe; + AND?: Maybe; + OR?: Maybe; + NOT?: Maybe; +} + +export interface UserUpdateManyMutationInput { + airtableId?: Maybe; + consentGDPR?: Maybe; + postCode?: Maybe; + email?: Maybe; + phoneNumber?: Maybe; +} + +export interface MealUpdateManyWithWhereNestedInput { + where: MealScalarWhereInput; + data: MealUpdateManyDataInput; +} + +export type ChildWhereUniqueInput = AtLeastOne<{ + id: Maybe; + airtableId?: Maybe; +}>; + +export interface MealUpdateManyDataInput { + airtableId?: Maybe; + imageURL?: Maybe; +} + +export type MealWhereUniqueInput = AtLeastOne<{ + id: Maybe; + airtableId?: Maybe; +}>; + +export interface ProportionUpsertWithoutFruitMealsInput { + update: ProportionUpdateWithoutFruitMealsDataInput; + create: ProportionCreateWithoutFruitMealsInput; +} + +export type ProjectWhereUniqueInput = AtLeastOne<{ + id: Maybe; + airtableId?: Maybe; + slug?: Maybe; +}>; + +export interface ProportionUpdateOneWithoutVegMealsInput { + create?: Maybe; + update?: Maybe; + upsert?: Maybe; + delete?: Maybe; + disconnect?: Maybe; + connect?: Maybe; +} + +export type ProportionWhereUniqueInput = AtLeastOne<{ + id: Maybe; + airtableId?: Maybe; + name?: Maybe; +}>; + +export interface ProportionUpdateWithoutVegMealsDataInput { + airtableId?: Maybe; + name?: Maybe; + fruitMeals?: Maybe; +} + +export interface UserUpdateManyDataInput { + airtableId?: Maybe; + consentGDPR?: Maybe; + postCode?: Maybe; + email?: Maybe; + phoneNumber?: Maybe; +} + +export interface MealUpdateManyWithoutProportionFruitInput { + create?: Maybe< + | MealCreateWithoutProportionFruitInput[] + | MealCreateWithoutProportionFruitInput + >; + delete?: Maybe; + connect?: Maybe; + set?: Maybe; + disconnect?: Maybe; + update?: Maybe< + | MealUpdateWithWhereUniqueWithoutProportionFruitInput[] + | MealUpdateWithWhereUniqueWithoutProportionFruitInput + >; + upsert?: Maybe< + | MealUpsertWithWhereUniqueWithoutProportionFruitInput[] + | MealUpsertWithWhereUniqueWithoutProportionFruitInput + >; + deleteMany?: Maybe; + updateMany?: Maybe< + MealUpdateManyWithWhereNestedInput[] | MealUpdateManyWithWhereNestedInput + >; +} + +export interface UserUpsertWithWhereUniqueWithoutProjectsInput { + where: UserWhereUniqueInput; + update: UserUpdateWithoutProjectsDataInput; + create: UserCreateWithoutProjectsInput; +} + +export interface MealUpdateWithWhereUniqueWithoutProportionFruitInput { + where: MealWhereUniqueInput; + data: MealUpdateWithoutProportionFruitDataInput; +} + +export interface UserUpdateManyWithoutProjectsInput { + create?: Maybe< + UserCreateWithoutProjectsInput[] | UserCreateWithoutProjectsInput + >; + delete?: Maybe; + connect?: Maybe; + set?: Maybe; + disconnect?: Maybe; + update?: Maybe< + | UserUpdateWithWhereUniqueWithoutProjectsInput[] + | UserUpdateWithWhereUniqueWithoutProjectsInput + >; + upsert?: Maybe< + | UserUpsertWithWhereUniqueWithoutProjectsInput[] + | UserUpsertWithWhereUniqueWithoutProjectsInput + >; + deleteMany?: Maybe; + updateMany?: Maybe< + UserUpdateManyWithWhereNestedInput[] | UserUpdateManyWithWhereNestedInput + >; +} + +export interface MealUpdateWithoutProportionFruitDataInput { + airtableId?: Maybe; + user?: Maybe; + imageURL?: Maybe; + categories?: Maybe; + tags?: Maybe; + proportionVeg?: Maybe; +} + +export interface MealCreateWithoutCategoriesInput { + id?: Maybe; + airtableId?: Maybe; + user: UserCreateOneWithoutMealsInput; + imageURL: String; + tags?: Maybe; + proportionFruit?: Maybe; + proportionVeg?: Maybe; +} + +export interface MealUpsertWithWhereUniqueWithoutProportionFruitInput { + where: MealWhereUniqueInput; + update: MealUpdateWithoutProportionFruitDataInput; + create: MealCreateWithoutProportionFruitInput; +} + +export interface ProjectCreateWithoutUsersInput { + id?: Maybe; + airtableId?: Maybe; + name: String; + slug: String; +} + +export interface ProportionUpsertWithoutVegMealsInput { + update: ProportionUpdateWithoutVegMealsDataInput; + create: ProportionCreateWithoutVegMealsInput; +} + +export interface TagCreateWithoutMealsInput { + id?: Maybe; + airtableId?: Maybe; + name: String; +} + +export interface MealUpsertWithWhereUniqueWithoutCategoriesInput { + where: MealWhereUniqueInput; + update: MealUpdateWithoutCategoriesDataInput; + create: MealCreateWithoutCategoriesInput; +} + +export interface MealCreateWithoutProportionVegInput { + id?: Maybe; + airtableId?: Maybe; + user: UserCreateOneWithoutMealsInput; + imageURL: String; + categories?: Maybe; + tags?: Maybe; + proportionFruit?: Maybe; +} + +export interface CategoryUpdateManyMutationInput { + airtableId?: Maybe; + name?: Maybe; +} + +export interface ProportionCreateWithoutVegMealsInput { + id?: Maybe; + airtableId?: Maybe; + name: String; + fruitMeals?: Maybe; +} + +export interface UserCreateManyWithoutProjectsInput { + create?: Maybe< + UserCreateWithoutProjectsInput[] | UserCreateWithoutProjectsInput + >; + connect?: Maybe; +} + +export interface MealUpdateManyWithoutCategoriesInput { + create?: Maybe< + MealCreateWithoutCategoriesInput[] | MealCreateWithoutCategoriesInput + >; + delete?: Maybe; + connect?: Maybe; + set?: Maybe; + disconnect?: Maybe; + update?: Maybe< + | MealUpdateWithWhereUniqueWithoutCategoriesInput[] + | MealUpdateWithWhereUniqueWithoutCategoriesInput + >; + upsert?: Maybe< + | MealUpsertWithWhereUniqueWithoutCategoriesInput[] + | MealUpsertWithWhereUniqueWithoutCategoriesInput + >; + deleteMany?: Maybe; + updateMany?: Maybe< + MealUpdateManyWithWhereNestedInput[] | MealUpdateManyWithWhereNestedInput + >; +} + +export interface ProjectCreateInput { + id?: Maybe; + airtableId?: Maybe; + name: String; + slug: String; + users?: Maybe; +} + +export interface UserSubscriptionWhereInput { + mutation_in?: Maybe; + updatedFields_contains?: Maybe; + updatedFields_contains_every?: Maybe; + updatedFields_contains_some?: Maybe; + node?: Maybe; + AND?: Maybe; + OR?: Maybe; + NOT?: Maybe; +} + +export interface ChildCreateInput { + id?: Maybe; + airtableId?: Maybe; + Parent: UserCreateOneWithoutChildrenInput; + age: String; +} + +export interface ChildSubscriptionWhereInput { + mutation_in?: Maybe; + updatedFields_contains?: Maybe; + updatedFields_contains_every?: Maybe; + updatedFields_contains_some?: Maybe; + node?: Maybe; + AND?: Maybe; + OR?: Maybe; + NOT?: Maybe; +} + +export interface UserCreateOneWithoutChildrenInput { + create?: Maybe; + connect?: Maybe; +} + +export interface MealUpdateWithoutTagsDataInput { + airtableId?: Maybe; + user?: Maybe; + imageURL?: Maybe; + categories?: Maybe; + proportionFruit?: Maybe; + proportionVeg?: Maybe; +} + +export interface UserCreateWithoutChildrenInput { + id?: Maybe; + airtableId?: Maybe; + consentGDPR: Boolean; + postCode: String; + email: String; + meals?: Maybe; + projects?: Maybe; + phoneNumber: String; +} + +export interface TagCreateInput { + id?: Maybe; + airtableId?: Maybe; + name: String; + meals?: Maybe; +} + +export interface MealCreateManyWithoutUserInput { + create?: Maybe; + connect?: Maybe; +} + +export interface UserUpdateManyWithWhereNestedInput { + where: UserScalarWhereInput; + data: UserUpdateManyDataInput; +} + +export interface MealCreateWithoutUserInput { + id?: Maybe; + airtableId?: Maybe; + imageURL: String; + categories?: Maybe; + tags?: Maybe; + proportionFruit?: Maybe; + proportionVeg?: Maybe; +} + +export interface CategoryCreateInput { + id?: Maybe; + airtableId?: Maybe; + name: String; + meals?: Maybe; +} + +export interface ChildUpdateInput { + airtableId?: Maybe; + Parent?: Maybe; + age?: Maybe; +} + +export interface ChildCreateWithoutParentInput { + id?: Maybe; + airtableId?: Maybe; + age: String; +} + +export interface UserUpdateOneRequiredWithoutChildrenInput { + create?: Maybe; + update?: Maybe; + upsert?: Maybe; + connect?: Maybe; +} + +export interface CategoryCreateWithoutMealsInput { + id?: Maybe; + airtableId?: Maybe; + name: String; +} + +export interface UserUpdateWithoutChildrenDataInput { + airtableId?: Maybe; + consentGDPR?: Maybe; + postCode?: Maybe; + email?: Maybe; + meals?: Maybe; + projects?: Maybe; + phoneNumber?: Maybe; +} + +export interface MealUpdateWithoutCategoriesDataInput { + airtableId?: Maybe; + user?: Maybe; + imageURL?: Maybe; + tags?: Maybe; + proportionFruit?: Maybe; + proportionVeg?: Maybe; +} + +export interface MealUpdateManyWithoutUserInput { + create?: Maybe; + delete?: Maybe; + connect?: Maybe; + set?: Maybe; + disconnect?: Maybe; + update?: Maybe< + | MealUpdateWithWhereUniqueWithoutUserInput[] + | MealUpdateWithWhereUniqueWithoutUserInput + >; + upsert?: Maybe< + | MealUpsertWithWhereUniqueWithoutUserInput[] + | MealUpsertWithWhereUniqueWithoutUserInput + >; + deleteMany?: Maybe; + updateMany?: Maybe< + MealUpdateManyWithWhereNestedInput[] | MealUpdateManyWithWhereNestedInput + >; +} + +export interface UserCreateInput { + id?: Maybe; + airtableId?: Maybe; + consentGDPR: Boolean; + postCode: String; + email: String; + meals?: Maybe; + projects?: Maybe; + children?: Maybe; + phoneNumber: String; +} + +export interface MealUpdateWithWhereUniqueWithoutUserInput { + where: MealWhereUniqueInput; + data: MealUpdateWithoutUserDataInput; +} + +export interface ProportionCreateInput { + id?: Maybe; + airtableId?: Maybe; + name: String; + fruitMeals?: Maybe; + vegMeals?: Maybe; +} + +export interface MealUpdateWithoutUserDataInput { + airtableId?: Maybe; + imageURL?: Maybe; + categories?: Maybe; + tags?: Maybe; + proportionFruit?: Maybe; + proportionVeg?: Maybe; +} + +export interface UserCreateWithoutMealsInput { + id?: Maybe; + airtableId?: Maybe; + consentGDPR: Boolean; + postCode: String; + email: String; + projects?: Maybe; + children?: Maybe; + phoneNumber: String; +} + +export interface MealUpsertWithWhereUniqueWithoutUserInput { + where: MealWhereUniqueInput; + update: MealUpdateWithoutUserDataInput; + create: MealCreateWithoutUserInput; +} + +export interface MealCreateWithoutProportionFruitInput { + id?: Maybe; + airtableId?: Maybe; + user: UserCreateOneWithoutMealsInput; + imageURL: String; + categories?: Maybe; + tags?: Maybe; + proportionVeg?: Maybe; +} + +export interface MealUpdateInput { + airtableId?: Maybe; + user?: Maybe; + imageURL?: Maybe; + categories?: Maybe; + tags?: Maybe; + proportionFruit?: Maybe; + proportionVeg?: Maybe; +} + +export interface MealCreateInput { + id?: Maybe; + airtableId?: Maybe; + user: UserCreateOneWithoutMealsInput; + imageURL: String; + categories?: Maybe; + tags?: Maybe; + proportionFruit?: Maybe; + proportionVeg?: Maybe; +} + +export interface ChildUpdateManyMutationInput { + airtableId?: Maybe; + age?: Maybe; +} + +export interface UserUpsertWithoutChildrenInput { + update: UserUpdateWithoutChildrenDataInput; + create: UserCreateWithoutChildrenInput; +} + +export interface ProjectSubscriptionWhereInput { + mutation_in?: Maybe; + updatedFields_contains?: Maybe; + updatedFields_contains_every?: Maybe; + updatedFields_contains_some?: Maybe; + node?: Maybe; + AND?: Maybe; + OR?: Maybe; + NOT?: Maybe; +} + +export interface ProportionCreateWithoutFruitMealsInput { + id?: Maybe; + airtableId?: Maybe; + name: String; + vegMeals?: Maybe; +} + +export interface UserUpdateWithoutProjectsDataInput { + airtableId?: Maybe; + consentGDPR?: Maybe; + postCode?: Maybe; + email?: Maybe; + meals?: Maybe; + children?: Maybe; + phoneNumber?: Maybe; +} + +export interface TagUpdateInput { + airtableId?: Maybe; + name?: Maybe; + meals?: Maybe; +} + +export interface NodeNode { + id: ID_Output; +} + +export interface UserPreviousValues { + id: ID_Output; + airtableId?: String; + consentGDPR: Boolean; + postCode: String; + email: String; + phoneNumber: String; + updatedAt: DateTimeOutput; + createdAt: DateTimeOutput; +} + +export interface UserPreviousValuesPromise + extends Promise, + Fragmentable { + id: () => Promise; + airtableId: () => Promise; + consentGDPR: () => Promise; + postCode: () => Promise; + email: () => Promise; + phoneNumber: () => Promise; + updatedAt: () => Promise; + createdAt: () => Promise; +} + +export interface UserPreviousValuesSubscription + extends Promise>, + Fragmentable { + id: () => Promise>; + airtableId: () => Promise>; + consentGDPR: () => Promise>; + postCode: () => Promise>; + email: () => Promise>; + phoneNumber: () => Promise>; + updatedAt: () => Promise>; + createdAt: () => Promise>; +} + +export interface ChildConnection { + pageInfo: PageInfo; + edges: ChildEdge[]; +} + +export interface ChildConnectionPromise + extends Promise, + Fragmentable { + pageInfo: () => T; + edges: >() => T; + aggregate: () => T; +} + +export interface ChildConnectionSubscription + extends Promise>, + Fragmentable { + pageInfo: () => T; + edges: >>() => T; + aggregate: () => T; +} + +export interface TagSubscriptionPayload { + mutation: MutationType; + node: Tag; + updatedFields: String[]; + previousValues: TagPreviousValues; +} + +export interface TagSubscriptionPayloadPromise + extends Promise, + Fragmentable { + mutation: () => Promise; + node: () => T; + updatedFields: () => Promise; + previousValues: () => T; +} + +export interface TagSubscriptionPayloadSubscription + extends Promise>, + Fragmentable { + mutation: () => Promise>; + node: () => T; + updatedFields: () => Promise>; + previousValues: () => T; +} + +export interface AggregateCategory { + count: Int; +} + +export interface AggregateCategoryPromise + extends Promise, + Fragmentable { + count: () => Promise; +} + +export interface AggregateCategorySubscription + extends Promise>, + Fragmentable { + count: () => Promise>; +} + +export interface CategoryEdge { + node: Category; + cursor: String; +} + +export interface CategoryEdgePromise + extends Promise, + Fragmentable { + node: () => T; + cursor: () => Promise; +} + +export interface CategoryEdgeSubscription + extends Promise>, + Fragmentable { + node: () => T; + cursor: () => Promise>; +} + +export interface BatchPayload { + count: Long; +} + +export interface BatchPayloadPromise + extends Promise, + Fragmentable { + count: () => Promise; +} + +export interface BatchPayloadSubscription + extends Promise>, + Fragmentable { + count: () => Promise>; +} + +export interface UserSubscriptionPayload { + mutation: MutationType; + node: User; + updatedFields: String[]; + previousValues: UserPreviousValues; +} + +export interface UserSubscriptionPayloadPromise + extends Promise, + Fragmentable { + mutation: () => Promise; + node: () => T; + updatedFields: () => Promise; + previousValues: () => T; +} + +export interface UserSubscriptionPayloadSubscription + extends Promise>, + Fragmentable { + mutation: () => Promise>; + node: () => T; + updatedFields: () => Promise>; + previousValues: () => T; +} + +export interface PageInfo { + hasNextPage: Boolean; + hasPreviousPage: Boolean; + startCursor?: String; + endCursor?: String; +} + +export interface PageInfoPromise extends Promise, Fragmentable { + hasNextPage: () => Promise; + hasPreviousPage: () => Promise; + startCursor: () => Promise; + endCursor: () => Promise; +} + +export interface PageInfoSubscription + extends Promise>, + Fragmentable { + hasNextPage: () => Promise>; + hasPreviousPage: () => Promise>; + startCursor: () => Promise>; + endCursor: () => Promise>; +} + +export interface UserEdge { + node: User; + cursor: String; +} + +export interface UserEdgePromise extends Promise, Fragmentable { + node: () => T; + cursor: () => Promise; +} + +export interface UserEdgeSubscription + extends Promise>, + Fragmentable { + node: () => T; + cursor: () => Promise>; +} + +export interface CategoryConnection { + pageInfo: PageInfo; + edges: CategoryEdge[]; +} + +export interface CategoryConnectionPromise + extends Promise, + Fragmentable { + pageInfo: () => T; + edges: >() => T; + aggregate: () => T; +} + +export interface CategoryConnectionSubscription + extends Promise>, + Fragmentable { + pageInfo: () => T; + edges: >>() => T; + aggregate: () => T; +} + +export interface AggregateTag { + count: Int; +} + +export interface AggregateTagPromise + extends Promise, + Fragmentable { + count: () => Promise; +} + +export interface AggregateTagSubscription + extends Promise>, + Fragmentable { + count: () => Promise>; +} + +export interface Proportion { + id: ID_Output; + airtableId?: String; + name: String; + updatedAt: DateTimeOutput; + createdAt: DateTimeOutput; +} + +export interface ProportionPromise extends Promise, Fragmentable { + id: () => Promise; + airtableId: () => Promise; + name: () => Promise; + fruitMeals: >(args?: { + where?: MealWhereInput; + orderBy?: MealOrderByInput; + skip?: Int; + after?: String; + before?: String; + first?: Int; + last?: Int; + }) => T; + vegMeals: >(args?: { + where?: MealWhereInput; + orderBy?: MealOrderByInput; + skip?: Int; + after?: String; + before?: String; + first?: Int; + last?: Int; + }) => T; + updatedAt: () => Promise; + createdAt: () => Promise; +} + +export interface ProportionSubscription + extends Promise>, + Fragmentable { + id: () => Promise>; + airtableId: () => Promise>; + name: () => Promise>; + fruitMeals: >>(args?: { + where?: MealWhereInput; + orderBy?: MealOrderByInput; + skip?: Int; + after?: String; + before?: String; + first?: Int; + last?: Int; + }) => T; + vegMeals: >>(args?: { + where?: MealWhereInput; + orderBy?: MealOrderByInput; + skip?: Int; + after?: String; + before?: String; + first?: Int; + last?: Int; + }) => T; + updatedAt: () => Promise>; + createdAt: () => Promise>; +} + +export interface ProportionNullablePromise + extends Promise, + Fragmentable { + id: () => Promise; + airtableId: () => Promise; + name: () => Promise; + fruitMeals: >(args?: { + where?: MealWhereInput; + orderBy?: MealOrderByInput; + skip?: Int; + after?: String; + before?: String; + first?: Int; + last?: Int; + }) => T; + vegMeals: >(args?: { + where?: MealWhereInput; + orderBy?: MealOrderByInput; + skip?: Int; + after?: String; + before?: String; + first?: Int; + last?: Int; + }) => T; + updatedAt: () => Promise; + createdAt: () => Promise; +} + +export interface TagConnection { + pageInfo: PageInfo; + edges: TagEdge[]; +} + +export interface TagConnectionPromise + extends Promise, + Fragmentable { + pageInfo: () => T; + edges: >() => T; + aggregate: () => T; +} + +export interface TagConnectionSubscription + extends Promise>, + Fragmentable { + pageInfo: () => T; + edges: >>() => T; + aggregate: () => T; +} + +export interface User { + id: ID_Output; + airtableId?: String; + consentGDPR: Boolean; + postCode: String; + email: String; + phoneNumber: String; + updatedAt: DateTimeOutput; + createdAt: DateTimeOutput; +} + +export interface UserPromise extends Promise, Fragmentable { + id: () => Promise; + airtableId: () => Promise; + consentGDPR: () => Promise; + postCode: () => Promise; + email: () => Promise; + meals: >(args?: { + where?: MealWhereInput; + orderBy?: MealOrderByInput; + skip?: Int; + after?: String; + before?: String; + first?: Int; + last?: Int; + }) => T; + projects: >(args?: { + where?: ProjectWhereInput; + orderBy?: ProjectOrderByInput; + skip?: Int; + after?: String; + before?: String; + first?: Int; + last?: Int; + }) => T; + children: >(args?: { + where?: ChildWhereInput; + orderBy?: ChildOrderByInput; + skip?: Int; + after?: String; + before?: String; + first?: Int; + last?: Int; + }) => T; + phoneNumber: () => Promise; + updatedAt: () => Promise; + createdAt: () => Promise; +} + +export interface UserSubscription + extends Promise>, + Fragmentable { + id: () => Promise>; + airtableId: () => Promise>; + consentGDPR: () => Promise>; + postCode: () => Promise>; + email: () => Promise>; + meals: >>(args?: { + where?: MealWhereInput; + orderBy?: MealOrderByInput; + skip?: Int; + after?: String; + before?: String; + first?: Int; + last?: Int; + }) => T; + projects: >>(args?: { + where?: ProjectWhereInput; + orderBy?: ProjectOrderByInput; + skip?: Int; + after?: String; + before?: String; + first?: Int; + last?: Int; + }) => T; + children: >>(args?: { + where?: ChildWhereInput; + orderBy?: ChildOrderByInput; + skip?: Int; + after?: String; + before?: String; + first?: Int; + last?: Int; + }) => T; + phoneNumber: () => Promise>; + updatedAt: () => Promise>; + createdAt: () => Promise>; +} + +export interface UserNullablePromise + extends Promise, + Fragmentable { + id: () => Promise; + airtableId: () => Promise; + consentGDPR: () => Promise; + postCode: () => Promise; + email: () => Promise; + meals: >(args?: { + where?: MealWhereInput; + orderBy?: MealOrderByInput; + skip?: Int; + after?: String; + before?: String; + first?: Int; + last?: Int; + }) => T; + projects: >(args?: { + where?: ProjectWhereInput; + orderBy?: ProjectOrderByInput; + skip?: Int; + after?: String; + before?: String; + first?: Int; + last?: Int; + }) => T; + children: >(args?: { + where?: ChildWhereInput; + orderBy?: ChildOrderByInput; + skip?: Int; + after?: String; + before?: String; + first?: Int; + last?: Int; + }) => T; + phoneNumber: () => Promise; + updatedAt: () => Promise; + createdAt: () => Promise; +} + +export interface ProportionEdge { + node: Proportion; + cursor: String; +} + +export interface ProportionEdgePromise + extends Promise, + Fragmentable { + node: () => T; + cursor: () => Promise; +} + +export interface ProportionEdgeSubscription + extends Promise>, + Fragmentable { + node: () => T; + cursor: () => Promise>; +} + +export interface CategorySubscriptionPayload { + mutation: MutationType; + node: Category; + updatedFields: String[]; + previousValues: CategoryPreviousValues; +} + +export interface CategorySubscriptionPayloadPromise + extends Promise, + Fragmentable { + mutation: () => Promise; + node: () => T; + updatedFields: () => Promise; + previousValues: () => T; +} + +export interface CategorySubscriptionPayloadSubscription + extends Promise>, + Fragmentable { + mutation: () => Promise>; + node: () => T; + updatedFields: () => Promise>; + previousValues: () => T; +} + +export interface Category { + id: ID_Output; + airtableId?: String; + name: String; + updatedAt: DateTimeOutput; + createdAt: DateTimeOutput; +} + +export interface CategoryPromise extends Promise, Fragmentable { + id: () => Promise; + airtableId: () => Promise; + name: () => Promise; + meals: >(args?: { + where?: MealWhereInput; + orderBy?: MealOrderByInput; + skip?: Int; + after?: String; + before?: String; + first?: Int; + last?: Int; + }) => T; + updatedAt: () => Promise; + createdAt: () => Promise; +} + +export interface CategorySubscription + extends Promise>, + Fragmentable { + id: () => Promise>; + airtableId: () => Promise>; + name: () => Promise>; + meals: >>(args?: { + where?: MealWhereInput; + orderBy?: MealOrderByInput; + skip?: Int; + after?: String; + before?: String; + first?: Int; + last?: Int; + }) => T; + updatedAt: () => Promise>; + createdAt: () => Promise>; +} + +export interface CategoryNullablePromise + extends Promise, + Fragmentable { + id: () => Promise; + airtableId: () => Promise; + name: () => Promise; + meals: >(args?: { + where?: MealWhereInput; + orderBy?: MealOrderByInput; + skip?: Int; + after?: String; + before?: String; + first?: Int; + last?: Int; + }) => T; + updatedAt: () => Promise; + createdAt: () => Promise; +} + +export interface CategoryPreviousValues { + id: ID_Output; + airtableId?: String; + name: String; + updatedAt: DateTimeOutput; + createdAt: DateTimeOutput; +} + +export interface CategoryPreviousValuesPromise + extends Promise, + Fragmentable { + id: () => Promise; + airtableId: () => Promise; + name: () => Promise; + updatedAt: () => Promise; + createdAt: () => Promise; +} + +export interface CategoryPreviousValuesSubscription + extends Promise>, + Fragmentable { + id: () => Promise>; + airtableId: () => Promise>; + name: () => Promise>; + updatedAt: () => Promise>; + createdAt: () => Promise>; +} + +export interface ProjectEdge { + node: Project; + cursor: String; +} + +export interface ProjectEdgePromise extends Promise, Fragmentable { + node: () => T; + cursor: () => Promise; +} + +export interface ProjectEdgeSubscription + extends Promise>, + Fragmentable { + node: () => T; + cursor: () => Promise>; +} + +export interface Tag { + id: ID_Output; + airtableId?: String; + name: String; + updatedAt: DateTimeOutput; + createdAt: DateTimeOutput; +} + +export interface TagPromise extends Promise, Fragmentable { + id: () => Promise; + airtableId: () => Promise; + name: () => Promise; + meals: >(args?: { + where?: MealWhereInput; + orderBy?: MealOrderByInput; + skip?: Int; + after?: String; + before?: String; + first?: Int; + last?: Int; + }) => T; + updatedAt: () => Promise; + createdAt: () => Promise; +} + +export interface TagSubscription + extends Promise>, + Fragmentable { + id: () => Promise>; + airtableId: () => Promise>; + name: () => Promise>; + meals: >>(args?: { + where?: MealWhereInput; + orderBy?: MealOrderByInput; + skip?: Int; + after?: String; + before?: String; + first?: Int; + last?: Int; + }) => T; + updatedAt: () => Promise>; + createdAt: () => Promise>; +} + +export interface TagNullablePromise extends Promise, Fragmentable { + id: () => Promise; + airtableId: () => Promise; + name: () => Promise; + meals: >(args?: { + where?: MealWhereInput; + orderBy?: MealOrderByInput; + skip?: Int; + after?: String; + before?: String; + first?: Int; + last?: Int; + }) => T; + updatedAt: () => Promise; + createdAt: () => Promise; +} + +export interface AggregateMeal { + count: Int; +} + +export interface AggregateMealPromise + extends Promise, + Fragmentable { + count: () => Promise; +} + +export interface AggregateMealSubscription + extends Promise>, + Fragmentable { + count: () => Promise>; +} + +export interface ChildSubscriptionPayload { + mutation: MutationType; + node: Child; + updatedFields: String[]; + previousValues: ChildPreviousValues; +} + +export interface ChildSubscriptionPayloadPromise + extends Promise, + Fragmentable { + mutation: () => Promise; + node: () => T; + updatedFields: () => Promise; + previousValues: () => T; +} + +export interface ChildSubscriptionPayloadSubscription + extends Promise>, + Fragmentable { + mutation: () => Promise>; + node: () => T; + updatedFields: () => Promise>; + previousValues: () => T; +} + +export interface MealConnection { + pageInfo: PageInfo; + edges: MealEdge[]; +} + +export interface MealConnectionPromise + extends Promise, + Fragmentable { + pageInfo: () => T; + edges: >() => T; + aggregate: () => T; +} + +export interface MealConnectionSubscription + extends Promise>, + Fragmentable { + pageInfo: () => T; + edges: >>() => T; + aggregate: () => T; +} + +export interface ChildPreviousValues { + id: ID_Output; + airtableId?: String; + age: String; + updatedAt: DateTimeOutput; + createdAt: DateTimeOutput; +} + +export interface ChildPreviousValuesPromise + extends Promise, + Fragmentable { + id: () => Promise; + airtableId: () => Promise; + age: () => Promise; + updatedAt: () => Promise; + createdAt: () => Promise; +} + +export interface ChildPreviousValuesSubscription + extends Promise>, + Fragmentable { + id: () => Promise>; + airtableId: () => Promise>; + age: () => Promise>; + updatedAt: () => Promise>; + createdAt: () => Promise>; +} + +export interface ChildEdge { + node: Child; + cursor: String; +} + +export interface ChildEdgePromise extends Promise, Fragmentable { + node: () => T; + cursor: () => Promise; +} + +export interface ChildEdgeSubscription + extends Promise>, + Fragmentable { + node: () => T; + cursor: () => Promise>; +} + +export interface Child { + id: ID_Output; + airtableId?: String; + age: String; + updatedAt: DateTimeOutput; + createdAt: DateTimeOutput; +} + +export interface ChildPromise extends Promise, Fragmentable { + id: () => Promise; + airtableId: () => Promise; + Parent: () => T; + age: () => Promise; + updatedAt: () => Promise; + createdAt: () => Promise; +} + +export interface ChildSubscription + extends Promise>, + Fragmentable { + id: () => Promise>; + airtableId: () => Promise>; + Parent: () => T; + age: () => Promise>; + updatedAt: () => Promise>; + createdAt: () => Promise>; +} + +export interface ChildNullablePromise + extends Promise, + Fragmentable { + id: () => Promise; + airtableId: () => Promise; + Parent: () => T; + age: () => Promise; + updatedAt: () => Promise; + createdAt: () => Promise; +} + +export interface AggregateUser { + count: Int; +} + +export interface AggregateUserPromise + extends Promise, + Fragmentable { + count: () => Promise; +} + +export interface AggregateUserSubscription + extends Promise>, + Fragmentable { + count: () => Promise>; +} + +export interface MealSubscriptionPayload { + mutation: MutationType; + node: Meal; + updatedFields: String[]; + previousValues: MealPreviousValues; +} + +export interface MealSubscriptionPayloadPromise + extends Promise, + Fragmentable { + mutation: () => Promise; + node: () => T; + updatedFields: () => Promise; + previousValues: () => T; +} + +export interface MealSubscriptionPayloadSubscription + extends Promise>, + Fragmentable { + mutation: () => Promise>; + node: () => T; + updatedFields: () => Promise>; + previousValues: () => T; +} + +export interface TagEdge { + node: Tag; + cursor: String; +} + +export interface TagEdgePromise extends Promise, Fragmentable { + node: () => T; + cursor: () => Promise; +} + +export interface TagEdgeSubscription + extends Promise>, + Fragmentable { + node: () => T; + cursor: () => Promise>; +} + +export interface MealPreviousValues { + id: ID_Output; + airtableId?: String; + imageURL: String; + updatedAt: DateTimeOutput; + createdAt: DateTimeOutput; +} + +export interface MealPreviousValuesPromise + extends Promise, + Fragmentable { + id: () => Promise; + airtableId: () => Promise; + imageURL: () => Promise; + updatedAt: () => Promise; + createdAt: () => Promise; +} + +export interface MealPreviousValuesSubscription + extends Promise>, + Fragmentable { + id: () => Promise>; + airtableId: () => Promise>; + imageURL: () => Promise>; + updatedAt: () => Promise>; + createdAt: () => Promise>; +} + +export interface ProportionConnection { + pageInfo: PageInfo; + edges: ProportionEdge[]; +} + +export interface ProportionConnectionPromise + extends Promise, + Fragmentable { + pageInfo: () => T; + edges: >() => T; + aggregate: () => T; +} + +export interface ProportionConnectionSubscription + extends Promise>, + Fragmentable { + pageInfo: () => T; + edges: >>() => T; + aggregate: () => T; +} + +export interface TagPreviousValues { + id: ID_Output; + airtableId?: String; + name: String; + updatedAt: DateTimeOutput; + createdAt: DateTimeOutput; +} + +export interface TagPreviousValuesPromise + extends Promise, + Fragmentable { + id: () => Promise; + airtableId: () => Promise; + name: () => Promise; + updatedAt: () => Promise; + createdAt: () => Promise; +} + +export interface TagPreviousValuesSubscription + extends Promise>, + Fragmentable { + id: () => Promise>; + airtableId: () => Promise>; + name: () => Promise>; + updatedAt: () => Promise>; + createdAt: () => Promise>; +} + +export interface ProjectConnection { + pageInfo: PageInfo; + edges: ProjectEdge[]; +} + +export interface ProjectConnectionPromise + extends Promise, + Fragmentable { + pageInfo: () => T; + edges: >() => T; + aggregate: () => T; +} + +export interface ProjectConnectionSubscription + extends Promise>, + Fragmentable { + pageInfo: () => T; + edges: >>() => T; + aggregate: () => T; +} + +export interface ProjectSubscriptionPayload { + mutation: MutationType; + node: Project; + updatedFields: String[]; + previousValues: ProjectPreviousValues; +} + +export interface ProjectSubscriptionPayloadPromise + extends Promise, + Fragmentable { + mutation: () => Promise; + node: () => T; + updatedFields: () => Promise; + previousValues: () => T; +} + +export interface ProjectSubscriptionPayloadSubscription + extends Promise>, + Fragmentable { + mutation: () => Promise>; + node: () => T; + updatedFields: () => Promise>; + previousValues: () => T; +} + +export interface AggregateChild { + count: Int; +} + +export interface AggregateChildPromise + extends Promise, + Fragmentable { + count: () => Promise; +} + +export interface AggregateChildSubscription + extends Promise>, + Fragmentable { + count: () => Promise>; +} + +export interface UserConnection { + pageInfo: PageInfo; + edges: UserEdge[]; +} + +export interface UserConnectionPromise + extends Promise, + Fragmentable { + pageInfo: () => T; + edges: >() => T; + aggregate: () => T; +} + +export interface UserConnectionSubscription + extends Promise>, + Fragmentable { + pageInfo: () => T; + edges: >>() => T; + aggregate: () => T; +} + +export interface ProportionPreviousValues { + id: ID_Output; + airtableId?: String; + name: String; + updatedAt: DateTimeOutput; + createdAt: DateTimeOutput; +} + +export interface ProportionPreviousValuesPromise + extends Promise, + Fragmentable { + id: () => Promise; + airtableId: () => Promise; + name: () => Promise; + updatedAt: () => Promise; + createdAt: () => Promise; +} + +export interface ProportionPreviousValuesSubscription + extends Promise>, + Fragmentable { + id: () => Promise>; + airtableId: () => Promise>; + name: () => Promise>; + updatedAt: () => Promise>; + createdAt: () => Promise>; +} + +export interface ProportionSubscriptionPayload { + mutation: MutationType; + node: Proportion; + updatedFields: String[]; + previousValues: ProportionPreviousValues; +} + +export interface ProportionSubscriptionPayloadPromise + extends Promise, + Fragmentable { + mutation: () => Promise; + node: () => T; + updatedFields: () => Promise; + previousValues: () => T; +} + +export interface ProportionSubscriptionPayloadSubscription + extends Promise>, + Fragmentable { + mutation: () => Promise>; + node: () => T; + updatedFields: () => Promise>; + previousValues: () => T; +} + +export interface Project { + id: ID_Output; + airtableId?: String; + name: String; + slug: String; + updatedAt: DateTimeOutput; + createdAt: DateTimeOutput; +} + +export interface ProjectPromise extends Promise, Fragmentable { + id: () => Promise; + airtableId: () => Promise; + name: () => Promise; + slug: () => Promise; + users: >(args?: { + where?: UserWhereInput; + orderBy?: UserOrderByInput; + skip?: Int; + after?: String; + before?: String; + first?: Int; + last?: Int; + }) => T; + updatedAt: () => Promise; + createdAt: () => Promise; +} + +export interface ProjectSubscription + extends Promise>, + Fragmentable { + id: () => Promise>; + airtableId: () => Promise>; + name: () => Promise>; + slug: () => Promise>; + users: >>(args?: { + where?: UserWhereInput; + orderBy?: UserOrderByInput; + skip?: Int; + after?: String; + before?: String; + first?: Int; + last?: Int; + }) => T; + updatedAt: () => Promise>; + createdAt: () => Promise>; +} + +export interface ProjectNullablePromise + extends Promise, + Fragmentable { + id: () => Promise; + airtableId: () => Promise; + name: () => Promise; + slug: () => Promise; + users: >(args?: { + where?: UserWhereInput; + orderBy?: UserOrderByInput; + skip?: Int; + after?: String; + before?: String; + first?: Int; + last?: Int; + }) => T; + updatedAt: () => Promise; + createdAt: () => Promise; +} + +export interface ProjectPreviousValues { + id: ID_Output; + airtableId?: String; + name: String; + slug: String; + updatedAt: DateTimeOutput; + createdAt: DateTimeOutput; +} + +export interface ProjectPreviousValuesPromise + extends Promise, + Fragmentable { + id: () => Promise; + airtableId: () => Promise; + name: () => Promise; + slug: () => Promise; + updatedAt: () => Promise; + createdAt: () => Promise; +} + +export interface ProjectPreviousValuesSubscription + extends Promise>, + Fragmentable { + id: () => Promise>; + airtableId: () => Promise>; + name: () => Promise>; + slug: () => Promise>; + updatedAt: () => Promise>; + createdAt: () => Promise>; +} + +export interface AggregateProportion { + count: Int; +} + +export interface AggregateProportionPromise + extends Promise, + Fragmentable { + count: () => Promise; +} + +export interface AggregateProportionSubscription + extends Promise>, + Fragmentable { + count: () => Promise>; +} + +export interface Meal { + id: ID_Output; + airtableId?: String; + imageURL: String; + updatedAt: DateTimeOutput; + createdAt: DateTimeOutput; +} + +export interface MealPromise extends Promise, Fragmentable { + id: () => Promise; + airtableId: () => Promise; + user: () => T; + imageURL: () => Promise; + categories: >(args?: { + where?: CategoryWhereInput; + orderBy?: CategoryOrderByInput; + skip?: Int; + after?: String; + before?: String; + first?: Int; + last?: Int; + }) => T; + tags: >(args?: { + where?: TagWhereInput; + orderBy?: TagOrderByInput; + skip?: Int; + after?: String; + before?: String; + first?: Int; + last?: Int; + }) => T; + updatedAt: () => Promise; + createdAt: () => Promise; + proportionFruit: () => T; + proportionVeg: () => T; +} + +export interface MealSubscription + extends Promise>, + Fragmentable { + id: () => Promise>; + airtableId: () => Promise>; + user: () => T; + imageURL: () => Promise>; + categories: >>(args?: { + where?: CategoryWhereInput; + orderBy?: CategoryOrderByInput; + skip?: Int; + after?: String; + before?: String; + first?: Int; + last?: Int; + }) => T; + tags: >>(args?: { + where?: TagWhereInput; + orderBy?: TagOrderByInput; + skip?: Int; + after?: String; + before?: String; + first?: Int; + last?: Int; + }) => T; + updatedAt: () => Promise>; + createdAt: () => Promise>; + proportionFruit: () => T; + proportionVeg: () => T; +} + +export interface MealNullablePromise + extends Promise, + Fragmentable { + id: () => Promise; + airtableId: () => Promise; + user: () => T; + imageURL: () => Promise; + categories: >(args?: { + where?: CategoryWhereInput; + orderBy?: CategoryOrderByInput; + skip?: Int; + after?: String; + before?: String; + first?: Int; + last?: Int; + }) => T; + tags: >(args?: { + where?: TagWhereInput; + orderBy?: TagOrderByInput; + skip?: Int; + after?: String; + before?: String; + first?: Int; + last?: Int; + }) => T; + updatedAt: () => Promise; + createdAt: () => Promise; + proportionFruit: () => T; + proportionVeg: () => T; +} + +export interface MealEdge { + node: Meal; + cursor: String; +} + +export interface MealEdgePromise extends Promise, Fragmentable { + node: () => T; + cursor: () => Promise; +} + +export interface MealEdgeSubscription + extends Promise>, + Fragmentable { + node: () => T; + cursor: () => Promise>; +} + +export interface AggregateProject { + count: Int; +} + +export interface AggregateProjectPromise + extends Promise, + Fragmentable { + count: () => Promise; +} + +export interface AggregateProjectSubscription + extends Promise>, + Fragmentable { + count: () => Promise>; +} + +/* +The `Int` scalar type represents non-fractional signed whole numeric values. Int can represent values between -(2^31) and 2^31 - 1. +*/ +export type Int = number; + +export type Long = string; + +/* +The `ID` scalar type represents a unique identifier, often used to refetch an object or as key for a cache. The ID type appears in a JSON response as a String; however, it is not intended to be human-readable. When expected as an input type, any string (such as `"4"`) or integer (such as `4`) input value will be accepted as an ID. +*/ +export type ID_Input = string | number; +export type ID_Output = string; + +/* +The `String` scalar type represents textual data, represented as UTF-8 character sequences. The String type is most often used by GraphQL to represent free-form human-readable text. +*/ +export type String = string; + +/* +The `Boolean` scalar type represents `true` or `false`. +*/ +export type Boolean = boolean; + +/* +DateTime scalar input type, allowing Date +*/ +export type DateTimeInput = Date | string; + +/* +DateTime scalar output type, which is always a string +*/ +export type DateTimeOutput = string; + +/** + * Model Metadata + */ + +export const models: Model[] = [ + { + name: "User", + embedded: false + }, + { + name: "Child", + embedded: false + }, + { + name: "Meal", + embedded: false + }, + { + name: "Tag", + embedded: false + }, + { + name: "Category", + embedded: false + }, + { + name: "Project", + embedded: false + }, + { + name: "Proportion", + embedded: false + } +]; + +/** + * Type Defs + */ + +export const prisma: Prisma; diff --git a/prisma/generated/js/index.js b/prisma/generated/js/index.js new file mode 100644 index 0000000..7c90cb3 --- /dev/null +++ b/prisma/generated/js/index.js @@ -0,0 +1,42 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var prisma_lib_1 = require("prisma-client-lib"); +var typeDefs = require("./prisma-schema").typeDefs; + +var models = [ + { + name: "User", + embedded: false + }, + { + name: "Child", + embedded: false + }, + { + name: "Meal", + embedded: false + }, + { + name: "Tag", + embedded: false + }, + { + name: "Category", + embedded: false + }, + { + name: "Project", + embedded: false + }, + { + name: "Proportion", + embedded: false + } +]; +exports.Prisma = prisma_lib_1.makePrismaClientClass({ + typeDefs, + models, + endpoint: `${process.env["PRISMA_ENDPOINT"]}`, + secret: `${process.env["PRISMA_SECRET"]}` +}); +exports.prisma = new exports.Prisma(); diff --git a/prisma/generated/js/prisma-schema.js b/prisma/generated/js/prisma-schema.js new file mode 100644 index 0000000..cd454c3 --- /dev/null +++ b/prisma/generated/js/prisma-schema.js @@ -0,0 +1,2369 @@ +module.exports = { + typeDefs: // Code generated by Prisma (prisma@1.34.10). DO NOT EDIT. + // Please don't change this file manually but run `prisma generate` to update it. + // For more information, please read the docs: https://www.prisma.io/docs/prisma-client/ + +/* GraphQL */ `type AggregateCategory { + count: Int! +} + +type AggregateChild { + count: Int! +} + +type AggregateMeal { + count: Int! +} + +type AggregateProject { + count: Int! +} + +type AggregateProportion { + count: Int! +} + +type AggregateTag { + count: Int! +} + +type AggregateUser { + count: Int! +} + +type BatchPayload { + count: Long! +} + +type Category { + id: ID! + airtableId: String + name: String! + meals(where: MealWhereInput, orderBy: MealOrderByInput, skip: Int, after: String, before: String, first: Int, last: Int): [Meal!] + updatedAt: DateTime! + createdAt: DateTime! +} + +type CategoryConnection { + pageInfo: PageInfo! + edges: [CategoryEdge]! + aggregate: AggregateCategory! +} + +input CategoryCreateInput { + id: ID + airtableId: String + name: String! + meals: MealCreateManyWithoutCategoriesInput +} + +input CategoryCreateManyWithoutMealsInput { + create: [CategoryCreateWithoutMealsInput!] + connect: [CategoryWhereUniqueInput!] +} + +input CategoryCreateWithoutMealsInput { + id: ID + airtableId: String + name: String! +} + +type CategoryEdge { + node: Category! + cursor: String! +} + +enum CategoryOrderByInput { + id_ASC + id_DESC + airtableId_ASC + airtableId_DESC + name_ASC + name_DESC + updatedAt_ASC + updatedAt_DESC + createdAt_ASC + createdAt_DESC +} + +type CategoryPreviousValues { + id: ID! + airtableId: String + name: String! + updatedAt: DateTime! + createdAt: DateTime! +} + +input CategoryScalarWhereInput { + id: ID + id_not: ID + id_in: [ID!] + id_not_in: [ID!] + id_lt: ID + id_lte: ID + id_gt: ID + id_gte: ID + id_contains: ID + id_not_contains: ID + id_starts_with: ID + id_not_starts_with: ID + id_ends_with: ID + id_not_ends_with: ID + airtableId: String + airtableId_not: String + airtableId_in: [String!] + airtableId_not_in: [String!] + airtableId_lt: String + airtableId_lte: String + airtableId_gt: String + airtableId_gte: String + airtableId_contains: String + airtableId_not_contains: String + airtableId_starts_with: String + airtableId_not_starts_with: String + airtableId_ends_with: String + airtableId_not_ends_with: String + name: String + name_not: String + name_in: [String!] + name_not_in: [String!] + name_lt: String + name_lte: String + name_gt: String + name_gte: String + name_contains: String + name_not_contains: String + name_starts_with: String + name_not_starts_with: String + name_ends_with: String + name_not_ends_with: String + updatedAt: DateTime + updatedAt_not: DateTime + updatedAt_in: [DateTime!] + updatedAt_not_in: [DateTime!] + updatedAt_lt: DateTime + updatedAt_lte: DateTime + updatedAt_gt: DateTime + updatedAt_gte: DateTime + createdAt: DateTime + createdAt_not: DateTime + createdAt_in: [DateTime!] + createdAt_not_in: [DateTime!] + createdAt_lt: DateTime + createdAt_lte: DateTime + createdAt_gt: DateTime + createdAt_gte: DateTime + AND: [CategoryScalarWhereInput!] + OR: [CategoryScalarWhereInput!] + NOT: [CategoryScalarWhereInput!] +} + +type CategorySubscriptionPayload { + mutation: MutationType! + node: Category + updatedFields: [String!] + previousValues: CategoryPreviousValues +} + +input CategorySubscriptionWhereInput { + mutation_in: [MutationType!] + updatedFields_contains: String + updatedFields_contains_every: [String!] + updatedFields_contains_some: [String!] + node: CategoryWhereInput + AND: [CategorySubscriptionWhereInput!] + OR: [CategorySubscriptionWhereInput!] + NOT: [CategorySubscriptionWhereInput!] +} + +input CategoryUpdateInput { + airtableId: String + name: String + meals: MealUpdateManyWithoutCategoriesInput +} + +input CategoryUpdateManyDataInput { + airtableId: String + name: String +} + +input CategoryUpdateManyMutationInput { + airtableId: String + name: String +} + +input CategoryUpdateManyWithoutMealsInput { + create: [CategoryCreateWithoutMealsInput!] + delete: [CategoryWhereUniqueInput!] + connect: [CategoryWhereUniqueInput!] + set: [CategoryWhereUniqueInput!] + disconnect: [CategoryWhereUniqueInput!] + update: [CategoryUpdateWithWhereUniqueWithoutMealsInput!] + upsert: [CategoryUpsertWithWhereUniqueWithoutMealsInput!] + deleteMany: [CategoryScalarWhereInput!] + updateMany: [CategoryUpdateManyWithWhereNestedInput!] +} + +input CategoryUpdateManyWithWhereNestedInput { + where: CategoryScalarWhereInput! + data: CategoryUpdateManyDataInput! +} + +input CategoryUpdateWithoutMealsDataInput { + airtableId: String + name: String +} + +input CategoryUpdateWithWhereUniqueWithoutMealsInput { + where: CategoryWhereUniqueInput! + data: CategoryUpdateWithoutMealsDataInput! +} + +input CategoryUpsertWithWhereUniqueWithoutMealsInput { + where: CategoryWhereUniqueInput! + update: CategoryUpdateWithoutMealsDataInput! + create: CategoryCreateWithoutMealsInput! +} + +input CategoryWhereInput { + id: ID + id_not: ID + id_in: [ID!] + id_not_in: [ID!] + id_lt: ID + id_lte: ID + id_gt: ID + id_gte: ID + id_contains: ID + id_not_contains: ID + id_starts_with: ID + id_not_starts_with: ID + id_ends_with: ID + id_not_ends_with: ID + airtableId: String + airtableId_not: String + airtableId_in: [String!] + airtableId_not_in: [String!] + airtableId_lt: String + airtableId_lte: String + airtableId_gt: String + airtableId_gte: String + airtableId_contains: String + airtableId_not_contains: String + airtableId_starts_with: String + airtableId_not_starts_with: String + airtableId_ends_with: String + airtableId_not_ends_with: String + name: String + name_not: String + name_in: [String!] + name_not_in: [String!] + name_lt: String + name_lte: String + name_gt: String + name_gte: String + name_contains: String + name_not_contains: String + name_starts_with: String + name_not_starts_with: String + name_ends_with: String + name_not_ends_with: String + meals_every: MealWhereInput + meals_some: MealWhereInput + meals_none: MealWhereInput + updatedAt: DateTime + updatedAt_not: DateTime + updatedAt_in: [DateTime!] + updatedAt_not_in: [DateTime!] + updatedAt_lt: DateTime + updatedAt_lte: DateTime + updatedAt_gt: DateTime + updatedAt_gte: DateTime + createdAt: DateTime + createdAt_not: DateTime + createdAt_in: [DateTime!] + createdAt_not_in: [DateTime!] + createdAt_lt: DateTime + createdAt_lte: DateTime + createdAt_gt: DateTime + createdAt_gte: DateTime + AND: [CategoryWhereInput!] + OR: [CategoryWhereInput!] + NOT: [CategoryWhereInput!] +} + +input CategoryWhereUniqueInput { + id: ID + airtableId: String + name: String +} + +type Child { + id: ID! + airtableId: String + Parent: User! + age: String! + updatedAt: DateTime! + createdAt: DateTime! +} + +type ChildConnection { + pageInfo: PageInfo! + edges: [ChildEdge]! + aggregate: AggregateChild! +} + +input ChildCreateInput { + id: ID + airtableId: String + Parent: UserCreateOneWithoutChildrenInput! + age: String! +} + +input ChildCreateManyWithoutParentInput { + create: [ChildCreateWithoutParentInput!] + connect: [ChildWhereUniqueInput!] +} + +input ChildCreateWithoutParentInput { + id: ID + airtableId: String + age: String! +} + +type ChildEdge { + node: Child! + cursor: String! +} + +enum ChildOrderByInput { + id_ASC + id_DESC + airtableId_ASC + airtableId_DESC + age_ASC + age_DESC + updatedAt_ASC + updatedAt_DESC + createdAt_ASC + createdAt_DESC +} + +type ChildPreviousValues { + id: ID! + airtableId: String + age: String! + updatedAt: DateTime! + createdAt: DateTime! +} + +input ChildScalarWhereInput { + id: ID + id_not: ID + id_in: [ID!] + id_not_in: [ID!] + id_lt: ID + id_lte: ID + id_gt: ID + id_gte: ID + id_contains: ID + id_not_contains: ID + id_starts_with: ID + id_not_starts_with: ID + id_ends_with: ID + id_not_ends_with: ID + airtableId: String + airtableId_not: String + airtableId_in: [String!] + airtableId_not_in: [String!] + airtableId_lt: String + airtableId_lte: String + airtableId_gt: String + airtableId_gte: String + airtableId_contains: String + airtableId_not_contains: String + airtableId_starts_with: String + airtableId_not_starts_with: String + airtableId_ends_with: String + airtableId_not_ends_with: String + age: String + age_not: String + age_in: [String!] + age_not_in: [String!] + age_lt: String + age_lte: String + age_gt: String + age_gte: String + age_contains: String + age_not_contains: String + age_starts_with: String + age_not_starts_with: String + age_ends_with: String + age_not_ends_with: String + updatedAt: DateTime + updatedAt_not: DateTime + updatedAt_in: [DateTime!] + updatedAt_not_in: [DateTime!] + updatedAt_lt: DateTime + updatedAt_lte: DateTime + updatedAt_gt: DateTime + updatedAt_gte: DateTime + createdAt: DateTime + createdAt_not: DateTime + createdAt_in: [DateTime!] + createdAt_not_in: [DateTime!] + createdAt_lt: DateTime + createdAt_lte: DateTime + createdAt_gt: DateTime + createdAt_gte: DateTime + AND: [ChildScalarWhereInput!] + OR: [ChildScalarWhereInput!] + NOT: [ChildScalarWhereInput!] +} + +type ChildSubscriptionPayload { + mutation: MutationType! + node: Child + updatedFields: [String!] + previousValues: ChildPreviousValues +} + +input ChildSubscriptionWhereInput { + mutation_in: [MutationType!] + updatedFields_contains: String + updatedFields_contains_every: [String!] + updatedFields_contains_some: [String!] + node: ChildWhereInput + AND: [ChildSubscriptionWhereInput!] + OR: [ChildSubscriptionWhereInput!] + NOT: [ChildSubscriptionWhereInput!] +} + +input ChildUpdateInput { + airtableId: String + Parent: UserUpdateOneRequiredWithoutChildrenInput + age: String +} + +input ChildUpdateManyDataInput { + airtableId: String + age: String +} + +input ChildUpdateManyMutationInput { + airtableId: String + age: String +} + +input ChildUpdateManyWithoutParentInput { + create: [ChildCreateWithoutParentInput!] + delete: [ChildWhereUniqueInput!] + connect: [ChildWhereUniqueInput!] + set: [ChildWhereUniqueInput!] + disconnect: [ChildWhereUniqueInput!] + update: [ChildUpdateWithWhereUniqueWithoutParentInput!] + upsert: [ChildUpsertWithWhereUniqueWithoutParentInput!] + deleteMany: [ChildScalarWhereInput!] + updateMany: [ChildUpdateManyWithWhereNestedInput!] +} + +input ChildUpdateManyWithWhereNestedInput { + where: ChildScalarWhereInput! + data: ChildUpdateManyDataInput! +} + +input ChildUpdateWithoutParentDataInput { + airtableId: String + age: String +} + +input ChildUpdateWithWhereUniqueWithoutParentInput { + where: ChildWhereUniqueInput! + data: ChildUpdateWithoutParentDataInput! +} + +input ChildUpsertWithWhereUniqueWithoutParentInput { + where: ChildWhereUniqueInput! + update: ChildUpdateWithoutParentDataInput! + create: ChildCreateWithoutParentInput! +} + +input ChildWhereInput { + id: ID + id_not: ID + id_in: [ID!] + id_not_in: [ID!] + id_lt: ID + id_lte: ID + id_gt: ID + id_gte: ID + id_contains: ID + id_not_contains: ID + id_starts_with: ID + id_not_starts_with: ID + id_ends_with: ID + id_not_ends_with: ID + airtableId: String + airtableId_not: String + airtableId_in: [String!] + airtableId_not_in: [String!] + airtableId_lt: String + airtableId_lte: String + airtableId_gt: String + airtableId_gte: String + airtableId_contains: String + airtableId_not_contains: String + airtableId_starts_with: String + airtableId_not_starts_with: String + airtableId_ends_with: String + airtableId_not_ends_with: String + Parent: UserWhereInput + age: String + age_not: String + age_in: [String!] + age_not_in: [String!] + age_lt: String + age_lte: String + age_gt: String + age_gte: String + age_contains: String + age_not_contains: String + age_starts_with: String + age_not_starts_with: String + age_ends_with: String + age_not_ends_with: String + updatedAt: DateTime + updatedAt_not: DateTime + updatedAt_in: [DateTime!] + updatedAt_not_in: [DateTime!] + updatedAt_lt: DateTime + updatedAt_lte: DateTime + updatedAt_gt: DateTime + updatedAt_gte: DateTime + createdAt: DateTime + createdAt_not: DateTime + createdAt_in: [DateTime!] + createdAt_not_in: [DateTime!] + createdAt_lt: DateTime + createdAt_lte: DateTime + createdAt_gt: DateTime + createdAt_gte: DateTime + AND: [ChildWhereInput!] + OR: [ChildWhereInput!] + NOT: [ChildWhereInput!] +} + +input ChildWhereUniqueInput { + id: ID + airtableId: String +} + +scalar DateTime + +scalar Long + +type Meal { + id: ID! + airtableId: String + user: User! + imageURL: String! + categories(where: CategoryWhereInput, orderBy: CategoryOrderByInput, skip: Int, after: String, before: String, first: Int, last: Int): [Category!] + tags(where: TagWhereInput, orderBy: TagOrderByInput, skip: Int, after: String, before: String, first: Int, last: Int): [Tag!] + updatedAt: DateTime! + createdAt: DateTime! + proportionFruit: Proportion + proportionVeg: Proportion +} + +type MealConnection { + pageInfo: PageInfo! + edges: [MealEdge]! + aggregate: AggregateMeal! +} + +input MealCreateInput { + id: ID + airtableId: String + user: UserCreateOneWithoutMealsInput! + imageURL: String! + categories: CategoryCreateManyWithoutMealsInput + tags: TagCreateManyWithoutMealsInput + proportionFruit: ProportionCreateOneWithoutFruitMealsInput + proportionVeg: ProportionCreateOneWithoutVegMealsInput +} + +input MealCreateManyWithoutCategoriesInput { + create: [MealCreateWithoutCategoriesInput!] + connect: [MealWhereUniqueInput!] +} + +input MealCreateManyWithoutProportionFruitInput { + create: [MealCreateWithoutProportionFruitInput!] + connect: [MealWhereUniqueInput!] +} + +input MealCreateManyWithoutProportionVegInput { + create: [MealCreateWithoutProportionVegInput!] + connect: [MealWhereUniqueInput!] +} + +input MealCreateManyWithoutTagsInput { + create: [MealCreateWithoutTagsInput!] + connect: [MealWhereUniqueInput!] +} + +input MealCreateManyWithoutUserInput { + create: [MealCreateWithoutUserInput!] + connect: [MealWhereUniqueInput!] +} + +input MealCreateWithoutCategoriesInput { + id: ID + airtableId: String + user: UserCreateOneWithoutMealsInput! + imageURL: String! + tags: TagCreateManyWithoutMealsInput + proportionFruit: ProportionCreateOneWithoutFruitMealsInput + proportionVeg: ProportionCreateOneWithoutVegMealsInput +} + +input MealCreateWithoutProportionFruitInput { + id: ID + airtableId: String + user: UserCreateOneWithoutMealsInput! + imageURL: String! + categories: CategoryCreateManyWithoutMealsInput + tags: TagCreateManyWithoutMealsInput + proportionVeg: ProportionCreateOneWithoutVegMealsInput +} + +input MealCreateWithoutProportionVegInput { + id: ID + airtableId: String + user: UserCreateOneWithoutMealsInput! + imageURL: String! + categories: CategoryCreateManyWithoutMealsInput + tags: TagCreateManyWithoutMealsInput + proportionFruit: ProportionCreateOneWithoutFruitMealsInput +} + +input MealCreateWithoutTagsInput { + id: ID + airtableId: String + user: UserCreateOneWithoutMealsInput! + imageURL: String! + categories: CategoryCreateManyWithoutMealsInput + proportionFruit: ProportionCreateOneWithoutFruitMealsInput + proportionVeg: ProportionCreateOneWithoutVegMealsInput +} + +input MealCreateWithoutUserInput { + id: ID + airtableId: String + imageURL: String! + categories: CategoryCreateManyWithoutMealsInput + tags: TagCreateManyWithoutMealsInput + proportionFruit: ProportionCreateOneWithoutFruitMealsInput + proportionVeg: ProportionCreateOneWithoutVegMealsInput +} + +type MealEdge { + node: Meal! + cursor: String! +} + +enum MealOrderByInput { + id_ASC + id_DESC + airtableId_ASC + airtableId_DESC + imageURL_ASC + imageURL_DESC + updatedAt_ASC + updatedAt_DESC + createdAt_ASC + createdAt_DESC +} + +type MealPreviousValues { + id: ID! + airtableId: String + imageURL: String! + updatedAt: DateTime! + createdAt: DateTime! +} + +input MealScalarWhereInput { + id: ID + id_not: ID + id_in: [ID!] + id_not_in: [ID!] + id_lt: ID + id_lte: ID + id_gt: ID + id_gte: ID + id_contains: ID + id_not_contains: ID + id_starts_with: ID + id_not_starts_with: ID + id_ends_with: ID + id_not_ends_with: ID + airtableId: String + airtableId_not: String + airtableId_in: [String!] + airtableId_not_in: [String!] + airtableId_lt: String + airtableId_lte: String + airtableId_gt: String + airtableId_gte: String + airtableId_contains: String + airtableId_not_contains: String + airtableId_starts_with: String + airtableId_not_starts_with: String + airtableId_ends_with: String + airtableId_not_ends_with: String + imageURL: String + imageURL_not: String + imageURL_in: [String!] + imageURL_not_in: [String!] + imageURL_lt: String + imageURL_lte: String + imageURL_gt: String + imageURL_gte: String + imageURL_contains: String + imageURL_not_contains: String + imageURL_starts_with: String + imageURL_not_starts_with: String + imageURL_ends_with: String + imageURL_not_ends_with: String + updatedAt: DateTime + updatedAt_not: DateTime + updatedAt_in: [DateTime!] + updatedAt_not_in: [DateTime!] + updatedAt_lt: DateTime + updatedAt_lte: DateTime + updatedAt_gt: DateTime + updatedAt_gte: DateTime + createdAt: DateTime + createdAt_not: DateTime + createdAt_in: [DateTime!] + createdAt_not_in: [DateTime!] + createdAt_lt: DateTime + createdAt_lte: DateTime + createdAt_gt: DateTime + createdAt_gte: DateTime + AND: [MealScalarWhereInput!] + OR: [MealScalarWhereInput!] + NOT: [MealScalarWhereInput!] +} + +type MealSubscriptionPayload { + mutation: MutationType! + node: Meal + updatedFields: [String!] + previousValues: MealPreviousValues +} + +input MealSubscriptionWhereInput { + mutation_in: [MutationType!] + updatedFields_contains: String + updatedFields_contains_every: [String!] + updatedFields_contains_some: [String!] + node: MealWhereInput + AND: [MealSubscriptionWhereInput!] + OR: [MealSubscriptionWhereInput!] + NOT: [MealSubscriptionWhereInput!] +} + +input MealUpdateInput { + airtableId: String + user: UserUpdateOneRequiredWithoutMealsInput + imageURL: String + categories: CategoryUpdateManyWithoutMealsInput + tags: TagUpdateManyWithoutMealsInput + proportionFruit: ProportionUpdateOneWithoutFruitMealsInput + proportionVeg: ProportionUpdateOneWithoutVegMealsInput +} + +input MealUpdateManyDataInput { + airtableId: String + imageURL: String +} + +input MealUpdateManyMutationInput { + airtableId: String + imageURL: String +} + +input MealUpdateManyWithoutCategoriesInput { + create: [MealCreateWithoutCategoriesInput!] + delete: [MealWhereUniqueInput!] + connect: [MealWhereUniqueInput!] + set: [MealWhereUniqueInput!] + disconnect: [MealWhereUniqueInput!] + update: [MealUpdateWithWhereUniqueWithoutCategoriesInput!] + upsert: [MealUpsertWithWhereUniqueWithoutCategoriesInput!] + deleteMany: [MealScalarWhereInput!] + updateMany: [MealUpdateManyWithWhereNestedInput!] +} + +input MealUpdateManyWithoutProportionFruitInput { + create: [MealCreateWithoutProportionFruitInput!] + delete: [MealWhereUniqueInput!] + connect: [MealWhereUniqueInput!] + set: [MealWhereUniqueInput!] + disconnect: [MealWhereUniqueInput!] + update: [MealUpdateWithWhereUniqueWithoutProportionFruitInput!] + upsert: [MealUpsertWithWhereUniqueWithoutProportionFruitInput!] + deleteMany: [MealScalarWhereInput!] + updateMany: [MealUpdateManyWithWhereNestedInput!] +} + +input MealUpdateManyWithoutProportionVegInput { + create: [MealCreateWithoutProportionVegInput!] + delete: [MealWhereUniqueInput!] + connect: [MealWhereUniqueInput!] + set: [MealWhereUniqueInput!] + disconnect: [MealWhereUniqueInput!] + update: [MealUpdateWithWhereUniqueWithoutProportionVegInput!] + upsert: [MealUpsertWithWhereUniqueWithoutProportionVegInput!] + deleteMany: [MealScalarWhereInput!] + updateMany: [MealUpdateManyWithWhereNestedInput!] +} + +input MealUpdateManyWithoutTagsInput { + create: [MealCreateWithoutTagsInput!] + delete: [MealWhereUniqueInput!] + connect: [MealWhereUniqueInput!] + set: [MealWhereUniqueInput!] + disconnect: [MealWhereUniqueInput!] + update: [MealUpdateWithWhereUniqueWithoutTagsInput!] + upsert: [MealUpsertWithWhereUniqueWithoutTagsInput!] + deleteMany: [MealScalarWhereInput!] + updateMany: [MealUpdateManyWithWhereNestedInput!] +} + +input MealUpdateManyWithoutUserInput { + create: [MealCreateWithoutUserInput!] + delete: [MealWhereUniqueInput!] + connect: [MealWhereUniqueInput!] + set: [MealWhereUniqueInput!] + disconnect: [MealWhereUniqueInput!] + update: [MealUpdateWithWhereUniqueWithoutUserInput!] + upsert: [MealUpsertWithWhereUniqueWithoutUserInput!] + deleteMany: [MealScalarWhereInput!] + updateMany: [MealUpdateManyWithWhereNestedInput!] +} + +input MealUpdateManyWithWhereNestedInput { + where: MealScalarWhereInput! + data: MealUpdateManyDataInput! +} + +input MealUpdateWithoutCategoriesDataInput { + airtableId: String + user: UserUpdateOneRequiredWithoutMealsInput + imageURL: String + tags: TagUpdateManyWithoutMealsInput + proportionFruit: ProportionUpdateOneWithoutFruitMealsInput + proportionVeg: ProportionUpdateOneWithoutVegMealsInput +} + +input MealUpdateWithoutProportionFruitDataInput { + airtableId: String + user: UserUpdateOneRequiredWithoutMealsInput + imageURL: String + categories: CategoryUpdateManyWithoutMealsInput + tags: TagUpdateManyWithoutMealsInput + proportionVeg: ProportionUpdateOneWithoutVegMealsInput +} + +input MealUpdateWithoutProportionVegDataInput { + airtableId: String + user: UserUpdateOneRequiredWithoutMealsInput + imageURL: String + categories: CategoryUpdateManyWithoutMealsInput + tags: TagUpdateManyWithoutMealsInput + proportionFruit: ProportionUpdateOneWithoutFruitMealsInput +} + +input MealUpdateWithoutTagsDataInput { + airtableId: String + user: UserUpdateOneRequiredWithoutMealsInput + imageURL: String + categories: CategoryUpdateManyWithoutMealsInput + proportionFruit: ProportionUpdateOneWithoutFruitMealsInput + proportionVeg: ProportionUpdateOneWithoutVegMealsInput +} + +input MealUpdateWithoutUserDataInput { + airtableId: String + imageURL: String + categories: CategoryUpdateManyWithoutMealsInput + tags: TagUpdateManyWithoutMealsInput + proportionFruit: ProportionUpdateOneWithoutFruitMealsInput + proportionVeg: ProportionUpdateOneWithoutVegMealsInput +} + +input MealUpdateWithWhereUniqueWithoutCategoriesInput { + where: MealWhereUniqueInput! + data: MealUpdateWithoutCategoriesDataInput! +} + +input MealUpdateWithWhereUniqueWithoutProportionFruitInput { + where: MealWhereUniqueInput! + data: MealUpdateWithoutProportionFruitDataInput! +} + +input MealUpdateWithWhereUniqueWithoutProportionVegInput { + where: MealWhereUniqueInput! + data: MealUpdateWithoutProportionVegDataInput! +} + +input MealUpdateWithWhereUniqueWithoutTagsInput { + where: MealWhereUniqueInput! + data: MealUpdateWithoutTagsDataInput! +} + +input MealUpdateWithWhereUniqueWithoutUserInput { + where: MealWhereUniqueInput! + data: MealUpdateWithoutUserDataInput! +} + +input MealUpsertWithWhereUniqueWithoutCategoriesInput { + where: MealWhereUniqueInput! + update: MealUpdateWithoutCategoriesDataInput! + create: MealCreateWithoutCategoriesInput! +} + +input MealUpsertWithWhereUniqueWithoutProportionFruitInput { + where: MealWhereUniqueInput! + update: MealUpdateWithoutProportionFruitDataInput! + create: MealCreateWithoutProportionFruitInput! +} + +input MealUpsertWithWhereUniqueWithoutProportionVegInput { + where: MealWhereUniqueInput! + update: MealUpdateWithoutProportionVegDataInput! + create: MealCreateWithoutProportionVegInput! +} + +input MealUpsertWithWhereUniqueWithoutTagsInput { + where: MealWhereUniqueInput! + update: MealUpdateWithoutTagsDataInput! + create: MealCreateWithoutTagsInput! +} + +input MealUpsertWithWhereUniqueWithoutUserInput { + where: MealWhereUniqueInput! + update: MealUpdateWithoutUserDataInput! + create: MealCreateWithoutUserInput! +} + +input MealWhereInput { + id: ID + id_not: ID + id_in: [ID!] + id_not_in: [ID!] + id_lt: ID + id_lte: ID + id_gt: ID + id_gte: ID + id_contains: ID + id_not_contains: ID + id_starts_with: ID + id_not_starts_with: ID + id_ends_with: ID + id_not_ends_with: ID + airtableId: String + airtableId_not: String + airtableId_in: [String!] + airtableId_not_in: [String!] + airtableId_lt: String + airtableId_lte: String + airtableId_gt: String + airtableId_gte: String + airtableId_contains: String + airtableId_not_contains: String + airtableId_starts_with: String + airtableId_not_starts_with: String + airtableId_ends_with: String + airtableId_not_ends_with: String + user: UserWhereInput + imageURL: String + imageURL_not: String + imageURL_in: [String!] + imageURL_not_in: [String!] + imageURL_lt: String + imageURL_lte: String + imageURL_gt: String + imageURL_gte: String + imageURL_contains: String + imageURL_not_contains: String + imageURL_starts_with: String + imageURL_not_starts_with: String + imageURL_ends_with: String + imageURL_not_ends_with: String + categories_every: CategoryWhereInput + categories_some: CategoryWhereInput + categories_none: CategoryWhereInput + tags_every: TagWhereInput + tags_some: TagWhereInput + tags_none: TagWhereInput + updatedAt: DateTime + updatedAt_not: DateTime + updatedAt_in: [DateTime!] + updatedAt_not_in: [DateTime!] + updatedAt_lt: DateTime + updatedAt_lte: DateTime + updatedAt_gt: DateTime + updatedAt_gte: DateTime + createdAt: DateTime + createdAt_not: DateTime + createdAt_in: [DateTime!] + createdAt_not_in: [DateTime!] + createdAt_lt: DateTime + createdAt_lte: DateTime + createdAt_gt: DateTime + createdAt_gte: DateTime + proportionFruit: ProportionWhereInput + proportionVeg: ProportionWhereInput + AND: [MealWhereInput!] + OR: [MealWhereInput!] + NOT: [MealWhereInput!] +} + +input MealWhereUniqueInput { + id: ID + airtableId: String +} + +type Mutation { + createCategory(data: CategoryCreateInput!): Category! + updateCategory(data: CategoryUpdateInput!, where: CategoryWhereUniqueInput!): Category + updateManyCategories(data: CategoryUpdateManyMutationInput!, where: CategoryWhereInput): BatchPayload! + upsertCategory(where: CategoryWhereUniqueInput!, create: CategoryCreateInput!, update: CategoryUpdateInput!): Category! + deleteCategory(where: CategoryWhereUniqueInput!): Category + deleteManyCategories(where: CategoryWhereInput): BatchPayload! + createChild(data: ChildCreateInput!): Child! + updateChild(data: ChildUpdateInput!, where: ChildWhereUniqueInput!): Child + updateManyChildren(data: ChildUpdateManyMutationInput!, where: ChildWhereInput): BatchPayload! + upsertChild(where: ChildWhereUniqueInput!, create: ChildCreateInput!, update: ChildUpdateInput!): Child! + deleteChild(where: ChildWhereUniqueInput!): Child + deleteManyChildren(where: ChildWhereInput): BatchPayload! + createMeal(data: MealCreateInput!): Meal! + updateMeal(data: MealUpdateInput!, where: MealWhereUniqueInput!): Meal + updateManyMeals(data: MealUpdateManyMutationInput!, where: MealWhereInput): BatchPayload! + upsertMeal(where: MealWhereUniqueInput!, create: MealCreateInput!, update: MealUpdateInput!): Meal! + deleteMeal(where: MealWhereUniqueInput!): Meal + deleteManyMeals(where: MealWhereInput): BatchPayload! + createProject(data: ProjectCreateInput!): Project! + updateProject(data: ProjectUpdateInput!, where: ProjectWhereUniqueInput!): Project + updateManyProjects(data: ProjectUpdateManyMutationInput!, where: ProjectWhereInput): BatchPayload! + upsertProject(where: ProjectWhereUniqueInput!, create: ProjectCreateInput!, update: ProjectUpdateInput!): Project! + deleteProject(where: ProjectWhereUniqueInput!): Project + deleteManyProjects(where: ProjectWhereInput): BatchPayload! + createProportion(data: ProportionCreateInput!): Proportion! + updateProportion(data: ProportionUpdateInput!, where: ProportionWhereUniqueInput!): Proportion + updateManyProportions(data: ProportionUpdateManyMutationInput!, where: ProportionWhereInput): BatchPayload! + upsertProportion(where: ProportionWhereUniqueInput!, create: ProportionCreateInput!, update: ProportionUpdateInput!): Proportion! + deleteProportion(where: ProportionWhereUniqueInput!): Proportion + deleteManyProportions(where: ProportionWhereInput): BatchPayload! + createTag(data: TagCreateInput!): Tag! + updateTag(data: TagUpdateInput!, where: TagWhereUniqueInput!): Tag + updateManyTags(data: TagUpdateManyMutationInput!, where: TagWhereInput): BatchPayload! + upsertTag(where: TagWhereUniqueInput!, create: TagCreateInput!, update: TagUpdateInput!): Tag! + deleteTag(where: TagWhereUniqueInput!): Tag + deleteManyTags(where: TagWhereInput): BatchPayload! + createUser(data: UserCreateInput!): User! + updateUser(data: UserUpdateInput!, where: UserWhereUniqueInput!): User + updateManyUsers(data: UserUpdateManyMutationInput!, where: UserWhereInput): BatchPayload! + upsertUser(where: UserWhereUniqueInput!, create: UserCreateInput!, update: UserUpdateInput!): User! + deleteUser(where: UserWhereUniqueInput!): User + deleteManyUsers(where: UserWhereInput): BatchPayload! +} + +enum MutationType { + CREATED + UPDATED + DELETED +} + +interface Node { + id: ID! +} + +type PageInfo { + hasNextPage: Boolean! + hasPreviousPage: Boolean! + startCursor: String + endCursor: String +} + +type Project { + id: ID! + airtableId: String + name: String! + slug: String! + users(where: UserWhereInput, orderBy: UserOrderByInput, skip: Int, after: String, before: String, first: Int, last: Int): [User!] + updatedAt: DateTime! + createdAt: DateTime! +} + +type ProjectConnection { + pageInfo: PageInfo! + edges: [ProjectEdge]! + aggregate: AggregateProject! +} + +input ProjectCreateInput { + id: ID + airtableId: String + name: String! + slug: String! + users: UserCreateManyWithoutProjectsInput +} + +input ProjectCreateManyWithoutUsersInput { + create: [ProjectCreateWithoutUsersInput!] + connect: [ProjectWhereUniqueInput!] +} + +input ProjectCreateWithoutUsersInput { + id: ID + airtableId: String + name: String! + slug: String! +} + +type ProjectEdge { + node: Project! + cursor: String! +} + +enum ProjectOrderByInput { + id_ASC + id_DESC + airtableId_ASC + airtableId_DESC + name_ASC + name_DESC + slug_ASC + slug_DESC + updatedAt_ASC + updatedAt_DESC + createdAt_ASC + createdAt_DESC +} + +type ProjectPreviousValues { + id: ID! + airtableId: String + name: String! + slug: String! + updatedAt: DateTime! + createdAt: DateTime! +} + +input ProjectScalarWhereInput { + id: ID + id_not: ID + id_in: [ID!] + id_not_in: [ID!] + id_lt: ID + id_lte: ID + id_gt: ID + id_gte: ID + id_contains: ID + id_not_contains: ID + id_starts_with: ID + id_not_starts_with: ID + id_ends_with: ID + id_not_ends_with: ID + airtableId: String + airtableId_not: String + airtableId_in: [String!] + airtableId_not_in: [String!] + airtableId_lt: String + airtableId_lte: String + airtableId_gt: String + airtableId_gte: String + airtableId_contains: String + airtableId_not_contains: String + airtableId_starts_with: String + airtableId_not_starts_with: String + airtableId_ends_with: String + airtableId_not_ends_with: String + name: String + name_not: String + name_in: [String!] + name_not_in: [String!] + name_lt: String + name_lte: String + name_gt: String + name_gte: String + name_contains: String + name_not_contains: String + name_starts_with: String + name_not_starts_with: String + name_ends_with: String + name_not_ends_with: String + slug: String + slug_not: String + slug_in: [String!] + slug_not_in: [String!] + slug_lt: String + slug_lte: String + slug_gt: String + slug_gte: String + slug_contains: String + slug_not_contains: String + slug_starts_with: String + slug_not_starts_with: String + slug_ends_with: String + slug_not_ends_with: String + updatedAt: DateTime + updatedAt_not: DateTime + updatedAt_in: [DateTime!] + updatedAt_not_in: [DateTime!] + updatedAt_lt: DateTime + updatedAt_lte: DateTime + updatedAt_gt: DateTime + updatedAt_gte: DateTime + createdAt: DateTime + createdAt_not: DateTime + createdAt_in: [DateTime!] + createdAt_not_in: [DateTime!] + createdAt_lt: DateTime + createdAt_lte: DateTime + createdAt_gt: DateTime + createdAt_gte: DateTime + AND: [ProjectScalarWhereInput!] + OR: [ProjectScalarWhereInput!] + NOT: [ProjectScalarWhereInput!] +} + +type ProjectSubscriptionPayload { + mutation: MutationType! + node: Project + updatedFields: [String!] + previousValues: ProjectPreviousValues +} + +input ProjectSubscriptionWhereInput { + mutation_in: [MutationType!] + updatedFields_contains: String + updatedFields_contains_every: [String!] + updatedFields_contains_some: [String!] + node: ProjectWhereInput + AND: [ProjectSubscriptionWhereInput!] + OR: [ProjectSubscriptionWhereInput!] + NOT: [ProjectSubscriptionWhereInput!] +} + +input ProjectUpdateInput { + airtableId: String + name: String + slug: String + users: UserUpdateManyWithoutProjectsInput +} + +input ProjectUpdateManyDataInput { + airtableId: String + name: String + slug: String +} + +input ProjectUpdateManyMutationInput { + airtableId: String + name: String + slug: String +} + +input ProjectUpdateManyWithoutUsersInput { + create: [ProjectCreateWithoutUsersInput!] + delete: [ProjectWhereUniqueInput!] + connect: [ProjectWhereUniqueInput!] + set: [ProjectWhereUniqueInput!] + disconnect: [ProjectWhereUniqueInput!] + update: [ProjectUpdateWithWhereUniqueWithoutUsersInput!] + upsert: [ProjectUpsertWithWhereUniqueWithoutUsersInput!] + deleteMany: [ProjectScalarWhereInput!] + updateMany: [ProjectUpdateManyWithWhereNestedInput!] +} + +input ProjectUpdateManyWithWhereNestedInput { + where: ProjectScalarWhereInput! + data: ProjectUpdateManyDataInput! +} + +input ProjectUpdateWithoutUsersDataInput { + airtableId: String + name: String + slug: String +} + +input ProjectUpdateWithWhereUniqueWithoutUsersInput { + where: ProjectWhereUniqueInput! + data: ProjectUpdateWithoutUsersDataInput! +} + +input ProjectUpsertWithWhereUniqueWithoutUsersInput { + where: ProjectWhereUniqueInput! + update: ProjectUpdateWithoutUsersDataInput! + create: ProjectCreateWithoutUsersInput! +} + +input ProjectWhereInput { + id: ID + id_not: ID + id_in: [ID!] + id_not_in: [ID!] + id_lt: ID + id_lte: ID + id_gt: ID + id_gte: ID + id_contains: ID + id_not_contains: ID + id_starts_with: ID + id_not_starts_with: ID + id_ends_with: ID + id_not_ends_with: ID + airtableId: String + airtableId_not: String + airtableId_in: [String!] + airtableId_not_in: [String!] + airtableId_lt: String + airtableId_lte: String + airtableId_gt: String + airtableId_gte: String + airtableId_contains: String + airtableId_not_contains: String + airtableId_starts_with: String + airtableId_not_starts_with: String + airtableId_ends_with: String + airtableId_not_ends_with: String + name: String + name_not: String + name_in: [String!] + name_not_in: [String!] + name_lt: String + name_lte: String + name_gt: String + name_gte: String + name_contains: String + name_not_contains: String + name_starts_with: String + name_not_starts_with: String + name_ends_with: String + name_not_ends_with: String + slug: String + slug_not: String + slug_in: [String!] + slug_not_in: [String!] + slug_lt: String + slug_lte: String + slug_gt: String + slug_gte: String + slug_contains: String + slug_not_contains: String + slug_starts_with: String + slug_not_starts_with: String + slug_ends_with: String + slug_not_ends_with: String + users_every: UserWhereInput + users_some: UserWhereInput + users_none: UserWhereInput + updatedAt: DateTime + updatedAt_not: DateTime + updatedAt_in: [DateTime!] + updatedAt_not_in: [DateTime!] + updatedAt_lt: DateTime + updatedAt_lte: DateTime + updatedAt_gt: DateTime + updatedAt_gte: DateTime + createdAt: DateTime + createdAt_not: DateTime + createdAt_in: [DateTime!] + createdAt_not_in: [DateTime!] + createdAt_lt: DateTime + createdAt_lte: DateTime + createdAt_gt: DateTime + createdAt_gte: DateTime + AND: [ProjectWhereInput!] + OR: [ProjectWhereInput!] + NOT: [ProjectWhereInput!] +} + +input ProjectWhereUniqueInput { + id: ID + airtableId: String + slug: String +} + +type Proportion { + id: ID! + airtableId: String + name: String! + fruitMeals(where: MealWhereInput, orderBy: MealOrderByInput, skip: Int, after: String, before: String, first: Int, last: Int): [Meal!] + vegMeals(where: MealWhereInput, orderBy: MealOrderByInput, skip: Int, after: String, before: String, first: Int, last: Int): [Meal!] + updatedAt: DateTime! + createdAt: DateTime! +} + +type ProportionConnection { + pageInfo: PageInfo! + edges: [ProportionEdge]! + aggregate: AggregateProportion! +} + +input ProportionCreateInput { + id: ID + airtableId: String + name: String! + fruitMeals: MealCreateManyWithoutProportionFruitInput + vegMeals: MealCreateManyWithoutProportionVegInput +} + +input ProportionCreateOneWithoutFruitMealsInput { + create: ProportionCreateWithoutFruitMealsInput + connect: ProportionWhereUniqueInput +} + +input ProportionCreateOneWithoutVegMealsInput { + create: ProportionCreateWithoutVegMealsInput + connect: ProportionWhereUniqueInput +} + +input ProportionCreateWithoutFruitMealsInput { + id: ID + airtableId: String + name: String! + vegMeals: MealCreateManyWithoutProportionVegInput +} + +input ProportionCreateWithoutVegMealsInput { + id: ID + airtableId: String + name: String! + fruitMeals: MealCreateManyWithoutProportionFruitInput +} + +type ProportionEdge { + node: Proportion! + cursor: String! +} + +enum ProportionOrderByInput { + id_ASC + id_DESC + airtableId_ASC + airtableId_DESC + name_ASC + name_DESC + updatedAt_ASC + updatedAt_DESC + createdAt_ASC + createdAt_DESC +} + +type ProportionPreviousValues { + id: ID! + airtableId: String + name: String! + updatedAt: DateTime! + createdAt: DateTime! +} + +type ProportionSubscriptionPayload { + mutation: MutationType! + node: Proportion + updatedFields: [String!] + previousValues: ProportionPreviousValues +} + +input ProportionSubscriptionWhereInput { + mutation_in: [MutationType!] + updatedFields_contains: String + updatedFields_contains_every: [String!] + updatedFields_contains_some: [String!] + node: ProportionWhereInput + AND: [ProportionSubscriptionWhereInput!] + OR: [ProportionSubscriptionWhereInput!] + NOT: [ProportionSubscriptionWhereInput!] +} + +input ProportionUpdateInput { + airtableId: String + name: String + fruitMeals: MealUpdateManyWithoutProportionFruitInput + vegMeals: MealUpdateManyWithoutProportionVegInput +} + +input ProportionUpdateManyMutationInput { + airtableId: String + name: String +} + +input ProportionUpdateOneWithoutFruitMealsInput { + create: ProportionCreateWithoutFruitMealsInput + update: ProportionUpdateWithoutFruitMealsDataInput + upsert: ProportionUpsertWithoutFruitMealsInput + delete: Boolean + disconnect: Boolean + connect: ProportionWhereUniqueInput +} + +input ProportionUpdateOneWithoutVegMealsInput { + create: ProportionCreateWithoutVegMealsInput + update: ProportionUpdateWithoutVegMealsDataInput + upsert: ProportionUpsertWithoutVegMealsInput + delete: Boolean + disconnect: Boolean + connect: ProportionWhereUniqueInput +} + +input ProportionUpdateWithoutFruitMealsDataInput { + airtableId: String + name: String + vegMeals: MealUpdateManyWithoutProportionVegInput +} + +input ProportionUpdateWithoutVegMealsDataInput { + airtableId: String + name: String + fruitMeals: MealUpdateManyWithoutProportionFruitInput +} + +input ProportionUpsertWithoutFruitMealsInput { + update: ProportionUpdateWithoutFruitMealsDataInput! + create: ProportionCreateWithoutFruitMealsInput! +} + +input ProportionUpsertWithoutVegMealsInput { + update: ProportionUpdateWithoutVegMealsDataInput! + create: ProportionCreateWithoutVegMealsInput! +} + +input ProportionWhereInput { + id: ID + id_not: ID + id_in: [ID!] + id_not_in: [ID!] + id_lt: ID + id_lte: ID + id_gt: ID + id_gte: ID + id_contains: ID + id_not_contains: ID + id_starts_with: ID + id_not_starts_with: ID + id_ends_with: ID + id_not_ends_with: ID + airtableId: String + airtableId_not: String + airtableId_in: [String!] + airtableId_not_in: [String!] + airtableId_lt: String + airtableId_lte: String + airtableId_gt: String + airtableId_gte: String + airtableId_contains: String + airtableId_not_contains: String + airtableId_starts_with: String + airtableId_not_starts_with: String + airtableId_ends_with: String + airtableId_not_ends_with: String + name: String + name_not: String + name_in: [String!] + name_not_in: [String!] + name_lt: String + name_lte: String + name_gt: String + name_gte: String + name_contains: String + name_not_contains: String + name_starts_with: String + name_not_starts_with: String + name_ends_with: String + name_not_ends_with: String + fruitMeals_every: MealWhereInput + fruitMeals_some: MealWhereInput + fruitMeals_none: MealWhereInput + vegMeals_every: MealWhereInput + vegMeals_some: MealWhereInput + vegMeals_none: MealWhereInput + updatedAt: DateTime + updatedAt_not: DateTime + updatedAt_in: [DateTime!] + updatedAt_not_in: [DateTime!] + updatedAt_lt: DateTime + updatedAt_lte: DateTime + updatedAt_gt: DateTime + updatedAt_gte: DateTime + createdAt: DateTime + createdAt_not: DateTime + createdAt_in: [DateTime!] + createdAt_not_in: [DateTime!] + createdAt_lt: DateTime + createdAt_lte: DateTime + createdAt_gt: DateTime + createdAt_gte: DateTime + AND: [ProportionWhereInput!] + OR: [ProportionWhereInput!] + NOT: [ProportionWhereInput!] +} + +input ProportionWhereUniqueInput { + id: ID + airtableId: String + name: String +} + +type Query { + category(where: CategoryWhereUniqueInput!): Category + categories(where: CategoryWhereInput, orderBy: CategoryOrderByInput, skip: Int, after: String, before: String, first: Int, last: Int): [Category]! + categoriesConnection(where: CategoryWhereInput, orderBy: CategoryOrderByInput, skip: Int, after: String, before: String, first: Int, last: Int): CategoryConnection! + child(where: ChildWhereUniqueInput!): Child + children(where: ChildWhereInput, orderBy: ChildOrderByInput, skip: Int, after: String, before: String, first: Int, last: Int): [Child]! + childrenConnection(where: ChildWhereInput, orderBy: ChildOrderByInput, skip: Int, after: String, before: String, first: Int, last: Int): ChildConnection! + meal(where: MealWhereUniqueInput!): Meal + meals(where: MealWhereInput, orderBy: MealOrderByInput, skip: Int, after: String, before: String, first: Int, last: Int): [Meal]! + mealsConnection(where: MealWhereInput, orderBy: MealOrderByInput, skip: Int, after: String, before: String, first: Int, last: Int): MealConnection! + project(where: ProjectWhereUniqueInput!): Project + projects(where: ProjectWhereInput, orderBy: ProjectOrderByInput, skip: Int, after: String, before: String, first: Int, last: Int): [Project]! + projectsConnection(where: ProjectWhereInput, orderBy: ProjectOrderByInput, skip: Int, after: String, before: String, first: Int, last: Int): ProjectConnection! + proportion(where: ProportionWhereUniqueInput!): Proportion + proportions(where: ProportionWhereInput, orderBy: ProportionOrderByInput, skip: Int, after: String, before: String, first: Int, last: Int): [Proportion]! + proportionsConnection(where: ProportionWhereInput, orderBy: ProportionOrderByInput, skip: Int, after: String, before: String, first: Int, last: Int): ProportionConnection! + tag(where: TagWhereUniqueInput!): Tag + tags(where: TagWhereInput, orderBy: TagOrderByInput, skip: Int, after: String, before: String, first: Int, last: Int): [Tag]! + tagsConnection(where: TagWhereInput, orderBy: TagOrderByInput, skip: Int, after: String, before: String, first: Int, last: Int): TagConnection! + user(where: UserWhereUniqueInput!): User + users(where: UserWhereInput, orderBy: UserOrderByInput, skip: Int, after: String, before: String, first: Int, last: Int): [User]! + usersConnection(where: UserWhereInput, orderBy: UserOrderByInput, skip: Int, after: String, before: String, first: Int, last: Int): UserConnection! + node(id: ID!): Node +} + +type Subscription { + category(where: CategorySubscriptionWhereInput): CategorySubscriptionPayload + child(where: ChildSubscriptionWhereInput): ChildSubscriptionPayload + meal(where: MealSubscriptionWhereInput): MealSubscriptionPayload + project(where: ProjectSubscriptionWhereInput): ProjectSubscriptionPayload + proportion(where: ProportionSubscriptionWhereInput): ProportionSubscriptionPayload + tag(where: TagSubscriptionWhereInput): TagSubscriptionPayload + user(where: UserSubscriptionWhereInput): UserSubscriptionPayload +} + +type Tag { + id: ID! + airtableId: String + name: String! + meals(where: MealWhereInput, orderBy: MealOrderByInput, skip: Int, after: String, before: String, first: Int, last: Int): [Meal!] + updatedAt: DateTime! + createdAt: DateTime! +} + +type TagConnection { + pageInfo: PageInfo! + edges: [TagEdge]! + aggregate: AggregateTag! +} + +input TagCreateInput { + id: ID + airtableId: String + name: String! + meals: MealCreateManyWithoutTagsInput +} + +input TagCreateManyWithoutMealsInput { + create: [TagCreateWithoutMealsInput!] + connect: [TagWhereUniqueInput!] +} + +input TagCreateWithoutMealsInput { + id: ID + airtableId: String + name: String! +} + +type TagEdge { + node: Tag! + cursor: String! +} + +enum TagOrderByInput { + id_ASC + id_DESC + airtableId_ASC + airtableId_DESC + name_ASC + name_DESC + updatedAt_ASC + updatedAt_DESC + createdAt_ASC + createdAt_DESC +} + +type TagPreviousValues { + id: ID! + airtableId: String + name: String! + updatedAt: DateTime! + createdAt: DateTime! +} + +input TagScalarWhereInput { + id: ID + id_not: ID + id_in: [ID!] + id_not_in: [ID!] + id_lt: ID + id_lte: ID + id_gt: ID + id_gte: ID + id_contains: ID + id_not_contains: ID + id_starts_with: ID + id_not_starts_with: ID + id_ends_with: ID + id_not_ends_with: ID + airtableId: String + airtableId_not: String + airtableId_in: [String!] + airtableId_not_in: [String!] + airtableId_lt: String + airtableId_lte: String + airtableId_gt: String + airtableId_gte: String + airtableId_contains: String + airtableId_not_contains: String + airtableId_starts_with: String + airtableId_not_starts_with: String + airtableId_ends_with: String + airtableId_not_ends_with: String + name: String + name_not: String + name_in: [String!] + name_not_in: [String!] + name_lt: String + name_lte: String + name_gt: String + name_gte: String + name_contains: String + name_not_contains: String + name_starts_with: String + name_not_starts_with: String + name_ends_with: String + name_not_ends_with: String + updatedAt: DateTime + updatedAt_not: DateTime + updatedAt_in: [DateTime!] + updatedAt_not_in: [DateTime!] + updatedAt_lt: DateTime + updatedAt_lte: DateTime + updatedAt_gt: DateTime + updatedAt_gte: DateTime + createdAt: DateTime + createdAt_not: DateTime + createdAt_in: [DateTime!] + createdAt_not_in: [DateTime!] + createdAt_lt: DateTime + createdAt_lte: DateTime + createdAt_gt: DateTime + createdAt_gte: DateTime + AND: [TagScalarWhereInput!] + OR: [TagScalarWhereInput!] + NOT: [TagScalarWhereInput!] +} + +type TagSubscriptionPayload { + mutation: MutationType! + node: Tag + updatedFields: [String!] + previousValues: TagPreviousValues +} + +input TagSubscriptionWhereInput { + mutation_in: [MutationType!] + updatedFields_contains: String + updatedFields_contains_every: [String!] + updatedFields_contains_some: [String!] + node: TagWhereInput + AND: [TagSubscriptionWhereInput!] + OR: [TagSubscriptionWhereInput!] + NOT: [TagSubscriptionWhereInput!] +} + +input TagUpdateInput { + airtableId: String + name: String + meals: MealUpdateManyWithoutTagsInput +} + +input TagUpdateManyDataInput { + airtableId: String + name: String +} + +input TagUpdateManyMutationInput { + airtableId: String + name: String +} + +input TagUpdateManyWithoutMealsInput { + create: [TagCreateWithoutMealsInput!] + delete: [TagWhereUniqueInput!] + connect: [TagWhereUniqueInput!] + set: [TagWhereUniqueInput!] + disconnect: [TagWhereUniqueInput!] + update: [TagUpdateWithWhereUniqueWithoutMealsInput!] + upsert: [TagUpsertWithWhereUniqueWithoutMealsInput!] + deleteMany: [TagScalarWhereInput!] + updateMany: [TagUpdateManyWithWhereNestedInput!] +} + +input TagUpdateManyWithWhereNestedInput { + where: TagScalarWhereInput! + data: TagUpdateManyDataInput! +} + +input TagUpdateWithoutMealsDataInput { + airtableId: String + name: String +} + +input TagUpdateWithWhereUniqueWithoutMealsInput { + where: TagWhereUniqueInput! + data: TagUpdateWithoutMealsDataInput! +} + +input TagUpsertWithWhereUniqueWithoutMealsInput { + where: TagWhereUniqueInput! + update: TagUpdateWithoutMealsDataInput! + create: TagCreateWithoutMealsInput! +} + +input TagWhereInput { + id: ID + id_not: ID + id_in: [ID!] + id_not_in: [ID!] + id_lt: ID + id_lte: ID + id_gt: ID + id_gte: ID + id_contains: ID + id_not_contains: ID + id_starts_with: ID + id_not_starts_with: ID + id_ends_with: ID + id_not_ends_with: ID + airtableId: String + airtableId_not: String + airtableId_in: [String!] + airtableId_not_in: [String!] + airtableId_lt: String + airtableId_lte: String + airtableId_gt: String + airtableId_gte: String + airtableId_contains: String + airtableId_not_contains: String + airtableId_starts_with: String + airtableId_not_starts_with: String + airtableId_ends_with: String + airtableId_not_ends_with: String + name: String + name_not: String + name_in: [String!] + name_not_in: [String!] + name_lt: String + name_lte: String + name_gt: String + name_gte: String + name_contains: String + name_not_contains: String + name_starts_with: String + name_not_starts_with: String + name_ends_with: String + name_not_ends_with: String + meals_every: MealWhereInput + meals_some: MealWhereInput + meals_none: MealWhereInput + updatedAt: DateTime + updatedAt_not: DateTime + updatedAt_in: [DateTime!] + updatedAt_not_in: [DateTime!] + updatedAt_lt: DateTime + updatedAt_lte: DateTime + updatedAt_gt: DateTime + updatedAt_gte: DateTime + createdAt: DateTime + createdAt_not: DateTime + createdAt_in: [DateTime!] + createdAt_not_in: [DateTime!] + createdAt_lt: DateTime + createdAt_lte: DateTime + createdAt_gt: DateTime + createdAt_gte: DateTime + AND: [TagWhereInput!] + OR: [TagWhereInput!] + NOT: [TagWhereInput!] +} + +input TagWhereUniqueInput { + id: ID + airtableId: String + name: String +} + +type User { + id: ID! + airtableId: String + consentGDPR: Boolean! + postCode: String! + email: String! + meals(where: MealWhereInput, orderBy: MealOrderByInput, skip: Int, after: String, before: String, first: Int, last: Int): [Meal!] + projects(where: ProjectWhereInput, orderBy: ProjectOrderByInput, skip: Int, after: String, before: String, first: Int, last: Int): [Project!] + children(where: ChildWhereInput, orderBy: ChildOrderByInput, skip: Int, after: String, before: String, first: Int, last: Int): [Child!] + phoneNumber: String! + updatedAt: DateTime! + createdAt: DateTime! +} + +type UserConnection { + pageInfo: PageInfo! + edges: [UserEdge]! + aggregate: AggregateUser! +} + +input UserCreateInput { + id: ID + airtableId: String + consentGDPR: Boolean! + postCode: String! + email: String! + meals: MealCreateManyWithoutUserInput + projects: ProjectCreateManyWithoutUsersInput + children: ChildCreateManyWithoutParentInput + phoneNumber: String! +} + +input UserCreateManyWithoutProjectsInput { + create: [UserCreateWithoutProjectsInput!] + connect: [UserWhereUniqueInput!] +} + +input UserCreateOneWithoutChildrenInput { + create: UserCreateWithoutChildrenInput + connect: UserWhereUniqueInput +} + +input UserCreateOneWithoutMealsInput { + create: UserCreateWithoutMealsInput + connect: UserWhereUniqueInput +} + +input UserCreateWithoutChildrenInput { + id: ID + airtableId: String + consentGDPR: Boolean! + postCode: String! + email: String! + meals: MealCreateManyWithoutUserInput + projects: ProjectCreateManyWithoutUsersInput + phoneNumber: String! +} + +input UserCreateWithoutMealsInput { + id: ID + airtableId: String + consentGDPR: Boolean! + postCode: String! + email: String! + projects: ProjectCreateManyWithoutUsersInput + children: ChildCreateManyWithoutParentInput + phoneNumber: String! +} + +input UserCreateWithoutProjectsInput { + id: ID + airtableId: String + consentGDPR: Boolean! + postCode: String! + email: String! + meals: MealCreateManyWithoutUserInput + children: ChildCreateManyWithoutParentInput + phoneNumber: String! +} + +type UserEdge { + node: User! + cursor: String! +} + +enum UserOrderByInput { + id_ASC + id_DESC + airtableId_ASC + airtableId_DESC + consentGDPR_ASC + consentGDPR_DESC + postCode_ASC + postCode_DESC + email_ASC + email_DESC + phoneNumber_ASC + phoneNumber_DESC + updatedAt_ASC + updatedAt_DESC + createdAt_ASC + createdAt_DESC +} + +type UserPreviousValues { + id: ID! + airtableId: String + consentGDPR: Boolean! + postCode: String! + email: String! + phoneNumber: String! + updatedAt: DateTime! + createdAt: DateTime! +} + +input UserScalarWhereInput { + id: ID + id_not: ID + id_in: [ID!] + id_not_in: [ID!] + id_lt: ID + id_lte: ID + id_gt: ID + id_gte: ID + id_contains: ID + id_not_contains: ID + id_starts_with: ID + id_not_starts_with: ID + id_ends_with: ID + id_not_ends_with: ID + airtableId: String + airtableId_not: String + airtableId_in: [String!] + airtableId_not_in: [String!] + airtableId_lt: String + airtableId_lte: String + airtableId_gt: String + airtableId_gte: String + airtableId_contains: String + airtableId_not_contains: String + airtableId_starts_with: String + airtableId_not_starts_with: String + airtableId_ends_with: String + airtableId_not_ends_with: String + consentGDPR: Boolean + consentGDPR_not: Boolean + postCode: String + postCode_not: String + postCode_in: [String!] + postCode_not_in: [String!] + postCode_lt: String + postCode_lte: String + postCode_gt: String + postCode_gte: String + postCode_contains: String + postCode_not_contains: String + postCode_starts_with: String + postCode_not_starts_with: String + postCode_ends_with: String + postCode_not_ends_with: String + email: String + email_not: String + email_in: [String!] + email_not_in: [String!] + email_lt: String + email_lte: String + email_gt: String + email_gte: String + email_contains: String + email_not_contains: String + email_starts_with: String + email_not_starts_with: String + email_ends_with: String + email_not_ends_with: String + phoneNumber: String + phoneNumber_not: String + phoneNumber_in: [String!] + phoneNumber_not_in: [String!] + phoneNumber_lt: String + phoneNumber_lte: String + phoneNumber_gt: String + phoneNumber_gte: String + phoneNumber_contains: String + phoneNumber_not_contains: String + phoneNumber_starts_with: String + phoneNumber_not_starts_with: String + phoneNumber_ends_with: String + phoneNumber_not_ends_with: String + updatedAt: DateTime + updatedAt_not: DateTime + updatedAt_in: [DateTime!] + updatedAt_not_in: [DateTime!] + updatedAt_lt: DateTime + updatedAt_lte: DateTime + updatedAt_gt: DateTime + updatedAt_gte: DateTime + createdAt: DateTime + createdAt_not: DateTime + createdAt_in: [DateTime!] + createdAt_not_in: [DateTime!] + createdAt_lt: DateTime + createdAt_lte: DateTime + createdAt_gt: DateTime + createdAt_gte: DateTime + AND: [UserScalarWhereInput!] + OR: [UserScalarWhereInput!] + NOT: [UserScalarWhereInput!] +} + +type UserSubscriptionPayload { + mutation: MutationType! + node: User + updatedFields: [String!] + previousValues: UserPreviousValues +} + +input UserSubscriptionWhereInput { + mutation_in: [MutationType!] + updatedFields_contains: String + updatedFields_contains_every: [String!] + updatedFields_contains_some: [String!] + node: UserWhereInput + AND: [UserSubscriptionWhereInput!] + OR: [UserSubscriptionWhereInput!] + NOT: [UserSubscriptionWhereInput!] +} + +input UserUpdateInput { + airtableId: String + consentGDPR: Boolean + postCode: String + email: String + meals: MealUpdateManyWithoutUserInput + projects: ProjectUpdateManyWithoutUsersInput + children: ChildUpdateManyWithoutParentInput + phoneNumber: String +} + +input UserUpdateManyDataInput { + airtableId: String + consentGDPR: Boolean + postCode: String + email: String + phoneNumber: String +} + +input UserUpdateManyMutationInput { + airtableId: String + consentGDPR: Boolean + postCode: String + email: String + phoneNumber: String +} + +input UserUpdateManyWithoutProjectsInput { + create: [UserCreateWithoutProjectsInput!] + delete: [UserWhereUniqueInput!] + connect: [UserWhereUniqueInput!] + set: [UserWhereUniqueInput!] + disconnect: [UserWhereUniqueInput!] + update: [UserUpdateWithWhereUniqueWithoutProjectsInput!] + upsert: [UserUpsertWithWhereUniqueWithoutProjectsInput!] + deleteMany: [UserScalarWhereInput!] + updateMany: [UserUpdateManyWithWhereNestedInput!] +} + +input UserUpdateManyWithWhereNestedInput { + where: UserScalarWhereInput! + data: UserUpdateManyDataInput! +} + +input UserUpdateOneRequiredWithoutChildrenInput { + create: UserCreateWithoutChildrenInput + update: UserUpdateWithoutChildrenDataInput + upsert: UserUpsertWithoutChildrenInput + connect: UserWhereUniqueInput +} + +input UserUpdateOneRequiredWithoutMealsInput { + create: UserCreateWithoutMealsInput + update: UserUpdateWithoutMealsDataInput + upsert: UserUpsertWithoutMealsInput + connect: UserWhereUniqueInput +} + +input UserUpdateWithoutChildrenDataInput { + airtableId: String + consentGDPR: Boolean + postCode: String + email: String + meals: MealUpdateManyWithoutUserInput + projects: ProjectUpdateManyWithoutUsersInput + phoneNumber: String +} + +input UserUpdateWithoutMealsDataInput { + airtableId: String + consentGDPR: Boolean + postCode: String + email: String + projects: ProjectUpdateManyWithoutUsersInput + children: ChildUpdateManyWithoutParentInput + phoneNumber: String +} + +input UserUpdateWithoutProjectsDataInput { + airtableId: String + consentGDPR: Boolean + postCode: String + email: String + meals: MealUpdateManyWithoutUserInput + children: ChildUpdateManyWithoutParentInput + phoneNumber: String +} + +input UserUpdateWithWhereUniqueWithoutProjectsInput { + where: UserWhereUniqueInput! + data: UserUpdateWithoutProjectsDataInput! +} + +input UserUpsertWithoutChildrenInput { + update: UserUpdateWithoutChildrenDataInput! + create: UserCreateWithoutChildrenInput! +} + +input UserUpsertWithoutMealsInput { + update: UserUpdateWithoutMealsDataInput! + create: UserCreateWithoutMealsInput! +} + +input UserUpsertWithWhereUniqueWithoutProjectsInput { + where: UserWhereUniqueInput! + update: UserUpdateWithoutProjectsDataInput! + create: UserCreateWithoutProjectsInput! +} + +input UserWhereInput { + id: ID + id_not: ID + id_in: [ID!] + id_not_in: [ID!] + id_lt: ID + id_lte: ID + id_gt: ID + id_gte: ID + id_contains: ID + id_not_contains: ID + id_starts_with: ID + id_not_starts_with: ID + id_ends_with: ID + id_not_ends_with: ID + airtableId: String + airtableId_not: String + airtableId_in: [String!] + airtableId_not_in: [String!] + airtableId_lt: String + airtableId_lte: String + airtableId_gt: String + airtableId_gte: String + airtableId_contains: String + airtableId_not_contains: String + airtableId_starts_with: String + airtableId_not_starts_with: String + airtableId_ends_with: String + airtableId_not_ends_with: String + consentGDPR: Boolean + consentGDPR_not: Boolean + postCode: String + postCode_not: String + postCode_in: [String!] + postCode_not_in: [String!] + postCode_lt: String + postCode_lte: String + postCode_gt: String + postCode_gte: String + postCode_contains: String + postCode_not_contains: String + postCode_starts_with: String + postCode_not_starts_with: String + postCode_ends_with: String + postCode_not_ends_with: String + email: String + email_not: String + email_in: [String!] + email_not_in: [String!] + email_lt: String + email_lte: String + email_gt: String + email_gte: String + email_contains: String + email_not_contains: String + email_starts_with: String + email_not_starts_with: String + email_ends_with: String + email_not_ends_with: String + meals_every: MealWhereInput + meals_some: MealWhereInput + meals_none: MealWhereInput + projects_every: ProjectWhereInput + projects_some: ProjectWhereInput + projects_none: ProjectWhereInput + children_every: ChildWhereInput + children_some: ChildWhereInput + children_none: ChildWhereInput + phoneNumber: String + phoneNumber_not: String + phoneNumber_in: [String!] + phoneNumber_not_in: [String!] + phoneNumber_lt: String + phoneNumber_lte: String + phoneNumber_gt: String + phoneNumber_gte: String + phoneNumber_contains: String + phoneNumber_not_contains: String + phoneNumber_starts_with: String + phoneNumber_not_starts_with: String + phoneNumber_ends_with: String + phoneNumber_not_ends_with: String + updatedAt: DateTime + updatedAt_not: DateTime + updatedAt_in: [DateTime!] + updatedAt_not_in: [DateTime!] + updatedAt_lt: DateTime + updatedAt_lte: DateTime + updatedAt_gt: DateTime + updatedAt_gte: DateTime + createdAt: DateTime + createdAt_not: DateTime + createdAt_in: [DateTime!] + createdAt_not_in: [DateTime!] + createdAt_lt: DateTime + createdAt_lte: DateTime + createdAt_gt: DateTime + createdAt_gte: DateTime + AND: [UserWhereInput!] + OR: [UserWhereInput!] + NOT: [UserWhereInput!] +} + +input UserWhereUniqueInput { + id: ID + airtableId: String + email: String + phoneNumber: String +} +` + } + \ No newline at end of file diff --git a/prisma/generated/ts/index.ts b/prisma/generated/ts/index.ts new file mode 100644 index 0000000..c6b38b2 --- /dev/null +++ b/prisma/generated/ts/index.ts @@ -0,0 +1,3858 @@ +// Code generated by Prisma (prisma@1.34.10). DO NOT EDIT. +// Please don't change this file manually but run `prisma generate` to update it. +// For more information, please read the docs: https://www.prisma.io/docs/prisma-client/ + +import { DocumentNode } from "graphql"; +import { + makePrismaClientClass, + BaseClientOptions, + Model +} from "prisma-client-lib"; +import { typeDefs } from "./prisma-schema"; + +export type AtLeastOne }> = Partial & + U[keyof U]; + +export type Maybe = T | undefined | null; + +export interface Exists { + category: (where?: CategoryWhereInput) => Promise; + child: (where?: ChildWhereInput) => Promise; + meal: (where?: MealWhereInput) => Promise; + project: (where?: ProjectWhereInput) => Promise; + proportion: (where?: ProportionWhereInput) => Promise; + tag: (where?: TagWhereInput) => Promise; + user: (where?: UserWhereInput) => Promise; +} + +export interface Node {} + +export type FragmentableArray = Promise> & Fragmentable; + +export interface Fragmentable { + $fragment(fragment: string | DocumentNode): Promise; +} + +export interface Prisma { + $exists: Exists; + $graphql: ( + query: string, + variables?: { [key: string]: any } + ) => Promise; + + /** + * Queries + */ + + category: (where: CategoryWhereUniqueInput) => CategoryNullablePromise; + categories: (args?: { + where?: CategoryWhereInput; + orderBy?: CategoryOrderByInput; + skip?: Int; + after?: String; + before?: String; + first?: Int; + last?: Int; + }) => FragmentableArray; + categoriesConnection: (args?: { + where?: CategoryWhereInput; + orderBy?: CategoryOrderByInput; + skip?: Int; + after?: String; + before?: String; + first?: Int; + last?: Int; + }) => CategoryConnectionPromise; + child: (where: ChildWhereUniqueInput) => ChildNullablePromise; + children: (args?: { + where?: ChildWhereInput; + orderBy?: ChildOrderByInput; + skip?: Int; + after?: String; + before?: String; + first?: Int; + last?: Int; + }) => FragmentableArray; + childrenConnection: (args?: { + where?: ChildWhereInput; + orderBy?: ChildOrderByInput; + skip?: Int; + after?: String; + before?: String; + first?: Int; + last?: Int; + }) => ChildConnectionPromise; + meal: (where: MealWhereUniqueInput) => MealNullablePromise; + meals: (args?: { + where?: MealWhereInput; + orderBy?: MealOrderByInput; + skip?: Int; + after?: String; + before?: String; + first?: Int; + last?: Int; + }) => FragmentableArray; + mealsConnection: (args?: { + where?: MealWhereInput; + orderBy?: MealOrderByInput; + skip?: Int; + after?: String; + before?: String; + first?: Int; + last?: Int; + }) => MealConnectionPromise; + project: (where: ProjectWhereUniqueInput) => ProjectNullablePromise; + projects: (args?: { + where?: ProjectWhereInput; + orderBy?: ProjectOrderByInput; + skip?: Int; + after?: String; + before?: String; + first?: Int; + last?: Int; + }) => FragmentableArray; + projectsConnection: (args?: { + where?: ProjectWhereInput; + orderBy?: ProjectOrderByInput; + skip?: Int; + after?: String; + before?: String; + first?: Int; + last?: Int; + }) => ProjectConnectionPromise; + proportion: (where: ProportionWhereUniqueInput) => ProportionNullablePromise; + proportions: (args?: { + where?: ProportionWhereInput; + orderBy?: ProportionOrderByInput; + skip?: Int; + after?: String; + before?: String; + first?: Int; + last?: Int; + }) => FragmentableArray; + proportionsConnection: (args?: { + where?: ProportionWhereInput; + orderBy?: ProportionOrderByInput; + skip?: Int; + after?: String; + before?: String; + first?: Int; + last?: Int; + }) => ProportionConnectionPromise; + tag: (where: TagWhereUniqueInput) => TagNullablePromise; + tags: (args?: { + where?: TagWhereInput; + orderBy?: TagOrderByInput; + skip?: Int; + after?: String; + before?: String; + first?: Int; + last?: Int; + }) => FragmentableArray; + tagsConnection: (args?: { + where?: TagWhereInput; + orderBy?: TagOrderByInput; + skip?: Int; + after?: String; + before?: String; + first?: Int; + last?: Int; + }) => TagConnectionPromise; + user: (where: UserWhereUniqueInput) => UserNullablePromise; + users: (args?: { + where?: UserWhereInput; + orderBy?: UserOrderByInput; + skip?: Int; + after?: String; + before?: String; + first?: Int; + last?: Int; + }) => FragmentableArray; + usersConnection: (args?: { + where?: UserWhereInput; + orderBy?: UserOrderByInput; + skip?: Int; + after?: String; + before?: String; + first?: Int; + last?: Int; + }) => UserConnectionPromise; + node: (args: { id: ID_Output }) => Node; + + /** + * Mutations + */ + + createCategory: (data: CategoryCreateInput) => CategoryPromise; + updateCategory: (args: { + data: CategoryUpdateInput; + where: CategoryWhereUniqueInput; + }) => CategoryPromise; + updateManyCategories: (args: { + data: CategoryUpdateManyMutationInput; + where?: CategoryWhereInput; + }) => BatchPayloadPromise; + upsertCategory: (args: { + where: CategoryWhereUniqueInput; + create: CategoryCreateInput; + update: CategoryUpdateInput; + }) => CategoryPromise; + deleteCategory: (where: CategoryWhereUniqueInput) => CategoryPromise; + deleteManyCategories: (where?: CategoryWhereInput) => BatchPayloadPromise; + createChild: (data: ChildCreateInput) => ChildPromise; + updateChild: (args: { + data: ChildUpdateInput; + where: ChildWhereUniqueInput; + }) => ChildPromise; + updateManyChildren: (args: { + data: ChildUpdateManyMutationInput; + where?: ChildWhereInput; + }) => BatchPayloadPromise; + upsertChild: (args: { + where: ChildWhereUniqueInput; + create: ChildCreateInput; + update: ChildUpdateInput; + }) => ChildPromise; + deleteChild: (where: ChildWhereUniqueInput) => ChildPromise; + deleteManyChildren: (where?: ChildWhereInput) => BatchPayloadPromise; + createMeal: (data: MealCreateInput) => MealPromise; + updateMeal: (args: { + data: MealUpdateInput; + where: MealWhereUniqueInput; + }) => MealPromise; + updateManyMeals: (args: { + data: MealUpdateManyMutationInput; + where?: MealWhereInput; + }) => BatchPayloadPromise; + upsertMeal: (args: { + where: MealWhereUniqueInput; + create: MealCreateInput; + update: MealUpdateInput; + }) => MealPromise; + deleteMeal: (where: MealWhereUniqueInput) => MealPromise; + deleteManyMeals: (where?: MealWhereInput) => BatchPayloadPromise; + createProject: (data: ProjectCreateInput) => ProjectPromise; + updateProject: (args: { + data: ProjectUpdateInput; + where: ProjectWhereUniqueInput; + }) => ProjectPromise; + updateManyProjects: (args: { + data: ProjectUpdateManyMutationInput; + where?: ProjectWhereInput; + }) => BatchPayloadPromise; + upsertProject: (args: { + where: ProjectWhereUniqueInput; + create: ProjectCreateInput; + update: ProjectUpdateInput; + }) => ProjectPromise; + deleteProject: (where: ProjectWhereUniqueInput) => ProjectPromise; + deleteManyProjects: (where?: ProjectWhereInput) => BatchPayloadPromise; + createProportion: (data: ProportionCreateInput) => ProportionPromise; + updateProportion: (args: { + data: ProportionUpdateInput; + where: ProportionWhereUniqueInput; + }) => ProportionPromise; + updateManyProportions: (args: { + data: ProportionUpdateManyMutationInput; + where?: ProportionWhereInput; + }) => BatchPayloadPromise; + upsertProportion: (args: { + where: ProportionWhereUniqueInput; + create: ProportionCreateInput; + update: ProportionUpdateInput; + }) => ProportionPromise; + deleteProportion: (where: ProportionWhereUniqueInput) => ProportionPromise; + deleteManyProportions: (where?: ProportionWhereInput) => BatchPayloadPromise; + createTag: (data: TagCreateInput) => TagPromise; + updateTag: (args: { + data: TagUpdateInput; + where: TagWhereUniqueInput; + }) => TagPromise; + updateManyTags: (args: { + data: TagUpdateManyMutationInput; + where?: TagWhereInput; + }) => BatchPayloadPromise; + upsertTag: (args: { + where: TagWhereUniqueInput; + create: TagCreateInput; + update: TagUpdateInput; + }) => TagPromise; + deleteTag: (where: TagWhereUniqueInput) => TagPromise; + deleteManyTags: (where?: TagWhereInput) => BatchPayloadPromise; + createUser: (data: UserCreateInput) => UserPromise; + updateUser: (args: { + data: UserUpdateInput; + where: UserWhereUniqueInput; + }) => UserPromise; + updateManyUsers: (args: { + data: UserUpdateManyMutationInput; + where?: UserWhereInput; + }) => BatchPayloadPromise; + upsertUser: (args: { + where: UserWhereUniqueInput; + create: UserCreateInput; + update: UserUpdateInput; + }) => UserPromise; + deleteUser: (where: UserWhereUniqueInput) => UserPromise; + deleteManyUsers: (where?: UserWhereInput) => BatchPayloadPromise; + + /** + * Subscriptions + */ + + $subscribe: Subscription; +} + +export interface Subscription { + category: ( + where?: CategorySubscriptionWhereInput + ) => CategorySubscriptionPayloadSubscription; + child: ( + where?: ChildSubscriptionWhereInput + ) => ChildSubscriptionPayloadSubscription; + meal: ( + where?: MealSubscriptionWhereInput + ) => MealSubscriptionPayloadSubscription; + project: ( + where?: ProjectSubscriptionWhereInput + ) => ProjectSubscriptionPayloadSubscription; + proportion: ( + where?: ProportionSubscriptionWhereInput + ) => ProportionSubscriptionPayloadSubscription; + tag: ( + where?: TagSubscriptionWhereInput + ) => TagSubscriptionPayloadSubscription; + user: ( + where?: UserSubscriptionWhereInput + ) => UserSubscriptionPayloadSubscription; +} + +export interface ClientConstructor { + new (options?: BaseClientOptions): T; +} + +/** + * Types + */ + +export type MealOrderByInput = + | "id_ASC" + | "id_DESC" + | "airtableId_ASC" + | "airtableId_DESC" + | "imageURL_ASC" + | "imageURL_DESC" + | "updatedAt_ASC" + | "updatedAt_DESC" + | "createdAt_ASC" + | "createdAt_DESC"; + +export type ProjectOrderByInput = + | "id_ASC" + | "id_DESC" + | "airtableId_ASC" + | "airtableId_DESC" + | "name_ASC" + | "name_DESC" + | "slug_ASC" + | "slug_DESC" + | "updatedAt_ASC" + | "updatedAt_DESC" + | "createdAt_ASC" + | "createdAt_DESC"; + +export type UserOrderByInput = + | "id_ASC" + | "id_DESC" + | "airtableId_ASC" + | "airtableId_DESC" + | "consentGDPR_ASC" + | "consentGDPR_DESC" + | "postCode_ASC" + | "postCode_DESC" + | "email_ASC" + | "email_DESC" + | "phoneNumber_ASC" + | "phoneNumber_DESC" + | "updatedAt_ASC" + | "updatedAt_DESC" + | "createdAt_ASC" + | "createdAt_DESC"; + +export type ChildOrderByInput = + | "id_ASC" + | "id_DESC" + | "airtableId_ASC" + | "airtableId_DESC" + | "age_ASC" + | "age_DESC" + | "updatedAt_ASC" + | "updatedAt_DESC" + | "createdAt_ASC" + | "createdAt_DESC"; + +export type CategoryOrderByInput = + | "id_ASC" + | "id_DESC" + | "airtableId_ASC" + | "airtableId_DESC" + | "name_ASC" + | "name_DESC" + | "updatedAt_ASC" + | "updatedAt_DESC" + | "createdAt_ASC" + | "createdAt_DESC"; + +export type TagOrderByInput = + | "id_ASC" + | "id_DESC" + | "airtableId_ASC" + | "airtableId_DESC" + | "name_ASC" + | "name_DESC" + | "updatedAt_ASC" + | "updatedAt_DESC" + | "createdAt_ASC" + | "createdAt_DESC"; + +export type ProportionOrderByInput = + | "id_ASC" + | "id_DESC" + | "airtableId_ASC" + | "airtableId_DESC" + | "name_ASC" + | "name_DESC" + | "updatedAt_ASC" + | "updatedAt_DESC" + | "createdAt_ASC" + | "createdAt_DESC"; + +export type MutationType = "CREATED" | "UPDATED" | "DELETED"; + +export interface TagUpdateWithWhereUniqueWithoutMealsInput { + where: TagWhereUniqueInput; + data: TagUpdateWithoutMealsDataInput; +} + +export type CategoryWhereUniqueInput = AtLeastOne<{ + id: Maybe; + airtableId?: Maybe; + name?: Maybe; +}>; + +export interface TagUpdateManyDataInput { + airtableId?: Maybe; + name?: Maybe; +} + +export interface CategoryWhereInput { + id?: Maybe; + id_not?: Maybe; + id_in?: Maybe; + id_not_in?: Maybe; + id_lt?: Maybe; + id_lte?: Maybe; + id_gt?: Maybe; + id_gte?: Maybe; + id_contains?: Maybe; + id_not_contains?: Maybe; + id_starts_with?: Maybe; + id_not_starts_with?: Maybe; + id_ends_with?: Maybe; + id_not_ends_with?: Maybe; + airtableId?: Maybe; + airtableId_not?: Maybe; + airtableId_in?: Maybe; + airtableId_not_in?: Maybe; + airtableId_lt?: Maybe; + airtableId_lte?: Maybe; + airtableId_gt?: Maybe; + airtableId_gte?: Maybe; + airtableId_contains?: Maybe; + airtableId_not_contains?: Maybe; + airtableId_starts_with?: Maybe; + airtableId_not_starts_with?: Maybe; + airtableId_ends_with?: Maybe; + airtableId_not_ends_with?: Maybe; + name?: Maybe; + name_not?: Maybe; + name_in?: Maybe; + name_not_in?: Maybe; + name_lt?: Maybe; + name_lte?: Maybe; + name_gt?: Maybe; + name_gte?: Maybe; + name_contains?: Maybe; + name_not_contains?: Maybe; + name_starts_with?: Maybe; + name_not_starts_with?: Maybe; + name_ends_with?: Maybe; + name_not_ends_with?: Maybe; + meals_every?: Maybe; + meals_some?: Maybe; + meals_none?: Maybe; + updatedAt?: Maybe; + updatedAt_not?: Maybe; + updatedAt_in?: Maybe; + updatedAt_not_in?: Maybe; + updatedAt_lt?: Maybe; + updatedAt_lte?: Maybe; + updatedAt_gt?: Maybe; + updatedAt_gte?: Maybe; + createdAt?: Maybe; + createdAt_not?: Maybe; + createdAt_in?: Maybe; + createdAt_not_in?: Maybe; + createdAt_lt?: Maybe; + createdAt_lte?: Maybe; + createdAt_gt?: Maybe; + createdAt_gte?: Maybe; + AND?: Maybe; + OR?: Maybe; + NOT?: Maybe; +} + +export interface ProportionUpdateOneWithoutFruitMealsInput { + create?: Maybe; + update?: Maybe; + upsert?: Maybe; + delete?: Maybe; + disconnect?: Maybe; + connect?: Maybe; +} + +export interface ProportionWhereInput { + id?: Maybe; + id_not?: Maybe; + id_in?: Maybe; + id_not_in?: Maybe; + id_lt?: Maybe; + id_lte?: Maybe; + id_gt?: Maybe; + id_gte?: Maybe; + id_contains?: Maybe; + id_not_contains?: Maybe; + id_starts_with?: Maybe; + id_not_starts_with?: Maybe; + id_ends_with?: Maybe; + id_not_ends_with?: Maybe; + airtableId?: Maybe; + airtableId_not?: Maybe; + airtableId_in?: Maybe; + airtableId_not_in?: Maybe; + airtableId_lt?: Maybe; + airtableId_lte?: Maybe; + airtableId_gt?: Maybe; + airtableId_gte?: Maybe; + airtableId_contains?: Maybe; + airtableId_not_contains?: Maybe; + airtableId_starts_with?: Maybe; + airtableId_not_starts_with?: Maybe; + airtableId_ends_with?: Maybe; + airtableId_not_ends_with?: Maybe; + name?: Maybe; + name_not?: Maybe; + name_in?: Maybe; + name_not_in?: Maybe; + name_lt?: Maybe; + name_lte?: Maybe; + name_gt?: Maybe; + name_gte?: Maybe; + name_contains?: Maybe; + name_not_contains?: Maybe; + name_starts_with?: Maybe; + name_not_starts_with?: Maybe; + name_ends_with?: Maybe; + name_not_ends_with?: Maybe; + fruitMeals_every?: Maybe; + fruitMeals_some?: Maybe; + fruitMeals_none?: Maybe; + vegMeals_every?: Maybe; + vegMeals_some?: Maybe; + vegMeals_none?: Maybe; + updatedAt?: Maybe; + updatedAt_not?: Maybe; + updatedAt_in?: Maybe; + updatedAt_not_in?: Maybe; + updatedAt_lt?: Maybe; + updatedAt_lte?: Maybe; + updatedAt_gt?: Maybe; + updatedAt_gte?: Maybe; + createdAt?: Maybe; + createdAt_not?: Maybe; + createdAt_in?: Maybe; + createdAt_not_in?: Maybe; + createdAt_lt?: Maybe; + createdAt_lte?: Maybe; + createdAt_gt?: Maybe; + createdAt_gte?: Maybe; + AND?: Maybe; + OR?: Maybe; + NOT?: Maybe; +} + +export interface UserUpdateWithoutMealsDataInput { + airtableId?: Maybe; + consentGDPR?: Maybe; + postCode?: Maybe; + email?: Maybe; + projects?: Maybe; + children?: Maybe; + phoneNumber?: Maybe; +} + +export interface MealUpdateManyMutationInput { + airtableId?: Maybe; + imageURL?: Maybe; +} + +export interface ProjectUpdateManyWithoutUsersInput { + create?: Maybe< + ProjectCreateWithoutUsersInput[] | ProjectCreateWithoutUsersInput + >; + delete?: Maybe; + connect?: Maybe; + set?: Maybe; + disconnect?: Maybe; + update?: Maybe< + | ProjectUpdateWithWhereUniqueWithoutUsersInput[] + | ProjectUpdateWithWhereUniqueWithoutUsersInput + >; + upsert?: Maybe< + | ProjectUpsertWithWhereUniqueWithoutUsersInput[] + | ProjectUpsertWithWhereUniqueWithoutUsersInput + >; + deleteMany?: Maybe; + updateMany?: Maybe< + | ProjectUpdateManyWithWhereNestedInput[] + | ProjectUpdateManyWithWhereNestedInput + >; +} + +export interface ProportionUpdateWithoutFruitMealsDataInput { + airtableId?: Maybe; + name?: Maybe; + vegMeals?: Maybe; +} + +export interface ProjectUpdateWithWhereUniqueWithoutUsersInput { + where: ProjectWhereUniqueInput; + data: ProjectUpdateWithoutUsersDataInput; +} + +export interface TagSubscriptionWhereInput { + mutation_in?: Maybe; + updatedFields_contains?: Maybe; + updatedFields_contains_every?: Maybe; + updatedFields_contains_some?: Maybe; + node?: Maybe; + AND?: Maybe; + OR?: Maybe; + NOT?: Maybe; +} + +export interface ProjectUpdateWithoutUsersDataInput { + airtableId?: Maybe; + name?: Maybe; + slug?: Maybe; +} + +export interface ProjectWhereInput { + id?: Maybe; + id_not?: Maybe; + id_in?: Maybe; + id_not_in?: Maybe; + id_lt?: Maybe; + id_lte?: Maybe; + id_gt?: Maybe; + id_gte?: Maybe; + id_contains?: Maybe; + id_not_contains?: Maybe; + id_starts_with?: Maybe; + id_not_starts_with?: Maybe; + id_ends_with?: Maybe; + id_not_ends_with?: Maybe; + airtableId?: Maybe; + airtableId_not?: Maybe; + airtableId_in?: Maybe; + airtableId_not_in?: Maybe; + airtableId_lt?: Maybe; + airtableId_lte?: Maybe; + airtableId_gt?: Maybe; + airtableId_gte?: Maybe; + airtableId_contains?: Maybe; + airtableId_not_contains?: Maybe; + airtableId_starts_with?: Maybe; + airtableId_not_starts_with?: Maybe; + airtableId_ends_with?: Maybe; + airtableId_not_ends_with?: Maybe; + name?: Maybe; + name_not?: Maybe; + name_in?: Maybe; + name_not_in?: Maybe; + name_lt?: Maybe; + name_lte?: Maybe; + name_gt?: Maybe; + name_gte?: Maybe; + name_contains?: Maybe; + name_not_contains?: Maybe; + name_starts_with?: Maybe; + name_not_starts_with?: Maybe; + name_ends_with?: Maybe; + name_not_ends_with?: Maybe; + slug?: Maybe; + slug_not?: Maybe; + slug_in?: Maybe; + slug_not_in?: Maybe; + slug_lt?: Maybe; + slug_lte?: Maybe; + slug_gt?: Maybe; + slug_gte?: Maybe; + slug_contains?: Maybe; + slug_not_contains?: Maybe; + slug_starts_with?: Maybe; + slug_not_starts_with?: Maybe; + slug_ends_with?: Maybe; + slug_not_ends_with?: Maybe; + users_every?: Maybe; + users_some?: Maybe; + users_none?: Maybe; + updatedAt?: Maybe; + updatedAt_not?: Maybe; + updatedAt_in?: Maybe; + updatedAt_not_in?: Maybe; + updatedAt_lt?: Maybe; + updatedAt_lte?: Maybe; + updatedAt_gt?: Maybe; + updatedAt_gte?: Maybe; + createdAt?: Maybe; + createdAt_not?: Maybe; + createdAt_in?: Maybe; + createdAt_not_in?: Maybe; + createdAt_lt?: Maybe; + createdAt_lte?: Maybe; + createdAt_gt?: Maybe; + createdAt_gte?: Maybe; + AND?: Maybe; + OR?: Maybe; + NOT?: Maybe; +} + +export interface ProjectUpsertWithWhereUniqueWithoutUsersInput { + where: ProjectWhereUniqueInput; + update: ProjectUpdateWithoutUsersDataInput; + create: ProjectCreateWithoutUsersInput; +} + +export interface MealSubscriptionWhereInput { + mutation_in?: Maybe; + updatedFields_contains?: Maybe; + updatedFields_contains_every?: Maybe; + updatedFields_contains_some?: Maybe; + node?: Maybe; + AND?: Maybe; + OR?: Maybe; + NOT?: Maybe; +} + +export interface ProjectScalarWhereInput { + id?: Maybe; + id_not?: Maybe; + id_in?: Maybe; + id_not_in?: Maybe; + id_lt?: Maybe; + id_lte?: Maybe; + id_gt?: Maybe; + id_gte?: Maybe; + id_contains?: Maybe; + id_not_contains?: Maybe; + id_starts_with?: Maybe; + id_not_starts_with?: Maybe; + id_ends_with?: Maybe; + id_not_ends_with?: Maybe; + airtableId?: Maybe; + airtableId_not?: Maybe; + airtableId_in?: Maybe; + airtableId_not_in?: Maybe; + airtableId_lt?: Maybe; + airtableId_lte?: Maybe; + airtableId_gt?: Maybe; + airtableId_gte?: Maybe; + airtableId_contains?: Maybe; + airtableId_not_contains?: Maybe; + airtableId_starts_with?: Maybe; + airtableId_not_starts_with?: Maybe; + airtableId_ends_with?: Maybe; + airtableId_not_ends_with?: Maybe; + name?: Maybe; + name_not?: Maybe; + name_in?: Maybe; + name_not_in?: Maybe; + name_lt?: Maybe; + name_lte?: Maybe; + name_gt?: Maybe; + name_gte?: Maybe; + name_contains?: Maybe; + name_not_contains?: Maybe; + name_starts_with?: Maybe; + name_not_starts_with?: Maybe; + name_ends_with?: Maybe; + name_not_ends_with?: Maybe; + slug?: Maybe; + slug_not?: Maybe; + slug_in?: Maybe; + slug_not_in?: Maybe; + slug_lt?: Maybe; + slug_lte?: Maybe; + slug_gt?: Maybe; + slug_gte?: Maybe; + slug_contains?: Maybe; + slug_not_contains?: Maybe; + slug_starts_with?: Maybe; + slug_not_starts_with?: Maybe; + slug_ends_with?: Maybe; + slug_not_ends_with?: Maybe; + updatedAt?: Maybe; + updatedAt_not?: Maybe; + updatedAt_in?: Maybe; + updatedAt_not_in?: Maybe; + updatedAt_lt?: Maybe; + updatedAt_lte?: Maybe; + updatedAt_gt?: Maybe; + updatedAt_gte?: Maybe; + createdAt?: Maybe; + createdAt_not?: Maybe; + createdAt_in?: Maybe; + createdAt_not_in?: Maybe; + createdAt_lt?: Maybe; + createdAt_lte?: Maybe; + createdAt_gt?: Maybe; + createdAt_gte?: Maybe; + AND?: Maybe; + OR?: Maybe; + NOT?: Maybe; +} + +export interface MealWhereInput { + id?: Maybe; + id_not?: Maybe; + id_in?: Maybe; + id_not_in?: Maybe; + id_lt?: Maybe; + id_lte?: Maybe; + id_gt?: Maybe; + id_gte?: Maybe; + id_contains?: Maybe; + id_not_contains?: Maybe; + id_starts_with?: Maybe; + id_not_starts_with?: Maybe; + id_ends_with?: Maybe; + id_not_ends_with?: Maybe; + airtableId?: Maybe; + airtableId_not?: Maybe; + airtableId_in?: Maybe; + airtableId_not_in?: Maybe; + airtableId_lt?: Maybe; + airtableId_lte?: Maybe; + airtableId_gt?: Maybe; + airtableId_gte?: Maybe; + airtableId_contains?: Maybe; + airtableId_not_contains?: Maybe; + airtableId_starts_with?: Maybe; + airtableId_not_starts_with?: Maybe; + airtableId_ends_with?: Maybe; + airtableId_not_ends_with?: Maybe; + user?: Maybe; + imageURL?: Maybe; + imageURL_not?: Maybe; + imageURL_in?: Maybe; + imageURL_not_in?: Maybe; + imageURL_lt?: Maybe; + imageURL_lte?: Maybe; + imageURL_gt?: Maybe; + imageURL_gte?: Maybe; + imageURL_contains?: Maybe; + imageURL_not_contains?: Maybe; + imageURL_starts_with?: Maybe; + imageURL_not_starts_with?: Maybe; + imageURL_ends_with?: Maybe; + imageURL_not_ends_with?: Maybe; + categories_every?: Maybe; + categories_some?: Maybe; + categories_none?: Maybe; + tags_every?: Maybe; + tags_some?: Maybe; + tags_none?: Maybe; + updatedAt?: Maybe; + updatedAt_not?: Maybe; + updatedAt_in?: Maybe; + updatedAt_not_in?: Maybe; + updatedAt_lt?: Maybe; + updatedAt_lte?: Maybe; + updatedAt_gt?: Maybe; + updatedAt_gte?: Maybe; + createdAt?: Maybe; + createdAt_not?: Maybe; + createdAt_in?: Maybe; + createdAt_not_in?: Maybe; + createdAt_lt?: Maybe; + createdAt_lte?: Maybe; + createdAt_gt?: Maybe; + createdAt_gte?: Maybe; + proportionFruit?: Maybe; + proportionVeg?: Maybe; + AND?: Maybe; + OR?: Maybe; + NOT?: Maybe; +} + +export interface ProjectUpdateManyWithWhereNestedInput { + where: ProjectScalarWhereInput; + data: ProjectUpdateManyDataInput; +} + +export interface CategorySubscriptionWhereInput { + mutation_in?: Maybe; + updatedFields_contains?: Maybe; + updatedFields_contains_every?: Maybe; + updatedFields_contains_some?: Maybe; + node?: Maybe; + AND?: Maybe< + CategorySubscriptionWhereInput[] | CategorySubscriptionWhereInput + >; + OR?: Maybe; + NOT?: Maybe< + CategorySubscriptionWhereInput[] | CategorySubscriptionWhereInput + >; +} + +export interface ProjectUpdateManyDataInput { + airtableId?: Maybe; + name?: Maybe; + slug?: Maybe; +} + +export interface UserUpdateInput { + airtableId?: Maybe; + consentGDPR?: Maybe; + postCode?: Maybe; + email?: Maybe; + meals?: Maybe; + projects?: Maybe; + children?: Maybe; + phoneNumber?: Maybe; +} + +export interface ChildUpdateManyWithoutParentInput { + create?: Maybe< + ChildCreateWithoutParentInput[] | ChildCreateWithoutParentInput + >; + delete?: Maybe; + connect?: Maybe; + set?: Maybe; + disconnect?: Maybe; + update?: Maybe< + | ChildUpdateWithWhereUniqueWithoutParentInput[] + | ChildUpdateWithWhereUniqueWithoutParentInput + >; + upsert?: Maybe< + | ChildUpsertWithWhereUniqueWithoutParentInput[] + | ChildUpsertWithWhereUniqueWithoutParentInput + >; + deleteMany?: Maybe; + updateMany?: Maybe< + ChildUpdateManyWithWhereNestedInput[] | ChildUpdateManyWithWhereNestedInput + >; +} + +export interface TagUpdateManyMutationInput { + airtableId?: Maybe; + name?: Maybe; +} + +export interface ChildUpdateWithWhereUniqueWithoutParentInput { + where: ChildWhereUniqueInput; + data: ChildUpdateWithoutParentDataInput; +} + +export interface MealUpsertWithWhereUniqueWithoutTagsInput { + where: MealWhereUniqueInput; + update: MealUpdateWithoutTagsDataInput; + create: MealCreateWithoutTagsInput; +} + +export interface ChildUpdateWithoutParentDataInput { + airtableId?: Maybe; + age?: Maybe; +} + +export interface MealUpdateWithWhereUniqueWithoutTagsInput { + where: MealWhereUniqueInput; + data: MealUpdateWithoutTagsDataInput; +} + +export interface ChildUpsertWithWhereUniqueWithoutParentInput { + where: ChildWhereUniqueInput; + update: ChildUpdateWithoutParentDataInput; + create: ChildCreateWithoutParentInput; +} + +export interface MealUpdateManyWithoutTagsInput { + create?: Maybe; + delete?: Maybe; + connect?: Maybe; + set?: Maybe; + disconnect?: Maybe; + update?: Maybe< + | MealUpdateWithWhereUniqueWithoutTagsInput[] + | MealUpdateWithWhereUniqueWithoutTagsInput + >; + upsert?: Maybe< + | MealUpsertWithWhereUniqueWithoutTagsInput[] + | MealUpsertWithWhereUniqueWithoutTagsInput + >; + deleteMany?: Maybe; + updateMany?: Maybe< + MealUpdateManyWithWhereNestedInput[] | MealUpdateManyWithWhereNestedInput + >; +} + +export interface ChildScalarWhereInput { + id?: Maybe; + id_not?: Maybe; + id_in?: Maybe; + id_not_in?: Maybe; + id_lt?: Maybe; + id_lte?: Maybe; + id_gt?: Maybe; + id_gte?: Maybe; + id_contains?: Maybe; + id_not_contains?: Maybe; + id_starts_with?: Maybe; + id_not_starts_with?: Maybe; + id_ends_with?: Maybe; + id_not_ends_with?: Maybe; + airtableId?: Maybe; + airtableId_not?: Maybe; + airtableId_in?: Maybe; + airtableId_not_in?: Maybe; + airtableId_lt?: Maybe; + airtableId_lte?: Maybe; + airtableId_gt?: Maybe; + airtableId_gte?: Maybe; + airtableId_contains?: Maybe; + airtableId_not_contains?: Maybe; + airtableId_starts_with?: Maybe; + airtableId_not_starts_with?: Maybe; + airtableId_ends_with?: Maybe; + airtableId_not_ends_with?: Maybe; + age?: Maybe; + age_not?: Maybe; + age_in?: Maybe; + age_not_in?: Maybe; + age_lt?: Maybe; + age_lte?: Maybe; + age_gt?: Maybe; + age_gte?: Maybe; + age_contains?: Maybe; + age_not_contains?: Maybe; + age_starts_with?: Maybe; + age_not_starts_with?: Maybe; + age_ends_with?: Maybe; + age_not_ends_with?: Maybe; + updatedAt?: Maybe; + updatedAt_not?: Maybe; + updatedAt_in?: Maybe; + updatedAt_not_in?: Maybe; + updatedAt_lt?: Maybe; + updatedAt_lte?: Maybe; + updatedAt_gt?: Maybe; + updatedAt_gte?: Maybe; + createdAt?: Maybe; + createdAt_not?: Maybe; + createdAt_in?: Maybe; + createdAt_not_in?: Maybe; + createdAt_lt?: Maybe; + createdAt_lte?: Maybe; + createdAt_gt?: Maybe; + createdAt_gte?: Maybe; + AND?: Maybe; + OR?: Maybe; + NOT?: Maybe; +} + +export interface MealCreateWithoutTagsInput { + id?: Maybe; + airtableId?: Maybe; + user: UserCreateOneWithoutMealsInput; + imageURL: String; + categories?: Maybe; + proportionFruit?: Maybe; + proportionVeg?: Maybe; +} + +export interface ChildUpdateManyWithWhereNestedInput { + where: ChildScalarWhereInput; + data: ChildUpdateManyDataInput; +} + +export interface MealCreateManyWithoutTagsInput { + create?: Maybe; + connect?: Maybe; +} + +export interface ChildUpdateManyDataInput { + airtableId?: Maybe; + age?: Maybe; +} + +export interface ProportionUpdateManyMutationInput { + airtableId?: Maybe; + name?: Maybe; +} + +export interface UserUpsertWithoutMealsInput { + update: UserUpdateWithoutMealsDataInput; + create: UserCreateWithoutMealsInput; +} + +export interface ProportionUpdateInput { + airtableId?: Maybe; + name?: Maybe; + fruitMeals?: Maybe; + vegMeals?: Maybe; +} + +export interface TagUpdateManyWithoutMealsInput { + create?: Maybe; + delete?: Maybe; + connect?: Maybe; + set?: Maybe; + disconnect?: Maybe; + update?: Maybe< + | TagUpdateWithWhereUniqueWithoutMealsInput[] + | TagUpdateWithWhereUniqueWithoutMealsInput + >; + upsert?: Maybe< + | TagUpsertWithWhereUniqueWithoutMealsInput[] + | TagUpsertWithWhereUniqueWithoutMealsInput + >; + deleteMany?: Maybe; + updateMany?: Maybe< + TagUpdateManyWithWhereNestedInput[] | TagUpdateManyWithWhereNestedInput + >; +} + +export interface ProjectUpdateManyMutationInput { + airtableId?: Maybe; + name?: Maybe; + slug?: Maybe; +} + +export interface ProjectUpdateInput { + airtableId?: Maybe; + name?: Maybe; + slug?: Maybe; + users?: Maybe; +} + +export type TagWhereUniqueInput = AtLeastOne<{ + id: Maybe; + airtableId?: Maybe; + name?: Maybe; +}>; + +export interface TagUpdateWithoutMealsDataInput { + airtableId?: Maybe; + name?: Maybe; +} + +export interface UserScalarWhereInput { + id?: Maybe; + id_not?: Maybe; + id_in?: Maybe; + id_not_in?: Maybe; + id_lt?: Maybe; + id_lte?: Maybe; + id_gt?: Maybe; + id_gte?: Maybe; + id_contains?: Maybe; + id_not_contains?: Maybe; + id_starts_with?: Maybe; + id_not_starts_with?: Maybe; + id_ends_with?: Maybe; + id_not_ends_with?: Maybe; + airtableId?: Maybe; + airtableId_not?: Maybe; + airtableId_in?: Maybe; + airtableId_not_in?: Maybe; + airtableId_lt?: Maybe; + airtableId_lte?: Maybe; + airtableId_gt?: Maybe; + airtableId_gte?: Maybe; + airtableId_contains?: Maybe; + airtableId_not_contains?: Maybe; + airtableId_starts_with?: Maybe; + airtableId_not_starts_with?: Maybe; + airtableId_ends_with?: Maybe; + airtableId_not_ends_with?: Maybe; + consentGDPR?: Maybe; + consentGDPR_not?: Maybe; + postCode?: Maybe; + postCode_not?: Maybe; + postCode_in?: Maybe; + postCode_not_in?: Maybe; + postCode_lt?: Maybe; + postCode_lte?: Maybe; + postCode_gt?: Maybe; + postCode_gte?: Maybe; + postCode_contains?: Maybe; + postCode_not_contains?: Maybe; + postCode_starts_with?: Maybe; + postCode_not_starts_with?: Maybe; + postCode_ends_with?: Maybe; + postCode_not_ends_with?: Maybe; + email?: Maybe; + email_not?: Maybe; + email_in?: Maybe; + email_not_in?: Maybe; + email_lt?: Maybe; + email_lte?: Maybe; + email_gt?: Maybe; + email_gte?: Maybe; + email_contains?: Maybe; + email_not_contains?: Maybe; + email_starts_with?: Maybe; + email_not_starts_with?: Maybe; + email_ends_with?: Maybe; + email_not_ends_with?: Maybe; + phoneNumber?: Maybe; + phoneNumber_not?: Maybe; + phoneNumber_in?: Maybe; + phoneNumber_not_in?: Maybe; + phoneNumber_lt?: Maybe; + phoneNumber_lte?: Maybe; + phoneNumber_gt?: Maybe; + phoneNumber_gte?: Maybe; + phoneNumber_contains?: Maybe; + phoneNumber_not_contains?: Maybe; + phoneNumber_starts_with?: Maybe; + phoneNumber_not_starts_with?: Maybe; + phoneNumber_ends_with?: Maybe; + phoneNumber_not_ends_with?: Maybe; + updatedAt?: Maybe; + updatedAt_not?: Maybe; + updatedAt_in?: Maybe; + updatedAt_not_in?: Maybe; + updatedAt_lt?: Maybe; + updatedAt_lte?: Maybe; + updatedAt_gt?: Maybe; + updatedAt_gte?: Maybe; + createdAt?: Maybe; + createdAt_not?: Maybe; + createdAt_in?: Maybe; + createdAt_not_in?: Maybe; + createdAt_lt?: Maybe; + createdAt_lte?: Maybe; + createdAt_gt?: Maybe; + createdAt_gte?: Maybe; + AND?: Maybe; + OR?: Maybe; + NOT?: Maybe; +} + +export interface TagUpsertWithWhereUniqueWithoutMealsInput { + where: TagWhereUniqueInput; + update: TagUpdateWithoutMealsDataInput; + create: TagCreateWithoutMealsInput; +} + +export type UserWhereUniqueInput = AtLeastOne<{ + id: Maybe; + airtableId?: Maybe; + email?: Maybe; + phoneNumber?: Maybe; +}>; + +export interface TagScalarWhereInput { + id?: Maybe; + id_not?: Maybe; + id_in?: Maybe; + id_not_in?: Maybe; + id_lt?: Maybe; + id_lte?: Maybe; + id_gt?: Maybe; + id_gte?: Maybe; + id_contains?: Maybe; + id_not_contains?: Maybe; + id_starts_with?: Maybe; + id_not_starts_with?: Maybe; + id_ends_with?: Maybe; + id_not_ends_with?: Maybe; + airtableId?: Maybe; + airtableId_not?: Maybe; + airtableId_in?: Maybe; + airtableId_not_in?: Maybe; + airtableId_lt?: Maybe; + airtableId_lte?: Maybe; + airtableId_gt?: Maybe; + airtableId_gte?: Maybe; + airtableId_contains?: Maybe; + airtableId_not_contains?: Maybe; + airtableId_starts_with?: Maybe; + airtableId_not_starts_with?: Maybe; + airtableId_ends_with?: Maybe; + airtableId_not_ends_with?: Maybe; + name?: Maybe; + name_not?: Maybe; + name_in?: Maybe; + name_not_in?: Maybe; + name_lt?: Maybe; + name_lte?: Maybe; + name_gt?: Maybe; + name_gte?: Maybe; + name_contains?: Maybe; + name_not_contains?: Maybe; + name_starts_with?: Maybe; + name_not_starts_with?: Maybe; + name_ends_with?: Maybe; + name_not_ends_with?: Maybe; + updatedAt?: Maybe; + updatedAt_not?: Maybe; + updatedAt_in?: Maybe; + updatedAt_not_in?: Maybe; + updatedAt_lt?: Maybe; + updatedAt_lte?: Maybe; + updatedAt_gt?: Maybe; + updatedAt_gte?: Maybe; + createdAt?: Maybe; + createdAt_not?: Maybe; + createdAt_in?: Maybe; + createdAt_not_in?: Maybe; + createdAt_lt?: Maybe; + createdAt_lte?: Maybe; + createdAt_gt?: Maybe; + createdAt_gte?: Maybe; + AND?: Maybe; + OR?: Maybe; + NOT?: Maybe; +} + +export interface UserUpdateWithWhereUniqueWithoutProjectsInput { + where: UserWhereUniqueInput; + data: UserUpdateWithoutProjectsDataInput; +} + +export interface TagUpdateManyWithWhereNestedInput { + where: TagScalarWhereInput; + data: TagUpdateManyDataInput; +} + +export interface MealCreateManyWithoutCategoriesInput { + create?: Maybe< + MealCreateWithoutCategoriesInput[] | MealCreateWithoutCategoriesInput + >; + connect?: Maybe; +} + +export interface TagWhereInput { + id?: Maybe; + id_not?: Maybe; + id_in?: Maybe; + id_not_in?: Maybe; + id_lt?: Maybe; + id_lte?: Maybe; + id_gt?: Maybe; + id_gte?: Maybe; + id_contains?: Maybe; + id_not_contains?: Maybe; + id_starts_with?: Maybe; + id_not_starts_with?: Maybe; + id_ends_with?: Maybe; + id_not_ends_with?: Maybe; + airtableId?: Maybe; + airtableId_not?: Maybe; + airtableId_in?: Maybe; + airtableId_not_in?: Maybe; + airtableId_lt?: Maybe; + airtableId_lte?: Maybe; + airtableId_gt?: Maybe; + airtableId_gte?: Maybe; + airtableId_contains?: Maybe; + airtableId_not_contains?: Maybe; + airtableId_starts_with?: Maybe; + airtableId_not_starts_with?: Maybe; + airtableId_ends_with?: Maybe; + airtableId_not_ends_with?: Maybe; + name?: Maybe; + name_not?: Maybe; + name_in?: Maybe; + name_not_in?: Maybe; + name_lt?: Maybe; + name_lte?: Maybe; + name_gt?: Maybe; + name_gte?: Maybe; + name_contains?: Maybe; + name_not_contains?: Maybe; + name_starts_with?: Maybe; + name_not_starts_with?: Maybe; + name_ends_with?: Maybe; + name_not_ends_with?: Maybe; + meals_every?: Maybe; + meals_some?: Maybe; + meals_none?: Maybe; + updatedAt?: Maybe; + updatedAt_not?: Maybe; + updatedAt_in?: Maybe; + updatedAt_not_in?: Maybe; + updatedAt_lt?: Maybe; + updatedAt_lte?: Maybe; + updatedAt_gt?: Maybe; + updatedAt_gte?: Maybe; + createdAt?: Maybe; + createdAt_not?: Maybe; + createdAt_in?: Maybe; + createdAt_not_in?: Maybe; + createdAt_lt?: Maybe; + createdAt_lte?: Maybe; + createdAt_gt?: Maybe; + createdAt_gte?: Maybe; + AND?: Maybe; + OR?: Maybe; + NOT?: Maybe; +} + +export interface UserCreateOneWithoutMealsInput { + create?: Maybe; + connect?: Maybe; +} + +export interface ChildWhereInput { + id?: Maybe; + id_not?: Maybe; + id_in?: Maybe; + id_not_in?: Maybe; + id_lt?: Maybe; + id_lte?: Maybe; + id_gt?: Maybe; + id_gte?: Maybe; + id_contains?: Maybe; + id_not_contains?: Maybe; + id_starts_with?: Maybe; + id_not_starts_with?: Maybe; + id_ends_with?: Maybe; + id_not_ends_with?: Maybe; + airtableId?: Maybe; + airtableId_not?: Maybe; + airtableId_in?: Maybe; + airtableId_not_in?: Maybe; + airtableId_lt?: Maybe; + airtableId_lte?: Maybe; + airtableId_gt?: Maybe; + airtableId_gte?: Maybe; + airtableId_contains?: Maybe; + airtableId_not_contains?: Maybe; + airtableId_starts_with?: Maybe; + airtableId_not_starts_with?: Maybe; + airtableId_ends_with?: Maybe; + airtableId_not_ends_with?: Maybe; + Parent?: Maybe; + age?: Maybe; + age_not?: Maybe; + age_in?: Maybe; + age_not_in?: Maybe; + age_lt?: Maybe; + age_lte?: Maybe; + age_gt?: Maybe; + age_gte?: Maybe; + age_contains?: Maybe; + age_not_contains?: Maybe; + age_starts_with?: Maybe; + age_not_starts_with?: Maybe; + age_ends_with?: Maybe; + age_not_ends_with?: Maybe; + updatedAt?: Maybe; + updatedAt_not?: Maybe; + updatedAt_in?: Maybe; + updatedAt_not_in?: Maybe; + updatedAt_lt?: Maybe; + updatedAt_lte?: Maybe; + updatedAt_gt?: Maybe; + updatedAt_gte?: Maybe; + createdAt?: Maybe; + createdAt_not?: Maybe; + createdAt_in?: Maybe; + createdAt_not_in?: Maybe; + createdAt_lt?: Maybe; + createdAt_lte?: Maybe; + createdAt_gt?: Maybe; + createdAt_gte?: Maybe; + AND?: Maybe; + OR?: Maybe; + NOT?: Maybe; +} + +export interface ProjectCreateManyWithoutUsersInput { + create?: Maybe< + ProjectCreateWithoutUsersInput[] | ProjectCreateWithoutUsersInput + >; + connect?: Maybe; +} + +export interface UserCreateWithoutProjectsInput { + id?: Maybe; + airtableId?: Maybe; + consentGDPR: Boolean; + postCode: String; + email: String; + meals?: Maybe; + children?: Maybe; + phoneNumber: String; +} + +export interface ChildCreateManyWithoutParentInput { + create?: Maybe< + ChildCreateWithoutParentInput[] | ChildCreateWithoutParentInput + >; + connect?: Maybe; +} + +export interface MealUpdateManyWithoutProportionVegInput { + create?: Maybe< + MealCreateWithoutProportionVegInput[] | MealCreateWithoutProportionVegInput + >; + delete?: Maybe; + connect?: Maybe; + set?: Maybe; + disconnect?: Maybe; + update?: Maybe< + | MealUpdateWithWhereUniqueWithoutProportionVegInput[] + | MealUpdateWithWhereUniqueWithoutProportionVegInput + >; + upsert?: Maybe< + | MealUpsertWithWhereUniqueWithoutProportionVegInput[] + | MealUpsertWithWhereUniqueWithoutProportionVegInput + >; + deleteMany?: Maybe; + updateMany?: Maybe< + MealUpdateManyWithWhereNestedInput[] | MealUpdateManyWithWhereNestedInput + >; +} + +export interface TagCreateManyWithoutMealsInput { + create?: Maybe; + connect?: Maybe; +} + +export interface MealUpdateWithWhereUniqueWithoutProportionVegInput { + where: MealWhereUniqueInput; + data: MealUpdateWithoutProportionVegDataInput; +} + +export interface ProportionCreateOneWithoutFruitMealsInput { + create?: Maybe; + connect?: Maybe; +} + +export interface MealUpdateWithoutProportionVegDataInput { + airtableId?: Maybe; + user?: Maybe; + imageURL?: Maybe; + categories?: Maybe; + tags?: Maybe; + proportionFruit?: Maybe; +} + +export interface MealCreateManyWithoutProportionVegInput { + create?: Maybe< + MealCreateWithoutProportionVegInput[] | MealCreateWithoutProportionVegInput + >; + connect?: Maybe; +} + +export interface CategoryUpdateManyWithoutMealsInput { + create?: Maybe< + CategoryCreateWithoutMealsInput[] | CategoryCreateWithoutMealsInput + >; + delete?: Maybe; + connect?: Maybe; + set?: Maybe; + disconnect?: Maybe; + update?: Maybe< + | CategoryUpdateWithWhereUniqueWithoutMealsInput[] + | CategoryUpdateWithWhereUniqueWithoutMealsInput + >; + upsert?: Maybe< + | CategoryUpsertWithWhereUniqueWithoutMealsInput[] + | CategoryUpsertWithWhereUniqueWithoutMealsInput + >; + deleteMany?: Maybe; + updateMany?: Maybe< + | CategoryUpdateManyWithWhereNestedInput[] + | CategoryUpdateManyWithWhereNestedInput + >; +} + +export interface CategoryCreateManyWithoutMealsInput { + create?: Maybe< + CategoryCreateWithoutMealsInput[] | CategoryCreateWithoutMealsInput + >; + connect?: Maybe; +} + +export interface CategoryUpdateWithWhereUniqueWithoutMealsInput { + where: CategoryWhereUniqueInput; + data: CategoryUpdateWithoutMealsDataInput; +} + +export interface ProportionCreateOneWithoutVegMealsInput { + create?: Maybe; + connect?: Maybe; +} + +export interface CategoryUpdateWithoutMealsDataInput { + airtableId?: Maybe; + name?: Maybe; +} + +export interface MealCreateManyWithoutProportionFruitInput { + create?: Maybe< + | MealCreateWithoutProportionFruitInput[] + | MealCreateWithoutProportionFruitInput + >; + connect?: Maybe; +} + +export interface CategoryUpsertWithWhereUniqueWithoutMealsInput { + where: CategoryWhereUniqueInput; + update: CategoryUpdateWithoutMealsDataInput; + create: CategoryCreateWithoutMealsInput; +} + +export interface CategoryUpdateInput { + airtableId?: Maybe; + name?: Maybe; + meals?: Maybe; +} + +export interface CategoryScalarWhereInput { + id?: Maybe; + id_not?: Maybe; + id_in?: Maybe; + id_not_in?: Maybe; + id_lt?: Maybe; + id_lte?: Maybe; + id_gt?: Maybe; + id_gte?: Maybe; + id_contains?: Maybe; + id_not_contains?: Maybe; + id_starts_with?: Maybe; + id_not_starts_with?: Maybe; + id_ends_with?: Maybe; + id_not_ends_with?: Maybe; + airtableId?: Maybe; + airtableId_not?: Maybe; + airtableId_in?: Maybe; + airtableId_not_in?: Maybe; + airtableId_lt?: Maybe; + airtableId_lte?: Maybe; + airtableId_gt?: Maybe; + airtableId_gte?: Maybe; + airtableId_contains?: Maybe; + airtableId_not_contains?: Maybe; + airtableId_starts_with?: Maybe; + airtableId_not_starts_with?: Maybe; + airtableId_ends_with?: Maybe; + airtableId_not_ends_with?: Maybe; + name?: Maybe; + name_not?: Maybe; + name_in?: Maybe; + name_not_in?: Maybe; + name_lt?: Maybe; + name_lte?: Maybe; + name_gt?: Maybe; + name_gte?: Maybe; + name_contains?: Maybe; + name_not_contains?: Maybe; + name_starts_with?: Maybe; + name_not_starts_with?: Maybe; + name_ends_with?: Maybe; + name_not_ends_with?: Maybe; + updatedAt?: Maybe; + updatedAt_not?: Maybe; + updatedAt_in?: Maybe; + updatedAt_not_in?: Maybe; + updatedAt_lt?: Maybe; + updatedAt_lte?: Maybe; + updatedAt_gt?: Maybe; + updatedAt_gte?: Maybe; + createdAt?: Maybe; + createdAt_not?: Maybe; + createdAt_in?: Maybe; + createdAt_not_in?: Maybe; + createdAt_lt?: Maybe; + createdAt_lte?: Maybe; + createdAt_gt?: Maybe; + createdAt_gte?: Maybe; + AND?: Maybe; + OR?: Maybe; + NOT?: Maybe; +} + +export interface MealUpdateWithWhereUniqueWithoutCategoriesInput { + where: MealWhereUniqueInput; + data: MealUpdateWithoutCategoriesDataInput; +} + +export interface CategoryUpdateManyWithWhereNestedInput { + where: CategoryScalarWhereInput; + data: CategoryUpdateManyDataInput; +} + +export interface UserUpdateOneRequiredWithoutMealsInput { + create?: Maybe; + update?: Maybe; + upsert?: Maybe; + connect?: Maybe; +} + +export interface CategoryUpdateManyDataInput { + airtableId?: Maybe; + name?: Maybe; +} + +export interface ProportionSubscriptionWhereInput { + mutation_in?: Maybe; + updatedFields_contains?: Maybe; + updatedFields_contains_every?: Maybe; + updatedFields_contains_some?: Maybe; + node?: Maybe; + AND?: Maybe< + ProportionSubscriptionWhereInput[] | ProportionSubscriptionWhereInput + >; + OR?: Maybe< + ProportionSubscriptionWhereInput[] | ProportionSubscriptionWhereInput + >; + NOT?: Maybe< + ProportionSubscriptionWhereInput[] | ProportionSubscriptionWhereInput + >; +} + +export interface MealUpsertWithWhereUniqueWithoutProportionVegInput { + where: MealWhereUniqueInput; + update: MealUpdateWithoutProportionVegDataInput; + create: MealCreateWithoutProportionVegInput; +} + +export interface UserWhereInput { + id?: Maybe; + id_not?: Maybe; + id_in?: Maybe; + id_not_in?: Maybe; + id_lt?: Maybe; + id_lte?: Maybe; + id_gt?: Maybe; + id_gte?: Maybe; + id_contains?: Maybe; + id_not_contains?: Maybe; + id_starts_with?: Maybe; + id_not_starts_with?: Maybe; + id_ends_with?: Maybe; + id_not_ends_with?: Maybe; + airtableId?: Maybe; + airtableId_not?: Maybe; + airtableId_in?: Maybe; + airtableId_not_in?: Maybe; + airtableId_lt?: Maybe; + airtableId_lte?: Maybe; + airtableId_gt?: Maybe; + airtableId_gte?: Maybe; + airtableId_contains?: Maybe; + airtableId_not_contains?: Maybe; + airtableId_starts_with?: Maybe; + airtableId_not_starts_with?: Maybe; + airtableId_ends_with?: Maybe; + airtableId_not_ends_with?: Maybe; + consentGDPR?: Maybe; + consentGDPR_not?: Maybe; + postCode?: Maybe; + postCode_not?: Maybe; + postCode_in?: Maybe; + postCode_not_in?: Maybe; + postCode_lt?: Maybe; + postCode_lte?: Maybe; + postCode_gt?: Maybe; + postCode_gte?: Maybe; + postCode_contains?: Maybe; + postCode_not_contains?: Maybe; + postCode_starts_with?: Maybe; + postCode_not_starts_with?: Maybe; + postCode_ends_with?: Maybe; + postCode_not_ends_with?: Maybe; + email?: Maybe; + email_not?: Maybe; + email_in?: Maybe; + email_not_in?: Maybe; + email_lt?: Maybe; + email_lte?: Maybe; + email_gt?: Maybe; + email_gte?: Maybe; + email_contains?: Maybe; + email_not_contains?: Maybe; + email_starts_with?: Maybe; + email_not_starts_with?: Maybe; + email_ends_with?: Maybe; + email_not_ends_with?: Maybe; + meals_every?: Maybe; + meals_some?: Maybe; + meals_none?: Maybe; + projects_every?: Maybe; + projects_some?: Maybe; + projects_none?: Maybe; + children_every?: Maybe; + children_some?: Maybe; + children_none?: Maybe; + phoneNumber?: Maybe; + phoneNumber_not?: Maybe; + phoneNumber_in?: Maybe; + phoneNumber_not_in?: Maybe; + phoneNumber_lt?: Maybe; + phoneNumber_lte?: Maybe; + phoneNumber_gt?: Maybe; + phoneNumber_gte?: Maybe; + phoneNumber_contains?: Maybe; + phoneNumber_not_contains?: Maybe; + phoneNumber_starts_with?: Maybe; + phoneNumber_not_starts_with?: Maybe; + phoneNumber_ends_with?: Maybe; + phoneNumber_not_ends_with?: Maybe; + updatedAt?: Maybe; + updatedAt_not?: Maybe; + updatedAt_in?: Maybe; + updatedAt_not_in?: Maybe; + updatedAt_lt?: Maybe; + updatedAt_lte?: Maybe; + updatedAt_gt?: Maybe; + updatedAt_gte?: Maybe; + createdAt?: Maybe; + createdAt_not?: Maybe; + createdAt_in?: Maybe; + createdAt_not_in?: Maybe; + createdAt_lt?: Maybe; + createdAt_lte?: Maybe; + createdAt_gt?: Maybe; + createdAt_gte?: Maybe; + AND?: Maybe; + OR?: Maybe; + NOT?: Maybe; +} + +export interface MealScalarWhereInput { + id?: Maybe; + id_not?: Maybe; + id_in?: Maybe; + id_not_in?: Maybe; + id_lt?: Maybe; + id_lte?: Maybe; + id_gt?: Maybe; + id_gte?: Maybe; + id_contains?: Maybe; + id_not_contains?: Maybe; + id_starts_with?: Maybe; + id_not_starts_with?: Maybe; + id_ends_with?: Maybe; + id_not_ends_with?: Maybe; + airtableId?: Maybe; + airtableId_not?: Maybe; + airtableId_in?: Maybe; + airtableId_not_in?: Maybe; + airtableId_lt?: Maybe; + airtableId_lte?: Maybe; + airtableId_gt?: Maybe; + airtableId_gte?: Maybe; + airtableId_contains?: Maybe; + airtableId_not_contains?: Maybe; + airtableId_starts_with?: Maybe; + airtableId_not_starts_with?: Maybe; + airtableId_ends_with?: Maybe; + airtableId_not_ends_with?: Maybe; + imageURL?: Maybe; + imageURL_not?: Maybe; + imageURL_in?: Maybe; + imageURL_not_in?: Maybe; + imageURL_lt?: Maybe; + imageURL_lte?: Maybe; + imageURL_gt?: Maybe; + imageURL_gte?: Maybe; + imageURL_contains?: Maybe; + imageURL_not_contains?: Maybe; + imageURL_starts_with?: Maybe; + imageURL_not_starts_with?: Maybe; + imageURL_ends_with?: Maybe; + imageURL_not_ends_with?: Maybe; + updatedAt?: Maybe; + updatedAt_not?: Maybe; + updatedAt_in?: Maybe; + updatedAt_not_in?: Maybe; + updatedAt_lt?: Maybe; + updatedAt_lte?: Maybe; + updatedAt_gt?: Maybe; + updatedAt_gte?: Maybe; + createdAt?: Maybe; + createdAt_not?: Maybe; + createdAt_in?: Maybe; + createdAt_not_in?: Maybe; + createdAt_lt?: Maybe; + createdAt_lte?: Maybe; + createdAt_gt?: Maybe; + createdAt_gte?: Maybe; + AND?: Maybe; + OR?: Maybe; + NOT?: Maybe; +} + +export interface UserUpdateManyMutationInput { + airtableId?: Maybe; + consentGDPR?: Maybe; + postCode?: Maybe; + email?: Maybe; + phoneNumber?: Maybe; +} + +export interface MealUpdateManyWithWhereNestedInput { + where: MealScalarWhereInput; + data: MealUpdateManyDataInput; +} + +export type ChildWhereUniqueInput = AtLeastOne<{ + id: Maybe; + airtableId?: Maybe; +}>; + +export interface MealUpdateManyDataInput { + airtableId?: Maybe; + imageURL?: Maybe; +} + +export type MealWhereUniqueInput = AtLeastOne<{ + id: Maybe; + airtableId?: Maybe; +}>; + +export interface ProportionUpsertWithoutFruitMealsInput { + update: ProportionUpdateWithoutFruitMealsDataInput; + create: ProportionCreateWithoutFruitMealsInput; +} + +export type ProjectWhereUniqueInput = AtLeastOne<{ + id: Maybe; + airtableId?: Maybe; + slug?: Maybe; +}>; + +export interface ProportionUpdateOneWithoutVegMealsInput { + create?: Maybe; + update?: Maybe; + upsert?: Maybe; + delete?: Maybe; + disconnect?: Maybe; + connect?: Maybe; +} + +export type ProportionWhereUniqueInput = AtLeastOne<{ + id: Maybe; + airtableId?: Maybe; + name?: Maybe; +}>; + +export interface ProportionUpdateWithoutVegMealsDataInput { + airtableId?: Maybe; + name?: Maybe; + fruitMeals?: Maybe; +} + +export interface UserUpdateManyDataInput { + airtableId?: Maybe; + consentGDPR?: Maybe; + postCode?: Maybe; + email?: Maybe; + phoneNumber?: Maybe; +} + +export interface MealUpdateManyWithoutProportionFruitInput { + create?: Maybe< + | MealCreateWithoutProportionFruitInput[] + | MealCreateWithoutProportionFruitInput + >; + delete?: Maybe; + connect?: Maybe; + set?: Maybe; + disconnect?: Maybe; + update?: Maybe< + | MealUpdateWithWhereUniqueWithoutProportionFruitInput[] + | MealUpdateWithWhereUniqueWithoutProportionFruitInput + >; + upsert?: Maybe< + | MealUpsertWithWhereUniqueWithoutProportionFruitInput[] + | MealUpsertWithWhereUniqueWithoutProportionFruitInput + >; + deleteMany?: Maybe; + updateMany?: Maybe< + MealUpdateManyWithWhereNestedInput[] | MealUpdateManyWithWhereNestedInput + >; +} + +export interface UserUpsertWithWhereUniqueWithoutProjectsInput { + where: UserWhereUniqueInput; + update: UserUpdateWithoutProjectsDataInput; + create: UserCreateWithoutProjectsInput; +} + +export interface MealUpdateWithWhereUniqueWithoutProportionFruitInput { + where: MealWhereUniqueInput; + data: MealUpdateWithoutProportionFruitDataInput; +} + +export interface UserUpdateManyWithoutProjectsInput { + create?: Maybe< + UserCreateWithoutProjectsInput[] | UserCreateWithoutProjectsInput + >; + delete?: Maybe; + connect?: Maybe; + set?: Maybe; + disconnect?: Maybe; + update?: Maybe< + | UserUpdateWithWhereUniqueWithoutProjectsInput[] + | UserUpdateWithWhereUniqueWithoutProjectsInput + >; + upsert?: Maybe< + | UserUpsertWithWhereUniqueWithoutProjectsInput[] + | UserUpsertWithWhereUniqueWithoutProjectsInput + >; + deleteMany?: Maybe; + updateMany?: Maybe< + UserUpdateManyWithWhereNestedInput[] | UserUpdateManyWithWhereNestedInput + >; +} + +export interface MealUpdateWithoutProportionFruitDataInput { + airtableId?: Maybe; + user?: Maybe; + imageURL?: Maybe; + categories?: Maybe; + tags?: Maybe; + proportionVeg?: Maybe; +} + +export interface MealCreateWithoutCategoriesInput { + id?: Maybe; + airtableId?: Maybe; + user: UserCreateOneWithoutMealsInput; + imageURL: String; + tags?: Maybe; + proportionFruit?: Maybe; + proportionVeg?: Maybe; +} + +export interface MealUpsertWithWhereUniqueWithoutProportionFruitInput { + where: MealWhereUniqueInput; + update: MealUpdateWithoutProportionFruitDataInput; + create: MealCreateWithoutProportionFruitInput; +} + +export interface ProjectCreateWithoutUsersInput { + id?: Maybe; + airtableId?: Maybe; + name: String; + slug: String; +} + +export interface ProportionUpsertWithoutVegMealsInput { + update: ProportionUpdateWithoutVegMealsDataInput; + create: ProportionCreateWithoutVegMealsInput; +} + +export interface TagCreateWithoutMealsInput { + id?: Maybe; + airtableId?: Maybe; + name: String; +} + +export interface MealUpsertWithWhereUniqueWithoutCategoriesInput { + where: MealWhereUniqueInput; + update: MealUpdateWithoutCategoriesDataInput; + create: MealCreateWithoutCategoriesInput; +} + +export interface MealCreateWithoutProportionVegInput { + id?: Maybe; + airtableId?: Maybe; + user: UserCreateOneWithoutMealsInput; + imageURL: String; + categories?: Maybe; + tags?: Maybe; + proportionFruit?: Maybe; +} + +export interface CategoryUpdateManyMutationInput { + airtableId?: Maybe; + name?: Maybe; +} + +export interface ProportionCreateWithoutVegMealsInput { + id?: Maybe; + airtableId?: Maybe; + name: String; + fruitMeals?: Maybe; +} + +export interface UserCreateManyWithoutProjectsInput { + create?: Maybe< + UserCreateWithoutProjectsInput[] | UserCreateWithoutProjectsInput + >; + connect?: Maybe; +} + +export interface MealUpdateManyWithoutCategoriesInput { + create?: Maybe< + MealCreateWithoutCategoriesInput[] | MealCreateWithoutCategoriesInput + >; + delete?: Maybe; + connect?: Maybe; + set?: Maybe; + disconnect?: Maybe; + update?: Maybe< + | MealUpdateWithWhereUniqueWithoutCategoriesInput[] + | MealUpdateWithWhereUniqueWithoutCategoriesInput + >; + upsert?: Maybe< + | MealUpsertWithWhereUniqueWithoutCategoriesInput[] + | MealUpsertWithWhereUniqueWithoutCategoriesInput + >; + deleteMany?: Maybe; + updateMany?: Maybe< + MealUpdateManyWithWhereNestedInput[] | MealUpdateManyWithWhereNestedInput + >; +} + +export interface ProjectCreateInput { + id?: Maybe; + airtableId?: Maybe; + name: String; + slug: String; + users?: Maybe; +} + +export interface UserSubscriptionWhereInput { + mutation_in?: Maybe; + updatedFields_contains?: Maybe; + updatedFields_contains_every?: Maybe; + updatedFields_contains_some?: Maybe; + node?: Maybe; + AND?: Maybe; + OR?: Maybe; + NOT?: Maybe; +} + +export interface ChildCreateInput { + id?: Maybe; + airtableId?: Maybe; + Parent: UserCreateOneWithoutChildrenInput; + age: String; +} + +export interface ChildSubscriptionWhereInput { + mutation_in?: Maybe; + updatedFields_contains?: Maybe; + updatedFields_contains_every?: Maybe; + updatedFields_contains_some?: Maybe; + node?: Maybe; + AND?: Maybe; + OR?: Maybe; + NOT?: Maybe; +} + +export interface UserCreateOneWithoutChildrenInput { + create?: Maybe; + connect?: Maybe; +} + +export interface MealUpdateWithoutTagsDataInput { + airtableId?: Maybe; + user?: Maybe; + imageURL?: Maybe; + categories?: Maybe; + proportionFruit?: Maybe; + proportionVeg?: Maybe; +} + +export interface UserCreateWithoutChildrenInput { + id?: Maybe; + airtableId?: Maybe; + consentGDPR: Boolean; + postCode: String; + email: String; + meals?: Maybe; + projects?: Maybe; + phoneNumber: String; +} + +export interface TagCreateInput { + id?: Maybe; + airtableId?: Maybe; + name: String; + meals?: Maybe; +} + +export interface MealCreateManyWithoutUserInput { + create?: Maybe; + connect?: Maybe; +} + +export interface UserUpdateManyWithWhereNestedInput { + where: UserScalarWhereInput; + data: UserUpdateManyDataInput; +} + +export interface MealCreateWithoutUserInput { + id?: Maybe; + airtableId?: Maybe; + imageURL: String; + categories?: Maybe; + tags?: Maybe; + proportionFruit?: Maybe; + proportionVeg?: Maybe; +} + +export interface CategoryCreateInput { + id?: Maybe; + airtableId?: Maybe; + name: String; + meals?: Maybe; +} + +export interface ChildUpdateInput { + airtableId?: Maybe; + Parent?: Maybe; + age?: Maybe; +} + +export interface ChildCreateWithoutParentInput { + id?: Maybe; + airtableId?: Maybe; + age: String; +} + +export interface UserUpdateOneRequiredWithoutChildrenInput { + create?: Maybe; + update?: Maybe; + upsert?: Maybe; + connect?: Maybe; +} + +export interface CategoryCreateWithoutMealsInput { + id?: Maybe; + airtableId?: Maybe; + name: String; +} + +export interface UserUpdateWithoutChildrenDataInput { + airtableId?: Maybe; + consentGDPR?: Maybe; + postCode?: Maybe; + email?: Maybe; + meals?: Maybe; + projects?: Maybe; + phoneNumber?: Maybe; +} + +export interface MealUpdateWithoutCategoriesDataInput { + airtableId?: Maybe; + user?: Maybe; + imageURL?: Maybe; + tags?: Maybe; + proportionFruit?: Maybe; + proportionVeg?: Maybe; +} + +export interface MealUpdateManyWithoutUserInput { + create?: Maybe; + delete?: Maybe; + connect?: Maybe; + set?: Maybe; + disconnect?: Maybe; + update?: Maybe< + | MealUpdateWithWhereUniqueWithoutUserInput[] + | MealUpdateWithWhereUniqueWithoutUserInput + >; + upsert?: Maybe< + | MealUpsertWithWhereUniqueWithoutUserInput[] + | MealUpsertWithWhereUniqueWithoutUserInput + >; + deleteMany?: Maybe; + updateMany?: Maybe< + MealUpdateManyWithWhereNestedInput[] | MealUpdateManyWithWhereNestedInput + >; +} + +export interface UserCreateInput { + id?: Maybe; + airtableId?: Maybe; + consentGDPR: Boolean; + postCode: String; + email: String; + meals?: Maybe; + projects?: Maybe; + children?: Maybe; + phoneNumber: String; +} + +export interface MealUpdateWithWhereUniqueWithoutUserInput { + where: MealWhereUniqueInput; + data: MealUpdateWithoutUserDataInput; +} + +export interface ProportionCreateInput { + id?: Maybe; + airtableId?: Maybe; + name: String; + fruitMeals?: Maybe; + vegMeals?: Maybe; +} + +export interface MealUpdateWithoutUserDataInput { + airtableId?: Maybe; + imageURL?: Maybe; + categories?: Maybe; + tags?: Maybe; + proportionFruit?: Maybe; + proportionVeg?: Maybe; +} + +export interface UserCreateWithoutMealsInput { + id?: Maybe; + airtableId?: Maybe; + consentGDPR: Boolean; + postCode: String; + email: String; + projects?: Maybe; + children?: Maybe; + phoneNumber: String; +} + +export interface MealUpsertWithWhereUniqueWithoutUserInput { + where: MealWhereUniqueInput; + update: MealUpdateWithoutUserDataInput; + create: MealCreateWithoutUserInput; +} + +export interface MealCreateWithoutProportionFruitInput { + id?: Maybe; + airtableId?: Maybe; + user: UserCreateOneWithoutMealsInput; + imageURL: String; + categories?: Maybe; + tags?: Maybe; + proportionVeg?: Maybe; +} + +export interface MealUpdateInput { + airtableId?: Maybe; + user?: Maybe; + imageURL?: Maybe; + categories?: Maybe; + tags?: Maybe; + proportionFruit?: Maybe; + proportionVeg?: Maybe; +} + +export interface MealCreateInput { + id?: Maybe; + airtableId?: Maybe; + user: UserCreateOneWithoutMealsInput; + imageURL: String; + categories?: Maybe; + tags?: Maybe; + proportionFruit?: Maybe; + proportionVeg?: Maybe; +} + +export interface ChildUpdateManyMutationInput { + airtableId?: Maybe; + age?: Maybe; +} + +export interface UserUpsertWithoutChildrenInput { + update: UserUpdateWithoutChildrenDataInput; + create: UserCreateWithoutChildrenInput; +} + +export interface ProjectSubscriptionWhereInput { + mutation_in?: Maybe; + updatedFields_contains?: Maybe; + updatedFields_contains_every?: Maybe; + updatedFields_contains_some?: Maybe; + node?: Maybe; + AND?: Maybe; + OR?: Maybe; + NOT?: Maybe; +} + +export interface ProportionCreateWithoutFruitMealsInput { + id?: Maybe; + airtableId?: Maybe; + name: String; + vegMeals?: Maybe; +} + +export interface UserUpdateWithoutProjectsDataInput { + airtableId?: Maybe; + consentGDPR?: Maybe; + postCode?: Maybe; + email?: Maybe; + meals?: Maybe; + children?: Maybe; + phoneNumber?: Maybe; +} + +export interface TagUpdateInput { + airtableId?: Maybe; + name?: Maybe; + meals?: Maybe; +} + +export interface NodeNode { + id: ID_Output; +} + +export interface UserPreviousValues { + id: ID_Output; + airtableId?: String; + consentGDPR: Boolean; + postCode: String; + email: String; + phoneNumber: String; + updatedAt: DateTimeOutput; + createdAt: DateTimeOutput; +} + +export interface UserPreviousValuesPromise + extends Promise, + Fragmentable { + id: () => Promise; + airtableId: () => Promise; + consentGDPR: () => Promise; + postCode: () => Promise; + email: () => Promise; + phoneNumber: () => Promise; + updatedAt: () => Promise; + createdAt: () => Promise; +} + +export interface UserPreviousValuesSubscription + extends Promise>, + Fragmentable { + id: () => Promise>; + airtableId: () => Promise>; + consentGDPR: () => Promise>; + postCode: () => Promise>; + email: () => Promise>; + phoneNumber: () => Promise>; + updatedAt: () => Promise>; + createdAt: () => Promise>; +} + +export interface ChildConnection { + pageInfo: PageInfo; + edges: ChildEdge[]; +} + +export interface ChildConnectionPromise + extends Promise, + Fragmentable { + pageInfo: () => T; + edges: >() => T; + aggregate: () => T; +} + +export interface ChildConnectionSubscription + extends Promise>, + Fragmentable { + pageInfo: () => T; + edges: >>() => T; + aggregate: () => T; +} + +export interface TagSubscriptionPayload { + mutation: MutationType; + node: Tag; + updatedFields: String[]; + previousValues: TagPreviousValues; +} + +export interface TagSubscriptionPayloadPromise + extends Promise, + Fragmentable { + mutation: () => Promise; + node: () => T; + updatedFields: () => Promise; + previousValues: () => T; +} + +export interface TagSubscriptionPayloadSubscription + extends Promise>, + Fragmentable { + mutation: () => Promise>; + node: () => T; + updatedFields: () => Promise>; + previousValues: () => T; +} + +export interface AggregateCategory { + count: Int; +} + +export interface AggregateCategoryPromise + extends Promise, + Fragmentable { + count: () => Promise; +} + +export interface AggregateCategorySubscription + extends Promise>, + Fragmentable { + count: () => Promise>; +} + +export interface CategoryEdge { + node: Category; + cursor: String; +} + +export interface CategoryEdgePromise + extends Promise, + Fragmentable { + node: () => T; + cursor: () => Promise; +} + +export interface CategoryEdgeSubscription + extends Promise>, + Fragmentable { + node: () => T; + cursor: () => Promise>; +} + +export interface BatchPayload { + count: Long; +} + +export interface BatchPayloadPromise + extends Promise, + Fragmentable { + count: () => Promise; +} + +export interface BatchPayloadSubscription + extends Promise>, + Fragmentable { + count: () => Promise>; +} + +export interface UserSubscriptionPayload { + mutation: MutationType; + node: User; + updatedFields: String[]; + previousValues: UserPreviousValues; +} + +export interface UserSubscriptionPayloadPromise + extends Promise, + Fragmentable { + mutation: () => Promise; + node: () => T; + updatedFields: () => Promise; + previousValues: () => T; +} + +export interface UserSubscriptionPayloadSubscription + extends Promise>, + Fragmentable { + mutation: () => Promise>; + node: () => T; + updatedFields: () => Promise>; + previousValues: () => T; +} + +export interface PageInfo { + hasNextPage: Boolean; + hasPreviousPage: Boolean; + startCursor?: String; + endCursor?: String; +} + +export interface PageInfoPromise extends Promise, Fragmentable { + hasNextPage: () => Promise; + hasPreviousPage: () => Promise; + startCursor: () => Promise; + endCursor: () => Promise; +} + +export interface PageInfoSubscription + extends Promise>, + Fragmentable { + hasNextPage: () => Promise>; + hasPreviousPage: () => Promise>; + startCursor: () => Promise>; + endCursor: () => Promise>; +} + +export interface UserEdge { + node: User; + cursor: String; +} + +export interface UserEdgePromise extends Promise, Fragmentable { + node: () => T; + cursor: () => Promise; +} + +export interface UserEdgeSubscription + extends Promise>, + Fragmentable { + node: () => T; + cursor: () => Promise>; +} + +export interface CategoryConnection { + pageInfo: PageInfo; + edges: CategoryEdge[]; +} + +export interface CategoryConnectionPromise + extends Promise, + Fragmentable { + pageInfo: () => T; + edges: >() => T; + aggregate: () => T; +} + +export interface CategoryConnectionSubscription + extends Promise>, + Fragmentable { + pageInfo: () => T; + edges: >>() => T; + aggregate: () => T; +} + +export interface AggregateTag { + count: Int; +} + +export interface AggregateTagPromise + extends Promise, + Fragmentable { + count: () => Promise; +} + +export interface AggregateTagSubscription + extends Promise>, + Fragmentable { + count: () => Promise>; +} + +export interface Proportion { + id: ID_Output; + airtableId?: String; + name: String; + updatedAt: DateTimeOutput; + createdAt: DateTimeOutput; +} + +export interface ProportionPromise extends Promise, Fragmentable { + id: () => Promise; + airtableId: () => Promise; + name: () => Promise; + fruitMeals: >(args?: { + where?: MealWhereInput; + orderBy?: MealOrderByInput; + skip?: Int; + after?: String; + before?: String; + first?: Int; + last?: Int; + }) => T; + vegMeals: >(args?: { + where?: MealWhereInput; + orderBy?: MealOrderByInput; + skip?: Int; + after?: String; + before?: String; + first?: Int; + last?: Int; + }) => T; + updatedAt: () => Promise; + createdAt: () => Promise; +} + +export interface ProportionSubscription + extends Promise>, + Fragmentable { + id: () => Promise>; + airtableId: () => Promise>; + name: () => Promise>; + fruitMeals: >>(args?: { + where?: MealWhereInput; + orderBy?: MealOrderByInput; + skip?: Int; + after?: String; + before?: String; + first?: Int; + last?: Int; + }) => T; + vegMeals: >>(args?: { + where?: MealWhereInput; + orderBy?: MealOrderByInput; + skip?: Int; + after?: String; + before?: String; + first?: Int; + last?: Int; + }) => T; + updatedAt: () => Promise>; + createdAt: () => Promise>; +} + +export interface ProportionNullablePromise + extends Promise, + Fragmentable { + id: () => Promise; + airtableId: () => Promise; + name: () => Promise; + fruitMeals: >(args?: { + where?: MealWhereInput; + orderBy?: MealOrderByInput; + skip?: Int; + after?: String; + before?: String; + first?: Int; + last?: Int; + }) => T; + vegMeals: >(args?: { + where?: MealWhereInput; + orderBy?: MealOrderByInput; + skip?: Int; + after?: String; + before?: String; + first?: Int; + last?: Int; + }) => T; + updatedAt: () => Promise; + createdAt: () => Promise; +} + +export interface TagConnection { + pageInfo: PageInfo; + edges: TagEdge[]; +} + +export interface TagConnectionPromise + extends Promise, + Fragmentable { + pageInfo: () => T; + edges: >() => T; + aggregate: () => T; +} + +export interface TagConnectionSubscription + extends Promise>, + Fragmentable { + pageInfo: () => T; + edges: >>() => T; + aggregate: () => T; +} + +export interface User { + id: ID_Output; + airtableId?: String; + consentGDPR: Boolean; + postCode: String; + email: String; + phoneNumber: String; + updatedAt: DateTimeOutput; + createdAt: DateTimeOutput; +} + +export interface UserPromise extends Promise, Fragmentable { + id: () => Promise; + airtableId: () => Promise; + consentGDPR: () => Promise; + postCode: () => Promise; + email: () => Promise; + meals: >(args?: { + where?: MealWhereInput; + orderBy?: MealOrderByInput; + skip?: Int; + after?: String; + before?: String; + first?: Int; + last?: Int; + }) => T; + projects: >(args?: { + where?: ProjectWhereInput; + orderBy?: ProjectOrderByInput; + skip?: Int; + after?: String; + before?: String; + first?: Int; + last?: Int; + }) => T; + children: >(args?: { + where?: ChildWhereInput; + orderBy?: ChildOrderByInput; + skip?: Int; + after?: String; + before?: String; + first?: Int; + last?: Int; + }) => T; + phoneNumber: () => Promise; + updatedAt: () => Promise; + createdAt: () => Promise; +} + +export interface UserSubscription + extends Promise>, + Fragmentable { + id: () => Promise>; + airtableId: () => Promise>; + consentGDPR: () => Promise>; + postCode: () => Promise>; + email: () => Promise>; + meals: >>(args?: { + where?: MealWhereInput; + orderBy?: MealOrderByInput; + skip?: Int; + after?: String; + before?: String; + first?: Int; + last?: Int; + }) => T; + projects: >>(args?: { + where?: ProjectWhereInput; + orderBy?: ProjectOrderByInput; + skip?: Int; + after?: String; + before?: String; + first?: Int; + last?: Int; + }) => T; + children: >>(args?: { + where?: ChildWhereInput; + orderBy?: ChildOrderByInput; + skip?: Int; + after?: String; + before?: String; + first?: Int; + last?: Int; + }) => T; + phoneNumber: () => Promise>; + updatedAt: () => Promise>; + createdAt: () => Promise>; +} + +export interface UserNullablePromise + extends Promise, + Fragmentable { + id: () => Promise; + airtableId: () => Promise; + consentGDPR: () => Promise; + postCode: () => Promise; + email: () => Promise; + meals: >(args?: { + where?: MealWhereInput; + orderBy?: MealOrderByInput; + skip?: Int; + after?: String; + before?: String; + first?: Int; + last?: Int; + }) => T; + projects: >(args?: { + where?: ProjectWhereInput; + orderBy?: ProjectOrderByInput; + skip?: Int; + after?: String; + before?: String; + first?: Int; + last?: Int; + }) => T; + children: >(args?: { + where?: ChildWhereInput; + orderBy?: ChildOrderByInput; + skip?: Int; + after?: String; + before?: String; + first?: Int; + last?: Int; + }) => T; + phoneNumber: () => Promise; + updatedAt: () => Promise; + createdAt: () => Promise; +} + +export interface ProportionEdge { + node: Proportion; + cursor: String; +} + +export interface ProportionEdgePromise + extends Promise, + Fragmentable { + node: () => T; + cursor: () => Promise; +} + +export interface ProportionEdgeSubscription + extends Promise>, + Fragmentable { + node: () => T; + cursor: () => Promise>; +} + +export interface CategorySubscriptionPayload { + mutation: MutationType; + node: Category; + updatedFields: String[]; + previousValues: CategoryPreviousValues; +} + +export interface CategorySubscriptionPayloadPromise + extends Promise, + Fragmentable { + mutation: () => Promise; + node: () => T; + updatedFields: () => Promise; + previousValues: () => T; +} + +export interface CategorySubscriptionPayloadSubscription + extends Promise>, + Fragmentable { + mutation: () => Promise>; + node: () => T; + updatedFields: () => Promise>; + previousValues: () => T; +} + +export interface Category { + id: ID_Output; + airtableId?: String; + name: String; + updatedAt: DateTimeOutput; + createdAt: DateTimeOutput; +} + +export interface CategoryPromise extends Promise, Fragmentable { + id: () => Promise; + airtableId: () => Promise; + name: () => Promise; + meals: >(args?: { + where?: MealWhereInput; + orderBy?: MealOrderByInput; + skip?: Int; + after?: String; + before?: String; + first?: Int; + last?: Int; + }) => T; + updatedAt: () => Promise; + createdAt: () => Promise; +} + +export interface CategorySubscription + extends Promise>, + Fragmentable { + id: () => Promise>; + airtableId: () => Promise>; + name: () => Promise>; + meals: >>(args?: { + where?: MealWhereInput; + orderBy?: MealOrderByInput; + skip?: Int; + after?: String; + before?: String; + first?: Int; + last?: Int; + }) => T; + updatedAt: () => Promise>; + createdAt: () => Promise>; +} + +export interface CategoryNullablePromise + extends Promise, + Fragmentable { + id: () => Promise; + airtableId: () => Promise; + name: () => Promise; + meals: >(args?: { + where?: MealWhereInput; + orderBy?: MealOrderByInput; + skip?: Int; + after?: String; + before?: String; + first?: Int; + last?: Int; + }) => T; + updatedAt: () => Promise; + createdAt: () => Promise; +} + +export interface CategoryPreviousValues { + id: ID_Output; + airtableId?: String; + name: String; + updatedAt: DateTimeOutput; + createdAt: DateTimeOutput; +} + +export interface CategoryPreviousValuesPromise + extends Promise, + Fragmentable { + id: () => Promise; + airtableId: () => Promise; + name: () => Promise; + updatedAt: () => Promise; + createdAt: () => Promise; +} + +export interface CategoryPreviousValuesSubscription + extends Promise>, + Fragmentable { + id: () => Promise>; + airtableId: () => Promise>; + name: () => Promise>; + updatedAt: () => Promise>; + createdAt: () => Promise>; +} + +export interface ProjectEdge { + node: Project; + cursor: String; +} + +export interface ProjectEdgePromise extends Promise, Fragmentable { + node: () => T; + cursor: () => Promise; +} + +export interface ProjectEdgeSubscription + extends Promise>, + Fragmentable { + node: () => T; + cursor: () => Promise>; +} + +export interface Tag { + id: ID_Output; + airtableId?: String; + name: String; + updatedAt: DateTimeOutput; + createdAt: DateTimeOutput; +} + +export interface TagPromise extends Promise, Fragmentable { + id: () => Promise; + airtableId: () => Promise; + name: () => Promise; + meals: >(args?: { + where?: MealWhereInput; + orderBy?: MealOrderByInput; + skip?: Int; + after?: String; + before?: String; + first?: Int; + last?: Int; + }) => T; + updatedAt: () => Promise; + createdAt: () => Promise; +} + +export interface TagSubscription + extends Promise>, + Fragmentable { + id: () => Promise>; + airtableId: () => Promise>; + name: () => Promise>; + meals: >>(args?: { + where?: MealWhereInput; + orderBy?: MealOrderByInput; + skip?: Int; + after?: String; + before?: String; + first?: Int; + last?: Int; + }) => T; + updatedAt: () => Promise>; + createdAt: () => Promise>; +} + +export interface TagNullablePromise extends Promise, Fragmentable { + id: () => Promise; + airtableId: () => Promise; + name: () => Promise; + meals: >(args?: { + where?: MealWhereInput; + orderBy?: MealOrderByInput; + skip?: Int; + after?: String; + before?: String; + first?: Int; + last?: Int; + }) => T; + updatedAt: () => Promise; + createdAt: () => Promise; +} + +export interface AggregateMeal { + count: Int; +} + +export interface AggregateMealPromise + extends Promise, + Fragmentable { + count: () => Promise; +} + +export interface AggregateMealSubscription + extends Promise>, + Fragmentable { + count: () => Promise>; +} + +export interface ChildSubscriptionPayload { + mutation: MutationType; + node: Child; + updatedFields: String[]; + previousValues: ChildPreviousValues; +} + +export interface ChildSubscriptionPayloadPromise + extends Promise, + Fragmentable { + mutation: () => Promise; + node: () => T; + updatedFields: () => Promise; + previousValues: () => T; +} + +export interface ChildSubscriptionPayloadSubscription + extends Promise>, + Fragmentable { + mutation: () => Promise>; + node: () => T; + updatedFields: () => Promise>; + previousValues: () => T; +} + +export interface MealConnection { + pageInfo: PageInfo; + edges: MealEdge[]; +} + +export interface MealConnectionPromise + extends Promise, + Fragmentable { + pageInfo: () => T; + edges: >() => T; + aggregate: () => T; +} + +export interface MealConnectionSubscription + extends Promise>, + Fragmentable { + pageInfo: () => T; + edges: >>() => T; + aggregate: () => T; +} + +export interface ChildPreviousValues { + id: ID_Output; + airtableId?: String; + age: String; + updatedAt: DateTimeOutput; + createdAt: DateTimeOutput; +} + +export interface ChildPreviousValuesPromise + extends Promise, + Fragmentable { + id: () => Promise; + airtableId: () => Promise; + age: () => Promise; + updatedAt: () => Promise; + createdAt: () => Promise; +} + +export interface ChildPreviousValuesSubscription + extends Promise>, + Fragmentable { + id: () => Promise>; + airtableId: () => Promise>; + age: () => Promise>; + updatedAt: () => Promise>; + createdAt: () => Promise>; +} + +export interface ChildEdge { + node: Child; + cursor: String; +} + +export interface ChildEdgePromise extends Promise, Fragmentable { + node: () => T; + cursor: () => Promise; +} + +export interface ChildEdgeSubscription + extends Promise>, + Fragmentable { + node: () => T; + cursor: () => Promise>; +} + +export interface Child { + id: ID_Output; + airtableId?: String; + age: String; + updatedAt: DateTimeOutput; + createdAt: DateTimeOutput; +} + +export interface ChildPromise extends Promise, Fragmentable { + id: () => Promise; + airtableId: () => Promise; + Parent: () => T; + age: () => Promise; + updatedAt: () => Promise; + createdAt: () => Promise; +} + +export interface ChildSubscription + extends Promise>, + Fragmentable { + id: () => Promise>; + airtableId: () => Promise>; + Parent: () => T; + age: () => Promise>; + updatedAt: () => Promise>; + createdAt: () => Promise>; +} + +export interface ChildNullablePromise + extends Promise, + Fragmentable { + id: () => Promise; + airtableId: () => Promise; + Parent: () => T; + age: () => Promise; + updatedAt: () => Promise; + createdAt: () => Promise; +} + +export interface AggregateUser { + count: Int; +} + +export interface AggregateUserPromise + extends Promise, + Fragmentable { + count: () => Promise; +} + +export interface AggregateUserSubscription + extends Promise>, + Fragmentable { + count: () => Promise>; +} + +export interface MealSubscriptionPayload { + mutation: MutationType; + node: Meal; + updatedFields: String[]; + previousValues: MealPreviousValues; +} + +export interface MealSubscriptionPayloadPromise + extends Promise, + Fragmentable { + mutation: () => Promise; + node: () => T; + updatedFields: () => Promise; + previousValues: () => T; +} + +export interface MealSubscriptionPayloadSubscription + extends Promise>, + Fragmentable { + mutation: () => Promise>; + node: () => T; + updatedFields: () => Promise>; + previousValues: () => T; +} + +export interface TagEdge { + node: Tag; + cursor: String; +} + +export interface TagEdgePromise extends Promise, Fragmentable { + node: () => T; + cursor: () => Promise; +} + +export interface TagEdgeSubscription + extends Promise>, + Fragmentable { + node: () => T; + cursor: () => Promise>; +} + +export interface MealPreviousValues { + id: ID_Output; + airtableId?: String; + imageURL: String; + updatedAt: DateTimeOutput; + createdAt: DateTimeOutput; +} + +export interface MealPreviousValuesPromise + extends Promise, + Fragmentable { + id: () => Promise; + airtableId: () => Promise; + imageURL: () => Promise; + updatedAt: () => Promise; + createdAt: () => Promise; +} + +export interface MealPreviousValuesSubscription + extends Promise>, + Fragmentable { + id: () => Promise>; + airtableId: () => Promise>; + imageURL: () => Promise>; + updatedAt: () => Promise>; + createdAt: () => Promise>; +} + +export interface ProportionConnection { + pageInfo: PageInfo; + edges: ProportionEdge[]; +} + +export interface ProportionConnectionPromise + extends Promise, + Fragmentable { + pageInfo: () => T; + edges: >() => T; + aggregate: () => T; +} + +export interface ProportionConnectionSubscription + extends Promise>, + Fragmentable { + pageInfo: () => T; + edges: >>() => T; + aggregate: () => T; +} + +export interface TagPreviousValues { + id: ID_Output; + airtableId?: String; + name: String; + updatedAt: DateTimeOutput; + createdAt: DateTimeOutput; +} + +export interface TagPreviousValuesPromise + extends Promise, + Fragmentable { + id: () => Promise; + airtableId: () => Promise; + name: () => Promise; + updatedAt: () => Promise; + createdAt: () => Promise; +} + +export interface TagPreviousValuesSubscription + extends Promise>, + Fragmentable { + id: () => Promise>; + airtableId: () => Promise>; + name: () => Promise>; + updatedAt: () => Promise>; + createdAt: () => Promise>; +} + +export interface ProjectConnection { + pageInfo: PageInfo; + edges: ProjectEdge[]; +} + +export interface ProjectConnectionPromise + extends Promise, + Fragmentable { + pageInfo: () => T; + edges: >() => T; + aggregate: () => T; +} + +export interface ProjectConnectionSubscription + extends Promise>, + Fragmentable { + pageInfo: () => T; + edges: >>() => T; + aggregate: () => T; +} + +export interface ProjectSubscriptionPayload { + mutation: MutationType; + node: Project; + updatedFields: String[]; + previousValues: ProjectPreviousValues; +} + +export interface ProjectSubscriptionPayloadPromise + extends Promise, + Fragmentable { + mutation: () => Promise; + node: () => T; + updatedFields: () => Promise; + previousValues: () => T; +} + +export interface ProjectSubscriptionPayloadSubscription + extends Promise>, + Fragmentable { + mutation: () => Promise>; + node: () => T; + updatedFields: () => Promise>; + previousValues: () => T; +} + +export interface AggregateChild { + count: Int; +} + +export interface AggregateChildPromise + extends Promise, + Fragmentable { + count: () => Promise; +} + +export interface AggregateChildSubscription + extends Promise>, + Fragmentable { + count: () => Promise>; +} + +export interface UserConnection { + pageInfo: PageInfo; + edges: UserEdge[]; +} + +export interface UserConnectionPromise + extends Promise, + Fragmentable { + pageInfo: () => T; + edges: >() => T; + aggregate: () => T; +} + +export interface UserConnectionSubscription + extends Promise>, + Fragmentable { + pageInfo: () => T; + edges: >>() => T; + aggregate: () => T; +} + +export interface ProportionPreviousValues { + id: ID_Output; + airtableId?: String; + name: String; + updatedAt: DateTimeOutput; + createdAt: DateTimeOutput; +} + +export interface ProportionPreviousValuesPromise + extends Promise, + Fragmentable { + id: () => Promise; + airtableId: () => Promise; + name: () => Promise; + updatedAt: () => Promise; + createdAt: () => Promise; +} + +export interface ProportionPreviousValuesSubscription + extends Promise>, + Fragmentable { + id: () => Promise>; + airtableId: () => Promise>; + name: () => Promise>; + updatedAt: () => Promise>; + createdAt: () => Promise>; +} + +export interface ProportionSubscriptionPayload { + mutation: MutationType; + node: Proportion; + updatedFields: String[]; + previousValues: ProportionPreviousValues; +} + +export interface ProportionSubscriptionPayloadPromise + extends Promise, + Fragmentable { + mutation: () => Promise; + node: () => T; + updatedFields: () => Promise; + previousValues: () => T; +} + +export interface ProportionSubscriptionPayloadSubscription + extends Promise>, + Fragmentable { + mutation: () => Promise>; + node: () => T; + updatedFields: () => Promise>; + previousValues: () => T; +} + +export interface Project { + id: ID_Output; + airtableId?: String; + name: String; + slug: String; + updatedAt: DateTimeOutput; + createdAt: DateTimeOutput; +} + +export interface ProjectPromise extends Promise, Fragmentable { + id: () => Promise; + airtableId: () => Promise; + name: () => Promise; + slug: () => Promise; + users: >(args?: { + where?: UserWhereInput; + orderBy?: UserOrderByInput; + skip?: Int; + after?: String; + before?: String; + first?: Int; + last?: Int; + }) => T; + updatedAt: () => Promise; + createdAt: () => Promise; +} + +export interface ProjectSubscription + extends Promise>, + Fragmentable { + id: () => Promise>; + airtableId: () => Promise>; + name: () => Promise>; + slug: () => Promise>; + users: >>(args?: { + where?: UserWhereInput; + orderBy?: UserOrderByInput; + skip?: Int; + after?: String; + before?: String; + first?: Int; + last?: Int; + }) => T; + updatedAt: () => Promise>; + createdAt: () => Promise>; +} + +export interface ProjectNullablePromise + extends Promise, + Fragmentable { + id: () => Promise; + airtableId: () => Promise; + name: () => Promise; + slug: () => Promise; + users: >(args?: { + where?: UserWhereInput; + orderBy?: UserOrderByInput; + skip?: Int; + after?: String; + before?: String; + first?: Int; + last?: Int; + }) => T; + updatedAt: () => Promise; + createdAt: () => Promise; +} + +export interface ProjectPreviousValues { + id: ID_Output; + airtableId?: String; + name: String; + slug: String; + updatedAt: DateTimeOutput; + createdAt: DateTimeOutput; +} + +export interface ProjectPreviousValuesPromise + extends Promise, + Fragmentable { + id: () => Promise; + airtableId: () => Promise; + name: () => Promise; + slug: () => Promise; + updatedAt: () => Promise; + createdAt: () => Promise; +} + +export interface ProjectPreviousValuesSubscription + extends Promise>, + Fragmentable { + id: () => Promise>; + airtableId: () => Promise>; + name: () => Promise>; + slug: () => Promise>; + updatedAt: () => Promise>; + createdAt: () => Promise>; +} + +export interface AggregateProportion { + count: Int; +} + +export interface AggregateProportionPromise + extends Promise, + Fragmentable { + count: () => Promise; +} + +export interface AggregateProportionSubscription + extends Promise>, + Fragmentable { + count: () => Promise>; +} + +export interface Meal { + id: ID_Output; + airtableId?: String; + imageURL: String; + updatedAt: DateTimeOutput; + createdAt: DateTimeOutput; +} + +export interface MealPromise extends Promise, Fragmentable { + id: () => Promise; + airtableId: () => Promise; + user: () => T; + imageURL: () => Promise; + categories: >(args?: { + where?: CategoryWhereInput; + orderBy?: CategoryOrderByInput; + skip?: Int; + after?: String; + before?: String; + first?: Int; + last?: Int; + }) => T; + tags: >(args?: { + where?: TagWhereInput; + orderBy?: TagOrderByInput; + skip?: Int; + after?: String; + before?: String; + first?: Int; + last?: Int; + }) => T; + updatedAt: () => Promise; + createdAt: () => Promise; + proportionFruit: () => T; + proportionVeg: () => T; +} + +export interface MealSubscription + extends Promise>, + Fragmentable { + id: () => Promise>; + airtableId: () => Promise>; + user: () => T; + imageURL: () => Promise>; + categories: >>(args?: { + where?: CategoryWhereInput; + orderBy?: CategoryOrderByInput; + skip?: Int; + after?: String; + before?: String; + first?: Int; + last?: Int; + }) => T; + tags: >>(args?: { + where?: TagWhereInput; + orderBy?: TagOrderByInput; + skip?: Int; + after?: String; + before?: String; + first?: Int; + last?: Int; + }) => T; + updatedAt: () => Promise>; + createdAt: () => Promise>; + proportionFruit: () => T; + proportionVeg: () => T; +} + +export interface MealNullablePromise + extends Promise, + Fragmentable { + id: () => Promise; + airtableId: () => Promise; + user: () => T; + imageURL: () => Promise; + categories: >(args?: { + where?: CategoryWhereInput; + orderBy?: CategoryOrderByInput; + skip?: Int; + after?: String; + before?: String; + first?: Int; + last?: Int; + }) => T; + tags: >(args?: { + where?: TagWhereInput; + orderBy?: TagOrderByInput; + skip?: Int; + after?: String; + before?: String; + first?: Int; + last?: Int; + }) => T; + updatedAt: () => Promise; + createdAt: () => Promise; + proportionFruit: () => T; + proportionVeg: () => T; +} + +export interface MealEdge { + node: Meal; + cursor: String; +} + +export interface MealEdgePromise extends Promise, Fragmentable { + node: () => T; + cursor: () => Promise; +} + +export interface MealEdgeSubscription + extends Promise>, + Fragmentable { + node: () => T; + cursor: () => Promise>; +} + +export interface AggregateProject { + count: Int; +} + +export interface AggregateProjectPromise + extends Promise, + Fragmentable { + count: () => Promise; +} + +export interface AggregateProjectSubscription + extends Promise>, + Fragmentable { + count: () => Promise>; +} + +/* +The `Int` scalar type represents non-fractional signed whole numeric values. Int can represent values between -(2^31) and 2^31 - 1. +*/ +export type Int = number; + +export type Long = string; + +/* +The `ID` scalar type represents a unique identifier, often used to refetch an object or as key for a cache. The ID type appears in a JSON response as a String; however, it is not intended to be human-readable. When expected as an input type, any string (such as `"4"`) or integer (such as `4`) input value will be accepted as an ID. +*/ +export type ID_Input = string | number; +export type ID_Output = string; + +/* +The `String` scalar type represents textual data, represented as UTF-8 character sequences. The String type is most often used by GraphQL to represent free-form human-readable text. +*/ +export type String = string; + +/* +The `Boolean` scalar type represents `true` or `false`. +*/ +export type Boolean = boolean; + +/* +DateTime scalar input type, allowing Date +*/ +export type DateTimeInput = Date | string; + +/* +DateTime scalar output type, which is always a string +*/ +export type DateTimeOutput = string; + +/** + * Model Metadata + */ + +export const models: Model[] = [ + { + name: "User", + embedded: false + }, + { + name: "Child", + embedded: false + }, + { + name: "Meal", + embedded: false + }, + { + name: "Tag", + embedded: false + }, + { + name: "Category", + embedded: false + }, + { + name: "Project", + embedded: false + }, + { + name: "Proportion", + embedded: false + } +]; + +/** + * Type Defs + */ + +export const Prisma = makePrismaClientClass>({ + typeDefs, + models, + endpoint: `${process.env["PRISMA_ENDPOINT"]}`, + secret: `${process.env["PRISMA_SECRET"]}` +}); +export const prisma = new Prisma(); diff --git a/prisma/generated/ts/prisma-schema.ts b/prisma/generated/ts/prisma-schema.ts new file mode 100644 index 0000000..7762aea --- /dev/null +++ b/prisma/generated/ts/prisma-schema.ts @@ -0,0 +1,2366 @@ +// Code generated by Prisma (prisma@1.34.10). DO NOT EDIT. + // Please don't change this file manually but run `prisma generate` to update it. + // For more information, please read the docs: https://www.prisma.io/docs/prisma-client/ + +export const typeDefs = /* GraphQL */ `type AggregateCategory { + count: Int! +} + +type AggregateChild { + count: Int! +} + +type AggregateMeal { + count: Int! +} + +type AggregateProject { + count: Int! +} + +type AggregateProportion { + count: Int! +} + +type AggregateTag { + count: Int! +} + +type AggregateUser { + count: Int! +} + +type BatchPayload { + count: Long! +} + +type Category { + id: ID! + airtableId: String + name: String! + meals(where: MealWhereInput, orderBy: MealOrderByInput, skip: Int, after: String, before: String, first: Int, last: Int): [Meal!] + updatedAt: DateTime! + createdAt: DateTime! +} + +type CategoryConnection { + pageInfo: PageInfo! + edges: [CategoryEdge]! + aggregate: AggregateCategory! +} + +input CategoryCreateInput { + id: ID + airtableId: String + name: String! + meals: MealCreateManyWithoutCategoriesInput +} + +input CategoryCreateManyWithoutMealsInput { + create: [CategoryCreateWithoutMealsInput!] + connect: [CategoryWhereUniqueInput!] +} + +input CategoryCreateWithoutMealsInput { + id: ID + airtableId: String + name: String! +} + +type CategoryEdge { + node: Category! + cursor: String! +} + +enum CategoryOrderByInput { + id_ASC + id_DESC + airtableId_ASC + airtableId_DESC + name_ASC + name_DESC + updatedAt_ASC + updatedAt_DESC + createdAt_ASC + createdAt_DESC +} + +type CategoryPreviousValues { + id: ID! + airtableId: String + name: String! + updatedAt: DateTime! + createdAt: DateTime! +} + +input CategoryScalarWhereInput { + id: ID + id_not: ID + id_in: [ID!] + id_not_in: [ID!] + id_lt: ID + id_lte: ID + id_gt: ID + id_gte: ID + id_contains: ID + id_not_contains: ID + id_starts_with: ID + id_not_starts_with: ID + id_ends_with: ID + id_not_ends_with: ID + airtableId: String + airtableId_not: String + airtableId_in: [String!] + airtableId_not_in: [String!] + airtableId_lt: String + airtableId_lte: String + airtableId_gt: String + airtableId_gte: String + airtableId_contains: String + airtableId_not_contains: String + airtableId_starts_with: String + airtableId_not_starts_with: String + airtableId_ends_with: String + airtableId_not_ends_with: String + name: String + name_not: String + name_in: [String!] + name_not_in: [String!] + name_lt: String + name_lte: String + name_gt: String + name_gte: String + name_contains: String + name_not_contains: String + name_starts_with: String + name_not_starts_with: String + name_ends_with: String + name_not_ends_with: String + updatedAt: DateTime + updatedAt_not: DateTime + updatedAt_in: [DateTime!] + updatedAt_not_in: [DateTime!] + updatedAt_lt: DateTime + updatedAt_lte: DateTime + updatedAt_gt: DateTime + updatedAt_gte: DateTime + createdAt: DateTime + createdAt_not: DateTime + createdAt_in: [DateTime!] + createdAt_not_in: [DateTime!] + createdAt_lt: DateTime + createdAt_lte: DateTime + createdAt_gt: DateTime + createdAt_gte: DateTime + AND: [CategoryScalarWhereInput!] + OR: [CategoryScalarWhereInput!] + NOT: [CategoryScalarWhereInput!] +} + +type CategorySubscriptionPayload { + mutation: MutationType! + node: Category + updatedFields: [String!] + previousValues: CategoryPreviousValues +} + +input CategorySubscriptionWhereInput { + mutation_in: [MutationType!] + updatedFields_contains: String + updatedFields_contains_every: [String!] + updatedFields_contains_some: [String!] + node: CategoryWhereInput + AND: [CategorySubscriptionWhereInput!] + OR: [CategorySubscriptionWhereInput!] + NOT: [CategorySubscriptionWhereInput!] +} + +input CategoryUpdateInput { + airtableId: String + name: String + meals: MealUpdateManyWithoutCategoriesInput +} + +input CategoryUpdateManyDataInput { + airtableId: String + name: String +} + +input CategoryUpdateManyMutationInput { + airtableId: String + name: String +} + +input CategoryUpdateManyWithoutMealsInput { + create: [CategoryCreateWithoutMealsInput!] + delete: [CategoryWhereUniqueInput!] + connect: [CategoryWhereUniqueInput!] + set: [CategoryWhereUniqueInput!] + disconnect: [CategoryWhereUniqueInput!] + update: [CategoryUpdateWithWhereUniqueWithoutMealsInput!] + upsert: [CategoryUpsertWithWhereUniqueWithoutMealsInput!] + deleteMany: [CategoryScalarWhereInput!] + updateMany: [CategoryUpdateManyWithWhereNestedInput!] +} + +input CategoryUpdateManyWithWhereNestedInput { + where: CategoryScalarWhereInput! + data: CategoryUpdateManyDataInput! +} + +input CategoryUpdateWithoutMealsDataInput { + airtableId: String + name: String +} + +input CategoryUpdateWithWhereUniqueWithoutMealsInput { + where: CategoryWhereUniqueInput! + data: CategoryUpdateWithoutMealsDataInput! +} + +input CategoryUpsertWithWhereUniqueWithoutMealsInput { + where: CategoryWhereUniqueInput! + update: CategoryUpdateWithoutMealsDataInput! + create: CategoryCreateWithoutMealsInput! +} + +input CategoryWhereInput { + id: ID + id_not: ID + id_in: [ID!] + id_not_in: [ID!] + id_lt: ID + id_lte: ID + id_gt: ID + id_gte: ID + id_contains: ID + id_not_contains: ID + id_starts_with: ID + id_not_starts_with: ID + id_ends_with: ID + id_not_ends_with: ID + airtableId: String + airtableId_not: String + airtableId_in: [String!] + airtableId_not_in: [String!] + airtableId_lt: String + airtableId_lte: String + airtableId_gt: String + airtableId_gte: String + airtableId_contains: String + airtableId_not_contains: String + airtableId_starts_with: String + airtableId_not_starts_with: String + airtableId_ends_with: String + airtableId_not_ends_with: String + name: String + name_not: String + name_in: [String!] + name_not_in: [String!] + name_lt: String + name_lte: String + name_gt: String + name_gte: String + name_contains: String + name_not_contains: String + name_starts_with: String + name_not_starts_with: String + name_ends_with: String + name_not_ends_with: String + meals_every: MealWhereInput + meals_some: MealWhereInput + meals_none: MealWhereInput + updatedAt: DateTime + updatedAt_not: DateTime + updatedAt_in: [DateTime!] + updatedAt_not_in: [DateTime!] + updatedAt_lt: DateTime + updatedAt_lte: DateTime + updatedAt_gt: DateTime + updatedAt_gte: DateTime + createdAt: DateTime + createdAt_not: DateTime + createdAt_in: [DateTime!] + createdAt_not_in: [DateTime!] + createdAt_lt: DateTime + createdAt_lte: DateTime + createdAt_gt: DateTime + createdAt_gte: DateTime + AND: [CategoryWhereInput!] + OR: [CategoryWhereInput!] + NOT: [CategoryWhereInput!] +} + +input CategoryWhereUniqueInput { + id: ID + airtableId: String + name: String +} + +type Child { + id: ID! + airtableId: String + Parent: User! + age: String! + updatedAt: DateTime! + createdAt: DateTime! +} + +type ChildConnection { + pageInfo: PageInfo! + edges: [ChildEdge]! + aggregate: AggregateChild! +} + +input ChildCreateInput { + id: ID + airtableId: String + Parent: UserCreateOneWithoutChildrenInput! + age: String! +} + +input ChildCreateManyWithoutParentInput { + create: [ChildCreateWithoutParentInput!] + connect: [ChildWhereUniqueInput!] +} + +input ChildCreateWithoutParentInput { + id: ID + airtableId: String + age: String! +} + +type ChildEdge { + node: Child! + cursor: String! +} + +enum ChildOrderByInput { + id_ASC + id_DESC + airtableId_ASC + airtableId_DESC + age_ASC + age_DESC + updatedAt_ASC + updatedAt_DESC + createdAt_ASC + createdAt_DESC +} + +type ChildPreviousValues { + id: ID! + airtableId: String + age: String! + updatedAt: DateTime! + createdAt: DateTime! +} + +input ChildScalarWhereInput { + id: ID + id_not: ID + id_in: [ID!] + id_not_in: [ID!] + id_lt: ID + id_lte: ID + id_gt: ID + id_gte: ID + id_contains: ID + id_not_contains: ID + id_starts_with: ID + id_not_starts_with: ID + id_ends_with: ID + id_not_ends_with: ID + airtableId: String + airtableId_not: String + airtableId_in: [String!] + airtableId_not_in: [String!] + airtableId_lt: String + airtableId_lte: String + airtableId_gt: String + airtableId_gte: String + airtableId_contains: String + airtableId_not_contains: String + airtableId_starts_with: String + airtableId_not_starts_with: String + airtableId_ends_with: String + airtableId_not_ends_with: String + age: String + age_not: String + age_in: [String!] + age_not_in: [String!] + age_lt: String + age_lte: String + age_gt: String + age_gte: String + age_contains: String + age_not_contains: String + age_starts_with: String + age_not_starts_with: String + age_ends_with: String + age_not_ends_with: String + updatedAt: DateTime + updatedAt_not: DateTime + updatedAt_in: [DateTime!] + updatedAt_not_in: [DateTime!] + updatedAt_lt: DateTime + updatedAt_lte: DateTime + updatedAt_gt: DateTime + updatedAt_gte: DateTime + createdAt: DateTime + createdAt_not: DateTime + createdAt_in: [DateTime!] + createdAt_not_in: [DateTime!] + createdAt_lt: DateTime + createdAt_lte: DateTime + createdAt_gt: DateTime + createdAt_gte: DateTime + AND: [ChildScalarWhereInput!] + OR: [ChildScalarWhereInput!] + NOT: [ChildScalarWhereInput!] +} + +type ChildSubscriptionPayload { + mutation: MutationType! + node: Child + updatedFields: [String!] + previousValues: ChildPreviousValues +} + +input ChildSubscriptionWhereInput { + mutation_in: [MutationType!] + updatedFields_contains: String + updatedFields_contains_every: [String!] + updatedFields_contains_some: [String!] + node: ChildWhereInput + AND: [ChildSubscriptionWhereInput!] + OR: [ChildSubscriptionWhereInput!] + NOT: [ChildSubscriptionWhereInput!] +} + +input ChildUpdateInput { + airtableId: String + Parent: UserUpdateOneRequiredWithoutChildrenInput + age: String +} + +input ChildUpdateManyDataInput { + airtableId: String + age: String +} + +input ChildUpdateManyMutationInput { + airtableId: String + age: String +} + +input ChildUpdateManyWithoutParentInput { + create: [ChildCreateWithoutParentInput!] + delete: [ChildWhereUniqueInput!] + connect: [ChildWhereUniqueInput!] + set: [ChildWhereUniqueInput!] + disconnect: [ChildWhereUniqueInput!] + update: [ChildUpdateWithWhereUniqueWithoutParentInput!] + upsert: [ChildUpsertWithWhereUniqueWithoutParentInput!] + deleteMany: [ChildScalarWhereInput!] + updateMany: [ChildUpdateManyWithWhereNestedInput!] +} + +input ChildUpdateManyWithWhereNestedInput { + where: ChildScalarWhereInput! + data: ChildUpdateManyDataInput! +} + +input ChildUpdateWithoutParentDataInput { + airtableId: String + age: String +} + +input ChildUpdateWithWhereUniqueWithoutParentInput { + where: ChildWhereUniqueInput! + data: ChildUpdateWithoutParentDataInput! +} + +input ChildUpsertWithWhereUniqueWithoutParentInput { + where: ChildWhereUniqueInput! + update: ChildUpdateWithoutParentDataInput! + create: ChildCreateWithoutParentInput! +} + +input ChildWhereInput { + id: ID + id_not: ID + id_in: [ID!] + id_not_in: [ID!] + id_lt: ID + id_lte: ID + id_gt: ID + id_gte: ID + id_contains: ID + id_not_contains: ID + id_starts_with: ID + id_not_starts_with: ID + id_ends_with: ID + id_not_ends_with: ID + airtableId: String + airtableId_not: String + airtableId_in: [String!] + airtableId_not_in: [String!] + airtableId_lt: String + airtableId_lte: String + airtableId_gt: String + airtableId_gte: String + airtableId_contains: String + airtableId_not_contains: String + airtableId_starts_with: String + airtableId_not_starts_with: String + airtableId_ends_with: String + airtableId_not_ends_with: String + Parent: UserWhereInput + age: String + age_not: String + age_in: [String!] + age_not_in: [String!] + age_lt: String + age_lte: String + age_gt: String + age_gte: String + age_contains: String + age_not_contains: String + age_starts_with: String + age_not_starts_with: String + age_ends_with: String + age_not_ends_with: String + updatedAt: DateTime + updatedAt_not: DateTime + updatedAt_in: [DateTime!] + updatedAt_not_in: [DateTime!] + updatedAt_lt: DateTime + updatedAt_lte: DateTime + updatedAt_gt: DateTime + updatedAt_gte: DateTime + createdAt: DateTime + createdAt_not: DateTime + createdAt_in: [DateTime!] + createdAt_not_in: [DateTime!] + createdAt_lt: DateTime + createdAt_lte: DateTime + createdAt_gt: DateTime + createdAt_gte: DateTime + AND: [ChildWhereInput!] + OR: [ChildWhereInput!] + NOT: [ChildWhereInput!] +} + +input ChildWhereUniqueInput { + id: ID + airtableId: String +} + +scalar DateTime + +scalar Long + +type Meal { + id: ID! + airtableId: String + user: User! + imageURL: String! + categories(where: CategoryWhereInput, orderBy: CategoryOrderByInput, skip: Int, after: String, before: String, first: Int, last: Int): [Category!] + tags(where: TagWhereInput, orderBy: TagOrderByInput, skip: Int, after: String, before: String, first: Int, last: Int): [Tag!] + updatedAt: DateTime! + createdAt: DateTime! + proportionFruit: Proportion + proportionVeg: Proportion +} + +type MealConnection { + pageInfo: PageInfo! + edges: [MealEdge]! + aggregate: AggregateMeal! +} + +input MealCreateInput { + id: ID + airtableId: String + user: UserCreateOneWithoutMealsInput! + imageURL: String! + categories: CategoryCreateManyWithoutMealsInput + tags: TagCreateManyWithoutMealsInput + proportionFruit: ProportionCreateOneWithoutFruitMealsInput + proportionVeg: ProportionCreateOneWithoutVegMealsInput +} + +input MealCreateManyWithoutCategoriesInput { + create: [MealCreateWithoutCategoriesInput!] + connect: [MealWhereUniqueInput!] +} + +input MealCreateManyWithoutProportionFruitInput { + create: [MealCreateWithoutProportionFruitInput!] + connect: [MealWhereUniqueInput!] +} + +input MealCreateManyWithoutProportionVegInput { + create: [MealCreateWithoutProportionVegInput!] + connect: [MealWhereUniqueInput!] +} + +input MealCreateManyWithoutTagsInput { + create: [MealCreateWithoutTagsInput!] + connect: [MealWhereUniqueInput!] +} + +input MealCreateManyWithoutUserInput { + create: [MealCreateWithoutUserInput!] + connect: [MealWhereUniqueInput!] +} + +input MealCreateWithoutCategoriesInput { + id: ID + airtableId: String + user: UserCreateOneWithoutMealsInput! + imageURL: String! + tags: TagCreateManyWithoutMealsInput + proportionFruit: ProportionCreateOneWithoutFruitMealsInput + proportionVeg: ProportionCreateOneWithoutVegMealsInput +} + +input MealCreateWithoutProportionFruitInput { + id: ID + airtableId: String + user: UserCreateOneWithoutMealsInput! + imageURL: String! + categories: CategoryCreateManyWithoutMealsInput + tags: TagCreateManyWithoutMealsInput + proportionVeg: ProportionCreateOneWithoutVegMealsInput +} + +input MealCreateWithoutProportionVegInput { + id: ID + airtableId: String + user: UserCreateOneWithoutMealsInput! + imageURL: String! + categories: CategoryCreateManyWithoutMealsInput + tags: TagCreateManyWithoutMealsInput + proportionFruit: ProportionCreateOneWithoutFruitMealsInput +} + +input MealCreateWithoutTagsInput { + id: ID + airtableId: String + user: UserCreateOneWithoutMealsInput! + imageURL: String! + categories: CategoryCreateManyWithoutMealsInput + proportionFruit: ProportionCreateOneWithoutFruitMealsInput + proportionVeg: ProportionCreateOneWithoutVegMealsInput +} + +input MealCreateWithoutUserInput { + id: ID + airtableId: String + imageURL: String! + categories: CategoryCreateManyWithoutMealsInput + tags: TagCreateManyWithoutMealsInput + proportionFruit: ProportionCreateOneWithoutFruitMealsInput + proportionVeg: ProportionCreateOneWithoutVegMealsInput +} + +type MealEdge { + node: Meal! + cursor: String! +} + +enum MealOrderByInput { + id_ASC + id_DESC + airtableId_ASC + airtableId_DESC + imageURL_ASC + imageURL_DESC + updatedAt_ASC + updatedAt_DESC + createdAt_ASC + createdAt_DESC +} + +type MealPreviousValues { + id: ID! + airtableId: String + imageURL: String! + updatedAt: DateTime! + createdAt: DateTime! +} + +input MealScalarWhereInput { + id: ID + id_not: ID + id_in: [ID!] + id_not_in: [ID!] + id_lt: ID + id_lte: ID + id_gt: ID + id_gte: ID + id_contains: ID + id_not_contains: ID + id_starts_with: ID + id_not_starts_with: ID + id_ends_with: ID + id_not_ends_with: ID + airtableId: String + airtableId_not: String + airtableId_in: [String!] + airtableId_not_in: [String!] + airtableId_lt: String + airtableId_lte: String + airtableId_gt: String + airtableId_gte: String + airtableId_contains: String + airtableId_not_contains: String + airtableId_starts_with: String + airtableId_not_starts_with: String + airtableId_ends_with: String + airtableId_not_ends_with: String + imageURL: String + imageURL_not: String + imageURL_in: [String!] + imageURL_not_in: [String!] + imageURL_lt: String + imageURL_lte: String + imageURL_gt: String + imageURL_gte: String + imageURL_contains: String + imageURL_not_contains: String + imageURL_starts_with: String + imageURL_not_starts_with: String + imageURL_ends_with: String + imageURL_not_ends_with: String + updatedAt: DateTime + updatedAt_not: DateTime + updatedAt_in: [DateTime!] + updatedAt_not_in: [DateTime!] + updatedAt_lt: DateTime + updatedAt_lte: DateTime + updatedAt_gt: DateTime + updatedAt_gte: DateTime + createdAt: DateTime + createdAt_not: DateTime + createdAt_in: [DateTime!] + createdAt_not_in: [DateTime!] + createdAt_lt: DateTime + createdAt_lte: DateTime + createdAt_gt: DateTime + createdAt_gte: DateTime + AND: [MealScalarWhereInput!] + OR: [MealScalarWhereInput!] + NOT: [MealScalarWhereInput!] +} + +type MealSubscriptionPayload { + mutation: MutationType! + node: Meal + updatedFields: [String!] + previousValues: MealPreviousValues +} + +input MealSubscriptionWhereInput { + mutation_in: [MutationType!] + updatedFields_contains: String + updatedFields_contains_every: [String!] + updatedFields_contains_some: [String!] + node: MealWhereInput + AND: [MealSubscriptionWhereInput!] + OR: [MealSubscriptionWhereInput!] + NOT: [MealSubscriptionWhereInput!] +} + +input MealUpdateInput { + airtableId: String + user: UserUpdateOneRequiredWithoutMealsInput + imageURL: String + categories: CategoryUpdateManyWithoutMealsInput + tags: TagUpdateManyWithoutMealsInput + proportionFruit: ProportionUpdateOneWithoutFruitMealsInput + proportionVeg: ProportionUpdateOneWithoutVegMealsInput +} + +input MealUpdateManyDataInput { + airtableId: String + imageURL: String +} + +input MealUpdateManyMutationInput { + airtableId: String + imageURL: String +} + +input MealUpdateManyWithoutCategoriesInput { + create: [MealCreateWithoutCategoriesInput!] + delete: [MealWhereUniqueInput!] + connect: [MealWhereUniqueInput!] + set: [MealWhereUniqueInput!] + disconnect: [MealWhereUniqueInput!] + update: [MealUpdateWithWhereUniqueWithoutCategoriesInput!] + upsert: [MealUpsertWithWhereUniqueWithoutCategoriesInput!] + deleteMany: [MealScalarWhereInput!] + updateMany: [MealUpdateManyWithWhereNestedInput!] +} + +input MealUpdateManyWithoutProportionFruitInput { + create: [MealCreateWithoutProportionFruitInput!] + delete: [MealWhereUniqueInput!] + connect: [MealWhereUniqueInput!] + set: [MealWhereUniqueInput!] + disconnect: [MealWhereUniqueInput!] + update: [MealUpdateWithWhereUniqueWithoutProportionFruitInput!] + upsert: [MealUpsertWithWhereUniqueWithoutProportionFruitInput!] + deleteMany: [MealScalarWhereInput!] + updateMany: [MealUpdateManyWithWhereNestedInput!] +} + +input MealUpdateManyWithoutProportionVegInput { + create: [MealCreateWithoutProportionVegInput!] + delete: [MealWhereUniqueInput!] + connect: [MealWhereUniqueInput!] + set: [MealWhereUniqueInput!] + disconnect: [MealWhereUniqueInput!] + update: [MealUpdateWithWhereUniqueWithoutProportionVegInput!] + upsert: [MealUpsertWithWhereUniqueWithoutProportionVegInput!] + deleteMany: [MealScalarWhereInput!] + updateMany: [MealUpdateManyWithWhereNestedInput!] +} + +input MealUpdateManyWithoutTagsInput { + create: [MealCreateWithoutTagsInput!] + delete: [MealWhereUniqueInput!] + connect: [MealWhereUniqueInput!] + set: [MealWhereUniqueInput!] + disconnect: [MealWhereUniqueInput!] + update: [MealUpdateWithWhereUniqueWithoutTagsInput!] + upsert: [MealUpsertWithWhereUniqueWithoutTagsInput!] + deleteMany: [MealScalarWhereInput!] + updateMany: [MealUpdateManyWithWhereNestedInput!] +} + +input MealUpdateManyWithoutUserInput { + create: [MealCreateWithoutUserInput!] + delete: [MealWhereUniqueInput!] + connect: [MealWhereUniqueInput!] + set: [MealWhereUniqueInput!] + disconnect: [MealWhereUniqueInput!] + update: [MealUpdateWithWhereUniqueWithoutUserInput!] + upsert: [MealUpsertWithWhereUniqueWithoutUserInput!] + deleteMany: [MealScalarWhereInput!] + updateMany: [MealUpdateManyWithWhereNestedInput!] +} + +input MealUpdateManyWithWhereNestedInput { + where: MealScalarWhereInput! + data: MealUpdateManyDataInput! +} + +input MealUpdateWithoutCategoriesDataInput { + airtableId: String + user: UserUpdateOneRequiredWithoutMealsInput + imageURL: String + tags: TagUpdateManyWithoutMealsInput + proportionFruit: ProportionUpdateOneWithoutFruitMealsInput + proportionVeg: ProportionUpdateOneWithoutVegMealsInput +} + +input MealUpdateWithoutProportionFruitDataInput { + airtableId: String + user: UserUpdateOneRequiredWithoutMealsInput + imageURL: String + categories: CategoryUpdateManyWithoutMealsInput + tags: TagUpdateManyWithoutMealsInput + proportionVeg: ProportionUpdateOneWithoutVegMealsInput +} + +input MealUpdateWithoutProportionVegDataInput { + airtableId: String + user: UserUpdateOneRequiredWithoutMealsInput + imageURL: String + categories: CategoryUpdateManyWithoutMealsInput + tags: TagUpdateManyWithoutMealsInput + proportionFruit: ProportionUpdateOneWithoutFruitMealsInput +} + +input MealUpdateWithoutTagsDataInput { + airtableId: String + user: UserUpdateOneRequiredWithoutMealsInput + imageURL: String + categories: CategoryUpdateManyWithoutMealsInput + proportionFruit: ProportionUpdateOneWithoutFruitMealsInput + proportionVeg: ProportionUpdateOneWithoutVegMealsInput +} + +input MealUpdateWithoutUserDataInput { + airtableId: String + imageURL: String + categories: CategoryUpdateManyWithoutMealsInput + tags: TagUpdateManyWithoutMealsInput + proportionFruit: ProportionUpdateOneWithoutFruitMealsInput + proportionVeg: ProportionUpdateOneWithoutVegMealsInput +} + +input MealUpdateWithWhereUniqueWithoutCategoriesInput { + where: MealWhereUniqueInput! + data: MealUpdateWithoutCategoriesDataInput! +} + +input MealUpdateWithWhereUniqueWithoutProportionFruitInput { + where: MealWhereUniqueInput! + data: MealUpdateWithoutProportionFruitDataInput! +} + +input MealUpdateWithWhereUniqueWithoutProportionVegInput { + where: MealWhereUniqueInput! + data: MealUpdateWithoutProportionVegDataInput! +} + +input MealUpdateWithWhereUniqueWithoutTagsInput { + where: MealWhereUniqueInput! + data: MealUpdateWithoutTagsDataInput! +} + +input MealUpdateWithWhereUniqueWithoutUserInput { + where: MealWhereUniqueInput! + data: MealUpdateWithoutUserDataInput! +} + +input MealUpsertWithWhereUniqueWithoutCategoriesInput { + where: MealWhereUniqueInput! + update: MealUpdateWithoutCategoriesDataInput! + create: MealCreateWithoutCategoriesInput! +} + +input MealUpsertWithWhereUniqueWithoutProportionFruitInput { + where: MealWhereUniqueInput! + update: MealUpdateWithoutProportionFruitDataInput! + create: MealCreateWithoutProportionFruitInput! +} + +input MealUpsertWithWhereUniqueWithoutProportionVegInput { + where: MealWhereUniqueInput! + update: MealUpdateWithoutProportionVegDataInput! + create: MealCreateWithoutProportionVegInput! +} + +input MealUpsertWithWhereUniqueWithoutTagsInput { + where: MealWhereUniqueInput! + update: MealUpdateWithoutTagsDataInput! + create: MealCreateWithoutTagsInput! +} + +input MealUpsertWithWhereUniqueWithoutUserInput { + where: MealWhereUniqueInput! + update: MealUpdateWithoutUserDataInput! + create: MealCreateWithoutUserInput! +} + +input MealWhereInput { + id: ID + id_not: ID + id_in: [ID!] + id_not_in: [ID!] + id_lt: ID + id_lte: ID + id_gt: ID + id_gte: ID + id_contains: ID + id_not_contains: ID + id_starts_with: ID + id_not_starts_with: ID + id_ends_with: ID + id_not_ends_with: ID + airtableId: String + airtableId_not: String + airtableId_in: [String!] + airtableId_not_in: [String!] + airtableId_lt: String + airtableId_lte: String + airtableId_gt: String + airtableId_gte: String + airtableId_contains: String + airtableId_not_contains: String + airtableId_starts_with: String + airtableId_not_starts_with: String + airtableId_ends_with: String + airtableId_not_ends_with: String + user: UserWhereInput + imageURL: String + imageURL_not: String + imageURL_in: [String!] + imageURL_not_in: [String!] + imageURL_lt: String + imageURL_lte: String + imageURL_gt: String + imageURL_gte: String + imageURL_contains: String + imageURL_not_contains: String + imageURL_starts_with: String + imageURL_not_starts_with: String + imageURL_ends_with: String + imageURL_not_ends_with: String + categories_every: CategoryWhereInput + categories_some: CategoryWhereInput + categories_none: CategoryWhereInput + tags_every: TagWhereInput + tags_some: TagWhereInput + tags_none: TagWhereInput + updatedAt: DateTime + updatedAt_not: DateTime + updatedAt_in: [DateTime!] + updatedAt_not_in: [DateTime!] + updatedAt_lt: DateTime + updatedAt_lte: DateTime + updatedAt_gt: DateTime + updatedAt_gte: DateTime + createdAt: DateTime + createdAt_not: DateTime + createdAt_in: [DateTime!] + createdAt_not_in: [DateTime!] + createdAt_lt: DateTime + createdAt_lte: DateTime + createdAt_gt: DateTime + createdAt_gte: DateTime + proportionFruit: ProportionWhereInput + proportionVeg: ProportionWhereInput + AND: [MealWhereInput!] + OR: [MealWhereInput!] + NOT: [MealWhereInput!] +} + +input MealWhereUniqueInput { + id: ID + airtableId: String +} + +type Mutation { + createCategory(data: CategoryCreateInput!): Category! + updateCategory(data: CategoryUpdateInput!, where: CategoryWhereUniqueInput!): Category + updateManyCategories(data: CategoryUpdateManyMutationInput!, where: CategoryWhereInput): BatchPayload! + upsertCategory(where: CategoryWhereUniqueInput!, create: CategoryCreateInput!, update: CategoryUpdateInput!): Category! + deleteCategory(where: CategoryWhereUniqueInput!): Category + deleteManyCategories(where: CategoryWhereInput): BatchPayload! + createChild(data: ChildCreateInput!): Child! + updateChild(data: ChildUpdateInput!, where: ChildWhereUniqueInput!): Child + updateManyChildren(data: ChildUpdateManyMutationInput!, where: ChildWhereInput): BatchPayload! + upsertChild(where: ChildWhereUniqueInput!, create: ChildCreateInput!, update: ChildUpdateInput!): Child! + deleteChild(where: ChildWhereUniqueInput!): Child + deleteManyChildren(where: ChildWhereInput): BatchPayload! + createMeal(data: MealCreateInput!): Meal! + updateMeal(data: MealUpdateInput!, where: MealWhereUniqueInput!): Meal + updateManyMeals(data: MealUpdateManyMutationInput!, where: MealWhereInput): BatchPayload! + upsertMeal(where: MealWhereUniqueInput!, create: MealCreateInput!, update: MealUpdateInput!): Meal! + deleteMeal(where: MealWhereUniqueInput!): Meal + deleteManyMeals(where: MealWhereInput): BatchPayload! + createProject(data: ProjectCreateInput!): Project! + updateProject(data: ProjectUpdateInput!, where: ProjectWhereUniqueInput!): Project + updateManyProjects(data: ProjectUpdateManyMutationInput!, where: ProjectWhereInput): BatchPayload! + upsertProject(where: ProjectWhereUniqueInput!, create: ProjectCreateInput!, update: ProjectUpdateInput!): Project! + deleteProject(where: ProjectWhereUniqueInput!): Project + deleteManyProjects(where: ProjectWhereInput): BatchPayload! + createProportion(data: ProportionCreateInput!): Proportion! + updateProportion(data: ProportionUpdateInput!, where: ProportionWhereUniqueInput!): Proportion + updateManyProportions(data: ProportionUpdateManyMutationInput!, where: ProportionWhereInput): BatchPayload! + upsertProportion(where: ProportionWhereUniqueInput!, create: ProportionCreateInput!, update: ProportionUpdateInput!): Proportion! + deleteProportion(where: ProportionWhereUniqueInput!): Proportion + deleteManyProportions(where: ProportionWhereInput): BatchPayload! + createTag(data: TagCreateInput!): Tag! + updateTag(data: TagUpdateInput!, where: TagWhereUniqueInput!): Tag + updateManyTags(data: TagUpdateManyMutationInput!, where: TagWhereInput): BatchPayload! + upsertTag(where: TagWhereUniqueInput!, create: TagCreateInput!, update: TagUpdateInput!): Tag! + deleteTag(where: TagWhereUniqueInput!): Tag + deleteManyTags(where: TagWhereInput): BatchPayload! + createUser(data: UserCreateInput!): User! + updateUser(data: UserUpdateInput!, where: UserWhereUniqueInput!): User + updateManyUsers(data: UserUpdateManyMutationInput!, where: UserWhereInput): BatchPayload! + upsertUser(where: UserWhereUniqueInput!, create: UserCreateInput!, update: UserUpdateInput!): User! + deleteUser(where: UserWhereUniqueInput!): User + deleteManyUsers(where: UserWhereInput): BatchPayload! +} + +enum MutationType { + CREATED + UPDATED + DELETED +} + +interface Node { + id: ID! +} + +type PageInfo { + hasNextPage: Boolean! + hasPreviousPage: Boolean! + startCursor: String + endCursor: String +} + +type Project { + id: ID! + airtableId: String + name: String! + slug: String! + users(where: UserWhereInput, orderBy: UserOrderByInput, skip: Int, after: String, before: String, first: Int, last: Int): [User!] + updatedAt: DateTime! + createdAt: DateTime! +} + +type ProjectConnection { + pageInfo: PageInfo! + edges: [ProjectEdge]! + aggregate: AggregateProject! +} + +input ProjectCreateInput { + id: ID + airtableId: String + name: String! + slug: String! + users: UserCreateManyWithoutProjectsInput +} + +input ProjectCreateManyWithoutUsersInput { + create: [ProjectCreateWithoutUsersInput!] + connect: [ProjectWhereUniqueInput!] +} + +input ProjectCreateWithoutUsersInput { + id: ID + airtableId: String + name: String! + slug: String! +} + +type ProjectEdge { + node: Project! + cursor: String! +} + +enum ProjectOrderByInput { + id_ASC + id_DESC + airtableId_ASC + airtableId_DESC + name_ASC + name_DESC + slug_ASC + slug_DESC + updatedAt_ASC + updatedAt_DESC + createdAt_ASC + createdAt_DESC +} + +type ProjectPreviousValues { + id: ID! + airtableId: String + name: String! + slug: String! + updatedAt: DateTime! + createdAt: DateTime! +} + +input ProjectScalarWhereInput { + id: ID + id_not: ID + id_in: [ID!] + id_not_in: [ID!] + id_lt: ID + id_lte: ID + id_gt: ID + id_gte: ID + id_contains: ID + id_not_contains: ID + id_starts_with: ID + id_not_starts_with: ID + id_ends_with: ID + id_not_ends_with: ID + airtableId: String + airtableId_not: String + airtableId_in: [String!] + airtableId_not_in: [String!] + airtableId_lt: String + airtableId_lte: String + airtableId_gt: String + airtableId_gte: String + airtableId_contains: String + airtableId_not_contains: String + airtableId_starts_with: String + airtableId_not_starts_with: String + airtableId_ends_with: String + airtableId_not_ends_with: String + name: String + name_not: String + name_in: [String!] + name_not_in: [String!] + name_lt: String + name_lte: String + name_gt: String + name_gte: String + name_contains: String + name_not_contains: String + name_starts_with: String + name_not_starts_with: String + name_ends_with: String + name_not_ends_with: String + slug: String + slug_not: String + slug_in: [String!] + slug_not_in: [String!] + slug_lt: String + slug_lte: String + slug_gt: String + slug_gte: String + slug_contains: String + slug_not_contains: String + slug_starts_with: String + slug_not_starts_with: String + slug_ends_with: String + slug_not_ends_with: String + updatedAt: DateTime + updatedAt_not: DateTime + updatedAt_in: [DateTime!] + updatedAt_not_in: [DateTime!] + updatedAt_lt: DateTime + updatedAt_lte: DateTime + updatedAt_gt: DateTime + updatedAt_gte: DateTime + createdAt: DateTime + createdAt_not: DateTime + createdAt_in: [DateTime!] + createdAt_not_in: [DateTime!] + createdAt_lt: DateTime + createdAt_lte: DateTime + createdAt_gt: DateTime + createdAt_gte: DateTime + AND: [ProjectScalarWhereInput!] + OR: [ProjectScalarWhereInput!] + NOT: [ProjectScalarWhereInput!] +} + +type ProjectSubscriptionPayload { + mutation: MutationType! + node: Project + updatedFields: [String!] + previousValues: ProjectPreviousValues +} + +input ProjectSubscriptionWhereInput { + mutation_in: [MutationType!] + updatedFields_contains: String + updatedFields_contains_every: [String!] + updatedFields_contains_some: [String!] + node: ProjectWhereInput + AND: [ProjectSubscriptionWhereInput!] + OR: [ProjectSubscriptionWhereInput!] + NOT: [ProjectSubscriptionWhereInput!] +} + +input ProjectUpdateInput { + airtableId: String + name: String + slug: String + users: UserUpdateManyWithoutProjectsInput +} + +input ProjectUpdateManyDataInput { + airtableId: String + name: String + slug: String +} + +input ProjectUpdateManyMutationInput { + airtableId: String + name: String + slug: String +} + +input ProjectUpdateManyWithoutUsersInput { + create: [ProjectCreateWithoutUsersInput!] + delete: [ProjectWhereUniqueInput!] + connect: [ProjectWhereUniqueInput!] + set: [ProjectWhereUniqueInput!] + disconnect: [ProjectWhereUniqueInput!] + update: [ProjectUpdateWithWhereUniqueWithoutUsersInput!] + upsert: [ProjectUpsertWithWhereUniqueWithoutUsersInput!] + deleteMany: [ProjectScalarWhereInput!] + updateMany: [ProjectUpdateManyWithWhereNestedInput!] +} + +input ProjectUpdateManyWithWhereNestedInput { + where: ProjectScalarWhereInput! + data: ProjectUpdateManyDataInput! +} + +input ProjectUpdateWithoutUsersDataInput { + airtableId: String + name: String + slug: String +} + +input ProjectUpdateWithWhereUniqueWithoutUsersInput { + where: ProjectWhereUniqueInput! + data: ProjectUpdateWithoutUsersDataInput! +} + +input ProjectUpsertWithWhereUniqueWithoutUsersInput { + where: ProjectWhereUniqueInput! + update: ProjectUpdateWithoutUsersDataInput! + create: ProjectCreateWithoutUsersInput! +} + +input ProjectWhereInput { + id: ID + id_not: ID + id_in: [ID!] + id_not_in: [ID!] + id_lt: ID + id_lte: ID + id_gt: ID + id_gte: ID + id_contains: ID + id_not_contains: ID + id_starts_with: ID + id_not_starts_with: ID + id_ends_with: ID + id_not_ends_with: ID + airtableId: String + airtableId_not: String + airtableId_in: [String!] + airtableId_not_in: [String!] + airtableId_lt: String + airtableId_lte: String + airtableId_gt: String + airtableId_gte: String + airtableId_contains: String + airtableId_not_contains: String + airtableId_starts_with: String + airtableId_not_starts_with: String + airtableId_ends_with: String + airtableId_not_ends_with: String + name: String + name_not: String + name_in: [String!] + name_not_in: [String!] + name_lt: String + name_lte: String + name_gt: String + name_gte: String + name_contains: String + name_not_contains: String + name_starts_with: String + name_not_starts_with: String + name_ends_with: String + name_not_ends_with: String + slug: String + slug_not: String + slug_in: [String!] + slug_not_in: [String!] + slug_lt: String + slug_lte: String + slug_gt: String + slug_gte: String + slug_contains: String + slug_not_contains: String + slug_starts_with: String + slug_not_starts_with: String + slug_ends_with: String + slug_not_ends_with: String + users_every: UserWhereInput + users_some: UserWhereInput + users_none: UserWhereInput + updatedAt: DateTime + updatedAt_not: DateTime + updatedAt_in: [DateTime!] + updatedAt_not_in: [DateTime!] + updatedAt_lt: DateTime + updatedAt_lte: DateTime + updatedAt_gt: DateTime + updatedAt_gte: DateTime + createdAt: DateTime + createdAt_not: DateTime + createdAt_in: [DateTime!] + createdAt_not_in: [DateTime!] + createdAt_lt: DateTime + createdAt_lte: DateTime + createdAt_gt: DateTime + createdAt_gte: DateTime + AND: [ProjectWhereInput!] + OR: [ProjectWhereInput!] + NOT: [ProjectWhereInput!] +} + +input ProjectWhereUniqueInput { + id: ID + airtableId: String + slug: String +} + +type Proportion { + id: ID! + airtableId: String + name: String! + fruitMeals(where: MealWhereInput, orderBy: MealOrderByInput, skip: Int, after: String, before: String, first: Int, last: Int): [Meal!] + vegMeals(where: MealWhereInput, orderBy: MealOrderByInput, skip: Int, after: String, before: String, first: Int, last: Int): [Meal!] + updatedAt: DateTime! + createdAt: DateTime! +} + +type ProportionConnection { + pageInfo: PageInfo! + edges: [ProportionEdge]! + aggregate: AggregateProportion! +} + +input ProportionCreateInput { + id: ID + airtableId: String + name: String! + fruitMeals: MealCreateManyWithoutProportionFruitInput + vegMeals: MealCreateManyWithoutProportionVegInput +} + +input ProportionCreateOneWithoutFruitMealsInput { + create: ProportionCreateWithoutFruitMealsInput + connect: ProportionWhereUniqueInput +} + +input ProportionCreateOneWithoutVegMealsInput { + create: ProportionCreateWithoutVegMealsInput + connect: ProportionWhereUniqueInput +} + +input ProportionCreateWithoutFruitMealsInput { + id: ID + airtableId: String + name: String! + vegMeals: MealCreateManyWithoutProportionVegInput +} + +input ProportionCreateWithoutVegMealsInput { + id: ID + airtableId: String + name: String! + fruitMeals: MealCreateManyWithoutProportionFruitInput +} + +type ProportionEdge { + node: Proportion! + cursor: String! +} + +enum ProportionOrderByInput { + id_ASC + id_DESC + airtableId_ASC + airtableId_DESC + name_ASC + name_DESC + updatedAt_ASC + updatedAt_DESC + createdAt_ASC + createdAt_DESC +} + +type ProportionPreviousValues { + id: ID! + airtableId: String + name: String! + updatedAt: DateTime! + createdAt: DateTime! +} + +type ProportionSubscriptionPayload { + mutation: MutationType! + node: Proportion + updatedFields: [String!] + previousValues: ProportionPreviousValues +} + +input ProportionSubscriptionWhereInput { + mutation_in: [MutationType!] + updatedFields_contains: String + updatedFields_contains_every: [String!] + updatedFields_contains_some: [String!] + node: ProportionWhereInput + AND: [ProportionSubscriptionWhereInput!] + OR: [ProportionSubscriptionWhereInput!] + NOT: [ProportionSubscriptionWhereInput!] +} + +input ProportionUpdateInput { + airtableId: String + name: String + fruitMeals: MealUpdateManyWithoutProportionFruitInput + vegMeals: MealUpdateManyWithoutProportionVegInput +} + +input ProportionUpdateManyMutationInput { + airtableId: String + name: String +} + +input ProportionUpdateOneWithoutFruitMealsInput { + create: ProportionCreateWithoutFruitMealsInput + update: ProportionUpdateWithoutFruitMealsDataInput + upsert: ProportionUpsertWithoutFruitMealsInput + delete: Boolean + disconnect: Boolean + connect: ProportionWhereUniqueInput +} + +input ProportionUpdateOneWithoutVegMealsInput { + create: ProportionCreateWithoutVegMealsInput + update: ProportionUpdateWithoutVegMealsDataInput + upsert: ProportionUpsertWithoutVegMealsInput + delete: Boolean + disconnect: Boolean + connect: ProportionWhereUniqueInput +} + +input ProportionUpdateWithoutFruitMealsDataInput { + airtableId: String + name: String + vegMeals: MealUpdateManyWithoutProportionVegInput +} + +input ProportionUpdateWithoutVegMealsDataInput { + airtableId: String + name: String + fruitMeals: MealUpdateManyWithoutProportionFruitInput +} + +input ProportionUpsertWithoutFruitMealsInput { + update: ProportionUpdateWithoutFruitMealsDataInput! + create: ProportionCreateWithoutFruitMealsInput! +} + +input ProportionUpsertWithoutVegMealsInput { + update: ProportionUpdateWithoutVegMealsDataInput! + create: ProportionCreateWithoutVegMealsInput! +} + +input ProportionWhereInput { + id: ID + id_not: ID + id_in: [ID!] + id_not_in: [ID!] + id_lt: ID + id_lte: ID + id_gt: ID + id_gte: ID + id_contains: ID + id_not_contains: ID + id_starts_with: ID + id_not_starts_with: ID + id_ends_with: ID + id_not_ends_with: ID + airtableId: String + airtableId_not: String + airtableId_in: [String!] + airtableId_not_in: [String!] + airtableId_lt: String + airtableId_lte: String + airtableId_gt: String + airtableId_gte: String + airtableId_contains: String + airtableId_not_contains: String + airtableId_starts_with: String + airtableId_not_starts_with: String + airtableId_ends_with: String + airtableId_not_ends_with: String + name: String + name_not: String + name_in: [String!] + name_not_in: [String!] + name_lt: String + name_lte: String + name_gt: String + name_gte: String + name_contains: String + name_not_contains: String + name_starts_with: String + name_not_starts_with: String + name_ends_with: String + name_not_ends_with: String + fruitMeals_every: MealWhereInput + fruitMeals_some: MealWhereInput + fruitMeals_none: MealWhereInput + vegMeals_every: MealWhereInput + vegMeals_some: MealWhereInput + vegMeals_none: MealWhereInput + updatedAt: DateTime + updatedAt_not: DateTime + updatedAt_in: [DateTime!] + updatedAt_not_in: [DateTime!] + updatedAt_lt: DateTime + updatedAt_lte: DateTime + updatedAt_gt: DateTime + updatedAt_gte: DateTime + createdAt: DateTime + createdAt_not: DateTime + createdAt_in: [DateTime!] + createdAt_not_in: [DateTime!] + createdAt_lt: DateTime + createdAt_lte: DateTime + createdAt_gt: DateTime + createdAt_gte: DateTime + AND: [ProportionWhereInput!] + OR: [ProportionWhereInput!] + NOT: [ProportionWhereInput!] +} + +input ProportionWhereUniqueInput { + id: ID + airtableId: String + name: String +} + +type Query { + category(where: CategoryWhereUniqueInput!): Category + categories(where: CategoryWhereInput, orderBy: CategoryOrderByInput, skip: Int, after: String, before: String, first: Int, last: Int): [Category]! + categoriesConnection(where: CategoryWhereInput, orderBy: CategoryOrderByInput, skip: Int, after: String, before: String, first: Int, last: Int): CategoryConnection! + child(where: ChildWhereUniqueInput!): Child + children(where: ChildWhereInput, orderBy: ChildOrderByInput, skip: Int, after: String, before: String, first: Int, last: Int): [Child]! + childrenConnection(where: ChildWhereInput, orderBy: ChildOrderByInput, skip: Int, after: String, before: String, first: Int, last: Int): ChildConnection! + meal(where: MealWhereUniqueInput!): Meal + meals(where: MealWhereInput, orderBy: MealOrderByInput, skip: Int, after: String, before: String, first: Int, last: Int): [Meal]! + mealsConnection(where: MealWhereInput, orderBy: MealOrderByInput, skip: Int, after: String, before: String, first: Int, last: Int): MealConnection! + project(where: ProjectWhereUniqueInput!): Project + projects(where: ProjectWhereInput, orderBy: ProjectOrderByInput, skip: Int, after: String, before: String, first: Int, last: Int): [Project]! + projectsConnection(where: ProjectWhereInput, orderBy: ProjectOrderByInput, skip: Int, after: String, before: String, first: Int, last: Int): ProjectConnection! + proportion(where: ProportionWhereUniqueInput!): Proportion + proportions(where: ProportionWhereInput, orderBy: ProportionOrderByInput, skip: Int, after: String, before: String, first: Int, last: Int): [Proportion]! + proportionsConnection(where: ProportionWhereInput, orderBy: ProportionOrderByInput, skip: Int, after: String, before: String, first: Int, last: Int): ProportionConnection! + tag(where: TagWhereUniqueInput!): Tag + tags(where: TagWhereInput, orderBy: TagOrderByInput, skip: Int, after: String, before: String, first: Int, last: Int): [Tag]! + tagsConnection(where: TagWhereInput, orderBy: TagOrderByInput, skip: Int, after: String, before: String, first: Int, last: Int): TagConnection! + user(where: UserWhereUniqueInput!): User + users(where: UserWhereInput, orderBy: UserOrderByInput, skip: Int, after: String, before: String, first: Int, last: Int): [User]! + usersConnection(where: UserWhereInput, orderBy: UserOrderByInput, skip: Int, after: String, before: String, first: Int, last: Int): UserConnection! + node(id: ID!): Node +} + +type Subscription { + category(where: CategorySubscriptionWhereInput): CategorySubscriptionPayload + child(where: ChildSubscriptionWhereInput): ChildSubscriptionPayload + meal(where: MealSubscriptionWhereInput): MealSubscriptionPayload + project(where: ProjectSubscriptionWhereInput): ProjectSubscriptionPayload + proportion(where: ProportionSubscriptionWhereInput): ProportionSubscriptionPayload + tag(where: TagSubscriptionWhereInput): TagSubscriptionPayload + user(where: UserSubscriptionWhereInput): UserSubscriptionPayload +} + +type Tag { + id: ID! + airtableId: String + name: String! + meals(where: MealWhereInput, orderBy: MealOrderByInput, skip: Int, after: String, before: String, first: Int, last: Int): [Meal!] + updatedAt: DateTime! + createdAt: DateTime! +} + +type TagConnection { + pageInfo: PageInfo! + edges: [TagEdge]! + aggregate: AggregateTag! +} + +input TagCreateInput { + id: ID + airtableId: String + name: String! + meals: MealCreateManyWithoutTagsInput +} + +input TagCreateManyWithoutMealsInput { + create: [TagCreateWithoutMealsInput!] + connect: [TagWhereUniqueInput!] +} + +input TagCreateWithoutMealsInput { + id: ID + airtableId: String + name: String! +} + +type TagEdge { + node: Tag! + cursor: String! +} + +enum TagOrderByInput { + id_ASC + id_DESC + airtableId_ASC + airtableId_DESC + name_ASC + name_DESC + updatedAt_ASC + updatedAt_DESC + createdAt_ASC + createdAt_DESC +} + +type TagPreviousValues { + id: ID! + airtableId: String + name: String! + updatedAt: DateTime! + createdAt: DateTime! +} + +input TagScalarWhereInput { + id: ID + id_not: ID + id_in: [ID!] + id_not_in: [ID!] + id_lt: ID + id_lte: ID + id_gt: ID + id_gte: ID + id_contains: ID + id_not_contains: ID + id_starts_with: ID + id_not_starts_with: ID + id_ends_with: ID + id_not_ends_with: ID + airtableId: String + airtableId_not: String + airtableId_in: [String!] + airtableId_not_in: [String!] + airtableId_lt: String + airtableId_lte: String + airtableId_gt: String + airtableId_gte: String + airtableId_contains: String + airtableId_not_contains: String + airtableId_starts_with: String + airtableId_not_starts_with: String + airtableId_ends_with: String + airtableId_not_ends_with: String + name: String + name_not: String + name_in: [String!] + name_not_in: [String!] + name_lt: String + name_lte: String + name_gt: String + name_gte: String + name_contains: String + name_not_contains: String + name_starts_with: String + name_not_starts_with: String + name_ends_with: String + name_not_ends_with: String + updatedAt: DateTime + updatedAt_not: DateTime + updatedAt_in: [DateTime!] + updatedAt_not_in: [DateTime!] + updatedAt_lt: DateTime + updatedAt_lte: DateTime + updatedAt_gt: DateTime + updatedAt_gte: DateTime + createdAt: DateTime + createdAt_not: DateTime + createdAt_in: [DateTime!] + createdAt_not_in: [DateTime!] + createdAt_lt: DateTime + createdAt_lte: DateTime + createdAt_gt: DateTime + createdAt_gte: DateTime + AND: [TagScalarWhereInput!] + OR: [TagScalarWhereInput!] + NOT: [TagScalarWhereInput!] +} + +type TagSubscriptionPayload { + mutation: MutationType! + node: Tag + updatedFields: [String!] + previousValues: TagPreviousValues +} + +input TagSubscriptionWhereInput { + mutation_in: [MutationType!] + updatedFields_contains: String + updatedFields_contains_every: [String!] + updatedFields_contains_some: [String!] + node: TagWhereInput + AND: [TagSubscriptionWhereInput!] + OR: [TagSubscriptionWhereInput!] + NOT: [TagSubscriptionWhereInput!] +} + +input TagUpdateInput { + airtableId: String + name: String + meals: MealUpdateManyWithoutTagsInput +} + +input TagUpdateManyDataInput { + airtableId: String + name: String +} + +input TagUpdateManyMutationInput { + airtableId: String + name: String +} + +input TagUpdateManyWithoutMealsInput { + create: [TagCreateWithoutMealsInput!] + delete: [TagWhereUniqueInput!] + connect: [TagWhereUniqueInput!] + set: [TagWhereUniqueInput!] + disconnect: [TagWhereUniqueInput!] + update: [TagUpdateWithWhereUniqueWithoutMealsInput!] + upsert: [TagUpsertWithWhereUniqueWithoutMealsInput!] + deleteMany: [TagScalarWhereInput!] + updateMany: [TagUpdateManyWithWhereNestedInput!] +} + +input TagUpdateManyWithWhereNestedInput { + where: TagScalarWhereInput! + data: TagUpdateManyDataInput! +} + +input TagUpdateWithoutMealsDataInput { + airtableId: String + name: String +} + +input TagUpdateWithWhereUniqueWithoutMealsInput { + where: TagWhereUniqueInput! + data: TagUpdateWithoutMealsDataInput! +} + +input TagUpsertWithWhereUniqueWithoutMealsInput { + where: TagWhereUniqueInput! + update: TagUpdateWithoutMealsDataInput! + create: TagCreateWithoutMealsInput! +} + +input TagWhereInput { + id: ID + id_not: ID + id_in: [ID!] + id_not_in: [ID!] + id_lt: ID + id_lte: ID + id_gt: ID + id_gte: ID + id_contains: ID + id_not_contains: ID + id_starts_with: ID + id_not_starts_with: ID + id_ends_with: ID + id_not_ends_with: ID + airtableId: String + airtableId_not: String + airtableId_in: [String!] + airtableId_not_in: [String!] + airtableId_lt: String + airtableId_lte: String + airtableId_gt: String + airtableId_gte: String + airtableId_contains: String + airtableId_not_contains: String + airtableId_starts_with: String + airtableId_not_starts_with: String + airtableId_ends_with: String + airtableId_not_ends_with: String + name: String + name_not: String + name_in: [String!] + name_not_in: [String!] + name_lt: String + name_lte: String + name_gt: String + name_gte: String + name_contains: String + name_not_contains: String + name_starts_with: String + name_not_starts_with: String + name_ends_with: String + name_not_ends_with: String + meals_every: MealWhereInput + meals_some: MealWhereInput + meals_none: MealWhereInput + updatedAt: DateTime + updatedAt_not: DateTime + updatedAt_in: [DateTime!] + updatedAt_not_in: [DateTime!] + updatedAt_lt: DateTime + updatedAt_lte: DateTime + updatedAt_gt: DateTime + updatedAt_gte: DateTime + createdAt: DateTime + createdAt_not: DateTime + createdAt_in: [DateTime!] + createdAt_not_in: [DateTime!] + createdAt_lt: DateTime + createdAt_lte: DateTime + createdAt_gt: DateTime + createdAt_gte: DateTime + AND: [TagWhereInput!] + OR: [TagWhereInput!] + NOT: [TagWhereInput!] +} + +input TagWhereUniqueInput { + id: ID + airtableId: String + name: String +} + +type User { + id: ID! + airtableId: String + consentGDPR: Boolean! + postCode: String! + email: String! + meals(where: MealWhereInput, orderBy: MealOrderByInput, skip: Int, after: String, before: String, first: Int, last: Int): [Meal!] + projects(where: ProjectWhereInput, orderBy: ProjectOrderByInput, skip: Int, after: String, before: String, first: Int, last: Int): [Project!] + children(where: ChildWhereInput, orderBy: ChildOrderByInput, skip: Int, after: String, before: String, first: Int, last: Int): [Child!] + phoneNumber: String! + updatedAt: DateTime! + createdAt: DateTime! +} + +type UserConnection { + pageInfo: PageInfo! + edges: [UserEdge]! + aggregate: AggregateUser! +} + +input UserCreateInput { + id: ID + airtableId: String + consentGDPR: Boolean! + postCode: String! + email: String! + meals: MealCreateManyWithoutUserInput + projects: ProjectCreateManyWithoutUsersInput + children: ChildCreateManyWithoutParentInput + phoneNumber: String! +} + +input UserCreateManyWithoutProjectsInput { + create: [UserCreateWithoutProjectsInput!] + connect: [UserWhereUniqueInput!] +} + +input UserCreateOneWithoutChildrenInput { + create: UserCreateWithoutChildrenInput + connect: UserWhereUniqueInput +} + +input UserCreateOneWithoutMealsInput { + create: UserCreateWithoutMealsInput + connect: UserWhereUniqueInput +} + +input UserCreateWithoutChildrenInput { + id: ID + airtableId: String + consentGDPR: Boolean! + postCode: String! + email: String! + meals: MealCreateManyWithoutUserInput + projects: ProjectCreateManyWithoutUsersInput + phoneNumber: String! +} + +input UserCreateWithoutMealsInput { + id: ID + airtableId: String + consentGDPR: Boolean! + postCode: String! + email: String! + projects: ProjectCreateManyWithoutUsersInput + children: ChildCreateManyWithoutParentInput + phoneNumber: String! +} + +input UserCreateWithoutProjectsInput { + id: ID + airtableId: String + consentGDPR: Boolean! + postCode: String! + email: String! + meals: MealCreateManyWithoutUserInput + children: ChildCreateManyWithoutParentInput + phoneNumber: String! +} + +type UserEdge { + node: User! + cursor: String! +} + +enum UserOrderByInput { + id_ASC + id_DESC + airtableId_ASC + airtableId_DESC + consentGDPR_ASC + consentGDPR_DESC + postCode_ASC + postCode_DESC + email_ASC + email_DESC + phoneNumber_ASC + phoneNumber_DESC + updatedAt_ASC + updatedAt_DESC + createdAt_ASC + createdAt_DESC +} + +type UserPreviousValues { + id: ID! + airtableId: String + consentGDPR: Boolean! + postCode: String! + email: String! + phoneNumber: String! + updatedAt: DateTime! + createdAt: DateTime! +} + +input UserScalarWhereInput { + id: ID + id_not: ID + id_in: [ID!] + id_not_in: [ID!] + id_lt: ID + id_lte: ID + id_gt: ID + id_gte: ID + id_contains: ID + id_not_contains: ID + id_starts_with: ID + id_not_starts_with: ID + id_ends_with: ID + id_not_ends_with: ID + airtableId: String + airtableId_not: String + airtableId_in: [String!] + airtableId_not_in: [String!] + airtableId_lt: String + airtableId_lte: String + airtableId_gt: String + airtableId_gte: String + airtableId_contains: String + airtableId_not_contains: String + airtableId_starts_with: String + airtableId_not_starts_with: String + airtableId_ends_with: String + airtableId_not_ends_with: String + consentGDPR: Boolean + consentGDPR_not: Boolean + postCode: String + postCode_not: String + postCode_in: [String!] + postCode_not_in: [String!] + postCode_lt: String + postCode_lte: String + postCode_gt: String + postCode_gte: String + postCode_contains: String + postCode_not_contains: String + postCode_starts_with: String + postCode_not_starts_with: String + postCode_ends_with: String + postCode_not_ends_with: String + email: String + email_not: String + email_in: [String!] + email_not_in: [String!] + email_lt: String + email_lte: String + email_gt: String + email_gte: String + email_contains: String + email_not_contains: String + email_starts_with: String + email_not_starts_with: String + email_ends_with: String + email_not_ends_with: String + phoneNumber: String + phoneNumber_not: String + phoneNumber_in: [String!] + phoneNumber_not_in: [String!] + phoneNumber_lt: String + phoneNumber_lte: String + phoneNumber_gt: String + phoneNumber_gte: String + phoneNumber_contains: String + phoneNumber_not_contains: String + phoneNumber_starts_with: String + phoneNumber_not_starts_with: String + phoneNumber_ends_with: String + phoneNumber_not_ends_with: String + updatedAt: DateTime + updatedAt_not: DateTime + updatedAt_in: [DateTime!] + updatedAt_not_in: [DateTime!] + updatedAt_lt: DateTime + updatedAt_lte: DateTime + updatedAt_gt: DateTime + updatedAt_gte: DateTime + createdAt: DateTime + createdAt_not: DateTime + createdAt_in: [DateTime!] + createdAt_not_in: [DateTime!] + createdAt_lt: DateTime + createdAt_lte: DateTime + createdAt_gt: DateTime + createdAt_gte: DateTime + AND: [UserScalarWhereInput!] + OR: [UserScalarWhereInput!] + NOT: [UserScalarWhereInput!] +} + +type UserSubscriptionPayload { + mutation: MutationType! + node: User + updatedFields: [String!] + previousValues: UserPreviousValues +} + +input UserSubscriptionWhereInput { + mutation_in: [MutationType!] + updatedFields_contains: String + updatedFields_contains_every: [String!] + updatedFields_contains_some: [String!] + node: UserWhereInput + AND: [UserSubscriptionWhereInput!] + OR: [UserSubscriptionWhereInput!] + NOT: [UserSubscriptionWhereInput!] +} + +input UserUpdateInput { + airtableId: String + consentGDPR: Boolean + postCode: String + email: String + meals: MealUpdateManyWithoutUserInput + projects: ProjectUpdateManyWithoutUsersInput + children: ChildUpdateManyWithoutParentInput + phoneNumber: String +} + +input UserUpdateManyDataInput { + airtableId: String + consentGDPR: Boolean + postCode: String + email: String + phoneNumber: String +} + +input UserUpdateManyMutationInput { + airtableId: String + consentGDPR: Boolean + postCode: String + email: String + phoneNumber: String +} + +input UserUpdateManyWithoutProjectsInput { + create: [UserCreateWithoutProjectsInput!] + delete: [UserWhereUniqueInput!] + connect: [UserWhereUniqueInput!] + set: [UserWhereUniqueInput!] + disconnect: [UserWhereUniqueInput!] + update: [UserUpdateWithWhereUniqueWithoutProjectsInput!] + upsert: [UserUpsertWithWhereUniqueWithoutProjectsInput!] + deleteMany: [UserScalarWhereInput!] + updateMany: [UserUpdateManyWithWhereNestedInput!] +} + +input UserUpdateManyWithWhereNestedInput { + where: UserScalarWhereInput! + data: UserUpdateManyDataInput! +} + +input UserUpdateOneRequiredWithoutChildrenInput { + create: UserCreateWithoutChildrenInput + update: UserUpdateWithoutChildrenDataInput + upsert: UserUpsertWithoutChildrenInput + connect: UserWhereUniqueInput +} + +input UserUpdateOneRequiredWithoutMealsInput { + create: UserCreateWithoutMealsInput + update: UserUpdateWithoutMealsDataInput + upsert: UserUpsertWithoutMealsInput + connect: UserWhereUniqueInput +} + +input UserUpdateWithoutChildrenDataInput { + airtableId: String + consentGDPR: Boolean + postCode: String + email: String + meals: MealUpdateManyWithoutUserInput + projects: ProjectUpdateManyWithoutUsersInput + phoneNumber: String +} + +input UserUpdateWithoutMealsDataInput { + airtableId: String + consentGDPR: Boolean + postCode: String + email: String + projects: ProjectUpdateManyWithoutUsersInput + children: ChildUpdateManyWithoutParentInput + phoneNumber: String +} + +input UserUpdateWithoutProjectsDataInput { + airtableId: String + consentGDPR: Boolean + postCode: String + email: String + meals: MealUpdateManyWithoutUserInput + children: ChildUpdateManyWithoutParentInput + phoneNumber: String +} + +input UserUpdateWithWhereUniqueWithoutProjectsInput { + where: UserWhereUniqueInput! + data: UserUpdateWithoutProjectsDataInput! +} + +input UserUpsertWithoutChildrenInput { + update: UserUpdateWithoutChildrenDataInput! + create: UserCreateWithoutChildrenInput! +} + +input UserUpsertWithoutMealsInput { + update: UserUpdateWithoutMealsDataInput! + create: UserCreateWithoutMealsInput! +} + +input UserUpsertWithWhereUniqueWithoutProjectsInput { + where: UserWhereUniqueInput! + update: UserUpdateWithoutProjectsDataInput! + create: UserCreateWithoutProjectsInput! +} + +input UserWhereInput { + id: ID + id_not: ID + id_in: [ID!] + id_not_in: [ID!] + id_lt: ID + id_lte: ID + id_gt: ID + id_gte: ID + id_contains: ID + id_not_contains: ID + id_starts_with: ID + id_not_starts_with: ID + id_ends_with: ID + id_not_ends_with: ID + airtableId: String + airtableId_not: String + airtableId_in: [String!] + airtableId_not_in: [String!] + airtableId_lt: String + airtableId_lte: String + airtableId_gt: String + airtableId_gte: String + airtableId_contains: String + airtableId_not_contains: String + airtableId_starts_with: String + airtableId_not_starts_with: String + airtableId_ends_with: String + airtableId_not_ends_with: String + consentGDPR: Boolean + consentGDPR_not: Boolean + postCode: String + postCode_not: String + postCode_in: [String!] + postCode_not_in: [String!] + postCode_lt: String + postCode_lte: String + postCode_gt: String + postCode_gte: String + postCode_contains: String + postCode_not_contains: String + postCode_starts_with: String + postCode_not_starts_with: String + postCode_ends_with: String + postCode_not_ends_with: String + email: String + email_not: String + email_in: [String!] + email_not_in: [String!] + email_lt: String + email_lte: String + email_gt: String + email_gte: String + email_contains: String + email_not_contains: String + email_starts_with: String + email_not_starts_with: String + email_ends_with: String + email_not_ends_with: String + meals_every: MealWhereInput + meals_some: MealWhereInput + meals_none: MealWhereInput + projects_every: ProjectWhereInput + projects_some: ProjectWhereInput + projects_none: ProjectWhereInput + children_every: ChildWhereInput + children_some: ChildWhereInput + children_none: ChildWhereInput + phoneNumber: String + phoneNumber_not: String + phoneNumber_in: [String!] + phoneNumber_not_in: [String!] + phoneNumber_lt: String + phoneNumber_lte: String + phoneNumber_gt: String + phoneNumber_gte: String + phoneNumber_contains: String + phoneNumber_not_contains: String + phoneNumber_starts_with: String + phoneNumber_not_starts_with: String + phoneNumber_ends_with: String + phoneNumber_not_ends_with: String + updatedAt: DateTime + updatedAt_not: DateTime + updatedAt_in: [DateTime!] + updatedAt_not_in: [DateTime!] + updatedAt_lt: DateTime + updatedAt_lte: DateTime + updatedAt_gt: DateTime + updatedAt_gte: DateTime + createdAt: DateTime + createdAt_not: DateTime + createdAt_in: [DateTime!] + createdAt_not_in: [DateTime!] + createdAt_lt: DateTime + createdAt_lte: DateTime + createdAt_gt: DateTime + createdAt_gte: DateTime + AND: [UserWhereInput!] + OR: [UserWhereInput!] + NOT: [UserWhereInput!] +} + +input UserWhereUniqueInput { + id: ID + airtableId: String + email: String + phoneNumber: String +} +` \ No newline at end of file diff --git a/prisma/prisma.yml b/prisma/prisma.yml new file mode 100644 index 0000000..fad5521 --- /dev/null +++ b/prisma/prisma.yml @@ -0,0 +1,8 @@ +endpoint: ${env:PRISMA_ENDPOINT} +datamodel: datamodel.prisma +secret: ${env:PRISMA_SECRET} +generate: + - generator: typescript-client + output: ./generated/ts + - generator: javascript-client + output: ./generated/js diff --git a/prisma/seeds.ts b/prisma/seeds.ts new file mode 100644 index 0000000..9c01679 --- /dev/null +++ b/prisma/seeds.ts @@ -0,0 +1,128 @@ +// To seed the database +// 1. Install ts-node - `yarn global add typescript ts-node` +// 2. Go to your terminal make sure you are in `snapeat/prisma/` directory +// 3. run `env-cmd -f ../.config/dev.env ts-node seeds.ts` + +import { prisma } from './generated/ts' +import flushDB from './flushDB' +import * as R from 'ramda' +import { CATEGORY_ARRAY, TAG_ARRAY, PROPORTION_ARRAY } from '../utils/constants' + +const seedDatabase = async () => { + try { + await flushDB() + + // create categories + const categories = await Promise.all( + R.map((category: string) => + prisma.createCategory({ + name: category, + }), + )(CATEGORY_ARRAY), + ) + + // create tags + const tags = await Promise.all( + R.map((tag: string) => + prisma.createTag({ + name: tag, + }), + )(TAG_ARRAY), + ) + + // create proportions + const proportions = await Promise.all( + R.map((proportion: string) => + prisma.createProportion({ + name: proportion, + }), + )(PROPORTION_ARRAY), + ) + + // create project + const alexandraRose = await prisma.createProject({ + name: 'Alexandra Rose', + slug: 'alexandra-rose', + }) + + const foodForLifeProject = await prisma.createProject({ + name: 'Food for Life Lambeth and Southwark', + slug: 'food-for-life', + }) + + const healthyHighStreetsProject = await prisma.createProject({ + name: 'Healthy High Streets', + slug: 'healthy-high-streets', + }) + + const collaborationForHealthyLivesProject = await prisma.createProject({ + name: 'Collaboration for Healthy Lives', + slug: 'healthy-lives', + }) + + // create user + const lucy = await prisma.createUser({ + consentGDPR: true, + postCode: 'E50DW', + email: 'lucy@infactcoop.com', + phoneNumber: '+447443998236', + projects: { + connect: { + id: alexandraRose.id, + }, + }, + }) + + // create meal + const meal = await prisma.createMeal({ + imageURL: + 'http://res.cloudinary.com/infact-digital-co-operative/image/upload/v1574773242/taew6klwnhdryupxiubc.jpg', + user: { + connect: { + id: lucy.id, + }, + }, + proportionFruit: { + connect: { + id: proportions[0].id, + }, + }, + proportionVeg: { + connect: { + id: proportions[1].id, + }, + }, + categories: { + connect: [ + { + id: categories[1].id, + }, + { + id: categories[0].id, + }, + ], + }, + tags: { + connect: [ + { + id: tags[4].id, + }, + { + id: tags[2].id, + }, + ], + }, + }) + + console.log('categories', categories) + console.log('tags', tags) + console.log('proportions', proportions) + console.log('project', alexandraRose) + console.log('lucy', lucy) + console.log('meal', meal) + } catch (e) { + console.log(JSON.stringify(e, undefined, 2)) //eslint-disable-line no-console + } +} + +seedDatabase() diff --git a/prisma/seeds.ts.rej b/prisma/seeds.ts.rej new file mode 100644 index 0000000..15a944c --- /dev/null +++ b/prisma/seeds.ts.rej @@ -0,0 +1,9 @@ +diff a/prisma/seeds.ts b/prisma/seeds.ts (rejected hunks) +@@ -8,5 +8,2 @@ import flushDB from './flushDB' +-import * as R from "ramda" +-import { CATEGORY_ARRAY, TAG_ARRAY, PROPORTION_ARRAY } from "../utils/constants" +- +- +- ++import * as R from 'ramda' ++import { CATEGORY_ARRAY, TAG_ARRAY, PROPORTION_ARRAY } from '../utils/constants' diff --git a/prisma/staging-seeds.ts b/prisma/staging-seeds.ts new file mode 100644 index 0000000..9657ae0 --- /dev/null +++ b/prisma/staging-seeds.ts @@ -0,0 +1,56 @@ +// To seed the database +// 1. Install ts-node - `yarn global add typescript ts-node` +// 2. Go to your terminal make sure you are in `snapeat/prisma/` directory +// 3. run `env-cmd -f ../.config/dev.env ts-node seeds.ts` + +import { prisma } from './generated/ts' +import flushDB from './flushDB' +import * as R from 'ramda' +import { CATEGORY_ARRAY, TAG_ARRAY, PROPORTION_ARRAY } from '../utils/constants' + +const seedDatabase = async () => { + try { + await flushDB() + + // create categories + const categories = await Promise.all( + R.map((category: string) => + prisma.createCategory({ + name: category, + }), + )(CATEGORY_ARRAY), + ) + + // create tags + const tags = await Promise.all( + R.map((tag: string) => + prisma.createTag({ + name: tag, + }), + )(TAG_ARRAY), + ) + + // create proportions + const proportions = await Promise.all( + R.map((proportion: string) => + prisma.createProportion({ + name: proportion, + }), + )(PROPORTION_ARRAY), + ) + + // create project + const snapeatTest = await prisma.createProject({ + name: 'SnapEat Trial', + slug: 'snapeat-trial', + }) + + console.log('categories', categories) + console.log('tags', tags) + console.log('proportions', proportions) + } catch (e) { + console.log(JSON.stringify(e, undefined, 2)) //eslint-disable-line no-console + } +} + +seedDatabase() diff --git a/prisma/tsconfig.json b/prisma/tsconfig.json new file mode 100644 index 0000000..3dfe10a --- /dev/null +++ b/prisma/tsconfig.json @@ -0,0 +1,10 @@ +{ + "exclude": ["./generated/js/"], + "compilerOptions": { + "module": "commonjs", + "lib": ["ES2015"], + "esModuleInterop": true, + "allowJs": true, + "noEmit": true + } +} diff --git a/public/android-icon-192x192.png b/public/android-icon-192x192.png new file mode 100644 index 0000000..7ec9d77 Binary files /dev/null and b/public/android-icon-192x192.png differ diff --git a/public/android-icon-512x512.png b/public/android-icon-512x512.png new file mode 100644 index 0000000..3e78b2b Binary files /dev/null and b/public/android-icon-512x512.png differ diff --git a/public/backgrounds/camera_bg.svg b/public/backgrounds/camera_bg.svg new file mode 100644 index 0000000..918c864 --- /dev/null +++ b/public/backgrounds/camera_bg.svg @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/backgrounds/categories_card.svg b/public/backgrounds/categories_card.svg new file mode 100644 index 0000000..d44d8fb --- /dev/null +++ b/public/backgrounds/categories_card.svg @@ -0,0 +1,31 @@ + + + + categories_card + Created with Sketch. + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/backgrounds/landing_bg.svg b/public/backgrounds/landing_bg.svg new file mode 100644 index 0000000..2d5c99d --- /dev/null +++ b/public/backgrounds/landing_bg.svg @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/public/backgrounds/menu_bg.svg b/public/backgrounds/menu_bg.svg new file mode 100644 index 0000000..85f341c --- /dev/null +++ b/public/backgrounds/menu_bg.svg @@ -0,0 +1,11 @@ + + + + menu_bg + Created with Sketch. + + + + + + \ No newline at end of file diff --git a/public/backgrounds/onboarding_card.svg b/public/backgrounds/onboarding_card.svg new file mode 100644 index 0000000..c1e0e72 --- /dev/null +++ b/public/backgrounds/onboarding_card.svg @@ -0,0 +1,31 @@ + + + + onboarding_card + Created with Sketch. + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/backgrounds/overlay_card.svg b/public/backgrounds/overlay_card.svg new file mode 100644 index 0000000..dfbe5b5 --- /dev/null +++ b/public/backgrounds/overlay_card.svg @@ -0,0 +1,31 @@ + + + + overlay_card + Created with Sketch. + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/backgrounds/success_bg.svg b/public/backgrounds/success_bg.svg new file mode 100644 index 0000000..3137e99 --- /dev/null +++ b/public/backgrounds/success_bg.svg @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/backgrounds/t&c_card.svg b/public/backgrounds/t&c_card.svg new file mode 100644 index 0000000..c48dda3 --- /dev/null +++ b/public/backgrounds/t&c_card.svg @@ -0,0 +1,31 @@ + + + + t&c_card + Created with Sketch. + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/backgrounds/termsConditionsBackground.svg b/public/backgrounds/termsConditionsBackground.svg new file mode 100644 index 0000000..f138b9b --- /dev/null +++ b/public/backgrounds/termsConditionsBackground.svg @@ -0,0 +1,13 @@ + + + + Rectangle + Created with Sketch. + + + + + + + + \ No newline at end of file diff --git a/public/backgrounds/welcome_card.svg b/public/backgrounds/welcome_card.svg new file mode 100644 index 0000000..2e148e2 --- /dev/null +++ b/public/backgrounds/welcome_card.svg @@ -0,0 +1,31 @@ + + + + welcome_card + Created with Sketch. + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/fonts/muli/Muli-Light.ttf b/public/fonts/muli/Muli-Light.ttf new file mode 100644 index 0000000..da9a93a Binary files /dev/null and b/public/fonts/muli/Muli-Light.ttf differ diff --git a/public/fonts/muli/muli-v16-latin-700.eot b/public/fonts/muli/muli-v16-latin-700.eot new file mode 100644 index 0000000..d498493 Binary files /dev/null and b/public/fonts/muli/muli-v16-latin-700.eot differ diff --git a/public/fonts/muli/muli-v16-latin-700.svg b/public/fonts/muli/muli-v16-latin-700.svg new file mode 100644 index 0000000..32bac76 --- /dev/null +++ b/public/fonts/muli/muli-v16-latin-700.svg @@ -0,0 +1,308 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/fonts/muli/muli-v16-latin-700.ttf b/public/fonts/muli/muli-v16-latin-700.ttf new file mode 100644 index 0000000..b3ec4d9 Binary files /dev/null and b/public/fonts/muli/muli-v16-latin-700.ttf differ diff --git a/public/fonts/muli/muli-v16-latin-700.woff b/public/fonts/muli/muli-v16-latin-700.woff new file mode 100644 index 0000000..46bf34a Binary files /dev/null and b/public/fonts/muli/muli-v16-latin-700.woff differ diff --git a/public/fonts/muli/muli-v16-latin-700.woff2 b/public/fonts/muli/muli-v16-latin-700.woff2 new file mode 100644 index 0000000..feba72d Binary files /dev/null and b/public/fonts/muli/muli-v16-latin-700.woff2 differ diff --git a/public/fonts/muli/muli-v16-latin-700italic.eot b/public/fonts/muli/muli-v16-latin-700italic.eot new file mode 100644 index 0000000..f336051 Binary files /dev/null and b/public/fonts/muli/muli-v16-latin-700italic.eot differ diff --git a/public/fonts/muli/muli-v16-latin-700italic.svg b/public/fonts/muli/muli-v16-latin-700italic.svg new file mode 100644 index 0000000..9cfab5c --- /dev/null +++ b/public/fonts/muli/muli-v16-latin-700italic.svg @@ -0,0 +1,322 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/fonts/muli/muli-v16-latin-700italic.ttf b/public/fonts/muli/muli-v16-latin-700italic.ttf new file mode 100644 index 0000000..e310fe2 Binary files /dev/null and b/public/fonts/muli/muli-v16-latin-700italic.ttf differ diff --git a/public/fonts/muli/muli-v16-latin-700italic.woff b/public/fonts/muli/muli-v16-latin-700italic.woff new file mode 100644 index 0000000..3869310 Binary files /dev/null and b/public/fonts/muli/muli-v16-latin-700italic.woff differ diff --git a/public/fonts/muli/muli-v16-latin-700italic.woff2 b/public/fonts/muli/muli-v16-latin-700italic.woff2 new file mode 100644 index 0000000..4b6ae8d Binary files /dev/null and b/public/fonts/muli/muli-v16-latin-700italic.woff2 differ diff --git a/public/fonts/muli/muli-v16-latin-italic.eot b/public/fonts/muli/muli-v16-latin-italic.eot new file mode 100644 index 0000000..45e65ce Binary files /dev/null and b/public/fonts/muli/muli-v16-latin-italic.eot differ diff --git a/public/fonts/muli/muli-v16-latin-italic.svg b/public/fonts/muli/muli-v16-latin-italic.svg new file mode 100644 index 0000000..c2fb42f --- /dev/null +++ b/public/fonts/muli/muli-v16-latin-italic.svg @@ -0,0 +1,323 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/fonts/muli/muli-v16-latin-italic.ttf b/public/fonts/muli/muli-v16-latin-italic.ttf new file mode 100644 index 0000000..88e596f Binary files /dev/null and b/public/fonts/muli/muli-v16-latin-italic.ttf differ diff --git a/public/fonts/muli/muli-v16-latin-italic.woff b/public/fonts/muli/muli-v16-latin-italic.woff new file mode 100644 index 0000000..7671e91 Binary files /dev/null and b/public/fonts/muli/muli-v16-latin-italic.woff differ diff --git a/public/fonts/muli/muli-v16-latin-italic.woff2 b/public/fonts/muli/muli-v16-latin-italic.woff2 new file mode 100644 index 0000000..5cce10f Binary files /dev/null and b/public/fonts/muli/muli-v16-latin-italic.woff2 differ diff --git a/public/fonts/muli/muli-v16-latin-regular.eot b/public/fonts/muli/muli-v16-latin-regular.eot new file mode 100644 index 0000000..fe3eb74 Binary files /dev/null and b/public/fonts/muli/muli-v16-latin-regular.eot differ diff --git a/public/fonts/muli/muli-v16-latin-regular.svg b/public/fonts/muli/muli-v16-latin-regular.svg new file mode 100644 index 0000000..384c0cc --- /dev/null +++ b/public/fonts/muli/muli-v16-latin-regular.svg @@ -0,0 +1,310 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/fonts/muli/muli-v16-latin-regular.ttf b/public/fonts/muli/muli-v16-latin-regular.ttf new file mode 100644 index 0000000..0753bef Binary files /dev/null and b/public/fonts/muli/muli-v16-latin-regular.ttf differ diff --git a/public/fonts/muli/muli-v16-latin-regular.woff b/public/fonts/muli/muli-v16-latin-regular.woff new file mode 100644 index 0000000..798ef0c Binary files /dev/null and b/public/fonts/muli/muli-v16-latin-regular.woff differ diff --git a/public/fonts/muli/muli-v16-latin-regular.woff2 b/public/fonts/muli/muli-v16-latin-regular.woff2 new file mode 100644 index 0000000..f81ba6b Binary files /dev/null and b/public/fonts/muli/muli-v16-latin-regular.woff2 differ diff --git a/public/icons/404-robot.svg b/public/icons/404-robot.svg new file mode 100644 index 0000000..4be883e --- /dev/null +++ b/public/icons/404-robot.svg @@ -0,0 +1,22 @@ + + + + 404-error-message-server-not-found + Created with Sketch. + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/icons/arrow_next.svg b/public/icons/arrow_next.svg new file mode 100644 index 0000000..92f05b4 --- /dev/null +++ b/public/icons/arrow_next.svg @@ -0,0 +1,18 @@ + + + + arrow-e + Created with Sketch. + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/icons/arrow_right.svg b/public/icons/arrow_right.svg new file mode 100644 index 0000000..4b8b7a3 --- /dev/null +++ b/public/icons/arrow_right.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/icons/back_blue.svg b/public/icons/back_blue.svg new file mode 100644 index 0000000..ce2e52a --- /dev/null +++ b/public/icons/back_blue.svg @@ -0,0 +1,13 @@ + + + + back_blue + Created with Sketch. + + + + + + + + \ No newline at end of file diff --git a/public/icons/back_white.svg b/public/icons/back_white.svg new file mode 100644 index 0000000..e3b1edd --- /dev/null +++ b/public/icons/back_white.svg @@ -0,0 +1,15 @@ + + + + back_white + Created with Sketch. + + + + + + + + + + \ No newline at end of file diff --git a/public/icons/btn_round-next.svg b/public/icons/btn_round-next.svg new file mode 100644 index 0000000..b72c8ca --- /dev/null +++ b/public/icons/btn_round-next.svg @@ -0,0 +1,29 @@ + + + + btn_round-next + Created with Sketch. + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/icons/btn_round-ok.svg b/public/icons/btn_round-ok.svg new file mode 100644 index 0000000..47055ae --- /dev/null +++ b/public/icons/btn_round-ok.svg @@ -0,0 +1,29 @@ + + + + btn_round-ok + Created with Sketch. + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/icons/btn_round.svg b/public/icons/btn_round.svg new file mode 100644 index 0000000..eb8ea5f --- /dev/null +++ b/public/icons/btn_round.svg @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/icons/bug_icon.svg b/public/icons/bug_icon.svg new file mode 100644 index 0000000..276310d --- /dev/null +++ b/public/icons/bug_icon.svg @@ -0,0 +1,14 @@ + + + + + + + + + ? + + + + + \ No newline at end of file diff --git a/public/icons/camera_icn.svg b/public/icons/camera_icn.svg new file mode 100644 index 0000000..42ce08f --- /dev/null +++ b/public/icons/camera_icn.svg @@ -0,0 +1,24 @@ + + + + camera_icn + Created with Sketch. + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/icons/categories/regular/bread.svg b/public/icons/categories/regular/bread.svg new file mode 100644 index 0000000..ce8f93c --- /dev/null +++ b/public/icons/categories/regular/bread.svg @@ -0,0 +1,14 @@ + + + + bread + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/public/icons/categories/regular/butter.svg b/public/icons/categories/regular/butter.svg new file mode 100644 index 0000000..aad5836 --- /dev/null +++ b/public/icons/categories/regular/butter.svg @@ -0,0 +1,14 @@ + + + + butter + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/public/icons/categories/regular/dairy.svg b/public/icons/categories/regular/dairy.svg new file mode 100644 index 0000000..016b6fe --- /dev/null +++ b/public/icons/categories/regular/dairy.svg @@ -0,0 +1,14 @@ + + + + dairy + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/public/icons/categories/regular/dessert.svg b/public/icons/categories/regular/dessert.svg new file mode 100644 index 0000000..45d4766 --- /dev/null +++ b/public/icons/categories/regular/dessert.svg @@ -0,0 +1,25 @@ + + + + dessert + Created with Sketch. + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/icons/categories/regular/egg.svg b/public/icons/categories/regular/egg.svg new file mode 100644 index 0000000..7ca4230 --- /dev/null +++ b/public/icons/categories/regular/egg.svg @@ -0,0 +1,14 @@ + + + + egg + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/public/icons/categories/regular/fish.svg b/public/icons/categories/regular/fish.svg new file mode 100644 index 0000000..4e1ee99 --- /dev/null +++ b/public/icons/categories/regular/fish.svg @@ -0,0 +1,14 @@ + + + + fish + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/public/icons/categories/regular/fizzy-drink.svg b/public/icons/categories/regular/fizzy-drink.svg new file mode 100644 index 0000000..299aba4 --- /dev/null +++ b/public/icons/categories/regular/fizzy-drink.svg @@ -0,0 +1,16 @@ + + + + fizzy-drink + Created with Sketch. + + + + + + + + + + + \ No newline at end of file diff --git a/public/icons/categories/regular/fruit_icn.svg b/public/icons/categories/regular/fruit_icn.svg new file mode 100644 index 0000000..4b20288 --- /dev/null +++ b/public/icons/categories/regular/fruit_icn.svg @@ -0,0 +1,16 @@ + + + + fruit_icn + Created with Sketch. + + + + + + + + + + + \ No newline at end of file diff --git a/public/icons/categories/regular/meat.svg b/public/icons/categories/regular/meat.svg new file mode 100644 index 0000000..4f0a0a4 --- /dev/null +++ b/public/icons/categories/regular/meat.svg @@ -0,0 +1,16 @@ + + + + meat + Created with Sketch. + + + + + + + + + + + \ No newline at end of file diff --git a/public/icons/categories/regular/nuts.svg b/public/icons/categories/regular/nuts.svg new file mode 100644 index 0000000..a990a5e --- /dev/null +++ b/public/icons/categories/regular/nuts.svg @@ -0,0 +1,14 @@ + + + + nuts + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/public/icons/categories/regular/oil.svg b/public/icons/categories/regular/oil.svg new file mode 100644 index 0000000..b9138b6 --- /dev/null +++ b/public/icons/categories/regular/oil.svg @@ -0,0 +1,15 @@ + + + + oil + Created with Sketch. + + + + + + + + + + \ No newline at end of file diff --git a/public/icons/categories/regular/pasta.svg b/public/icons/categories/regular/pasta.svg new file mode 100644 index 0000000..bb70b4b --- /dev/null +++ b/public/icons/categories/regular/pasta.svg @@ -0,0 +1,17 @@ + + + + pasta + Created with Sketch. + + + + + + + + + + + + \ No newline at end of file diff --git a/public/icons/categories/regular/potato.svg b/public/icons/categories/regular/potato.svg new file mode 100644 index 0000000..d65c79e --- /dev/null +++ b/public/icons/categories/regular/potato.svg @@ -0,0 +1,16 @@ + + + + potato + Created with Sketch. + + + + + + + + + + + \ No newline at end of file diff --git a/public/icons/categories/regular/rice.svg b/public/icons/categories/regular/rice.svg new file mode 100644 index 0000000..4b7cc0d --- /dev/null +++ b/public/icons/categories/regular/rice.svg @@ -0,0 +1,16 @@ + + + + rice + Created with Sketch. + + + + + + + + + + + \ No newline at end of file diff --git a/public/icons/categories/regular/vegan.svg b/public/icons/categories/regular/vegan.svg new file mode 100644 index 0000000..b97e389 --- /dev/null +++ b/public/icons/categories/regular/vegan.svg @@ -0,0 +1,19 @@ + + + + vegan + Created with Sketch. + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/icons/categories/regular/water.svg b/public/icons/categories/regular/water.svg new file mode 100644 index 0000000..075ab15 --- /dev/null +++ b/public/icons/categories/regular/water.svg @@ -0,0 +1,14 @@ + + + + water + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/public/icons/categories/selected/bread-white.svg b/public/icons/categories/selected/bread-white.svg new file mode 100644 index 0000000..ac5ff6b --- /dev/null +++ b/public/icons/categories/selected/bread-white.svg @@ -0,0 +1,14 @@ + + + + bread-white + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/public/icons/categories/selected/butter.svg b/public/icons/categories/selected/butter.svg new file mode 100644 index 0000000..800387c --- /dev/null +++ b/public/icons/categories/selected/butter.svg @@ -0,0 +1,14 @@ + + + + butter + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/public/icons/categories/selected/dairy-white.svg b/public/icons/categories/selected/dairy-white.svg new file mode 100644 index 0000000..7f75968 --- /dev/null +++ b/public/icons/categories/selected/dairy-white.svg @@ -0,0 +1,14 @@ + + + + dairy-white + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/public/icons/categories/selected/dessert-white.svg b/public/icons/categories/selected/dessert-white.svg new file mode 100644 index 0000000..3dbdedd --- /dev/null +++ b/public/icons/categories/selected/dessert-white.svg @@ -0,0 +1,25 @@ + + + + dessert-white + Created with Sketch. + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/icons/categories/selected/egg-white.svg b/public/icons/categories/selected/egg-white.svg new file mode 100644 index 0000000..9b17e79 --- /dev/null +++ b/public/icons/categories/selected/egg-white.svg @@ -0,0 +1,14 @@ + + + + egg-white + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/public/icons/categories/selected/fish-white.svg b/public/icons/categories/selected/fish-white.svg new file mode 100644 index 0000000..5dbf4cc --- /dev/null +++ b/public/icons/categories/selected/fish-white.svg @@ -0,0 +1,14 @@ + + + + fish-white + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/public/icons/categories/selected/fizzy-drink-white.svg b/public/icons/categories/selected/fizzy-drink-white.svg new file mode 100644 index 0000000..2af9465 --- /dev/null +++ b/public/icons/categories/selected/fizzy-drink-white.svg @@ -0,0 +1,16 @@ + + + + fizzy-drink-white + Created with Sketch. + + + + + + + + + + + \ No newline at end of file diff --git a/public/icons/categories/selected/fruit_icn-white.svg b/public/icons/categories/selected/fruit_icn-white.svg new file mode 100644 index 0000000..0722d44 --- /dev/null +++ b/public/icons/categories/selected/fruit_icn-white.svg @@ -0,0 +1,16 @@ + + + + fruit_icn-white + Created with Sketch. + + + + + + + + + + + \ No newline at end of file diff --git a/public/icons/categories/selected/meat-white.svg b/public/icons/categories/selected/meat-white.svg new file mode 100644 index 0000000..fbf85b2 --- /dev/null +++ b/public/icons/categories/selected/meat-white.svg @@ -0,0 +1,16 @@ + + + + meat-white + Created with Sketch. + + + + + + + + + + + \ No newline at end of file diff --git a/public/icons/categories/selected/nuts-white.svg b/public/icons/categories/selected/nuts-white.svg new file mode 100644 index 0000000..89cfe03 --- /dev/null +++ b/public/icons/categories/selected/nuts-white.svg @@ -0,0 +1,14 @@ + + + + nuts-white + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/public/icons/categories/selected/oil-white.svg b/public/icons/categories/selected/oil-white.svg new file mode 100644 index 0000000..63222e5 --- /dev/null +++ b/public/icons/categories/selected/oil-white.svg @@ -0,0 +1,15 @@ + + + + oil-white + Created with Sketch. + + + + + + + + + + \ No newline at end of file diff --git a/public/icons/categories/selected/pasta-white.svg b/public/icons/categories/selected/pasta-white.svg new file mode 100644 index 0000000..c8c174b --- /dev/null +++ b/public/icons/categories/selected/pasta-white.svg @@ -0,0 +1,17 @@ + + + + pasta-white + Created with Sketch. + + + + + + + + + + + + \ No newline at end of file diff --git a/public/icons/categories/selected/potato-white.svg b/public/icons/categories/selected/potato-white.svg new file mode 100644 index 0000000..d44aa70 --- /dev/null +++ b/public/icons/categories/selected/potato-white.svg @@ -0,0 +1,16 @@ + + + + potato-white + Created with Sketch. + + + + + + + + + + + \ No newline at end of file diff --git a/public/icons/categories/selected/rice-white.svg b/public/icons/categories/selected/rice-white.svg new file mode 100644 index 0000000..2e133ae --- /dev/null +++ b/public/icons/categories/selected/rice-white.svg @@ -0,0 +1,16 @@ + + + + rice-white + Created with Sketch. + + + + + + + + + + + \ No newline at end of file diff --git a/public/icons/categories/selected/vegs-white.svg b/public/icons/categories/selected/vegs-white.svg new file mode 100644 index 0000000..30b3889 --- /dev/null +++ b/public/icons/categories/selected/vegs-white.svg @@ -0,0 +1,19 @@ + + + + vegs-white + Created with Sketch. + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/icons/categories/selected/water-white.svg b/public/icons/categories/selected/water-white.svg new file mode 100644 index 0000000..a369d0b --- /dev/null +++ b/public/icons/categories/selected/water-white.svg @@ -0,0 +1,14 @@ + + + + water-white + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/public/icons/close.svg b/public/icons/close.svg new file mode 100644 index 0000000..1038181 --- /dev/null +++ b/public/icons/close.svg @@ -0,0 +1,13 @@ + + + + close + Created with Sketch. + + + + + + + + \ No newline at end of file diff --git a/public/icons/close_white.svg b/public/icons/close_white.svg new file mode 100644 index 0000000..cb8d4a9 --- /dev/null +++ b/public/icons/close_white.svg @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/public/icons/divider.svg b/public/icons/divider.svg new file mode 100644 index 0000000..1d35221 --- /dev/null +++ b/public/icons/divider.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/public/icons/dropdown.svg b/public/icons/dropdown.svg new file mode 100644 index 0000000..62d27bf --- /dev/null +++ b/public/icons/dropdown.svg @@ -0,0 +1,20 @@ + + + + dropdown + Created with Sketch. + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/icons/loading.svg b/public/icons/loading.svg new file mode 100644 index 0000000..1287966 --- /dev/null +++ b/public/icons/loading.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/icons/menu.svg b/public/icons/menu.svg new file mode 100644 index 0000000..9ef939a --- /dev/null +++ b/public/icons/menu.svg @@ -0,0 +1,15 @@ + + + + menu + Created with Sketch. + + + + + + + + + + \ No newline at end of file diff --git a/public/icons/progress_1.svg b/public/icons/progress_1.svg new file mode 100644 index 0000000..40c669a --- /dev/null +++ b/public/icons/progress_1.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/public/icons/progress_2.svg b/public/icons/progress_2.svg new file mode 100644 index 0000000..ee3d4b2 --- /dev/null +++ b/public/icons/progress_2.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/public/icons/progress_3.svg b/public/icons/progress_3.svg new file mode 100644 index 0000000..67feb43 --- /dev/null +++ b/public/icons/progress_3.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/public/icons/quantities/regular/all.svg b/public/icons/quantities/regular/all.svg new file mode 100644 index 0000000..98256ea --- /dev/null +++ b/public/icons/quantities/regular/all.svg @@ -0,0 +1,11 @@ + + + + whole + Created with Sketch. + + + + + + \ No newline at end of file diff --git a/public/icons/quantities/regular/half.svg b/public/icons/quantities/regular/half.svg new file mode 100644 index 0000000..205e44c --- /dev/null +++ b/public/icons/quantities/regular/half.svg @@ -0,0 +1,14 @@ + + + + half + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/public/icons/quantities/regular/mostly.svg b/public/icons/quantities/regular/mostly.svg new file mode 100644 index 0000000..69bbfc1 --- /dev/null +++ b/public/icons/quantities/regular/mostly.svg @@ -0,0 +1,14 @@ + + + + mostly + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/public/icons/quantities/regular/quarter.svg b/public/icons/quantities/regular/quarter.svg new file mode 100644 index 0000000..29d0238 --- /dev/null +++ b/public/icons/quantities/regular/quarter.svg @@ -0,0 +1,14 @@ + + + + quarter + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/public/icons/quantities/selected/all-selected.svg b/public/icons/quantities/selected/all-selected.svg new file mode 100644 index 0000000..3393679 --- /dev/null +++ b/public/icons/quantities/selected/all-selected.svg @@ -0,0 +1,11 @@ + + + + whole-selected + Created with Sketch. + + + + + + \ No newline at end of file diff --git a/public/icons/quantities/selected/half-selected.svg b/public/icons/quantities/selected/half-selected.svg new file mode 100644 index 0000000..8577765 --- /dev/null +++ b/public/icons/quantities/selected/half-selected.svg @@ -0,0 +1,14 @@ + + + + half-selected + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/public/icons/quantities/selected/mostly-selected.svg b/public/icons/quantities/selected/mostly-selected.svg new file mode 100644 index 0000000..d29df9d --- /dev/null +++ b/public/icons/quantities/selected/mostly-selected.svg @@ -0,0 +1,14 @@ + + + + mostly-selected + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/public/icons/quantities/selected/quarter-selected.svg b/public/icons/quantities/selected/quarter-selected.svg new file mode 100644 index 0000000..7823190 --- /dev/null +++ b/public/icons/quantities/selected/quarter-selected.svg @@ -0,0 +1,14 @@ + + + + quarter-selected + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/public/illustrations/checkmark.svg b/public/illustrations/checkmark.svg new file mode 100644 index 0000000..c1b5c68 --- /dev/null +++ b/public/illustrations/checkmark.svg @@ -0,0 +1,16 @@ + + + + checkmark + Created with Sketch. + + + + + + + + + + + \ No newline at end of file diff --git a/public/illustrations/hurray.svg b/public/illustrations/hurray.svg new file mode 100644 index 0000000..a0ddd41 --- /dev/null +++ b/public/illustrations/hurray.svg @@ -0,0 +1,62 @@ + + + + hurray + Created with Sketch. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/illustrations/illustration_1.png b/public/illustrations/illustration_1.png new file mode 100644 index 0000000..8a27a12 Binary files /dev/null and b/public/illustrations/illustration_1.png differ diff --git a/public/illustrations/illustration_2.png b/public/illustrations/illustration_2.png new file mode 100644 index 0000000..f4cf77a Binary files /dev/null and b/public/illustrations/illustration_2.png differ diff --git a/public/illustrations/illustration_3.png b/public/illustrations/illustration_3.png new file mode 100644 index 0000000..e7fb746 Binary files /dev/null and b/public/illustrations/illustration_3.png differ diff --git a/public/illustrations/illustration_all-set.svg b/public/illustrations/illustration_all-set.svg new file mode 100644 index 0000000..b4be534 --- /dev/null +++ b/public/illustrations/illustration_all-set.svg @@ -0,0 +1,68 @@ + + + + illustration_all-set + Created with Sketch. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/images/empty-plate.jpg b/public/images/empty-plate.jpg new file mode 100644 index 0000000..70b6047 Binary files /dev/null and b/public/images/empty-plate.jpg differ diff --git a/public/images/example_half.png b/public/images/example_half.png new file mode 100644 index 0000000..c7a7eab Binary files /dev/null and b/public/images/example_half.png differ diff --git a/public/images/example_mostly.png b/public/images/example_mostly.png new file mode 100644 index 0000000..3b908a3 Binary files /dev/null and b/public/images/example_mostly.png differ diff --git a/public/images/example_quarter.png b/public/images/example_quarter.png new file mode 100644 index 0000000..622e1d5 Binary files /dev/null and b/public/images/example_quarter.png differ diff --git a/public/images/example_whole.png b/public/images/example_whole.png new file mode 100644 index 0000000..46ac137 Binary files /dev/null and b/public/images/example_whole.png differ diff --git a/public/iphone-icon.png b/public/iphone-icon.png new file mode 100644 index 0000000..23b77f7 Binary files /dev/null and b/public/iphone-icon.png differ diff --git a/public/logos/gstc-logo.png b/public/logos/gstc-logo.png new file mode 100644 index 0000000..0bfc794 Binary files /dev/null and b/public/logos/gstc-logo.png differ diff --git a/public/logos/logo1.svg b/public/logos/logo1.svg new file mode 100644 index 0000000..40ac64d --- /dev/null +++ b/public/logos/logo1.svg @@ -0,0 +1,20 @@ + + + + logo1 + Created with Sketch. + + + + + + \ No newline at end of file diff --git a/public/logos/logo2.svg b/public/logos/logo2.svg new file mode 100644 index 0000000..93d4272 --- /dev/null +++ b/public/logos/logo2.svg @@ -0,0 +1,20 @@ + + + + logo2 + Created with Sketch. + + + + + + \ No newline at end of file diff --git a/public/logos/logo3.svg b/public/logos/logo3.svg new file mode 100644 index 0000000..38b016a --- /dev/null +++ b/public/logos/logo3.svg @@ -0,0 +1,20 @@ + + + + logo3 + Created with Sketch. + + + + + + \ No newline at end of file diff --git a/public/logos/splash_logo.svg b/public/logos/splash_logo.svg new file mode 100644 index 0000000..5413fd3 --- /dev/null +++ b/public/logos/splash_logo.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/manifest.json b/public/manifest.json new file mode 100644 index 0000000..3056d5f --- /dev/null +++ b/public/manifest.json @@ -0,0 +1,23 @@ +{ + "lang": "en", + "name": "SnapEat", + "short_name": "SnapEat", + "description": "An app which allows users to record their child's evening meals.", + "icons": [ + { + "src": "/android-icon-192x192.png", + "sizes": "192x192", + "type": "image/png" + }, + { + "src": "/android-icon-512x512.png", + "sizes": "512x512", + "type": "image/png" + } + ], + "theme_color": "#f8dd74", + "background_color": "#f8f8f8", + "start_url": "/", + "display": "standalone", + "orientation": "portrait" +} diff --git a/scripts/uploadToAirtable.js b/scripts/uploadToAirtable.js new file mode 100644 index 0000000..8ae95e2 --- /dev/null +++ b/scripts/uploadToAirtable.js @@ -0,0 +1,207 @@ +/* eslint-disable */ +// Uncomment last line to run this file: `env-cmd -f .config/dev.env node scripts/uploadToAirtable` + +const Airtable = require('airtable') +const R = require('ramda') +const moment = require('moment') +const { prisma } = require('../prisma/generated/js') + +Airtable.configure({ + endpointUrl: 'https://api.airtable.com', + apiKey: process.env.AIRTABLE_API_KEY, +}) + +const base = Airtable.base(process.env.AIRTABLE_BASE) + +// first create the users in AT +const createAirtableUsersWithMeals = async () => { + // get all users from prisma where project is "Snapeat Trial" + const snapeatTrialProject = 'ck3slx3qm00a30743r7sdk8hk' + + const users = await prisma.users({ + where: { + //eslint-disable-next-line + projects_every: { + id: snapeatTrialProject, + }, + }, + }) + + // for each user, push it into Airtable + + const addUsersToAirtable = async user => { + user.ages = [] + + // get ages of children + + const ageFragment = ` +fragment ChildAge on Child { + age +}` + const children = await prisma + .children({ + where: { + Parent: { + id: user.id, + }, + }, + }) + .$fragment(ageFragment) + + // add ages to user object + await R.map(({ age }) => user.ages.push(age))(children) + + // upload to AT + const { ages, postCode, consentGDPR } = user + + const airtableId = 'recDbH65aPnaXslJM' + + const [{ id: airtableParent }] = await base('Users').create([ + { + fields: { + Project: [airtableId], + 'Postcode Area': postCode.substring(0, 5), + 'Consent for Data Usage': consentGDPR, + }, + }, + ]) + + if (!R.isEmpty(ages)) { + const emptyFields = [] + + R.map(age => + emptyFields.push({ + fields: { + Parent: [airtableParent], + 'Age Group': `${age}`, + }, + }), + )(ages) + + await base('Children') + .create(emptyFields) + .catch(e => console.log('error', e)) + } + + await prisma.updateUser({ + data: { airtableId: airtableParent }, + where: { id: user.id }, + }) + } + + //add all of each users meals into AT + const addUserMeals = async user => { + //get all meals for user + + const mealFragment = ` + fragment MealWithDetails on Meal { + imageURL + createdAt + proportionVeg { + name + } + proportionFruit { + name + } + categories { + name + } + tags { + name + } + }` + + const meals = await prisma + .meals({ + where: { + user: { + id: user.id, + }, + }, + }) + .$fragment(mealFragment) + + // get userAirtableId + + const airtableIdFragment = ` +fragment AirtableId on User { + airtableId +}` + const { airtableId: userAirtableId } = await prisma + .user({ + id: user.id, + }) + .$fragment(airtableIdFragment) + + // upload each meal of that user to AT + + R.map(async meal => { + const { + categories, + tags, + proportionFruit, + proportionVeg, + imageURL, + id, + } = meal + + const mealCategories = [] + const mealTags = [] + const { name: mealPropFruit } = proportionFruit + ? proportionFruit + : { name: '' } + const { name: mealPropVeg } = proportionVeg ? proportionVeg : { name: '' } + + !R.isEmpty(tags) && (await R.map(({ name }) => mealTags.push(name))(tags)) + !R.isEmpty(categories) && + (await R.map(({ name }) => mealCategories.push(name))(categories)) + + const dbCategories = await prisma.categories() + const dbTags = await prisma.tags() + const dbProportions = await prisma.proportions() + + //map airtable ids for categories etc + + const getAirtableIds = (airtableArray, prismaArray) => + R.pipe( + x => R.filter(({ name }) => R.contains(name)(airtableArray))(x), + x => R.map(({ airtableId }) => airtableId)(x), + )(prismaArray) + + const Categories = getAirtableIds(mealCategories, dbCategories) + const Tags = getAirtableIds(mealTags, dbTags) + const ProportionFruit = getAirtableIds([mealPropFruit], dbProportions) + const ProportionVeg = getAirtableIds([mealPropVeg], dbProportions) + + const [{ id: airtableMeal }] = await base('Meals').create([ + { + fields: { + Image: [ + { + url: imageURL, + }, + ], + 'User ID': [userAirtableId], + 'Proportion of Fruit': ProportionFruit, + 'Proportion of Veg': ProportionVeg, + Categories, + Tags, + 'Date and Time': moment(), + }, + }, + ]) + + console.log('airtableMeal', airtableMeal) + + prisma.updateMeal({ + data: { airtableId: airtableMeal }, + where: { id: id }, + }) + })(meals) + } + + await R.map(addUsersToAirtable)(users) + await R.map(addUserMeals)(users) +} + +// createAirtableUsersWithMeals() diff --git a/server.js b/server.js new file mode 100644 index 0000000..168d078 --- /dev/null +++ b/server.js @@ -0,0 +1,46 @@ +const { join } = require('path') +const express = require('express') +const next = require('next') +// const cron = require('node-cron') +const enforce = require('express-sslify') + +// const sendReminderMessages = require('./server/sendReminderMessages.js') +const port = parseInt(process.env.PORT, 10) || 3000 +const dev = process.env.NODE_ENV !== 'production' +const app = next({ dev }) +const handle = app.getRequestHandler() + +if (process.env.HEROKU_APP_NAME) { + process.env.HOST = `https://${process.env.HEROKU_APP_NAME}.herokuapp.com` +} + +app.prepare().then(() => { + const server = express() + + server.get('/service-worker.js', (req, res) => { + const filePath = join(__dirname, '.next', '/service-worker.js') + app.serveStatic(req, res, filePath) + }) + + if (!dev) { + //eslint-disable-next-line + server.use(enforce.HTTPS({ trustProtoHeader: true })) + } + + // cron.schedule('30 17 * * *', () => { + // sendReminderMessages() + // }) + + server.get('*', (req, res) => { + return handle(req, res) + }) + + server.post('*', (req, res) => { + return handle(req, res) + }) + + server.listen(port, err => { + if (err) throw err + console.log(`> Ready on http://localhost:${port}`) //eslint-disable-line + }) +}) diff --git a/server/sendReminderMessages.js b/server/sendReminderMessages.js new file mode 100644 index 0000000..b01e9ce --- /dev/null +++ b/server/sendReminderMessages.js @@ -0,0 +1,36 @@ +const accountSid = process.env.TWILIO_ACCOUNT_SID +const authToken = process.env.TWILIO_AUTH_TOKEN +const client = require('twilio')(accountSid, authToken) + +const R = require('ramda') +const { prisma } = require('../prisma/generated/js') + +const sendReminderMessages = async () => { + const fragment = ` + fragment UserWithNumber on User { + phoneNumber + } + ` + + const userNumbers = await prisma.users().$fragment(fragment) + + Promise.all( + R.map(({ phoneNumber }) => { + return ( + client.messages + .create({ + body: + 'Remember to log what your child eats for dinner tonight on SnapEat!', + from: '+447428147340', + to: `${phoneNumber}`, + }) + //eslint-disable-next-line + .then(message => console.log(message.sid)) + //eslint-disable-next-line + .catch(e => console.log(e)) + ) + })(userNumbers), + ) +} + +module.exports = sendReminderMessages diff --git a/styles/_custom.css b/styles/_custom.css new file mode 100644 index 0000000..25eb573 --- /dev/null +++ b/styles/_custom.css @@ -0,0 +1,18 @@ +body { + min-height: 100vh; + height: fit-content; + -webkit-font-smoothing: antialiased; + font-size: theme('fontSize.base'); + color: theme('colors.navy'); + line-height: theme('lineHeight.base'); +} + +* { + -webkit-tap-highlight-color: transparent !important; +} + +input[type='number']::-webkit-inner-spin-button, +input[type='number']::-webkit-outer-spin-button { + -webkit-appearance: none; + margin: 0; +} diff --git a/styles/_fonts.css b/styles/_fonts.css new file mode 100644 index 0000000..14f6e78 --- /dev/null +++ b/styles/_fonts.css @@ -0,0 +1,115 @@ +/* Muli */ +@font-face { + font-family: 'Muli'; + font-style: normal; + font-weight: 200; + src: url('/fonts/muli/muli-v16-latin-regular.eot'); /* IE9 Compat Modes */ + src: local('Muli Light'), local('Muli-Light'), + /* Modern Browsers */ url('/fonts/muli/Muli-Light.ttf') format('truetype'); +} +@font-face { + font-family: 'Muli'; + font-style: italic; + font-weight: 400; + src: url('/fonts/muli/muli-v16-latin-italic.eot'); /* IE9 Compat Modes */ + src: local('Muli Italic'), local('Muli-Italic'), + url('/fonts/muli/muli-v16-latin-italic.eot?#iefix') + format('embedded-opentype'), + /* IE6-IE8 */ url('/fonts/muli/muli-v16-latin-italic.woff2') format('woff2'), + /* Super Modern Browsers */ url('/fonts/muli/muli-v16-latin-italic.woff') + format('woff'), + /* Modern Browsers */ url('/fonts/muli/muli-v16-latin-italic.ttf') + format('truetype'), + /* Safari, Android, iOS */ url('/fonts/muli/muli-v16-latin-italic.svg#Muli') + format('svg'); /* Legacy iOS */ +} +@font-face { + font-family: 'Muli'; + font-style: normal; + font-weight: 400; + src: url('/fonts/muli/muli-v16-latin-regular.eot'); /* IE9 Compat Modes */ + src: local('Muli Regular'), local('Muli-Regular'), + url('/fonts/muli/muli-v16-latin-regular.eot?#iefix') + format('embedded-opentype'), + /* IE6-IE8 */ url('/fonts/muli/muli-v16-latin-regular.woff2') + format('woff2'), + /* Super Modern Browsers */ url('/fonts/muli/muli-v16-latin-regular.woff') + format('woff'), + /* Modern Browsers */ url('/fonts/muli/muli-v16-latin-regular.ttf') + format('truetype'), + /* Safari, Android, iOS */ + url('/fonts/muli/muli-v16-latin-regular.svg#Muli') format('svg'); /* Legacy iOS */ +} +@font-face { + font-family: 'Muli'; + font-style: normal; + font-weight: 700; + src: url('/fonts/muli/muli-v16-latin-700.eot'); /* IE9 Compat Modes */ + src: local('Muli Bold'), local('Muli-Bold'), + url('/fonts/muli/muli-v16-latin-700.eot?#iefix') format('embedded-opentype'), + /* IE6-IE8 */ url('/fonts/muli/muli-v16-latin-700.woff2') format('woff2'), + /* Super Modern Browsers */ url('/fonts/muli/muli-v16-latin-700.woff') + format('woff'), + /* Modern Browsers */ url('/fonts/muli/muli-v16-latin-700.ttf') + format('truetype'), + /* Safari, Android, iOS */ url('/fonts/muli/muli-v16-latin-700.svg#Muli') + format('svg'); /* Legacy iOS */ +} +@font-face { + font-family: 'Muli'; + font-style: italic; + font-weight: 700; + src: url('/fonts/muli/muli-v16-latin-700italic.eot'); /* IE9 Compat Modes */ + src: local('Muli Bold Italic'), local('Muli-BoldItalic'), + url('/fonts/muli/muli-v16-latin-700italic.eot?#iefix') + format('embedded-opentype'), + /* IE6-IE8 */ url('/fonts/muli/muli-v16-latin-700italic.woff2') + format('woff2'), + /* Super Modern Browsers */ url('/fonts/muli/muli-v16-latin-700italic.woff') + format('woff'), + /* Modern Browsers */ url('/fonts/muli/muli-v16-latin-700italic.ttf') + format('truetype'), + /* Safari, Android, iOS */ + url('/fonts/muli/muli-v16-latin-700italic.svg#Muli') format('svg'); /* Legacy iOS */ +} + +/* Set base font family */ +* { + font-family: theme('fontFamily.sans'); +} + +/* Create font classes */ +@responsive { + .font-xs { + font-size: theme('fontSize.xs'); + line-height: theme('lineHeight.xs'); + } + .font-sm { + font-size: theme('fontSize.sm'); + line-height: theme('lineHeight.sm'); + } + .font-base { + font-size: theme('fontSize.base'); + line-height: theme('lineHeight.base'); + } + .font-lg { + font-size: theme('fontSize.lg'); + line-height: theme('lineHeight.lg'); + } + .font-xl { + font-size: theme('fontSize.xl'); + line-height: theme('lineHeight.xl'); + } + .font-xxl { + font-size: theme('fontSize.xxl'); + line-height: theme('lineHeight.xxl'); + } + .font-subheader { + font-size: theme('fontSize.subheader'); + line-height: theme('lineHeight.subheader'); + } + .font-header { + font-size: theme('fontSize.header'); + line-height: theme('lineHeight.header'); + } +} diff --git a/styles/index.css b/styles/index.css new file mode 100644 index 0000000..5910e9e --- /dev/null +++ b/styles/index.css @@ -0,0 +1,15 @@ +@import 'tailwindcss/base'; + +@import './_fonts.css'; + +@import 'tailwindcss/components'; +@import 'tailwindcss/utilities'; + +@import './_custom.css'; + +/* Debugging */ +@import 'tachyons/src/_debug-children'; +@import 'tachyons/src/_debug-grid'; + +/* Uncomment out the line below to help debug layout issues */ +/* @import 'tachyons/src/_debug'; */ diff --git a/tailwind.config.js b/tailwind.config.js new file mode 100644 index 0000000..db9fb8e --- /dev/null +++ b/tailwind.config.js @@ -0,0 +1,136 @@ +const screens = { + sm: '360px', + md: '768px', + lg: '1024px', + xl: '1280px', +} + +module.exports = { + theme: { + screens, + media: { + sm: `(min-width: ${screens.sm})`, + md: `(min-width: ${screens.md})`, + lg: `(min-width: ${screens.lg})`, + xl: `(min-width: ${screens.xl})`, + }, + extend: { + spacing: { + '1d5': '0.375rem', // 6px + '2d5': '0.625rem', // 10px + '3d5': '0.875rem', // 14px + '4': '1rem', // 16px + '4d5': '1.125rem', // 18px + '5': '1.25rem', // 20px + '5d5': '1.375rem', // 22px + '6': '1.5rem', // 24px + '7': '1.75rem', // 28px + '7d5': '1.875rem', // 30px + '9': '2.25rem', // 36px + '9d5': '2.375rem', // 38px + '10': '2.5rem', // 40px + '10d5': '2.625rem', // 42px + '11': '2.75rem', // 44px + '11d5': '2.875rem', // 46px + '12': '3rem', // 48px + '15': '3.75rem', // 60px + '16': '4rem', // 64px + '17': '4.25rem', // 68px + '18': '4.5rem', // 72px + '20': '5rem', // 80px + '25': '6.25rem', // 100px + '27': '6.75rem', // 108px + '30': '7.5rem', // 120px + '36': '9rem', // 144px + '40': '10rem', // 160px + '43': '10.75rem', // 172px + '50': '12.5rem', // 200px + '65': '16.25rem', // 260px + }, + width: { + '2d5': '0.625rem', // 10px + '16d5': '4.125rem', // 66px + '20': '20%', + '45': '45%', + }, + height: { + '2d5': '0.625rem', // 10px + '16d5': '4.125rem', // 66px + '80': '80vh', + }, + minHeight: { + '1/4': '25%', + }, + maxHeight: { + '1/2': '50%', + '3/4': '75%', + full: '100%', + }, + opacity: { + 40: '.4', + }, + colors: { + navy: '#170a59', + blue: `#428dfc`, + yellow: '#f8dd74', + white: '#fdfdfd', + black: '#4c4c4c', + green: '#88fcc6', + red: '#ef3f5f', + lightgray: '#f8f8f8', + lightnavy: '#8780a8', + }, + }, + fontSize: { + xs: '0.75rem', // 12px + sm: '0.875rem', // 14px + base: '1rem', // 16px + lg: '1.125rem', // 18px + xl: '1.25rem', // 20px + xxl: '1.5rem', // 24px + subheader: '1.75rem', // 28px + header: '3rem', // 48px + }, + lineHeight: { + xs: '0.875rem', // 14px + sm: '1rem', // 18px + base: '1.25rem', // 20px + lg: '1.375rem', // 22px + xl: '1.5rem', // 24px + xxl: '2rem', // 32px + subheader: '2rem', // 32px + header: '3.75rem', // 60px + }, + fontFamily: { + sans: [ + 'Muli', + '-apple-system', + 'BlinkMacSystemFont', + '"Segoe UI"', + 'Roboto', + '"Helvetica Neue"', + 'Arial', + '"Noto Sans"', + 'sans-serif', + '"Apple Color Emoji"', + '"Segoe UI Emoji"', + '"Segoe UI Symbol"', + '"Noto Color Emoji"', + ], + }, + borderRadius: { + card: '37px 37px 0 0 ', + button: '35.5px', + tooltip: '1rem 1rem 0% 0% / 2.5rem 2.5rem 0% 0%', + full: '100%', + }, + boxShadow: { + '1': '0 0 3px 0 rgba(0,0,0,0.05), 0 1px 1px 0 rgba(0,0,0,0.05)', + '2': '0 0 1px 1px rgba(0,0,0,0.02), 0 4px 6px 1px rgba(0,0,0,0.06)', + '3': '0 0 2px 1px rgba(0,0,0,0.03), 0 6px 10px 2px rgba(0,0,0,0.08)', + '4': '0 0 8px 2px rgba(0,0,0,0.03), 0 16px 24px 0 rgba(0,0,0,0.10)', + button: '0 8px 12px 2px rgba(23,10,89,0.24)', + tooltip: '0 0 2px 1px rgba(0,0,0,0.03), 0 -6px 10px 2px rgba(0,0,0,0.04)', + }, + }, +} diff --git a/test/jest-common.js b/test/jest-common.js new file mode 100644 index 0000000..88d013d --- /dev/null +++ b/test/jest-common.js @@ -0,0 +1,5 @@ +const path = require('path') + +module.exports = { + rootDir: path.join(__dirname, '..'), +} diff --git a/test/jest.lint.js b/test/jest.lint.js new file mode 100644 index 0000000..645b165 --- /dev/null +++ b/test/jest.lint.js @@ -0,0 +1,8 @@ +const path = require('path') + +module.exports = { + rootDir: path.join(__dirname, '..'), + displayName: 'lint', + runner: 'jest-runner-eslint', + testMatch: ['/**/*.js', '/pages/api/*.ts'], +} diff --git a/utils/R_.js b/utils/R_.js new file mode 100644 index 0000000..3178c09 --- /dev/null +++ b/utils/R_.js @@ -0,0 +1,17 @@ +// Custom combinations of ramda functions +import * as R from 'ramda' + +const mapIndexed = R.addIndex(R.map) +const reduceIndexed = R.addIndex(R.reduce) + +const inspectPipe = label => item => { + // eslint-disable-next-line + console.log(label, item) + return item +} + +export default { + mapIndexed, + reduceIndexed, + inspectPipe, +} diff --git a/utils/constants.js b/utils/constants.js index 82ff2e3..9ef3bdd 100644 --- a/utils/constants.js +++ b/utils/constants.js @@ -1,7 +1,128 @@ // Views -export const HOME = "HOME" -export const AWAY = "AWAY" +export const HOME = 'HOME' +export const MENU = 'MENU' +export const SPINNER = 'SPINNER' +export const ONBOARDING = 'ONBOARDING' +export const SECURITY_AUTH = 'SECURITY_AUTH' +export const SIGN_UP = 'SIGN_UP' +export const CATEGORY_SELECT = 'CATEGORY_SELECT' +export const ERROR = 'ERROR' +export const LOADING = 'LOADING' +export const SUCCESS = 'SUCCESS' +export const FOOD_DATA = 'FOOD_DATA' +export const PRIVACY_AUTH = 'PRIVACY_AUTH' +export const TERMS_AND_CONDITIONS_AUTH = 'TERMS_AND_CONDITIONS_AUTH' -// Actions -export const CHANGE_VIEW = "CHANGE_VIEW" -export const GO_BACK = "GO_BACK" +// Unauthenticated views +export const LANDING = 'LANDING' +export const SECURITY_UNAUTH = 'SECURITY_UNAUTH' +export const TERMS_AND_CONDITIONS_UNAUTH = 'TERMS_AND_CONDITIONS_UNAUTH' +export const PRIVACY_UNAUTH = 'PRIVACY_UNAUTH' +export const WELCOME = 'WELCOME' + +// Form States +export const FORM_NOT_SENT = 'FORM_NOT_SENT' +export const FORM_SENDING = 'FORM_SENDING' +export const FORM_SUCCESS = 'FORM_SUCCESS' +export const FORM_ERROR = 'FORM_ERROR' + +// Router Actions +export const CHANGE_VIEW = 'CHANGE_VIEW' +export const GO_BACK = 'GO_BACK' +export const SIGN_OUT = 'SIGN_OUT' + +// Project Actions +export const PROJECT_NOT_FOUND = 'PROJECT_NOT_FOUND' +export const NO_PROJECT = 'NO_PROJECT' +export const CHANGE_PROJECT = 'CHANGE_PROJECT' + +// Food Data Actions +export const SET_FOOD_PHOTO = 'SET_FOOD_PHOTO' + +// Consent Actions +export const NO_CONSENT_FROM_USER = 'NO_CONSENT_FROM_USER' +export const ACTIVE_CONSENT_FROM_USER = 'ACTIVE_CONSENT_FROM_USER' +export const SET_CONSENT = 'SET_CONSENT' + +export const USER_NOT_FOUND = 'USER_NOT_FOUND' + +// Food categories +export const FRUIT = 'fruit' +export const VEGETABLES = 'vegetables' +export const MEAT = 'meat' +export const FISH = 'fish/seafood' +export const DAIRY = 'dairy' +export const EGG = 'egg' +export const PASTA = 'pasta' +export const RICE = 'rice' +export const POTATO = 'potato' +export const BREAD = 'bread' +export const NUTS = 'nuts' +export const DESSERT = 'dessert' +export const OIL = 'oil' +export const BUTTER = 'butter' +export const WATER = 'water' +export const FIZZY_DRINK = 'fizzy-drink' + +// Food category array +export const CATEGORY_ARRAY = [ + FRUIT, + VEGETABLES, + MEAT, + FISH, + DAIRY, + EGG, + PASTA, + RICE, + POTATO, + BREAD, + NUTS, + DESSERT, + OIL, + BUTTER, + WATER, + FIZZY_DRINK, +] + +// food tags +export const TAKEAWAY = '#takeaway' +export const FRIED = '#fried' +export const FRESH = '#fresh' +export const MADE_FROM_SCRATCH = '#madefromscratch' +export const READY_MEAL = '#readymeal' +export const QUICK_AND_EASY = '#quickandeasy' +export const HOMECOOKED = '#homecooked' +export const HEALTHY = '#healthy' +export const FROZEN = '#frozen' +export const VEGAN = '#vegan' +export const VEGETARIAN = '#vegetarian' +export const KIDS_FAVOURITE = '#kidsfavourite' + +// food tag array +export const TAG_ARRAY = [ + TAKEAWAY, + FRIED, + FRESH, + MADE_FROM_SCRATCH, + READY_MEAL, + QUICK_AND_EASY, + HOMECOOKED, + HEALTHY, + FROZEN, + VEGAN, + VEGETARIAN, + KIDS_FAVOURITE, +] + +// food proportion +export const QUARTER = 'quarter' +export const HALF = 'half' +export const MOSTLY = 'mostly' +export const ALL = 'all' + +// food proportion array +export const PROPORTION_ARRAY = [QUARTER, HALF, MOSTLY, ALL] + +// Form Status Messages +export const NEXT_NOT_ATTEMPTED = 'NEXT_NOT_ATTEMPTED' +export const NEXT_ATTEMPTED = 'NEXT_ATTEMPTED' diff --git a/utils/createArrayOfLength.js b/utils/createArrayOfLength.js new file mode 100644 index 0000000..63e0de9 --- /dev/null +++ b/utils/createArrayOfLength.js @@ -0,0 +1,3 @@ +import * as R from 'ramda' + +export default int => R.pipe(parseInt, length => [...Array(length)])(int) diff --git a/utils/cssTheme.js b/utils/cssTheme.js new file mode 100644 index 0000000..e4e972d --- /dev/null +++ b/utils/cssTheme.js @@ -0,0 +1,8 @@ +import * as R from 'ramda' //eslint-disable-line + +const cssTheme = strPath => props => { + const path = R.split('.', strPath) + return R.path(path, props.theme) +} + +module.exports = cssTheme diff --git a/utils/fileNameFormatter.js b/utils/fileNameFormatter.js new file mode 100644 index 0000000..f8ab5cc --- /dev/null +++ b/utils/fileNameFormatter.js @@ -0,0 +1,4 @@ +const fileNameFormatter = name => + name.replace(/[^a-z0-9_.]/gi, '_').toLowerCase() + +export default fileNameFormatter diff --git a/utils/getLastPath.js b/utils/getLastPath.js new file mode 100644 index 0000000..7bc9484 --- /dev/null +++ b/utils/getLastPath.js @@ -0,0 +1,3 @@ +import * as R from 'ramda' + +export default path => R.pipe(R.without(['']), R.last)(path.split('/')) diff --git a/utils/keepFieldCleanOnChange.js b/utils/keepFieldCleanOnChange.js new file mode 100644 index 0000000..41d7eed --- /dev/null +++ b/utils/keepFieldCleanOnChange.js @@ -0,0 +1,9 @@ +import { curry } from 'ramda' +// Function allows us to automatically filter out user input that does not fit the specified pattern +// Curried with ramda, and can use R.__ as a placeholder for unknown arguments that aren't "e" + +export default curry((setFieldValue, fieldName, pattern, e) => { + if (e.target.value === '' || pattern.test(e.target.value)) { + setFieldValue(fieldName, e.target.value) + } +}) diff --git a/views/Away.js b/views/Away.js deleted file mode 100644 index 8f9ba38..0000000 --- a/views/Away.js +++ /dev/null @@ -1,15 +0,0 @@ -import React from "react" -import { useRouteDispatch } from "../utils/routeContext" -import { GO_BACK } from "../utils/constants" - -const Away = () => { - const routeDispatch = useRouteDispatch() - return ( -
-

Away

- -
- ) -} - -export default Away diff --git a/views/CategorySelect.js b/views/CategorySelect.js new file mode 100644 index 0000000..29528dc --- /dev/null +++ b/views/CategorySelect.js @@ -0,0 +1,17 @@ +import React from 'react' +import { useRouteDispatch } from '../context/routeContext' +import { MENU, CHANGE_VIEW } from '../utils/constants' + +const CategorySelect = () => { + const routeDispatch = useRouteDispatch() + return ( +
+

Sign up

+ +
+ ) +} + +export default CategorySelect diff --git a/views/Error.js b/views/Error.js new file mode 100644 index 0000000..ee25faa --- /dev/null +++ b/views/Error.js @@ -0,0 +1,51 @@ +import React from 'react' +import styled from 'styled-components' + +import logo from '../public/logos/logo1.svg' +import robot from '../public/icons/404-robot.svg' + +function Error() { + return ( +
+ + Snapeat logo + + A cute little error robot +
+ Oooops, it's an error! + + We noticed you lost your way. Not to worry though! + + + Go back to the homepage but first, please{' '} + { + + tell us what happened{' '} + + } + . + +
+ +
+ ) +} + +const Text = styled.p.attrs({ + className: 'text-xl text-center m-5 sm:m-8', +})`` + +export default Error diff --git a/views/FoodData.js b/views/FoodData.js new file mode 100644 index 0000000..17de02d --- /dev/null +++ b/views/FoodData.js @@ -0,0 +1,447 @@ +import React, { useState, useEffect } from 'react' +import styled from 'styled-components' +import { Formik, Form } from 'formik' +import axios from 'axios' +import * as R from 'ramda' + +import { + GO_BACK, + CHANGE_VIEW, + HOME, + FRUIT, + VEGETABLES, +} from '../utils/constants' + +import { useRouteDispatch } from '../context/routeContext' +import { useFoodDataState } from '../context/foodDataContext' +import { useAuth } from '../context/authContext' + +import * as Steps from '../components/foodData' +import Categories from '../components/foodData/Categories' +import VegetableProportion from '../components/foodData/VegetableProportion' +import FruitProportion from '../components/foodData/FruitProportion' +import Tags from '../components/foodData/Tags' +import Spinner from '../components/foodData/Spinner' +import Results from '../components/foodData/Results' +import Success from '../components/foodData/Success' +import Error from '../components/foodData/Error' + +import backIcon from '../public/icons/back_white.svg' +import nextIcon from '../public/icons/btn_round-next.svg' + +const initialValues = { + categories: [], + proportionFruit: '', + proportionVeg: '', + tags: [], +} + +// const initialValues = { +// categories: ['fruit', 'vegetables', 'pasta', 'oil'], +// proportionFruit: 'quarter', +// proportionVeg: 'quarter', +// tags: ['#readymeal', '#quickandeasy', '#vegetarian'], +// } + +const FoodData = () => { + return ( + + + + + + + + + + + ) +} + +const MultiStep = ({ children }) => { + const { foodPhoto } = useFoodDataState() + + const { snapeatUser } = useAuth() + const steps = React.Children.toArray(children) + const pages = steps.map(step => step.type.componentName) + const firstPage = R.head(pages) + + const [page, setPage] = useState(firstPage) + const [lastPage, setLastPage] = useState(page) + const [reachedResults, setReachedResults] = useState(false) + + // tracks last page visited to help navigating between pages from results page + const updatePage = destination => { + setLastPage(page) + setPage(destination) + } + + useEffect(() => { + if (page === Steps.Results) { + setReachedResults(true) + } + }, [page]) + + const activePage = R.find(R.pathEq(['type', 'componentName'], page))(steps) + + const incrementPage = () => { + const pageIndex = R.findIndex(R.equals(page))(pages) + updatePage(pages[pageIndex + 1]) + } + + const decrementPage = () => { + const pageIndex = R.findIndex(R.equals(page))(pages) + updatePage(pages[pageIndex - 1]) + } + + const { validation } = activePage && activePage.type + + const formLayout = () => { + switch (page) { + case Steps.Success: + return false + case Steps.Spinner: + return false + case Steps.Error: + return false + default: + return true + } + } + + return ( + + {({ validateForm, values, setTouched, setFieldValue, errors }) => { + return ( + + + {formLayout() && ( + + )} + + + + + + + + ) + }} + + ) +} + +const onSubmit = ({ + setPage, + snapeatUser: { email, airtableId: userAirtableId }, + foodPhoto, +}) => async values => { + setPage(Steps.Spinner) + + const data = new FormData() + data.set('photo', foodPhoto.file, foodPhoto.fileName) + + try { + //eslint-disable-next-line no-console + console.log('Food data values', values) + // upload photo to cloudinary + const { + data: { url }, + } = await axios.post(`${process.env.HOST}/api/upload-photo`, data) + + // upload meal to DB + const { + data: { meal }, + } = await axios.post(`${process.env.HOST}/api/submit-food-data`, { + imageURL: url, + user: { + email, + }, + ...values, + }) + + setPage(Steps.Success) + + axios.post(`${process.env.HOST}/api/upload-meal-to-airtable`, { + ...values, + imageURL: url, + userAirtableId, + mealId: meal.id, + }) + + return + } catch (e) { + // TODO: trigger submit error (maybe with toast error) + setPage(Steps.Error) + + //eslint-disable-next-line no-console + console.error('Error submitting food data form', e) + } +} + +const ControlsBack = ({ + reachedResults, + decrementPage, + page, + updatePage, + values, +}) => { + const routeDispatch = useRouteDispatch() + + const backOnClick = () => { + const vegetablesSelected = values.categories.includes('vegetables') + const fruitSelected = values.categories.includes('fruit') + + switch (page) { + case Steps.Categories: + return () => routeDispatch({ type: GO_BACK }) + case Steps.FruitProportion: + return () => + vegetablesSelected + ? updatePage(Steps.VegetableProportion) + : updatePage(Steps.Categories) + case Steps.Tags: + return () => { + if (fruitSelected) { + return updatePage(Steps.FruitProportion) + } + if (vegetablesSelected) { + return updatePage(Steps.VegetableProportion) + } + return updatePage(Steps.Categories) + } + default: + return decrementPage + } + } + + return ( + !(page === (Steps.Success || Steps.Spinner || Steps.Error)) && + !reachedResults && ( + + + Back + + + ) + ) +} + +// TODO: make sure back button goes to right place (if fruit and veg have been clicked or not) +// TODO: add validation + +const ControlsNext = ({ + incrementPage, + page, + setPage, + values, + setFieldValue, + foodPhoto, + snapeatUser, + reachedResults, +}) => { + const routeDispatch = useRouteDispatch() + const fruitSelected = values.categories.includes(FRUIT) + const fruitProportionEmpty = values.proportionFruit === '' + const vegetablesSelected = values.categories.includes(VEGETABLES) + const vegetableProportionEmpty = values.proportionVeg === '' + + const getNextFromCategories = () => { + if (vegetablesSelected && vegetableProportionEmpty) { + return setPage(Steps.VegetableProportion) + } + if (fruitSelected && fruitProportionEmpty) { + return setPage(Steps.FruitProportion) + } + if (reachedResults) { + return setPage(Steps.Results) + } + return setPage(Steps.Tags) + } + + const getNextPage = () => { + switch (page) { + case Steps.Categories: + return getNextFromCategories() + + case Steps.VegetableProportion: + if (fruitSelected && fruitProportionEmpty) { + return setPage(Steps.FruitProportion) + } + if (reachedResults) { + return setPage(Steps.Results) + } + return setPage(Steps.Tags) + + case Steps.FruitProportion: + return reachedResults ? setPage(Steps.Results) : setPage(Steps.Tags) + case Steps.Results: + return onSubmit({ setPage, snapeatUser, foodPhoto })(values) + case Steps.Success: + return routeDispatch({ type: CHANGE_VIEW, view: HOME }) + case Steps.Error: + return routeDispatch({ type: CHANGE_VIEW, view: HOME }) + default: + return incrementPage() + } + } + + const nextOnClick = () => { + // resets proportion values if fruit/veg have been unselected + if (!fruitSelected && !fruitProportionEmpty) { + setFieldValue('proportionFruit', '') + } + + if (!vegetablesSelected && !vegetableProportionEmpty) { + setFieldValue('proportionVeg', '') + } + + // regular functions for next button + return getNextPage(vegetablesSelected, fruitSelected) + } + + switch (page) { + case Steps.Success: { + return ( + + Done + + ) + } + case Steps.Error: { + return ( + + Try again + + ) + } + case Steps.Spinner: { + return
+ } + default: { + return ( + + {page === Steps.Results ? ( + + Next + + ) : ( + + Next + + )} + + ) + } + } +} + +const RenderStep = ({ activePage, validateForm, page, setTouched, props }) => { + useEffect(() => { + window.scrollTo(0, 0) + setTouched({}) + validateForm() + }, [page]) + + return React.cloneElement(activePage, props) +} + +const StyledForm = styled(Form).attrs({ + className: 'bg-lightgray flex flex-col items-center', +})`` + +const ImageContainer = styled.div.attrs({ + role: 'img', + 'aria-label': "Photo of user's dinner", +})` + height: 400px; + width: 100vw; + background-image: ${({ src }) => `url(${src})`}; + background-position: center; + background-size: cover; +` + +const StyledControlsBack = styled.nav.attrs({ + className: 'absolute top-0 min-w-full z-10', +})`` + +const Back = styled.button.attrs({ + className: 'm-4', +})`` + +const StyledControlsNext = styled.nav.attrs({ + className: 'flex justify-center pt-4 w-full bg-white', +})` + z-index: 30000; +` + +const StyledControlsDone = styled.nav.attrs({ + className: + 'text-white text-lg text-center absolute bg-navy mx-4 rounded-button shadow-button', +})` + bottom: 40px; + width: calc(100vw - 32px); + padding: 15px 0px; +` + +const Next = styled.button.attrs({ + className: '', +})`` + +const Container = styled.main` + background-color: ${cssTheme('colors.white')}; +` +const FormContainer = styled.div.attrs({ + className: 'absolute', +})` + top: ${({ page, formLayout }) => { + return formLayout(page) ? `300px;` : `0px;` + }}; + min-height: ${({ page, formLayout }) => { + return formLayout(page) ? `auto;` : `100%;` + }}; +` + +export default FoodData diff --git a/views/Home.js b/views/Home.js index 44ac6a3..be352a5 100644 --- a/views/Home.js +++ b/views/Home.js @@ -1,17 +1,128 @@ -import React from "react" -import { useRouteDispatch } from "../utils/routeContext" -import { CHANGE_VIEW, AWAY } from "../utils/constants" +import React, { useEffect, useState } from 'react' +import styled from 'styled-components' +import axios from 'axios' + +import { useRouteDispatch } from '../context/routeContext' +import { useFoodDataDispatch } from '../context/foodDataContext' +import { + CHANGE_VIEW, + // LOADING, + FOOD_DATA, + ERROR, + SET_FOOD_PHOTO, +} from '../utils/constants' +import { HeaderWithLogo } from '../components/Header' +import fileNameFormatter from '../utils/fileNameFormatter' + +import buttonBG from '../public/backgrounds/camera_bg.svg' +import cameraBG from '../public/icons/camera_icn.svg' + +import cameraButton from '../public/icons/btn_round.svg' const Home = () => { const routeDispatch = useRouteDispatch() + const foodDataDispatch = useFoodDataDispatch() + const [photo, setPhoto] = useState() + + useEffect(() => { + const fetchUser = async () => { + try { + await axios.get('/api/me') + } catch (err) { + //eslint-disable-next-line + console.log('error fetching user', err) + window.location.href = '/api/logout' + } + } + fetchUser() + return fetchUser + }, []) + + useEffect(() => { + if (!photo) { + return undefined + } + + if ( + photo.file && + !(photo.file.type === 'image/jpeg' || photo.file.type === 'image/png') + ) { + return routeDispatch({ type: CHANGE_VIEW, view: ERROR }) + } + + foodDataDispatch({ type: SET_FOOD_PHOTO, payload: photo }) + + return routeDispatch({ type: CHANGE_VIEW, view: FOOD_DATA }) + }, [foodDataDispatch, photo, routeDispatch]) + + const onImageSelect = e => { + e.preventDefault() + + const file = e.target.files[0] + + if (file) { + setPhoto({ + file, + fileName: fileNameFormatter(file.name), + fileURL: URL.createObjectURL(file), + }) + } + } + return ( -
-

Home

- -
+ + + +

What is your child eating for dinner?

+

Share a photo

+
+ + + + +
) } +const Dashboard = styled.div.attrs({ + className: 'w-full h-full text-center text-navy', +})` + display: grid; + grid-template-rows: 18% 1fr 25%; + background: url(${cameraBG}) center/45% auto no-repeat; +` + +const Label = styled.label` + height: 100%; + display: grid; + grid-template-rows: 20px 1fr; + grid-gap: 10px; + justify-items: center; +` +const ButtonForm = styled.form.attrs({ + className: 'w-full', +})` + background: url(${buttonBG}) left bottom/contain no-repeat; +` + +const CameraContainer = styled.div.attrs({ + className: 'w-full font-xl px-4 pt-5 pb-2d5', +})`` + export default Home diff --git a/views/Landing.js b/views/Landing.js new file mode 100644 index 0000000..dc4040a --- /dev/null +++ b/views/Landing.js @@ -0,0 +1,93 @@ +import styled from 'styled-components' + +import snapeatLogo from '../public/logos/splash_logo.svg' +import menuBG from '../public/backgrounds/landing_bg.svg' +import dividerSVG from '../public/icons/divider.svg' + +import { useRouteDispatchUnauth } from '../context/unauthRouteContext' +import { CHANGE_VIEW, SECURITY_UNAUTH } from '../utils/constants' + +const Landing = () => { + const routeDispatch = useRouteDispatchUnauth() + return ( + + + + +
+ Welcome! + New here? + Don't worry, just sign up to gain access to Snapeat. +
+ Returning? + Just log in! + + Something wrong? Tell us here + +
+ + Login + +
+ divider +

or

+ divider +
+ + { + return routeDispatch({ type: CHANGE_VIEW, view: SECURITY_UNAUTH }) + }} + > + Sign up + +
+
+ ) +} + +const MenuContainer = styled.div.attrs({ + className: 'w-screen flex justify-center px-6 pt-4', +})` + background: url(${menuBG}) left top/cover no-repeat; +` + +const SnapeatLogo = styled.img.attrs({ + className: 'h-12 sm:h-15', +})`` + +const Text = styled.p.attrs({ + className: 'font-lg sm:font-xl m-4', +})`` + +const Container = styled.section.attrs({ + className: 'h-full w-full', +})` + display: grid; + grid-template-rows: 22% 1fr 200px; + + @media ${cssTheme('media.sm')} { + grid-template-rows: 22% 1fr 260px; + } +` + +const Login = styled.a.attrs({ + className: + 'block text-center bg-navy rounded-button shadow-button w-full text-white py-4', +})`` + +const Signup = styled.button.attrs({ + className: + 'bg-white rounded-button shadow-button w-full text-navy py-4 border border-solid border-navy', +})`` + +const ButtonContainer = styled.div.attrs({ + className: 'w-screen rounded-card shadow-tooltip px-6 py-5 sm:py-12 bg-white', +})`` + +export default Landing diff --git a/views/Loading.js b/views/Loading.js new file mode 100644 index 0000000..7b26dda --- /dev/null +++ b/views/Loading.js @@ -0,0 +1,17 @@ +import React from 'react' +import { useRouteDispatch } from '../context/routeContext' +import { MENU, CHANGE_VIEW } from '../utils/constants' + +const Loading = () => { + const routeDispatch = useRouteDispatch() + return ( +
+

Loading

+ +
+ ) +} + +export default Loading diff --git a/views/Menu.js b/views/Menu.js new file mode 100644 index 0000000..696d884 --- /dev/null +++ b/views/Menu.js @@ -0,0 +1,146 @@ +import React from 'react' +import styled from 'styled-components' +import { useRouteDispatch } from '../context/routeContext' +import { + CHANGE_VIEW, + GO_BACK, + // WELCOME, + // HOME, + // SIGN_UP, + // ONBOARDING, + // SUCCESS, + // SECURITY, + PRIVACY_AUTH, + TERMS_AND_CONDITIONS_AUTH, +} from '../utils/constants' + +import logo from '../public/logos/logo3.svg' +import { Close } from '../components/SecurityPages' + +const Menu = () => { + const routeDispatch = useRouteDispatch() + const signOut = () => { + window.location.href = '/api/logout' + } + + return ( +
+ + + routeDispatch({ type: GO_BACK })} + /> + +
+
signOut()} + onKeyPress={() => signOut()} + > + Sign out +
+
+ routeDispatch({ + type: CHANGE_VIEW, + view: TERMS_AND_CONDITIONS_AUTH, + }) + } + onKeyPress={() => + routeDispatch({ + type: CHANGE_VIEW, + view: TERMS_AND_CONDITIONS_AUTH, + }) + } + > + Terms & Conditions +
+
+ routeDispatch({ type: CHANGE_VIEW, view: PRIVACY_AUTH }) + } + onKeyPress={() => + routeDispatch({ type: CHANGE_VIEW, view: PRIVACY_AUTH }) + } + > + Privacy +
+ + + Report problem + + {/* useful for dev routing */} + {/*
routeDispatch({ type: CHANGE_VIEW, view: HOME })} + onKeyPress={() => routeDispatch({ type: CHANGE_VIEW, view: HOME })} + > + Home +
+
routeDispatch({ type: CHANGE_VIEW, view: WELCOME })} + onKeyPress={() => routeDispatch({ type: CHANGE_VIEW, view: WELCOME })} + > + Welcome +
+
routeDispatch({ type: CHANGE_VIEW, view: SIGN_UP })} + onKeyPress={() => routeDispatch({ type: CHANGE_VIEW, view: SIGN_UP })} + > + Sign up +
+
routeDispatch({ type: CHANGE_VIEW, view: ONBOARDING })} + onKeyPress={() => + routeDispatch({ type: CHANGE_VIEW, view: ONBOARDING }) + } + > + Onboarding +
+
routeDispatch({ type: CHANGE_VIEW, view: PRIVACY })} + onKeyPress={() => routeDispatch({ type: CHANGE_VIEW, view: PRIVACY })} + > + Privacy +
+
routeDispatch({ type: CHANGE_VIEW, view: SUCCESS })} + onKeyPress={() => routeDispatch({ type: CHANGE_VIEW, view: SUCCESS })} + > + Success +
+
routeDispatch({ type: GO_BACK })} + onKeyPress={() => routeDispatch({ type: GO_BACK })} + > + Go back +
*/} +
+
+ ) +} + +const Logo = styled.img.attrs({ + className: 'w-auto sm:w-25 mt-6', +})` + margin-left: calc((100vw - 80px) / 2); + + @media ${cssTheme('media.sm')} { + margin-left: calc((100vw - 100px) / 2); + } +` +const HeaderContainer = styled.div.attrs({ + className: 'absolute w-screen top-0 left-0 z-2', +})`` + +export default Menu diff --git a/views/Onboarding.js b/views/Onboarding.js new file mode 100644 index 0000000..44bdae6 --- /dev/null +++ b/views/Onboarding.js @@ -0,0 +1,363 @@ +import React, { useState, useEffect } from 'react' +import { parsePhoneNumberFromString } from 'libphonenumber-js' + +import * as Yup from 'yup' +import styled from 'styled-components' +import { Formik, Form } from 'formik' +import axios from 'axios' + +import * as R from 'ramda' +import R_ from '../utils/R_' + +import { useAuth } from '../context/authContext' + +import * as Steps from '../components/onboarding' +import PostCode from '../components/onboarding/PostCode' +import NumberOfChildren from '../components/onboarding/NumberOfChildren' +import Ages from '../components/onboarding/Ages' +import Projects from '../components/onboarding/Projects' +import Phone from '../components/onboarding/Phone' + +import Spinner from '../components/onboarding/Spinner' +import Success from '../components/onboarding/Success' +import Error from '../components/onboarding/Error' + +import logo1 from '../public/logos/logo1.svg' +import arrowNext from '../public/icons/arrow_next.svg' +import arrowBack from '../public/icons/back_blue.svg' +import { + FORM_NOT_SENT, + FORM_SENDING, + FORM_ERROR, + FORM_SUCCESS, + NEXT_NOT_ATTEMPTED, + NEXT_ATTEMPTED, +} from '../utils/constants' + +// const initialValues = { +// ages: ['5-8', '9-12'], +// numberOfChildren: '2', +// phoneNumber: '', +// postCode: 'N4 3HF', +// project: 'healthy-lives', +// } + +const initialValues = { + postCode: '', + numberOfChildren: 0, + ages: [], + project: '', + phoneNumber: '', +} + +const initialStatus = NEXT_NOT_ATTEMPTED + +const Onboarding = () => { + return ( + + + + + + + + ) +} + +const MultiStep = ({ children }) => { + const [page, setPage] = useState(Steps.PostCode) + const [validationSchema, setValidationSchema] = useState(Yup.object()) + const [formStatus, setFormStatus] = useState(FORM_NOT_SENT) + const { + setSnapeatUser, + auth0User: { name: email }, + } = useAuth() + const steps = React.Children.toArray(children) + const pages = steps.map(step => step.type.componentName) + const activePage = R.find(R.pathEq(['type', 'componentName'], page))(steps) + const pageIndex = R.findIndex(R.equals(page))(pages) + + const incrementPage = () => { + setPage(pages[pageIndex + 1]) + } + + const decrementPage = () => { + setPage(pages[pageIndex - 1]) + } + + const { validation } = activePage && activePage.type + + useEffect(() => { + if (validation) { + setValidationSchema(validation) + } + }) + + return ( + + {({ + validateForm, + values, + setTouched, + setFieldValue, + errors, + isValid, + submitForm, + setStatus, + status, + }) => { + if (formStatus !== FORM_NOT_SENT) { + return + } + + return ( +
+ + + + + + + +
+ ) + }} +
+ ) +} + +const RenderStep = ({ activePage, validateForm, page, setTouched, props }) => { + useEffect(() => { + window.scrollTo(0, 0) + setTouched({}) + validateForm() + }, [page, setTouched, validateForm]) + + return React.cloneElement(activePage, props) +} + +const onSubmit = ({ setFormStatus, email, setSnapeatUser }) => async values => { + try { + //eslint-disable-next-line no-console + console.log('Onboarding form submitted', values) + setFormStatus(FORM_SENDING) + + const phoneNumber = parsePhoneNumberFromString( + values.phoneNumber, + 'GB', + ).formatInternational() + + const { + data: { user }, + } = await axios.post(`${process.env.HOST}/api/create-user`, { + ...values, + email, + phoneNumber, + }) + + const { + data: { updatedUser }, + } = await axios.post(`${process.env.HOST}/api/upload-user-to-airtable`, { + ...values, + user, + }) + + setSnapeatUser(updatedUser) + //eslint-disable-next-line no-console + console.log('Onboarding successful', user) + + setFormStatus(FORM_SUCCESS) + } catch (e) { + //eslint-disable-next-line no-console + console.error('Error submitting onboarding form', e) + setFormStatus(FORM_ERROR) + } +} + +const Progress = ({ pageIndex, amountOfPages }) => { + const pageNumber = pageIndex + 1 + const createDot = completed => (_, index) => ( + + ) + + const completed = R_.mapIndexed(createDot(true))([...Array(pageNumber)]) + const toComplete = R_.mapIndexed(createDot())([ + ...Array(amountOfPages - pageNumber), + ]) + + return ( + + <> + {completed} + {toComplete} + + + ) +} + +const Back = ({ onClick }) => ( + + Back arrow + Back + +) + +const BottomNav = ({ + incrementPage, + setFormStatus, + pageIndex, + amountOfPages, + isValid, + values, + errors, + email, + setSnapeatUser, + submitForm, + setStatus, +}) => { + const lastPage = amountOfPages - 1 === pageIndex + + return ( + + + {lastPage ? ( + + onSubmit({ setFormStatus, email, setSnapeatUser })(values) + } + /> + ) : ( + { + incrementPage() + setStatus(NEXT_NOT_ATTEMPTED) + } + : () => { + setStatus(NEXT_ATTEMPTED) + submitForm() + } + } + /> + )} + + ) +} + +const FormStatusPage = ({ formStatus }) => { + switch (formStatus) { + case FORM_SENDING: + return + case FORM_SUCCESS: + return + case FORM_ERROR: + return + default: + return null + } +} + +const TopNav = ({ pageIndex, decrementPage }) => { + const firstPage = pageIndex === 0 + return ( + + {!firstPage && } + + ) +} + +const StyledForm = styled(Form).attrs({ + className: 'bg-lightgray min-h-screen px-4 py-5d5 flex flex-col items-center', +})`` + +const Logo = styled.img.attrs({ + src: logo1, + className: '', + alt: 'SnapEat', +})`` + +const Dot = styled.div.attrs(({ completed }) => ({ + className: `mr-2d5 h-2d5 w-2d5 rounded-full bg-navy ${ + completed ? 'opacity-100' : 'opacity-40' + }`, +}))` + &:last-child { + margin-right: 0; + } +` + +const DotsContainer = styled.div.attrs({ + className: 'flex mb-6', +})`` + +const StyledTopNav = styled.nav.attrs(({ firstPage }) => ({ + className: `w-full ${firstPage ? 'mb-16' : 'mb-11'}`, +}))`` + +const Next = styled.button.attrs({ + className: 'w-16d5 h-16d5 shadow-button bg-navy rounded-full', +})` + background: center no-repeat url(${arrowNext}) ${cssTheme('colors.navy')}; +` + +const StyledBack = styled.button.attrs({ + className: 'flex items-center justify-between', + type: 'button', +})`` + +const StyledBottomNav = styled.nav.attrs({ + className: + 'bg-white w-full absolute z-10 bottom-0 rounded-tooltip shadow-tooltip pt-5 pb-6 flex flex-col items-center justify-around', +})`` + +const Main = styled.main.attrs({ + className: 'relative', +})` + min-height: 100vh; +` + +export default Onboarding diff --git a/views/Privacy.js b/views/Privacy.js new file mode 100644 index 0000000..38764d4 --- /dev/null +++ b/views/Privacy.js @@ -0,0 +1,97 @@ +import React, { useEffect } from 'react' + +import { useRouteDispatch, useRouteState } from '../context/routeContext' + +import { + useRouteDispatchUnauth, + useRouteStateUnauth, +} from '../context/unauthRouteContext' + +import { + HOME, + CHANGE_VIEW, + SECURITY_AUTH, + SECURITY_UNAUTH, +} from '../utils/constants' + +import { + HeaderWithGSTCLogo, + Text, + Footer, + Button, +} from '../components/SecurityPages' + +export const PrivacyAuth = () => { + const routeDispatch = useRouteDispatch() + const { history } = useRouteState() + return +} + +export const PrivacyUnauth = () => { + const routeDispatch = useRouteDispatchUnauth() + const { history } = useRouteStateUnauth() + return +} + +const Content = ({ routeDispatch, history }) => { + useEffect(() => { + window.scrollTo(0, 0) + }, []) + + const returnTo = () => { + if (history[history.length - 2] === SECURITY_UNAUTH) { + return SECURITY_UNAUTH + } else if (history[history.length - 2] === SECURITY_AUTH) { + return SECURITY_AUTH + } else return HOME + } + return ( +
+ routeDispatch({ type: CHANGE_VIEW, view: returnTo() })} + /> +
+ + Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do + eiusmod tempor incididunt ut labore et dolore magna aliqua. Nulla + aliquet enim tortor at auctor urna nunc. Cras tincidunt lobortis + feugiat vivamus at augue eget arcu dictum. Nisl rhoncus mattis rhoncus + urna neque viverra justo nec ultrices. Feugiat scelerisque varius + morbi enim nunc faucibus a. Ipsum dolor sit amet consectetur + adipiscing elit pellentesque habitant morbi. Tellus molestie nunc non + blandit massa. Ipsum dolor sit amet consectetur adipiscing elit duis. + Arcu risus quis varius quam. Nam at lectus urna duis convallis + convallis tellus id. Mauris commodo quis imperdiet massa tincidunt. + Pellentesque habitant morbi tristique senectus et netus. Nunc sed + blandit libero volutpat sed cras. Egestas sed tempus urna et. Aliquet + bibendum enim facilisis gravida neque. Ac odio tempor orci dapibus + ultrices in iaculis. Blandit cursus risus at ultrices mi tempus + imperdiet. + + + In pellentesque massa placerat duis ultricies lacus sed. Semper eget + duis at tellus at urna condimentum. Eros donec ac odio tempor orci + dapibus ultrices. Diam sit amet nisl suscipit adipiscing bibendum. + Viverra tellus in hac habitasse. Enim blandit volutpat maecenas + volutpat blandit aliquam etiam erat. Nunc consequat interdum varius + sit amet mattis vulputate enim. Facilisi nullam vehicula ipsum a. + Egestas sed sed risus pretium. Et ultrices neque ornare aenean euismod + elementum nisi quis. Tortor at auctor urna nunc. Ornare quam viverra + orci sagittis eu volutpat. Ut morbi tincidunt augue interdum velit. In + metus vulputate eu scelerisque felis imperdiet proin fermentum leo. + Venenatis urna cursus eget nunc. Posuere sollicitudin aliquam ultrices + sagittis. + +
+
+ +
+
+ ) +} diff --git a/views/Security.js b/views/Security.js new file mode 100644 index 0000000..c5c9149 --- /dev/null +++ b/views/Security.js @@ -0,0 +1,134 @@ +import React, { useEffect } from 'react' + +import { useRouteDispatch } from '../context/routeContext' +import { useRouteDispatchUnauth } from '../context/unauthRouteContext' +import { useConsentDispatch, useConsentState } from '../context/consentContext' +import { + HOME, + CHANGE_VIEW, + TERMS_AND_CONDITIONS_AUTH, + TERMS_AND_CONDITIONS_UNAUTH, + PRIVACY_AUTH, + PRIVACY_UNAUTH, + WELCOME, + SET_CONSENT, + NO_CONSENT_FROM_USER, + ACTIVE_CONSENT_FROM_USER, +} from '../utils/constants' + +import { + HeaderWithGSTCLogo, + Button, + Text, + Label, + Grid, + Checkbox, + Footer, +} from '../components/SecurityPages' + +export const SecurityAuth = () => { + const routeDispatch = useRouteDispatch() + return ( + + ) +} + +export const SecurityUnauth = () => { + const routeDispatch = useRouteDispatchUnauth() + return ( + + ) +} + +const Content = ({ + routeDispatch, + privacy, + termsAndConditions, + continueTo, +}) => { + const consentDispatch = useConsentDispatch() + const hasConsent = useConsentState() === ACTIVE_CONSENT_FROM_USER + + useEffect(() => { + window.scrollTo(0, 0) + }, []) + + return ( +
+ + +
+ + SnapEat is owned and managed by Guys & St Thomas' Charitable + Trust.
+ Everything you share on SnapEat will be stored safely and your + personal data will always be private. Read our Plain English Privacy + Policy{' '} + + . +
+ + + If you are still happy to take part in the SnapEat Project please read + our{' '} + {' '} + and, if you agree with them, click 'I Agree' so that your + family can take part. + +
+
+ + + consentDispatch({ + type: SET_CONSENT, + consent: e.target.checked + ? ACTIVE_CONSENT_FROM_USER + : NO_CONSENT_FROM_USER, + }) + } + /> + + + +
+
+ ) +} diff --git a/views/SignUp.js b/views/SignUp.js new file mode 100644 index 0000000..bc23cb8 --- /dev/null +++ b/views/SignUp.js @@ -0,0 +1,17 @@ +import React from 'react' +import { useRouteDispatch } from '../context/routeContext' +import { HOME, CHANGE_VIEW } from '../utils/constants' + +const SignUp = () => { + const routeDispatch = useRouteDispatch() + return ( +
+

Sign up

+ +
+ ) +} + +export default SignUp diff --git a/views/Spinner.js b/views/Spinner.js new file mode 100644 index 0000000..62be8b7 --- /dev/null +++ b/views/Spinner.js @@ -0,0 +1,17 @@ +import styled from 'styled-components' + +import loading from '../public/icons/loading.svg' + +const Text = styled.p.attrs({ + className: 'font-xxl text-center text-white mb-5 mt-5', +})`` +const Spinner = () => ( +
+
+ Loading + Loading... +
+
+) + +export default Spinner diff --git a/views/TermsAndConditions.js b/views/TermsAndConditions.js new file mode 100644 index 0000000..2dc864a --- /dev/null +++ b/views/TermsAndConditions.js @@ -0,0 +1,96 @@ +import React, { useEffect } from 'react' + +import { useRouteDispatch, useRouteState } from '../context/routeContext' +import { + useRouteDispatchUnauth, + useRouteStateUnauth, +} from '../context/unauthRouteContext' + +import { + HOME, + CHANGE_VIEW, + SECURITY_AUTH, + SECURITY_UNAUTH, +} from '../utils/constants' + +import { + HeaderWithGSTCLogo, + Text, + Footer, + Button, +} from '../components/SecurityPages' + +export const TermsAndConditionsAuth = () => { + const routeDispatch = useRouteDispatch() + const { history } = useRouteState() + return +} + +export const TermsAndConditionsUnauth = () => { + const routeDispatch = useRouteDispatchUnauth() + const { history } = useRouteStateUnauth() + return +} + +const Content = ({ routeDispatch, history }) => { + useEffect(() => { + window.scrollTo(0, 0) + }, []) + + const returnTo = () => { + if (history[history.length - 2] === SECURITY_UNAUTH) { + return SECURITY_UNAUTH + } else if (history[history.length - 2] === SECURITY_AUTH) { + return SECURITY_AUTH + } else return HOME + } + return ( +
+ routeDispatch({ type: CHANGE_VIEW, view: returnTo() })} + /> +
+ + Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do + eiusmod tempor incididunt ut labore et dolore magna aliqua. Nulla + aliquet enim tortor at auctor urna nunc. Cras tincidunt lobortis + feugiat vivamus at augue eget arcu dictum. Nisl rhoncus mattis rhoncus + urna neque viverra justo nec ultrices. Feugiat scelerisque varius + morbi enim nunc faucibus a. Ipsum dolor sit amet consectetur + adipiscing elit pellentesque habitant morbi. Tellus molestie nunc non + blandit massa. Ipsum dolor sit amet consectetur adipiscing elit duis. + Arcu risus quis varius quam. Nam at lectus urna duis convallis + convallis tellus id. Mauris commodo quis imperdiet massa tincidunt. + Pellentesque habitant morbi tristique senectus et netus. Nunc sed + blandit libero volutpat sed cras. Egestas sed tempus urna et. Aliquet + bibendum enim facilisis gravida neque. Ac odio tempor orci dapibus + ultrices in iaculis. Blandit cursus risus at ultrices mi tempus + imperdiet. + + + In pellentesque massa placerat duis ultricies lacus sed. Semper eget + duis at tellus at urna condimentum. Eros donec ac odio tempor orci + dapibus ultrices. Diam sit amet nisl suscipit adipiscing bibendum. + Viverra tellus in hac habitasse. Enim blandit volutpat maecenas + volutpat blandit aliquam etiam erat. Nunc consequat interdum varius + sit amet mattis vulputate enim. Facilisi nullam vehicula ipsum a. + Egestas sed sed risus pretium. Et ultrices neque ornare aenean euismod + elementum nisi quis. Tortor at auctor urna nunc. Ornare quam viverra + orci sagittis eu volutpat. Ut morbi tincidunt augue interdum velit. In + metus vulputate eu scelerisque felis imperdiet proin fermentum leo. + Venenatis urna cursus eget nunc. Posuere sollicitudin aliquam ultrices + sagittis. + +
+
+ +
+
+ ) +} diff --git a/views/Welcome.js b/views/Welcome.js new file mode 100644 index 0000000..dee5a0a --- /dev/null +++ b/views/Welcome.js @@ -0,0 +1,115 @@ +import { useState } from 'react' +import styled from 'styled-components' + +import illustration1 from '../public/illustrations/illustration_1.png' +import illustration2 from '../public/illustrations/illustration_2.png' +import illustration3 from '../public/illustrations/illustration_3.png' + +import progress1 from '../public/icons/progress_1.svg' +import progress2 from '../public/icons/progress_2.svg' +import progress3 from '../public/icons/progress_3.svg' + +import arrowRight from '../public/icons/arrow_right.svg' + +import { useRouteDispatchUnauth } from '../context/unauthRouteContext' + +const Welcome = () => { + const routeDispatch = useRouteDispatchUnauth() + + const [stageIndex, setStageIndex] = useState(0) + const stage = Stages[Object.keys(Stages)[stageIndex]] + + return ( +
+ +
+ +
+
+ ) +} + +const Stages = { + Start: { + illustration: illustration1, + title: 'Hi!', + copy: + 'Thanks for agreeing to take part in SnapEat. A project to see how children in Lambeth and Southwark eat.', + buttonText: 'Start', + progress: progress1, + }, + Next: { + illustration: illustration2, + title: 'How does this work?', + copy: + 'To take part, use this simple app to share what your child is eating for dinner each night for the next 3 months.', + buttonText: 'Next', + progress: progress2, + }, + LetsGo: { + illustration: illustration3, + title: 'Get everyone involved!', + copy: + 'Taking part is quick, easy and, hopefully, fun for you and your children too!', + buttonText: "Let's go!", + progress: progress3, + }, +} + +const Card = ({ stage }) => ( + +
+ +
+
+

+ {stage.title} +

+

{stage.copy}

+
+
+) + +const CardContainer = styled.div.attrs({ + className: 'text-navy bg-white rounded-card shadow-2 py-4 px-6 h-80', +})` + display: grid; + grid-template-rows: 60% 40%; +` + +const CardImage = styled.img.attrs({ + className: 'm-auto', +})` + max-height: 100%; + max-height: -moz-available; /* WebKit-based browsers will ignore this. */ + max-height: -webkit-fill-available; /* Mozilla-based browsers will ignore this. */ + max-height: fill-available; +` + +const Dots = ({ stage }) => form progress +const Button = ({ stage, setStageIndex, stageIndex }) => ( + (location = `${location}api/login`) + : () => setStageIndex(stageIndex + 1) + } + > + {stage.buttonText} + +) + +const ButtonWithArrow = styled.button.attrs({ + className: + 'text-white text-left rounded-button w-1/2 shadow-button px-5 sm:px-9 py-3 sm:py-4 bg-right', +})` + background: ${cssTheme('colors.navy')} url(${arrowRight}) no-repeat 85%; +` + +export default Welcome diff --git a/views/getView.js b/views/getView.js deleted file mode 100644 index 7068319..0000000 --- a/views/getView.js +++ /dev/null @@ -1,2 +0,0 @@ -import views from "./index" -export default routeName => views[routeName]() diff --git a/views/index.js b/views/index.js index f92b55b..f87e318 100644 --- a/views/index.js +++ b/views/index.js @@ -1,8 +1,57 @@ -import { HOME, AWAY } from "../utils/constants" -import Home from "./Home" -import Away from "./Away" +import { + HOME, + ONBOARDING, + SECURITY_AUTH, + SECURITY_UNAUTH, + SPINNER, + WELCOME, + SIGN_UP, + MENU, + CATEGORY_SELECT, + ERROR, + LOADING, + FOOD_DATA, + TERMS_AND_CONDITIONS_AUTH, + TERMS_AND_CONDITIONS_UNAUTH, + PRIVACY_AUTH, + PRIVACY_UNAUTH, + LANDING, +} from '../utils/constants' + +import Home from './Home' +import Onboarding from './Onboarding' +import { SecurityAuth, SecurityUnauth } from './Security' +import Welcome from './Welcome' +import SignUp from './SignUp' +import Menu from './Menu' +import Error from './Error' +import Loading from './Loading' +import Spinner from './Spinner' +import CategorySelect from './CategorySelect' +import FoodData from './FoodData' +import { PrivacyAuth, PrivacyUnauth } from './Privacy' +import { + TermsAndConditionsAuth, + TermsAndConditionsUnauth, +} from './TermsAndConditions' +import Landing from './Landing' export default { [HOME]: Home, - [AWAY]: Away, + [ONBOARDING]: Onboarding, + [WELCOME]: Welcome, + [SECURITY_AUTH]: SecurityAuth, + [SECURITY_UNAUTH]: SecurityUnauth, + [SIGN_UP]: SignUp, + [SPINNER]: Spinner, + [ERROR]: Error, + [MENU]: Menu, + [LOADING]: Loading, + [CATEGORY_SELECT]: CategorySelect, + [FOOD_DATA]: FoodData, + [PRIVACY_AUTH]: PrivacyAuth, + [PRIVACY_UNAUTH]: PrivacyUnauth, + [TERMS_AND_CONDITIONS_AUTH]: TermsAndConditionsAuth, + [TERMS_AND_CONDITIONS_UNAUTH]: TermsAndConditionsUnauth, + [LANDING]: Landing, } diff --git a/yarn.lock b/yarn.lock index 371402c..f4f267d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -33,6 +33,16 @@ resolved "https://registry.yarnpkg.com/@ampproject/toolbox-script-csp/-/toolbox-script-csp-1.1.1.tgz#0b049a1c86c99f300162a10e1b9ce83c6e354a45" integrity sha512-gACGfsVKinCy/977FSrlVgo6jxTZ0lcTCvCnRlNwvSOcxJVm+jJR3sP7/F43fpak9Gsq/EwFaatfnNMbunPc+w== +"@auth0/nextjs-auth0@^0.5.0": + version "0.5.0" + resolved "https://registry.yarnpkg.com/@auth0/nextjs-auth0/-/nextjs-auth0-0.5.0.tgz#892af351f38b6111e186dc249ea8c19ee73a96e2" + integrity sha512-CCvqQG0v1EjGe6LTmg/edCd+WB7AZnr5Czmb9KxYFmsQ5OFB6qLeNhn3uz/xTy145nQcpzM22uxgsRO2iovljw== + dependencies: + "@hapi/iron" "^5.1.4" + base64url "^3.0.1" + cookie "^0.4.0" + openid-client "^3.7.2" + "@babel/code-frame@^7.0.0", "@babel/code-frame@^7.5.5": version "7.5.5" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.5.5.tgz#bc0782f6d69f7b7d49531219699b988f669a8f9d" @@ -60,7 +70,27 @@ semver "^5.4.1" source-map "^0.5.0" -"@babel/generator@^7.6.4", "@babel/generator@^7.7.2": +"@babel/core@^7.1.0": + version "7.7.2" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.7.2.tgz#ea5b99693bcfc058116f42fa1dd54da412b29d91" + integrity sha512-eeD7VEZKfhK1KUXGiyPFettgF3m513f8FoBSWiQ1xTvl1RAopLs42Wp9+Ze911I6H0N9lNqJMDgoZT7gHsipeQ== + dependencies: + "@babel/code-frame" "^7.5.5" + "@babel/generator" "^7.7.2" + "@babel/helpers" "^7.7.0" + "@babel/parser" "^7.7.2" + "@babel/template" "^7.7.0" + "@babel/traverse" "^7.7.2" + "@babel/types" "^7.7.2" + convert-source-map "^1.7.0" + debug "^4.1.0" + json5 "^2.1.0" + lodash "^4.17.13" + resolve "^1.3.2" + semver "^5.4.1" + source-map "^0.5.0" + +"@babel/generator@^7.4.0", "@babel/generator@^7.6.4", "@babel/generator@^7.7.2": version "7.7.2" resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.7.2.tgz#2f4852d04131a5e17ea4f6645488b5da66ebf3af" integrity sha512-WthSArvAjYLz4TcbKOi88me+KmDJdKSlfwwN8CnUYn9jBkzhq0ZEPuBfkAWIvjJ3AdEV1Cf/+eSQTnp3IDJKlQ== @@ -253,7 +283,7 @@ "@babel/traverse" "^7.7.0" "@babel/types" "^7.7.0" -"@babel/helpers@^7.6.2": +"@babel/helpers@^7.6.2", "@babel/helpers@^7.7.0": version "7.7.0" resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.7.0.tgz#359bb5ac3b4726f7c1fde0ec75f64b3f4275d60b" integrity sha512-VnNwL4YOhbejHb7x/b5F39Zdg5vIQpUUNzJwx0ww1EcVRt41bbGRZWhAURrfY32T5zTT3qwNOQFWpn+P0i0a2g== @@ -271,7 +301,7 @@ esutils "^2.0.2" js-tokens "^4.0.0" -"@babel/parser@^7.0.0", "@babel/parser@^7.6.4", "@babel/parser@^7.7.0", "@babel/parser@^7.7.2": +"@babel/parser@^7.0.0", "@babel/parser@^7.1.0", "@babel/parser@^7.4.3", "@babel/parser@^7.6.4", "@babel/parser@^7.7.0", "@babel/parser@^7.7.2": version "7.7.3" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.7.3.tgz#5fad457c2529de476a248f75b0f090b3060af043" integrity sha512-bqv+iCo9i+uLVbI0ILzKkvMorqxouI+GbV13ivcARXn9NNEabi2IEz912IgNpT/60BNXac5dgcfjb94NjsF33A== @@ -361,7 +391,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-syntax-object-rest-spread@^7.2.0": +"@babel/plugin-syntax-object-rest-spread@^7.0.0", "@babel/plugin-syntax-object-rest-spread@^7.2.0": version "7.2.0" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.2.0.tgz#3b7a3e733510c57e820b9142a6579ac8b0dfad2e" integrity sha512-t0JKGgqk2We+9may3t0xDdmneaXmyxq0xieYcKHxIsrJO64n1OiMWNUtc5gQK1PA0NpdCRrtZp4z+IUaKugrSA== @@ -777,14 +807,14 @@ dependencies: regenerator-runtime "^0.13.2" -"@babel/runtime@^7.4.2", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.3": +"@babel/runtime@^7.0.0", "@babel/runtime@^7.3.4", "@babel/runtime@^7.4.2", "@babel/runtime@^7.4.5", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.3": version "7.7.2" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.7.2.tgz#111a78002a5c25fc8e3361bedc9529c696b85a6a" integrity sha512-JONRbXbTXc9WQE2mAZd1p0Z3DZ/6vaQIkgYMSTP3KjRCyd7rCZCcfhCyX+YjwcKxcZ82UrxbRD358bpExNgrjw== dependencies: regenerator-runtime "^0.13.2" -"@babel/template@^7.6.0", "@babel/template@^7.7.0": +"@babel/template@^7.4.0", "@babel/template@^7.6.0", "@babel/template@^7.7.0": version "7.7.0" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.7.0.tgz#4fadc1b8e734d97f56de39c77de76f2562e597d0" integrity sha512-OKcwSYOW1mhWbnTBgQY5lvg1Fxg+VyfQGjcBduZFljfc044J5iDlnDSfhQ867O17XHiSCxYHUxHg2b7ryitbUQ== @@ -793,7 +823,7 @@ "@babel/parser" "^7.7.0" "@babel/types" "^7.7.0" -"@babel/traverse@^7.0.0", "@babel/traverse@^7.6.3", "@babel/traverse@^7.7.0": +"@babel/traverse@^7.0.0", "@babel/traverse@^7.1.0", "@babel/traverse@^7.4.3", "@babel/traverse@^7.6.3", "@babel/traverse@^7.7.0", "@babel/traverse@^7.7.2": version "7.7.2" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.7.2.tgz#ef0a65e07a2f3c550967366b3d9b62a2dcbeae09" integrity sha512-TM01cXib2+rgIZrGJOLaHV/iZUAxf4A0dt5auY6KNZ+cm6aschuJGqKJM3ROTt3raPUdIDk9siAufIFEleRwtw== @@ -808,7 +838,7 @@ globals "^11.1.0" lodash "^4.17.13" -"@babel/types@^7.0.0", "@babel/types@^7.6.3", "@babel/types@^7.7.0", "@babel/types@^7.7.2": +"@babel/types@^7.0.0", "@babel/types@^7.3.0", "@babel/types@^7.4.0", "@babel/types@^7.6.3", "@babel/types@^7.7.0", "@babel/types@^7.7.2": version "7.7.2" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.7.2.tgz#550b82e5571dcd174af576e23f0adba7ffc683f7" integrity sha512-YTf6PXoh3+eZgRCBzzP25Bugd2ngmpQVrk7kXX0i5N9BO7TFBtIgZYs7WtxtOGs8e6A4ZI7ECkbBCEHeXocvOA== @@ -817,6 +847,14 @@ lodash "^4.17.13" to-fast-properties "^2.0.0" +"@cnakazawa/watch@^1.0.3": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@cnakazawa/watch/-/watch-1.0.3.tgz#099139eaec7ebf07a27c1786a3ff64f39464d2ef" + integrity sha512-r5160ogAvGyHsal38Kux7YYtodEKOj89RGb28ht1jh3SJb08VwRwAKKJL0bGb04Zd/3r9FL3BFIc3bBidYffCA== + dependencies: + exec-sh "^0.3.2" + minimist "^1.2.0" + "@csstools/convert-colors@^1.4.0": version "1.4.0" resolved "https://registry.yarnpkg.com/@csstools/convert-colors/-/convert-colors-1.4.0.tgz#ad495dc41b12e75d588c6db8b9834f08fa131eb7" @@ -839,11 +877,223 @@ resolved "https://registry.yarnpkg.com/@emotion/unitless/-/unitless-0.7.4.tgz#a87b4b04e5ae14a88d48ebef15015f6b7d1f5677" integrity sha512-kBa+cDHOR9jpRJ+kcGMsysrls0leukrm68DmFQoMIWQcXdr2cZvyvypWuGYT7U+9kAExUE7+T7r6G3C3A6L8MQ== +"@hapi/address@2.x.x": + version "2.1.2" + resolved "https://registry.yarnpkg.com/@hapi/address/-/address-2.1.2.tgz#1c794cd6dbf2354d1eb1ef10e0303f573e1c7222" + integrity sha512-O4QDrx+JoGKZc6aN64L04vqa7e41tIiLU+OvKdcYaEMP97UttL0f9GIi9/0A4WAMx0uBd6SidDIhktZhgOcN8Q== + +"@hapi/b64@4.x.x": + version "4.2.1" + resolved "https://registry.yarnpkg.com/@hapi/b64/-/b64-4.2.1.tgz#bf8418d7907c5e73463f2e3b5c6fca7e9f2a1357" + integrity sha512-zqHpQuH5CBMw6hADzKfU/IGNrxq1Q+/wTYV+OiZRQN9F3tMyk+9BUMeBvFRMamduuqL8iSp62QAnJ+7ATiYLWA== + dependencies: + "@hapi/hoek" "8.x.x" + +"@hapi/boom@7.x.x": + version "7.4.11" + resolved "https://registry.yarnpkg.com/@hapi/boom/-/boom-7.4.11.tgz#37af8417eb9416aef3367aa60fa04a1a9f1fc262" + integrity sha512-VSU/Cnj1DXouukYxxkes4nNJonCnlogHvIff1v1RVoN4xzkKhMXX+GRmb3NyH1iar10I9WFPDv2JPwfH3GaV0A== + dependencies: + "@hapi/hoek" "8.x.x" + +"@hapi/bourne@1.x.x": + version "1.3.2" + resolved "https://registry.yarnpkg.com/@hapi/bourne/-/bourne-1.3.2.tgz#0a7095adea067243ce3283e1b56b8a8f453b242a" + integrity sha512-1dVNHT76Uu5N3eJNTYcvxee+jzX4Z9lfciqRRHCU27ihbUcYi+iSc2iml5Ke1LXe1SyJCLA0+14Jh4tXJgOppA== + +"@hapi/cryptiles@4.x.x": + version "4.2.1" + resolved "https://registry.yarnpkg.com/@hapi/cryptiles/-/cryptiles-4.2.1.tgz#ff0f18d79074659838caedbb911851313ad1ffbc" + integrity sha512-XoqgKsHK0l/VpqPs+tr6j6vE+VQ3+2bkF2stvttmc7xAOf1oSAwHcJ0tlp/6MxMysktt1IEY0Csy3khKaP9/uQ== + dependencies: + "@hapi/boom" "7.x.x" + +"@hapi/hoek@8.x.x", "@hapi/hoek@^8.3.0": + version "8.5.0" + resolved "https://registry.yarnpkg.com/@hapi/hoek/-/hoek-8.5.0.tgz#2f9ce301c8898e1c3248b0a8564696b24d1a9a5a" + integrity sha512-7XYT10CZfPsH7j9F1Jmg1+d0ezOux2oM2GfArAzLwWe4mE2Dr3hVjsAL6+TFY49RRJlCdJDMw3nJsLFroTc8Kw== + +"@hapi/iron@^5.1.4": + version "5.1.4" + resolved "https://registry.yarnpkg.com/@hapi/iron/-/iron-5.1.4.tgz#7406f36847f798f52b92d1d97f855e27973832b7" + integrity sha512-+ElC+OCiwWLjlJBmm8ZEWjlfzTMQTdgPnU/TsoU5QsktspIWmWi9IU4kU83nH+X/SSya8TP8h8P11Wr5L7dkQQ== + dependencies: + "@hapi/b64" "4.x.x" + "@hapi/boom" "7.x.x" + "@hapi/bourne" "1.x.x" + "@hapi/cryptiles" "4.x.x" + "@hapi/hoek" "8.x.x" + +"@hapi/joi@^15.0.0": + version "15.1.1" + resolved "https://registry.yarnpkg.com/@hapi/joi/-/joi-15.1.1.tgz#c675b8a71296f02833f8d6d243b34c57b8ce19d7" + integrity sha512-entf8ZMOK8sc+8YfeOlM8pCfg3b5+WZIKBfUaaJT8UsjAAPjartzxIYm3TIbjvA4u+u++KbcXD38k682nVHDAQ== + dependencies: + "@hapi/address" "2.x.x" + "@hapi/bourne" "1.x.x" + "@hapi/hoek" "8.x.x" + "@hapi/topo" "3.x.x" + +"@hapi/topo@3.x.x": + version "3.1.6" + resolved "https://registry.yarnpkg.com/@hapi/topo/-/topo-3.1.6.tgz#68d935fa3eae7fdd5ab0d7f953f3205d8b2bfc29" + integrity sha512-tAag0jEcjwH+P2quUfipd7liWCNX2F8NvYjQp2wtInsZxnMlypdw0FtAOLxtvvkO+GSRRbmNi8m/5y42PQJYCQ== + dependencies: + "@hapi/hoek" "^8.3.0" + "@heroku/linewrap@^1.0.0": version "1.0.0" resolved "https://registry.yarnpkg.com/@heroku/linewrap/-/linewrap-1.0.0.tgz#a9d4e99f0a3e423a899b775f5f3d6747a1ff15c6" integrity sha512-qPeQp2DnALUwWKaL6ZXfnOw/lHp+zNg5V8whx5c/Y10HMWYjuQFqKupgoJgyuEYjnvYwoZTarW280+aOXWQLCQ== +"@jest/console@^24.7.1", "@jest/console@^24.9.0": + version "24.9.0" + resolved "https://registry.yarnpkg.com/@jest/console/-/console-24.9.0.tgz#79b1bc06fb74a8cfb01cbdedf945584b1b9707f0" + integrity sha512-Zuj6b8TnKXi3q4ymac8EQfc3ea/uhLeCGThFqXeC8H9/raaH8ARPUTdId+XyGd03Z4In0/VjD2OYFcBF09fNLQ== + dependencies: + "@jest/source-map" "^24.9.0" + chalk "^2.0.1" + slash "^2.0.0" + +"@jest/core@^24.9.0": + version "24.9.0" + resolved "https://registry.yarnpkg.com/@jest/core/-/core-24.9.0.tgz#2ceccd0b93181f9c4850e74f2a9ad43d351369c4" + integrity sha512-Fogg3s4wlAr1VX7q+rhV9RVnUv5tD7VuWfYy1+whMiWUrvl7U3QJSJyWcDio9Lq2prqYsZaeTv2Rz24pWGkJ2A== + dependencies: + "@jest/console" "^24.7.1" + "@jest/reporters" "^24.9.0" + "@jest/test-result" "^24.9.0" + "@jest/transform" "^24.9.0" + "@jest/types" "^24.9.0" + ansi-escapes "^3.0.0" + chalk "^2.0.1" + exit "^0.1.2" + graceful-fs "^4.1.15" + jest-changed-files "^24.9.0" + jest-config "^24.9.0" + jest-haste-map "^24.9.0" + jest-message-util "^24.9.0" + jest-regex-util "^24.3.0" + jest-resolve "^24.9.0" + jest-resolve-dependencies "^24.9.0" + jest-runner "^24.9.0" + jest-runtime "^24.9.0" + jest-snapshot "^24.9.0" + jest-util "^24.9.0" + jest-validate "^24.9.0" + jest-watcher "^24.9.0" + micromatch "^3.1.10" + p-each-series "^1.0.0" + realpath-native "^1.1.0" + rimraf "^2.5.4" + slash "^2.0.0" + strip-ansi "^5.0.0" + +"@jest/environment@^24.9.0": + version "24.9.0" + resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-24.9.0.tgz#21e3afa2d65c0586cbd6cbefe208bafade44ab18" + integrity sha512-5A1QluTPhvdIPFYnO3sZC3smkNeXPVELz7ikPbhUj0bQjB07EoE9qtLrem14ZUYWdVayYbsjVwIiL4WBIMV4aQ== + dependencies: + "@jest/fake-timers" "^24.9.0" + "@jest/transform" "^24.9.0" + "@jest/types" "^24.9.0" + jest-mock "^24.9.0" + +"@jest/fake-timers@^24.9.0": + version "24.9.0" + resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-24.9.0.tgz#ba3e6bf0eecd09a636049896434d306636540c93" + integrity sha512-eWQcNa2YSwzXWIMC5KufBh3oWRIijrQFROsIqt6v/NS9Io/gknw1jsAC9c+ih/RQX4A3O7SeWAhQeN0goKhT9A== + dependencies: + "@jest/types" "^24.9.0" + jest-message-util "^24.9.0" + jest-mock "^24.9.0" + +"@jest/reporters@^24.9.0": + version "24.9.0" + resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-24.9.0.tgz#86660eff8e2b9661d042a8e98a028b8d631a5b43" + integrity sha512-mu4X0yjaHrffOsWmVLzitKmmmWSQ3GGuefgNscUSWNiUNcEOSEQk9k3pERKEQVBb0Cnn88+UESIsZEMH3o88Gw== + dependencies: + "@jest/environment" "^24.9.0" + "@jest/test-result" "^24.9.0" + "@jest/transform" "^24.9.0" + "@jest/types" "^24.9.0" + chalk "^2.0.1" + exit "^0.1.2" + glob "^7.1.2" + istanbul-lib-coverage "^2.0.2" + istanbul-lib-instrument "^3.0.1" + istanbul-lib-report "^2.0.4" + istanbul-lib-source-maps "^3.0.1" + istanbul-reports "^2.2.6" + jest-haste-map "^24.9.0" + jest-resolve "^24.9.0" + jest-runtime "^24.9.0" + jest-util "^24.9.0" + jest-worker "^24.6.0" + node-notifier "^5.4.2" + slash "^2.0.0" + source-map "^0.6.0" + string-length "^2.0.0" + +"@jest/source-map@^24.3.0", "@jest/source-map@^24.9.0": + version "24.9.0" + resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-24.9.0.tgz#0e263a94430be4b41da683ccc1e6bffe2a191714" + integrity sha512-/Xw7xGlsZb4MJzNDgB7PW5crou5JqWiBQaz6xyPd3ArOg2nfn/PunV8+olXbbEZzNl591o5rWKE9BRDaFAuIBg== + dependencies: + callsites "^3.0.0" + graceful-fs "^4.1.15" + source-map "^0.6.0" + +"@jest/test-result@^24.9.0": + version "24.9.0" + resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-24.9.0.tgz#11796e8aa9dbf88ea025757b3152595ad06ba0ca" + integrity sha512-XEFrHbBonBJ8dGp2JmF8kP/nQI/ImPpygKHwQ/SY+es59Z3L5PI4Qb9TQQMAEeYsThG1xF0k6tmG0tIKATNiiA== + dependencies: + "@jest/console" "^24.9.0" + "@jest/types" "^24.9.0" + "@types/istanbul-lib-coverage" "^2.0.0" + +"@jest/test-sequencer@^24.9.0": + version "24.9.0" + resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-24.9.0.tgz#f8f334f35b625a4f2f355f2fe7e6036dad2e6b31" + integrity sha512-6qqsU4o0kW1dvA95qfNog8v8gkRN9ph6Lz7r96IvZpHdNipP2cBcb07J1Z45mz/VIS01OHJ3pY8T5fUY38tg4A== + dependencies: + "@jest/test-result" "^24.9.0" + jest-haste-map "^24.9.0" + jest-runner "^24.9.0" + jest-runtime "^24.9.0" + +"@jest/transform@^24.9.0": + version "24.9.0" + resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-24.9.0.tgz#4ae2768b296553fadab09e9ec119543c90b16c56" + integrity sha512-TcQUmyNRxV94S0QpMOnZl0++6RMiqpbH/ZMccFB/amku6Uwvyb1cjYX7xkp5nGNkbX4QPH/FcB6q1HBTHynLmQ== + dependencies: + "@babel/core" "^7.1.0" + "@jest/types" "^24.9.0" + babel-plugin-istanbul "^5.1.0" + chalk "^2.0.1" + convert-source-map "^1.4.0" + fast-json-stable-stringify "^2.0.0" + graceful-fs "^4.1.15" + jest-haste-map "^24.9.0" + jest-regex-util "^24.9.0" + jest-util "^24.9.0" + micromatch "^3.1.10" + pirates "^4.0.1" + realpath-native "^1.1.0" + slash "^2.0.0" + source-map "^0.6.1" + write-file-atomic "2.4.1" + +"@jest/types@^24.9.0": + version "24.9.0" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-24.9.0.tgz#63cb26cb7500d069e5a389441a7c6ab5e909fc59" + integrity sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw== + dependencies: + "@types/istanbul-lib-coverage" "^2.0.0" + "@types/istanbul-reports" "^1.1.1" + "@types/yargs" "^13.0.0" + "@mrmlnc/readdir-enhanced@^2.2.1": version "2.2.1" resolved "https://registry.yarnpkg.com/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz#524af240d1a360527b730475ecfa1344aa540dde" @@ -852,11 +1102,84 @@ call-me-maybe "^1.0.1" glob-to-regexp "^0.3.0" +"@nodelib/fs.scandir@2.1.3": + version "2.1.3" + resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz#3a582bdb53804c6ba6d146579c46e52130cf4a3b" + integrity sha512-eGmwYQn3gxo4r7jdQnkrrN6bY478C3P+a/y72IJukF8LjB6ZHeB3c+Ehacj3sYeSmUXGlnA67/PmbM9CVwL7Dw== + dependencies: + "@nodelib/fs.stat" "2.0.3" + run-parallel "^1.1.9" + +"@nodelib/fs.stat@2.0.3", "@nodelib/fs.stat@^2.0.2": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.3.tgz#34dc5f4cabbc720f4e60f75a747e7ecd6c175bd3" + integrity sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA== + "@nodelib/fs.stat@^1.1.2": version "1.1.3" resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz#2b5a3ab3f918cca48a8c754c08168e3f03eba61b" integrity sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw== +"@nodelib/fs.walk@^1.2.3": + version "1.2.4" + resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.4.tgz#011b9202a70a6366e436ca5c065844528ab04976" + integrity sha512-1V9XOY4rDW0rehzbrcqAmHnz8e7SKvX27gh8Gt2WgB0+pdzdiLV83p72kZPU+jvMbS1qU5mauP2iOvO8rhmurQ== + dependencies: + "@nodelib/fs.scandir" "2.1.3" + fastq "^1.6.0" + +"@samverschueren/stream-to-observable@^0.3.0": + version "0.3.0" + resolved "https://registry.yarnpkg.com/@samverschueren/stream-to-observable/-/stream-to-observable-0.3.0.tgz#ecdf48d532c58ea477acfcab80348424f8d0662f" + integrity sha512-MI4Xx6LHs4Webyvi6EbspgyAb4D2Q2VtnCQ1blOJcoLS6mVa8lNN2rkIy1CVxfTUpoyIbCTkXES1rLXztFD1lg== + dependencies: + any-observable "^0.3.0" + +"@sindresorhus/is@^0.14.0": + version "0.14.0" + resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.14.0.tgz#9fb3a3cf3132328151f353de4632e01e52102bea" + integrity sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ== + +"@szmarczak/http-timer@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-1.1.2.tgz#b1665e2c461a2cd92f4c1bbf50d5454de0d4b421" + integrity sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA== + dependencies: + defer-to-connect "^1.0.1" + +"@types/babel__core@^7.1.0": + version "7.1.3" + resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.3.tgz#e441ea7df63cd080dfcd02ab199e6d16a735fc30" + integrity sha512-8fBo0UR2CcwWxeX7WIIgJ7lXjasFxoYgRnFHUj+hRvKkpiBJbxhdAPTCY6/ZKM0uxANFVzt4yObSLuTiTnazDA== + dependencies: + "@babel/parser" "^7.1.0" + "@babel/types" "^7.0.0" + "@types/babel__generator" "*" + "@types/babel__template" "*" + "@types/babel__traverse" "*" + +"@types/babel__generator@*": + version "7.6.0" + resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.0.tgz#f1ec1c104d1bb463556ecb724018ab788d0c172a" + integrity sha512-c1mZUu4up5cp9KROs/QAw0gTeHrw/x7m52LcnvMxxOZ03DmLwPV0MlGmlgzV3cnSdjhJOZsj7E7FHeioai+egw== + dependencies: + "@babel/types" "^7.0.0" + +"@types/babel__template@*": + version "7.0.2" + resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.0.2.tgz#4ff63d6b52eddac1de7b975a5223ed32ecea9307" + integrity sha512-/K6zCpeW7Imzgab2bLkLEbz0+1JlFSrUMdw7KoIIu+IUdu51GWaBZpd3y1VXGVXzynvGa4DaIaxNZHiON3GXUg== + dependencies: + "@babel/parser" "^7.1.0" + "@babel/types" "^7.0.0" + +"@types/babel__traverse@*", "@types/babel__traverse@^7.0.6": + version "7.0.7" + resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.0.7.tgz#2496e9ff56196cc1429c72034e07eab6121b6f3f" + integrity sha512-CeBpmX1J8kWLcDEnI3Cl2Eo6RfbGvzUctA+CjZUhOKDFbLfcr7fc4usEqLNWetrlJd7RhAkyYe2czXop4fICpw== + dependencies: + "@babel/types" "^7.3.0" + "@types/body-parser@*": version "1.17.1" resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.17.1.tgz#18fcf61768fb5c30ccc508c21d6fd2e8b3bf7897" @@ -891,6 +1214,11 @@ resolved "https://registry.yarnpkg.com/@types/cookie/-/cookie-0.3.3.tgz#85bc74ba782fb7aa3a514d11767832b0e3bc6803" integrity sha512-LKVP3cgXBT9RYj+t+9FDKwS5tdI+rPBXaNSkma7hvqy35lc7mAokC2zsqWJH0LaqIt3B962nuYI77hsJoT1gow== +"@types/eslint-visitor-keys@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#1ee30d79544ca84d68d4b3cdb0af4f205663dd2d" + integrity sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag== + "@types/events@*": version "3.0.0" resolved "https://registry.yarnpkg.com/@types/events/-/events-3.0.0.tgz#2862f3f58a9a7f7c3e78d79f130dd4d71c25c2a7" @@ -904,7 +1232,7 @@ "@types/node" "*" "@types/range-parser" "*" -"@types/express@^4.16.1": +"@types/express@^4.16.1", "@types/express@^4.17.2": version "4.17.2" resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.2.tgz#a0fb7a23d8855bac31bc01d5a58cadd9b2173e6c" integrity sha512-5mHFNyavtLoJmnusB8OKJ5bshSzw+qkMIBAobLrIM48HJvunFva9mOa6aBwh64lBFyNwBbs0xiEFuj4eU/NjCA== @@ -928,6 +1256,45 @@ "@types/events" "*" "@types/node" "*" +"@types/glob@^7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.1.1.tgz#aa59a1c6e3fbc421e07ccd31a944c30eba521575" + integrity sha512-1Bh06cbWJUHMC97acuD6UMG29nMt0Aqz1vF3guLfG+kHHJhy3AyohZFFxYk2f7Q1SQIrNwvncxAE0N/9s70F2w== + dependencies: + "@types/events" "*" + "@types/minimatch" "*" + "@types/node" "*" + +"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.1.tgz#42995b446db9a48a11a07ec083499a860e9138ff" + integrity sha512-hRJD2ahnnpLgsj6KWMYSrmXkM3rm2Dl1qkx6IOFD5FnuNPXJIG5L0dhgKXCYTRMGzU4n0wImQ/xfmRc4POUFlg== + +"@types/istanbul-lib-report@*": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-1.1.1.tgz#e5471e7fa33c61358dd38426189c037a58433b8c" + integrity sha512-3BUTyMzbZa2DtDI2BkERNC6jJw2Mr2Y0oGI7mRxYNBPxppbtEK1F66u3bKwU2g+wxwWI7PAoRpJnOY1grJqzHg== + dependencies: + "@types/istanbul-lib-coverage" "*" + +"@types/istanbul-reports@^1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-1.1.1.tgz#7a8cbf6a406f36c8add871625b278eaf0b0d255a" + integrity sha512-UpYjBi8xefVChsCoBpKShdxTllC9pwISirfoZsUa2AAdQg/Jd2KQGtSbw+ya7GPo7x/wAPlH6JBhKhAsXUEZNA== + dependencies: + "@types/istanbul-lib-coverage" "*" + "@types/istanbul-lib-report" "*" + +"@types/json-schema@^7.0.3": + version "7.0.3" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.3.tgz#bdfd69d61e464dcc81b25159c270d75a73c1a636" + integrity sha512-Il2DtDVRGDcqjDtE+rF8iqg1CArehSK84HZJCT7AMITlyXRBpuPhqGLDQMowraqqu1coEaimg4ZOqggt6L6L+A== + +"@types/json5@^0.0.29": + version "0.0.29" + resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" + integrity sha1-7ihweulOEdK4J7y+UnC86n8+ce4= + "@types/methods@^1.1.0": version "1.1.0" resolved "https://registry.yarnpkg.com/@types/methods/-/methods-1.1.0.tgz#fa0c8c81992257903f724651ec2500ec427dc32d" @@ -938,6 +1305,11 @@ resolved "https://registry.yarnpkg.com/@types/mime/-/mime-2.0.1.tgz#dc488842312a7f075149312905b5e3c0b054c79d" integrity sha512-FwI9gX75FgVBJ7ywgnq/P7tw+/o1GUbtP0KzbtusLigAOgIgNISRK0ZPl4qertvXSIE8YbsVJueQ90cDt9YYyw== +"@types/minimatch@*": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d" + integrity sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA== + "@types/mongodb@^3.1.14": version "3.3.10" resolved "https://registry.yarnpkg.com/@types/mongodb/-/mongodb-3.3.10.tgz#ef8255cc78b32ecd8afd901796e458f4379d9bc2" @@ -963,6 +1335,11 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-10.17.5.tgz#c1920150f7b90708a7d0f3add12a06bc9123c055" integrity sha512-RElZIr/7JreF1eY6oD5RF3kpmdcreuQPjg5ri4oQ5g9sq7YWU8HkfB3eH8GwAwxf5OaCh0VPi7r4N/yoTGelrA== +"@types/normalize-package-data@^2.4.0": + version "2.4.0" + resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz#e486d0d97396d79beedd0a6e33f4534ff6b4973e" + integrity sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA== + "@types/object-assign@^4.0.30": version "4.0.30" resolved "https://registry.yarnpkg.com/@types/object-assign/-/object-assign-4.0.30.tgz#8949371d5a99f4381ee0f1df0a9b7a187e07e652" @@ -978,12 +1355,12 @@ resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.3.tgz#2ab0d5da2e5815f94b0b9d4b95d1e5f243ab2ca7" integrity sha512-KfRL3PuHmqQLOG+2tGpRO26Ctg+Cq1E01D2DMriKEATHgWLfeNDmq9e29Q9WIky0dQ3NPkd1mzYH8Lm936Z9qw== -"@types/ramda@^0.26.33": - version "0.26.33" - resolved "https://registry.yarnpkg.com/@types/ramda/-/ramda-0.26.33.tgz#5fd1f22381ccf913a3627beb16f468fb57f82d94" - integrity sha512-sUCQmKfAWmlbb6PpFqvndbGgTf0bCcmHLJqMYw8ErVS0UoZTTiz952aFedJhV+JERiVH7poh33358c7p0AAN8A== +"@types/ramda@^0.26.34": + version "0.26.34" + resolved "https://registry.yarnpkg.com/@types/ramda/-/ramda-0.26.34.tgz#e65df964a077e9eb97c412483446681a23e56def" + integrity sha512-5x+oE6PzERYl4IPqjj8DwvlLAz2DiQGv0KMuWM3a1byqQ8k8ebmGWw5TAtpVtDwdQEhs1KVdCtOaLy0iwuqwdQ== dependencies: - ts-toolbelt "^4.7.7" + ts-toolbelt "^4.10.7" "@types/range-parser@*": version "1.2.3" @@ -1006,11 +1383,92 @@ "@types/express-serve-static-core" "*" "@types/mime" "*" +"@types/stack-utils@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-1.0.1.tgz#0a851d3bd96498fa25c33ab7278ed3bd65f06c3e" + integrity sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw== + "@types/tough-cookie@^2.3.0": version "2.3.5" resolved "https://registry.yarnpkg.com/@types/tough-cookie/-/tough-cookie-2.3.5.tgz#9da44ed75571999b65c37b60c9b2b88db54c585d" integrity sha512-SCcK7mvGi3+ZNz833RRjFIxrn4gI1PPR3NtuIS+6vMkvmsGjosqTJwRt5bAEFLRz+wtJMWv8+uOnZf2hi2QXTg== +"@types/yargs-parser@*": + version "13.1.0" + resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-13.1.0.tgz#c563aa192f39350a1d18da36c5a8da382bbd8228" + integrity sha512-gCubfBUZ6KxzoibJ+SCUc/57Ms1jz5NjHe4+dI2krNmU5zCPAphyLJYyTOg06ueIyfj+SaCUqmzun7ImlxDcKg== + +"@types/yargs@^13.0.0": + version "13.0.3" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-13.0.3.tgz#76482af3981d4412d65371a318f992d33464a380" + integrity sha512-K8/LfZq2duW33XW/tFwEAfnZlqIfVsoyRB3kfXdPXYhl0nfM8mmh7GS0jg7WrX2Dgq/0Ha/pR1PaR+BvmWwjiQ== + dependencies: + "@types/yargs-parser" "*" + +"@typescript-eslint/eslint-plugin@^2.9.0": + version "2.9.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.9.0.tgz#fa810282c0e45f6c2310b9c0dfcd25bff97ab7e9" + integrity sha512-98rfOt3NYn5Gr9wekTB8TexxN6oM8ZRvYuphPs1Atfsy419SDLYCaE30aJkRiiTCwGEY98vOhFsEVm7Zs4toQQ== + dependencies: + "@typescript-eslint/experimental-utils" "2.9.0" + eslint-utils "^1.4.3" + functional-red-black-tree "^1.0.1" + regexpp "^3.0.0" + tsutils "^3.17.1" + +"@typescript-eslint/experimental-utils@2.9.0": + version "2.9.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-2.9.0.tgz#bbe99a8d9510240c055fc4b17230dd0192ba3c7f" + integrity sha512-0lOLFdpdJsCMqMSZT7l7W2ta0+GX8A3iefG3FovJjrX+QR8y6htFlFdU7aOVPL6pDvt6XcsOb8fxk5sq+girTw== + dependencies: + "@types/json-schema" "^7.0.3" + "@typescript-eslint/typescript-estree" "2.9.0" + eslint-scope "^5.0.0" + +"@typescript-eslint/experimental-utils@^2.5.0": + version "2.7.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-2.7.0.tgz#58d790a3884df3041b5a5e08f9e5e6b7c41864b5" + integrity sha512-9/L/OJh2a5G2ltgBWJpHRfGnt61AgDeH6rsdg59BH0naQseSwR7abwHq3D5/op0KYD/zFT4LS5gGvWcMmegTEg== + dependencies: + "@types/json-schema" "^7.0.3" + "@typescript-eslint/typescript-estree" "2.7.0" + eslint-scope "^5.0.0" + +"@typescript-eslint/parser@^2.9.0": + version "2.9.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-2.9.0.tgz#2e9cf438de119b143f642a3a406e1e27eb70b7cd" + integrity sha512-fJ+dNs3CCvEsJK2/Vg5c2ZjuQ860ySOAsodDPwBaVlrGvRN+iCNC8kUfLFL8cT49W4GSiLPa/bHiMjYXA7EhKQ== + dependencies: + "@types/eslint-visitor-keys" "^1.0.0" + "@typescript-eslint/experimental-utils" "2.9.0" + "@typescript-eslint/typescript-estree" "2.9.0" + eslint-visitor-keys "^1.1.0" + +"@typescript-eslint/typescript-estree@2.7.0": + version "2.7.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-2.7.0.tgz#34fd98c77a07b40d04d5b4203eddd3abeab909f4" + integrity sha512-vVCE/DY72N4RiJ/2f10PTyYekX2OLaltuSIBqeHYI44GQ940VCYioInIb8jKMrK9u855OEJdFC+HmWAZTnC+Ag== + dependencies: + debug "^4.1.1" + glob "^7.1.4" + is-glob "^4.0.1" + lodash.unescape "4.0.1" + semver "^6.3.0" + tsutils "^3.17.1" + +"@typescript-eslint/typescript-estree@2.9.0": + version "2.9.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-2.9.0.tgz#09138daf8f47d0e494ba7db9e77394e928803017" + integrity sha512-v6btSPXEWCP594eZbM+JCXuFoXWXyF/z8kaSBSdCb83DF+Y7+xItW29SsKtSULgLemqJBT+LpT+0ZqdfH7QVmA== + dependencies: + debug "^4.1.1" + eslint-visitor-keys "^1.1.0" + glob "^7.1.6" + is-glob "^4.0.1" + lodash.unescape "4.0.1" + semver "^6.3.0" + tsutils "^3.17.1" + "@webassemblyjs/ast@1.8.5": version "1.8.5" resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.8.5.tgz#51b1c5fe6576a34953bf4b253df9f0d490d9e359" @@ -1186,6 +1644,11 @@ mini-css-extract-plugin "0.4.3" postcss-loader "3.0.0" +abab@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.3.tgz#623e2075e02eb2d3f2475e49f99c91846467907a" + integrity sha512-tsFzPpcttalNjFBCFMqsKYQcWxxen1pgJR56by//QwvJc4/OUS3kPOOttx2tSIfjsylB0pYu7f5D3K1RCxUnUg== + abbrev@1: version "1.1.1" resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" @@ -1199,12 +1662,30 @@ accepts@~1.3.5, accepts@~1.3.7: mime-types "~2.1.24" negotiator "0.6.2" -acorn-jsx@^5.0.0, acorn-jsx@^5.1.0: +acorn-globals@^4.1.0: + version "4.3.4" + resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-4.3.4.tgz#9fa1926addc11c97308c4e66d7add0d40c3272e7" + integrity sha512-clfQEh21R+D0leSbUdWf3OcfqyaCSAQ8Ryq00bofSekfr9W8u1jyYZo6ir0xu9Gtcf7BjcHJpnbZH7JOCpP60A== + dependencies: + acorn "^6.0.1" + acorn-walk "^6.0.1" + +acorn-jsx@^5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.1.0.tgz#294adb71b57398b0680015f0a38c563ee1db5384" integrity sha512-tMUqwBWfLFbJbizRmEcWSLw6HnFzfdJs2sOJEOwwtVPMoH/0Ay+E703oZz78VSXZiiDcZrQ5XKjPIUQixhmgVw== -acorn@^6.0.7, acorn@^6.2.1: +acorn-walk@^6.0.1: + version "6.2.0" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-6.2.0.tgz#123cb8f3b84c2171f1f7fb252615b1c78a6b1a8c" + integrity sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA== + +acorn@^5.5.3: + version "5.7.3" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.3.tgz#67aa231bf8812974b85235a96771eb6bd07ea279" + integrity sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw== + +acorn@^6.0.1, acorn@^6.2.1: version "6.3.0" resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.3.0.tgz#0087509119ffa4fc0a0041d1e93a417e68cb856e" integrity sha512-/czfa8BwS88b9gWQVhc8eknunSA2DoJpJyTQkhheIf5E48u1N0R4q/YxxsAeqRrmK9TQ/uYfgLDfZo91UlANIA== @@ -1226,6 +1707,24 @@ agent-base@4, agent-base@^4.3.0: dependencies: es6-promisify "^5.0.0" +aggregate-error@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.0.1.tgz#db2fe7246e536f40d9b5442a39e117d7dd6a24e0" + integrity sha512-quoaXsZ9/BLNae5yiNoUz+Nhkwz83GhWwtYFglcjEQB2NDHCIpApbqXxIFnm4Pq/Nvhrsq5sYJFyohrrxnTGAA== + dependencies: + clean-stack "^2.0.0" + indent-string "^4.0.0" + +airtable@^0.8.1: + version "0.8.1" + resolved "https://registry.yarnpkg.com/airtable/-/airtable-0.8.1.tgz#8d10f04f41673b86ed75fa054f54470357e36ae0" + integrity sha512-Cxw55ta1olDwDERz++HFJOBX6LONtg+d7+wOcYguqI4PR4P5RHmgjTbY8tPKgLHb8U3FVOyAbpb7NpLRSnLGgg== + dependencies: + es6-promise "4.2.8" + lodash "4.17.15" + request "2.88.0" + xhr "2.3.3" + ajv-errors@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/ajv-errors/-/ajv-errors-1.0.1.tgz#f35986aceb91afadec4102fbd85014950cefa64d" @@ -1246,7 +1745,7 @@ ajv@5: fast-json-stable-stringify "^2.0.0" json-schema-traverse "^0.3.0" -ajv@^6.0.1, ajv@^6.1.0, ajv@^6.10.0, ajv@^6.10.2, ajv@^6.5.5, ajv@^6.9.1: +ajv@^6.0.1, ajv@^6.1.0, ajv@^6.10.0, ajv@^6.10.2, ajv@^6.5.5: version "6.10.2" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.10.2.tgz#d3cea04d6b017b2894ad69040fec8b623eb4bd52" integrity sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw== @@ -1304,7 +1803,7 @@ ansi-regex@^3.0.0: resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= -ansi-regex@^4.1.0: +ansi-regex@^4.0.0, ansi-regex@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== @@ -1336,6 +1835,11 @@ ansicolors@~0.3.2: resolved "https://registry.yarnpkg.com/ansicolors/-/ansicolors-0.3.2.tgz#665597de86a9ffe3aa9bfbe6cae5c6ea426b4979" integrity sha1-ZlWX3oap/+Oqm/vmyuXG6kJrSXk= +any-observable@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/any-observable/-/any-observable-0.3.0.tgz#af933475e5806a67d0d7df090dd5e8bef65d119b" + integrity sha512-/FQM1EDkTsf63Ub2C6O7GuYFDsSXUwsaZDurV0np41ocwq0jthUAYCmhBX9f+KwlaCgIuWyr/4WlUQUBfKfZog== + anymatch@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" @@ -1415,6 +1919,14 @@ argparse@^1.0.7: dependencies: sprintf-js "~1.0.2" +aria-query@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-3.0.0.tgz#65b3fcc1ca1155a8c9ae64d6eee297f15d5133cc" + integrity sha1-ZbP8wcoRVajJrmTW7uKX8V1RM8w= + dependencies: + ast-types-flow "0.0.7" + commander "^2.11.0" + arr-diff@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" @@ -1435,6 +1947,16 @@ array-differ@^1.0.0: resolved "https://registry.yarnpkg.com/array-differ/-/array-differ-1.0.0.tgz#eff52e3758249d33be402b8bb8e564bb2b5d4031" integrity sha1-7/UuN1gknTO+QCuLuOVkuytdQDE= +array-equal@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/array-equal/-/array-equal-1.0.0.tgz#8c2a5ef2472fd9ea742b04c77a75093ba2757c93" + integrity sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM= + +array-find@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/array-find/-/array-find-1.0.0.tgz#6c8e286d11ed768327f8e62ecee87353ca3e78b8" + integrity sha1-bI4obRHtdoMn+OYuzuhzU8o+eLg= + array-flatten@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" @@ -1455,6 +1977,11 @@ array-union@^1.0.1: dependencies: array-uniq "^1.0.1" +array-union@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" + integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== + array-uniq@^1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" @@ -1470,7 +1997,7 @@ arrify@^1.0.0, arrify@^1.0.1: resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" integrity sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0= -asap@~2.0.3: +asap@^2.0.0, asap@~2.0.3: version "2.0.6" resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" integrity sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY= @@ -1484,6 +2011,15 @@ asn1.js@^4.0.0: inherits "^2.0.1" minimalistic-assert "^1.0.0" +asn1.js@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-5.2.0.tgz#292c0357f26a47802ac9727e8772c09c7fc9bd85" + integrity sha512-Q7hnYGGNYbcmGrCPulXfkEw7oW7qjWeM4ZTALmgpuIcZLxyqqKYWxCZg2UBm8bklrnB4m2mGyJPWfoktdORD8A== + dependencies: + bn.js "^4.0.0" + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + asn1@~0.2.3: version "0.2.4" resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136" @@ -1509,6 +2045,11 @@ assign-symbols@^1.0.0: resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= +ast-types-flow@0.0.7, ast-types-flow@^0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/ast-types-flow/-/ast-types-flow-0.0.7.tgz#f70b735c6bca1a5c9c22d982c3e39e7feba3bdad" + integrity sha1-9wtzXGvKGlycItmCw+Oef+ujva0= + astral-regex@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" @@ -1569,7 +2110,7 @@ autodll-webpack-plugin@0.4.2: webpack-merge "^4.1.0" webpack-sources "^1.0.1" -autoprefixer@^9.4.5, autoprefixer@^9.6.1: +autoprefixer@^9.4.5, autoprefixer@^9.6.1, autoprefixer@^9.7.1: version "9.7.1" resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.7.1.tgz#9ffc44c55f5ca89253d9bb7186cefb01ef57747f" integrity sha512-w3b5y1PXWlhYulevrTJ0lizkQ5CyqfeU6BIRDbuhsMupstHQOeb1Ur80tcB1zxSu7AwyY/qCQ7Vvqklh31ZBFw== @@ -1600,6 +2141,13 @@ axios@^0.19.0: follow-redirects "1.5.10" is-buffer "^2.0.2" +axobject-query@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-2.0.2.tgz#ea187abe5b9002b377f925d8bf7d1c561adf38f9" + integrity sha512-MCeek8ZH7hKyO1rWUbKNQBbl4l2eY0ntk7OGi+q0RlafrCnfPxC06WZA+uebCfmYp4mNU9jRBP1AhGyf8+W3ww== + dependencies: + ast-types-flow "0.0.7" + babel-code-frame@^6.22.0, babel-code-frame@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" @@ -1614,7 +2162,7 @@ babel-core@7.0.0-bridge.0: resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-7.0.0-bridge.0.tgz#95a492ddd90f9b4e9a4a1da14eb335b87b634ece" integrity sha512-poPX9mZH/5CSanm50Q+1toVci6pv5KSRv/5TWCwtzQS5XEwn40BcCrgIeMFWP9CKKIniKXNxoIOnOq4VVlGXhg== -babel-eslint@^10.0.1, babel-eslint@^10.0.3: +babel-eslint@^10.0.3: version "10.0.3" resolved "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-10.0.3.tgz#81a2c669be0f205e19462fed2482d33e4687a88a" integrity sha512-z3U7eMY6r/3f3/JB9mTsLjyxrv0Yb1zb8PCWCLpguxfCzBIZUwy23R1t/XKewP+8mEN2Ck8Dtr4q20z6ce6SoA== @@ -1626,6 +2174,26 @@ babel-eslint@^10.0.1, babel-eslint@^10.0.3: eslint-visitor-keys "^1.0.0" resolve "^1.12.0" +babel-extract-comments@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/babel-extract-comments/-/babel-extract-comments-1.0.0.tgz#0a2aedf81417ed391b85e18b4614e693a0351a21" + integrity sha512-qWWzi4TlddohA91bFwgt6zO/J0X+io7Qp184Fw0m2JYRSTZnJbFR8+07KmzudHCZgOiKRCrjhylwv9Xd8gfhVQ== + dependencies: + babylon "^6.18.0" + +babel-jest@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-24.9.0.tgz#3fc327cb8467b89d14d7bc70e315104a783ccd54" + integrity sha512-ntuddfyiN+EhMw58PTNL1ph4C9rECiQXjI4nMMBKBaNjXvqLdkXpPRcMSr4iyBrJg/+wz9brFUD6RhOAT6r4Iw== + dependencies: + "@jest/transform" "^24.9.0" + "@jest/types" "^24.9.0" + "@types/babel__core" "^7.1.0" + babel-plugin-istanbul "^5.1.0" + babel-preset-jest "^24.9.0" + chalk "^2.4.2" + slash "^2.0.0" + babel-loader@8.0.6: version "8.0.6" resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.0.6.tgz#e33bdb6f362b03f4bb141a0c21ab87c501b70dfb" @@ -1643,6 +2211,23 @@ babel-plugin-dynamic-import-node@^2.3.0: dependencies: object.assign "^4.1.0" +babel-plugin-istanbul@^5.1.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-5.2.0.tgz#df4ade83d897a92df069c4d9a25cf2671293c854" + integrity sha512-5LphC0USA8t4i1zCtjbbNb6jJj/9+X6P37Qfirc/70EQ34xKlMW+a1RHGwxGI+SwWpNwZ27HqvzAobeqaXwiZw== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + find-up "^3.0.0" + istanbul-lib-instrument "^3.3.0" + test-exclude "^5.2.3" + +babel-plugin-jest-hoist@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-24.9.0.tgz#4f837091eb407e01447c8843cbec546d0002d756" + integrity sha512-2EMA2P8Vp7lG0RAzr4HXqtYwacfMErOuv1U3wrvxHX6rD1sV6xS3WXG3r8TRQ2r6w8OhvSdWt+z41hQNwNm3Xw== + dependencies: + "@types/babel__traverse" "^7.0.6" + "babel-plugin-styled-components@>= 1": version "1.10.6" resolved "https://registry.yarnpkg.com/babel-plugin-styled-components/-/babel-plugin-styled-components-1.10.6.tgz#f8782953751115faf09a9f92431436912c34006b" @@ -1658,6 +2243,11 @@ babel-plugin-syntax-jsx@6.18.0, babel-plugin-syntax-jsx@^6.18.0: resolved "https://registry.yarnpkg.com/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz#0af32a9a6e13ca7a3fd5069e62d7b0f58d0d8946" integrity sha1-CvMqmm4Tyno/1QaeYtew9Y0NiUY= +babel-plugin-syntax-object-rest-spread@^6.8.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz#fd6536f2bce13836ffa3a5458c4903a597bb3bf5" + integrity sha1-/WU28rzhODb/o6VFjEkDpZe7O/U= + babel-plugin-transform-define@1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-define/-/babel-plugin-transform-define-1.3.1.tgz#b21b7bad3b84cf8e3f07cdc8c660b99cbbc01213" @@ -1666,11 +2256,27 @@ babel-plugin-transform-define@1.3.1: lodash "^4.17.11" traverse "0.6.6" +babel-plugin-transform-object-rest-spread@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz#0f36692d50fef6b7e2d4b3ac1478137a963b7b06" + integrity sha1-DzZpLVD+9rfi1LOsFHgTepY7ewY= + dependencies: + babel-plugin-syntax-object-rest-spread "^6.8.0" + babel-runtime "^6.26.0" + babel-plugin-transform-react-remove-prop-types@0.4.24: version "0.4.24" resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-remove-prop-types/-/babel-plugin-transform-react-remove-prop-types-0.4.24.tgz#f2edaf9b4c6a5fbe5c1d678bfb531078c1555f3a" integrity sha512-eqj0hVcJUR57/Ug2zE1Yswsw4LhuqqHhD+8v120T1cl3kjg76QwtyBrdIk4WVwK+lAhBJVYCd/v+4nc4y+8JsA== +babel-preset-jest@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-24.9.0.tgz#192b521e2217fb1d1f67cf73f70c336650ad3cdc" + integrity sha512-izTUuhE4TMfTRPF92fFwD2QfdXaZW08qvWTFCI51V8rW5x00UuPgc3ajRoWofXOuxjfcOM5zzSYsQS3H8KGCAg== + dependencies: + "@babel/plugin-syntax-object-rest-spread" "^7.0.0" + babel-plugin-jest-hoist "^24.9.0" + babel-runtime@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" @@ -1689,6 +2295,11 @@ babel-types@6.26.0: lodash "^4.17.4" to-fast-properties "^1.0.3" +babylon@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" + integrity sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ== + backo2@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/backo2/-/backo2-1.0.2.tgz#31ab1ac8b129363463e35b3ebb69f4dfcfba7947" @@ -1704,7 +2315,7 @@ base64-js@^1.0.2: resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.1.tgz#58ece8cb75dd07e71ed08c736abc5fac4dbf8df1" integrity sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g== -base64url@3.x.x: +base64url@3.x.x, base64url@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/base64url/-/base64url-3.0.1.tgz#6399d572e2bc3f90a9a8b22d5dbb0a32d33f788d" integrity sha512-ir1UPr3dkwexU7FdV8qBBbNDRUhMmIekYMFZfi+C/sLNnRESKPl23nB9b2pltqfOQNnGzsDdId90AEtG5tCx4A== @@ -1815,11 +2426,30 @@ braces@^2.3.1, braces@^2.3.2: split-string "^3.0.2" to-regex "^3.0.1" +braces@^3.0.1: + version "3.0.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + dependencies: + fill-range "^7.0.1" + brorand@^1.0.1: version "1.1.0" resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8= +browser-process-hrtime@^0.1.2: + version "0.1.3" + resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-0.1.3.tgz#616f00faef1df7ec1b5bf9cfe2bdc3170f26c7b4" + integrity sha512-bRFnI4NnjO6cnyLmOV/7PVoDEMJChlcfN0z4s1YMBY989/SvlfMI1lgCnkFUs53e9gQF+w7qu7XdllSTiSl8Aw== + +browser-resolve@^1.11.3: + version "1.11.3" + resolved "https://registry.yarnpkg.com/browser-resolve/-/browser-resolve-1.11.3.tgz#9b7cbb3d0f510e4cb86bdbd796124d28b5890af6" + integrity sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ== + dependencies: + resolve "1.1.7" + browserify-aes@^1.0.0, browserify-aes@^1.0.4: version "1.2.0" resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" @@ -1888,6 +2518,13 @@ browserslist@^4.6.0, browserslist@^4.6.4, browserslist@^4.7.2: electron-to-chromium "^1.3.295" node-releases "^1.1.38" +bser@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05" + integrity sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ== + dependencies: + node-int64 "^0.4.0" + bson@^1.1.1: version "1.1.3" resolved "https://registry.yarnpkg.com/bson/-/bson-1.1.3.tgz#aa82cb91f9a453aaa060d6209d0675114a8154d3" @@ -1968,6 +2605,25 @@ bytes@3.1.0, bytes@^3.0.0: resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6" integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg== +cacache@^10.0.4: + version "10.0.4" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-10.0.4.tgz#6452367999eff9d4188aefd9a14e9d7c6a263460" + integrity sha512-Dph0MzuH+rTQzGPNT9fAnrPmMmjKfST6trxJeK7NQuHRaVw24VzPRWTmg9MpcwOVQZO0E1FBICUlFeNaKPIfHA== + dependencies: + bluebird "^3.5.1" + chownr "^1.0.1" + glob "^7.1.2" + graceful-fs "^4.1.11" + lru-cache "^4.1.1" + mississippi "^2.0.0" + mkdirp "^0.5.1" + move-concurrently "^1.0.1" + promise-inflight "^1.0.1" + rimraf "^2.6.2" + ssri "^5.2.4" + unique-filename "^1.1.0" + y18n "^4.0.0" + cacache@^12.0.2: version "12.0.3" resolved "https://registry.yarnpkg.com/cacache/-/cacache-12.0.3.tgz#be99abba4e1bf5df461cd5a2c1071fc432573390" @@ -2004,6 +2660,19 @@ cache-base@^1.0.1: union-value "^1.0.0" unset-value "^1.0.0" +cacheable-request@^6.0.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-6.1.0.tgz#20ffb8bd162ba4be11e9567d823db651052ca912" + integrity sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg== + dependencies: + clone-response "^1.0.2" + get-stream "^5.1.0" + http-cache-semantics "^4.0.0" + keyv "^3.0.0" + lowercase-keys "^2.0.0" + normalize-url "^4.1.0" + responselike "^1.0.2" + call-me-maybe@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/call-me-maybe/-/call-me-maybe-1.0.1.tgz#26d208ea89e37b5cbde60250a15f031c16a4d66b" @@ -2066,6 +2735,13 @@ caniuse-lite@^1.0.30000981, caniuse-lite@^1.0.30001004, caniuse-lite@^1.0.300010 resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001008.tgz#b8841b1df78a9f5ed9702537ef592f1f8772c0d9" integrity sha512-b8DJyb+VVXZGRgJUa30cbk8gKHZ3LOZTBLaUEEVr2P4xpmFigOCc62CO4uzquW641Ouq1Rm9N+rWLWdSYDaDIw== +capture-exit@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/capture-exit/-/capture-exit-2.0.0.tgz#fb953bfaebeb781f62898239dabb426d08a509a4" + integrity sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g== + dependencies: + rsvp "^4.8.4" + capture-stack-trace@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/capture-stack-trace/-/capture-stack-trace-1.0.1.tgz#a6c0bbe1f38f3aa0b92238ecb6ff42c344d4135d" @@ -2101,7 +2777,7 @@ chalk@2.4.2, chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.3.0, chalk@^2.4. escape-string-regexp "^1.0.5" supports-color "^5.3.0" -chalk@^1.1.3: +chalk@^1.0.0, chalk@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" integrity sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg= @@ -2148,7 +2824,7 @@ chokidar@^2.0.2, chokidar@^2.0.4, chokidar@^2.1.8: optionalDependencies: fsevents "^1.2.7" -chownr@^1.1.1: +chownr@^1.0.1, chownr@^1.1.1: version "1.1.3" resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.3.tgz#42d837d5239688d55f303003a508230fa6727142" integrity sha512-i70fVHhmV3DtTl6nqvZOnIjbY0Pe4kAUjwHj8z0zAdgBtYrJyYwLKCCuRBQ5ppkyL0AkN7HKRnETdmdp1zqNXw== @@ -2160,7 +2836,7 @@ chrome-trace-event@^1.0.2: dependencies: tslib "^1.9.0" -ci-info@2.0.0: +ci-info@2.0.0, ci-info@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== @@ -2193,12 +2869,24 @@ classnames@^2.2.6: resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.2.6.tgz#43935bffdd291f326dad0a205309b38d00f650ce" integrity sha512-JR/iSQOSt+LQIWwrwEzJ9uk0xfN3mTVYMwt1Ir5mUcSN6pU+V4zQFFaJsclJbPuAUQH+yfWef6tm7l1quW3C8Q== +clean-stack@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" + integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== + +clean-webpack-plugin@^0.1.19: + version "0.1.19" + resolved "https://registry.yarnpkg.com/clean-webpack-plugin/-/clean-webpack-plugin-0.1.19.tgz#ceda8bb96b00fe168e9b080272960d20fdcadd6d" + integrity sha512-M1Li5yLHECcN2MahoreuODul5LkjohJGFxLPTjl3j1ttKrF5rgjZET1SJduuqxLAuT1gAPOdkhg03qcaaU1KeA== + dependencies: + rimraf "^2.6.1" + cli-boxes@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-1.0.0.tgz#4fa917c3e59c94a004cd61f8ee509da651687143" integrity sha1-T6kXw+WclKAEzWH47lCdplFocUM= -cli-cursor@^2.1.0: +cli-cursor@^2.0.0, cli-cursor@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" integrity sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU= @@ -2224,6 +2912,14 @@ cli-table@^0.3.1: dependencies: colors "1.0.3" +cli-truncate@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-0.2.1.tgz#9f15cfbb0705005369216c626ac7d05ab90dd574" + integrity sha1-nxXPuwcFAFNpIWxiasfQWrkN1XQ= + dependencies: + slice-ansi "0.0.4" + string-width "^1.0.1" + cli-width@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639" @@ -2246,11 +2942,36 @@ cliui@^4.0.0: strip-ansi "^4.0.0" wrap-ansi "^2.0.0" +cliui@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5" + integrity sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA== + dependencies: + string-width "^3.1.0" + strip-ansi "^5.2.0" + wrap-ansi "^5.1.0" + +clone-response@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/clone-response/-/clone-response-1.0.2.tgz#d1dc973920314df67fbeb94223b4ee350239e96b" + integrity sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws= + dependencies: + mimic-response "^1.0.0" + clone@^1.0.2: version "1.0.4" resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" integrity sha1-2jCcwmPfFZlMaIypAheco8fNfH4= +cloudinary@^1.17.0: + version "1.17.0" + resolved "https://registry.yarnpkg.com/cloudinary/-/cloudinary-1.17.0.tgz#ef9ac1046a89de6d3cd4d7bbefac7488f561f63e" + integrity sha512-04kneY1ehHYXpnR5WasA8kyJdJyq6gvuYyeH/g/dAWVZxO9yeEwIyNqAL+cpM6fXYvEWkifos3Iqj6GME6giwg== + dependencies: + lodash "^4.17.11" + q "^1.5.1" + typescript "^2.9.2" + co@^4.6.0: version "4.6.0" resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" @@ -2305,7 +3026,7 @@ commander@2.9.0: dependencies: graceful-readlink ">= 1.0.0" -commander@^2.19.0, commander@^2.20.0, commander@^2.9.0: +commander@^2.11.0, commander@^2.19.0, commander@^2.20.0, commander@^2.9.0, commander@~2.20.3: version "2.20.3" resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== @@ -2315,6 +3036,11 @@ commander@^3.0.0: resolved "https://registry.yarnpkg.com/commander/-/commander-3.0.2.tgz#6837c3fb677ad9933d1cfba42dd14d5117d6b39e" integrity sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow== +common-tags@^1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/common-tags/-/common-tags-1.8.0.tgz#8e3153e542d4a39e9b10554434afaaf98956a937" + integrity sha512-6P6g0uetGpW/sdyUy/iQQCbFF0kWVMSIVSyYz7Zgjcgh8mgw8PQzDNZeyZ5DQ2gM7LBoZPHmnjz8rUthkBG5tw== + commondir@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" @@ -2447,14 +3173,7 @@ content-type@1.0.4, content-type@~1.0.4: resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== -convert-source-map@1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.6.0.tgz#51b537a8c43e0f04dec1993bffcdd504e758ac20" - integrity sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A== - dependencies: - safe-buffer "~5.1.1" - -convert-source-map@^1.1.0: +convert-source-map@1.7.0, convert-source-map@^1.1.0, convert-source-map@^1.4.0, convert-source-map@^1.7.0: version "1.7.0" resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.7.0.tgz#17a2cb882d7f77d3490585e2ce6c524424a3a442" integrity sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA== @@ -2493,6 +3212,20 @@ copy-descriptor@^0.1.0: resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= +copy-webpack-plugin@~4.5.2: + version "4.5.4" + resolved "https://registry.yarnpkg.com/copy-webpack-plugin/-/copy-webpack-plugin-4.5.4.tgz#f2b2782b3cd5225535c3dc166a80067e7d940f27" + integrity sha512-0lstlEyj74OAtYMrDxlNZsU7cwFijAI3Ofz2fD6Mpo9r4xCv4yegfa3uHIKvZY1NSuOtE9nvG6TAhJ+uz9gDaQ== + dependencies: + cacache "^10.0.4" + find-cache-dir "^1.0.0" + globby "^7.1.1" + is-glob "^4.0.0" + loader-utils "^1.1.0" + minimatch "^3.0.4" + p-limit "^1.0.0" + serialize-javascript "^1.4.0" + core-js-compat@^3.1.1: version "3.4.1" resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.4.1.tgz#e12c5a3ef9fcb50fd9d9a32805bfe674f9139246" @@ -2511,15 +3244,7 @@ core-util-is@1.0.2, core-util-is@~1.0.0: resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= -cors@^2.8.5: - version "2.8.5" - resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.5.tgz#eac11da51592dd86b9f06f6e7ac293b3df875d29" - integrity sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g== - dependencies: - object-assign "^4" - vary "^1" - -cosmiconfig@^5.0.0: +cosmiconfig@^5.0.0, cosmiconfig@^5.2.1: version "5.2.1" resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-5.2.1.tgz#040f726809c591e77a17c0a3626ca45b4f168b1a" integrity sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA== @@ -2582,6 +3307,15 @@ create-hmac@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.4: safe-buffer "^5.0.1" sha.js "^2.4.8" +create-jest-runner@^0.5.3: + version "0.5.3" + resolved "https://registry.yarnpkg.com/create-jest-runner/-/create-jest-runner-0.5.3.tgz#1387e2ce70b08e4c989ae55f677005b64f9ba97b" + integrity sha512-a9VY2doMBmzRollJB3Ft3/Y5fBceSWJ4gdyVsg4/d7nP1S4715VG939s2VnITDj79YBmRgKhjGjNRv1c+Kre1g== + dependencies: + chalk "^2.4.2" + jest-worker "^24.0.0" + throat "^4.1.0" + cross-fetch@2.2.2: version "2.2.2" resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-2.2.2.tgz#a47ff4f7fc712daba8f6a695a11c948440d45723" @@ -2610,6 +3344,15 @@ cross-spawn@^6.0.0, cross-spawn@^6.0.5: shebang-command "^1.2.0" which "^1.2.9" +cross-spawn@^7.0.0: + version "7.0.1" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.1.tgz#0ab56286e0f7c24e153d04cc2aa027e43a9a5d14" + integrity sha512-u7v4o84SwFpD32Z8IIcPZ6z1/ie24O6RU3RbtL5Y316l3KuHVPx9ItBgWQ6VlfAFnRnTtMUrsQ9MUUTuEZjogg== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + crypt@~0.0.1: version "0.0.2" resolved "https://registry.yarnpkg.com/crypt/-/crypt-0.0.2.tgz#88d7ff7ec0dfb86f713dc87bbb42d044d3e6c41b" @@ -2768,6 +3511,18 @@ cssnano-simple@1.0.0: cssnano-preset-simple "^1.0.0" postcss "^7.0.18" +cssom@0.3.x, "cssom@>= 0.3.2 < 0.4.0": + version "0.3.8" + resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.8.tgz#9f1276f5b2b463f2114d3f2c75250af8c1a36f4a" + integrity sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg== + +cssstyle@^1.0.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-1.4.0.tgz#9d31328229d3c565c61e586b02041a28fccdccf1" + integrity sha512-GBrLZYZ4X4x6/QEoBnIrqb8B/f5l4+8me2dkom/j1Gtbxy0kBv6OGzKuAsGM75bkGwGAFkt56Iwg28S3XTZgSA== + dependencies: + cssom "0.3.x" + csstype@^2.2.0, csstype@^2.6.7: version "2.6.7" resolved "https://registry.yarnpkg.com/csstype/-/csstype-2.6.7.tgz#20b0024c20b6718f4eda3853a1f5a1cce7f5e4a5" @@ -2778,6 +3533,11 @@ cyclist@^1.0.1: resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-1.0.1.tgz#596e9698fd0c80e12038c2b82d6eb1b35b6224d9" integrity sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk= +damerau-levenshtein@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/damerau-levenshtein/-/damerau-levenshtein-1.0.5.tgz#780cf7144eb2e8dbd1c3bb83ae31100ccc31a414" + integrity sha512-CBCRqFnpu715iPmw1KrdOrzRqbdFwQTwAWyyyYS42+iAgHCuXZ+/TdMgQkUENPomxEz9z1BEzuQU2Xw0kUuAgA== + dashdash@^1.12.0: version "1.14.1" resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" @@ -2785,16 +3545,35 @@ dashdash@^1.12.0: dependencies: assert-plus "^1.0.0" +data-urls@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-1.1.0.tgz#15ee0582baa5e22bb59c77140da8f9c76963bbfe" + integrity sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ== + dependencies: + abab "^2.0.0" + whatwg-mimetype "^2.2.0" + whatwg-url "^7.0.0" + dataloader@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/dataloader/-/dataloader-1.4.0.tgz#bca11d867f5d3f1b9ed9f737bd15970c65dff5c8" integrity sha512-68s5jYdlvasItOJnCuI2Q9s4q98g0pCyL3HrcKJu8KNugUl8ahgmZYg38ysLTgQjjXX3H8CJLkAvWrclWfcalw== +date-fns@^1.27.2: + version "1.30.1" + resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-1.30.1.tgz#2e71bf0b119153dbb4cc4e88d9ea5acfb50dc05c" + integrity sha512-hBSVCvSmWC+QypYObzwGOd9wqdDpOt+0wl0KbU+R+uuZBS1jN8VsD1ss3irQDknRj5NvxiTF6oj/nDRnN/UQNw== + date-fns@^2.0.1: version "2.7.0" resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.7.0.tgz#8271d943cc4636a1f27698f1b8d6a9f1ceb74026" integrity sha512-wxYp2PGoUDN5ZEACc61aOtYFvSsJUylIvCjpjDOqM1UDaKIIuMJ9fAnMYFHV3TQaDpfTVxhwNK/GiCaHKuemTA== +dayjs@^1.8.17: + version "1.8.17" + resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.8.17.tgz#53ec413f2a7b02afbea1846d61bb260fa8567cea" + integrity sha512-47VY/htqYqr9GHd7HW/h56PpQzRBSJcxIQFwqL3P20bMF/3az5c3PWdVY3LmPXFl6cQCYHL7c79b9ov+2bOBbw== + debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.8, debug@^2.6.9: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" @@ -2833,6 +3612,18 @@ decode-uri-component@^0.2.0: resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= +decompress-response@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-3.3.0.tgz#80a4dd323748384bfa248083622aedec982adff3" + integrity sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M= + dependencies: + mimic-response "^1.0.0" + +dedent@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c" + integrity sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw= + deep-extend@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" @@ -2855,6 +3646,11 @@ defaults@^1.0.3: dependencies: clone "^1.0.2" +defer-to-connect@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-1.1.0.tgz#b41bd7efa8508cef13f8456975f7a278c72833fd" + integrity sha512-WE2sZoctWm/v4smfCAdjYbrfS55JiMRdlY9ZubFhsYbteCK9+BvAx4YV7nPjYM6ZnX5BcoVKwfmyx9sIFTgQMQ== + define-properties@^1.1.2, define-properties@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" @@ -2896,6 +3692,20 @@ del@^3.0.0: pify "^3.0.0" rimraf "^2.2.8" +del@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/del/-/del-5.1.0.tgz#d9487c94e367410e6eff2925ee58c0c84a75b3a7" + integrity sha512-wH9xOVHnczo9jN2IW68BabcecVPxacIA3g/7z6vhSU/4stOKQzeCRK0yD0A24WiAAUJmmVpWqrERcTxnLo3AnA== + dependencies: + globby "^10.0.1" + graceful-fs "^4.2.2" + is-glob "^4.0.1" + is-path-cwd "^2.2.0" + is-path-inside "^3.0.1" + p-map "^3.0.0" + rimraf "^3.0.0" + slash "^3.0.0" + delayed-stream@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" @@ -2934,11 +3744,21 @@ detect-libc@^1.0.2: resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups= +detect-newline@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-2.1.0.tgz#f41f1c10be4b00e87b5f13da680759f2c5bfd3e2" + integrity sha1-9B8cEL5LAOh7XxPaaAdZ8sW/0+I= + devalue@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/devalue/-/devalue-2.0.0.tgz#2afa0b7c1bb35bebbef792498150663fdcd33c68" integrity sha512-6H2FBD5DPnQS75UWJtQjoVeKZlmXoa765UgYS5RQnx6Ay9LUhUld0w1/D6cYdrY+wnu6XQNlpEBfnJUZK0YyPQ== +diff-sequences@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-24.9.0.tgz#5715d6244e2aa65f48bba0bc972db0b0b11e95b5" + integrity sha512-Dj6Wk3tWyTE+Fo1rW8v0Xhwk80um6yFYKbuAxc9c3EZxIHFDYwbi34Uk42u1CdnIiVorvt4RmlSDjIPyzGC2ew== + diffie-hellman@^5.0.0: version "5.0.3" resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875" @@ -2956,6 +3776,20 @@ dir-glob@2.0.0: arrify "^1.0.1" path-type "^3.0.0" +dir-glob@^2.0.0: + version "2.2.2" + resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-2.2.2.tgz#fa09f0694153c8918b18ba0deafae94769fc50c4" + integrity sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw== + dependencies: + path-type "^3.0.0" + +dir-glob@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" + integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== + dependencies: + path-type "^4.0.0" + directory-tree@2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/directory-tree/-/directory-tree-2.2.1.tgz#3d56ce8a82a6c9612ac0879c6b4ed9ea54e89bde" @@ -2991,11 +3825,23 @@ dom-helpers@^5.0.1: "@babel/runtime" "^7.6.3" csstype "^2.6.7" +dom-walk@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/dom-walk/-/dom-walk-0.1.1.tgz#672226dc74c8f799ad35307df936aba11acd6018" + integrity sha1-ZyIm3HTI95mtNTB9+TaroRrNYBg= + domain-browser@^1.1.1: version "1.2.0" resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda" integrity sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA== +domexception@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/domexception/-/domexception-1.0.1.tgz#937442644ca6a31261ef36e3ec677fe805582c90" + integrity sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug== + dependencies: + webidl-conversions "^4.0.2" + dot-prop@^4.1.0: version "4.2.0" resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-4.2.0.tgz#1f19e0c2e1aa0e32797c49799f2837ac6af69c57" @@ -3060,6 +3906,11 @@ electron-to-chromium@^1.3.295: resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.306.tgz#e8265301d053d5f74e36cb876486830261fbe946" integrity sha512-frDqXvrIROoYvikSKTIKbHbzO6M3/qC6kCIt/1FOa9kALe++c4VAJnwjSFvf1tYLEUsP2n9XZ4XSCyqc3l7A/A== +elegant-spinner@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/elegant-spinner/-/elegant-spinner-1.0.1.tgz#db043521c95d7e303fd8f345bedc3349cfb0729e" + integrity sha1-2wQ1IcldfjA/2PNFvtwzSc+wcp4= + elliptic@^6.0.0: version "6.5.1" resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.1.tgz#c380f5f909bf1b9b4428d028cd18d3b0efd6b52b" @@ -3073,7 +3924,7 @@ elliptic@^6.0.0: minimalistic-assert "^1.0.0" minimalistic-crypto-utils "^1.0.0" -emoji-regex@^7.0.1: +emoji-regex@^7.0.1, emoji-regex@^7.0.2: version "7.0.3" resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== @@ -3116,6 +3967,15 @@ enhanced-resolve@^4.1.0: memory-fs "^0.5.0" tapable "^1.0.0" +enhanced-resolve@~0.9.0: + version "0.9.1" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-0.9.1.tgz#4d6e689b3725f86090927ccc86cd9f1635b89e2e" + integrity sha1-TW5omzcl+GCQknzMhs2fFjW4ni4= + dependencies: + graceful-fs "^4.1.2" + memory-fs "^0.2.0" + tapable "^0.1.8" + env-cmd@^10.0.1: version "10.0.1" resolved "https://registry.yarnpkg.com/env-cmd/-/env-cmd-10.0.1.tgz#bcaedad78a0172c62113890dd4efec36d2ba0775" @@ -3143,7 +4003,7 @@ error-ex@^1.2.0, error-ex@^1.3.1: dependencies: is-arrayish "^0.2.1" -es-abstract@^1.12.0, es-abstract@^1.15.0, es-abstract@^1.7.0: +es-abstract@^1.12.0, es-abstract@^1.15.0, es-abstract@^1.5.1, es-abstract@^1.7.0: version "1.16.0" resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.16.0.tgz#d3a26dc9c3283ac9750dca569586e976d9dcc06d" integrity sha512-xdQnfykZ9JMEiasTAJZJdMWCQ1Vm00NBw79/AWi7ELfZuuPCSOMDZbT9mkOfSctVtfhb+sAAzrm+j//GjjLHLg== @@ -3168,7 +4028,7 @@ es-to-primitive@^1.2.0: is-date-object "^1.0.1" is-symbol "^1.0.2" -es6-promise@^4.0.3: +es6-promise@4.2.8, es6-promise@^4.0.3: version "4.2.8" resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.8.tgz#4eb21594c972bc40553d276e510539143db53e0a" integrity sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w== @@ -3190,31 +4050,50 @@ escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= -eslint-config-esnext@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/eslint-config-esnext/-/eslint-config-esnext-4.0.0.tgz#b3f91bd59c515824fca0d9e553ab241833386230" - integrity sha512-UOovbox5WIgG9VSJPxtCsfwOkK96yNp8hBBi+WZ66OTr5zc7PxJCkE4MS7vON2Z1md5PNhwFHVzE9Uu+owBg1Q== +escodegen@^1.9.1: + version "1.12.0" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.12.0.tgz#f763daf840af172bb3a2b6dd7219c0e17f7ff541" + integrity sha512-TuA+EhsanGcme5T3R0L80u4t8CpbXQjegRmf7+FPTJrtCTErXFeelblRgHQa1FofEzqYYJmJ/OqjTwREp9qgmg== dependencies: - babel-eslint "^10.0.1" - eslint "^5.6.0" - eslint-plugin-babel "^5.2.1" - eslint-plugin-import "^2.14.0" + esprima "^3.1.3" + estraverse "^4.2.0" + esutils "^2.0.2" + optionator "^0.8.1" + optionalDependencies: + source-map "~0.6.1" -eslint-config-node@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/eslint-config-node/-/eslint-config-node-4.0.0.tgz#4ebb40defd29a261ce2e7f6fe1b2d7aee38cf2a5" - integrity sha512-sdr7zqVTQddLEBpsNzTFASOAk8bSbWatZqxLD9J1nBI/H83lGOknODaCCJFWMDN+36LNUMVWVWo+0LhxQJc+wg== - dependencies: - eslint "^5.6.0" - eslint-config-esnext "^4.0.0" +eslint-config-kentcdodds@^14.6.1: + version "14.6.1" + resolved "https://registry.yarnpkg.com/eslint-config-kentcdodds/-/eslint-config-kentcdodds-14.6.1.tgz#406b91fff60712295cb1c6afbd788df196d8d0ec" + integrity sha512-DF3VxxpoZpScCmosksbPZDBnF1FMOXqn6EddEgI9x+oCt7NzkK9ptwP4JQK1mv5YvirRVK7PoWIZqfRmiSYdhw== + dependencies: + babel-eslint "^10.0.3" + eslint-config-prettier "^6.4.0" + eslint-import-resolver-webpack "^0.11.1" + eslint-plugin-babel "^5.3.0" + eslint-plugin-import "^2.18.2" + eslint-plugin-jest "^23.0.1" + eslint-plugin-jsx-a11y "^6.2.3" + eslint-plugin-react "^7.16.0" + eslint-plugin-react-hooks "^2.1.2" + read-pkg-up "^7.0.0" + semver "^6.3.0" + webpack "^4.41.2" -eslint-config-prettier@^6.5.0: +eslint-config-prettier@^6.4.0: version "6.5.0" resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-6.5.0.tgz#aaf9a495e2a816865e541bfdbb73a65cc162b3eb" integrity sha512-cjXp8SbO9VFGW/Z7mbTydqS9to8Z58E5aYhj3e1+Hx7lS9s6gL5ILKNpCqZAFOVYRcSkWPFYljHrEh8QFEK5EQ== dependencies: get-stdin "^6.0.0" +eslint-config-prettier@^6.7.0: + version "6.7.0" + resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-6.7.0.tgz#9a876952e12df2b284adbd3440994bf1f39dfbb9" + integrity sha512-FamQVKM3jjUVwhG4hEMnbtsq7xOIDm+SY5iBPfR8gKsJoAB2IQnNF+bk1+8Fy44Nq7PPJaLvkRxILYdJWoguKQ== + dependencies: + get-stdin "^6.0.0" + eslint-import-resolver-node@^0.3.2: version "0.3.2" resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.2.tgz#58f15fb839b8d0576ca980413476aab2472db66a" @@ -3223,6 +4102,33 @@ eslint-import-resolver-node@^0.3.2: debug "^2.6.9" resolve "^1.5.0" +eslint-import-resolver-typescript@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-2.0.0.tgz#e95f126cc12d3018b9cc11692b4dbfd3e17d3ea6" + integrity sha512-bT5Frpl8UWoHBtY25vKUOMoVIMlJQOMefHLyQ4Tz3MQpIZ2N6yYKEEIHMo38bszBNUuMBW6M3+5JNYxeiGFH4w== + dependencies: + debug "^4.1.1" + is-glob "^4.0.1" + resolve "^1.12.0" + tiny-glob "^0.2.6" + tsconfig-paths "^3.9.0" + +eslint-import-resolver-webpack@^0.11.1: + version "0.11.1" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-webpack/-/eslint-import-resolver-webpack-0.11.1.tgz#fcf1fd57a775f51e18f442915f85dd6ba45d2f26" + integrity sha512-eK3zR7xVQR/MaoBWwGuD+CULYVuqe5QFlDukman71aI6IboCGzggDUohHNfu1ZeBnbHcUHJc0ywWoXUBNB6qdg== + dependencies: + array-find "^1.0.0" + debug "^2.6.8" + enhanced-resolve "~0.9.0" + find-root "^1.1.0" + has "^1.0.1" + interpret "^1.0.0" + lodash "^4.17.4" + node-libs-browser "^1.0.0 || ^2.0.0" + resolve "^1.10.0" + semver "^5.3.0" + eslint-module-utils@^2.4.0: version "2.4.1" resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.4.1.tgz#7b4675875bf96b0dbf1b21977456e5bb1f5e018c" @@ -3231,14 +4137,14 @@ eslint-module-utils@^2.4.0: debug "^2.6.8" pkg-dir "^2.0.0" -eslint-plugin-babel@^5.2.1, eslint-plugin-babel@^5.3.0: +eslint-plugin-babel@^5.3.0: version "5.3.0" resolved "https://registry.yarnpkg.com/eslint-plugin-babel/-/eslint-plugin-babel-5.3.0.tgz#2e7f251ccc249326da760c1a4c948a91c32d0023" integrity sha512-HPuNzSPE75O+SnxHIafbW5QB45r2w78fxqwK3HmjqIUoPfPzVrq6rD+CINU3yzoDSzEhUkX07VUphbF73Lth/w== dependencies: eslint-rule-composer "^0.3.0" -eslint-plugin-import@^2.14.0, eslint-plugin-import@^2.18.2: +eslint-plugin-import@^2.18.2: version "2.18.2" resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.18.2.tgz#02f1180b90b077b33d447a17a2326ceb400aceb6" integrity sha512-5ohpsHAiUBRNaBWAF08izwUGlbrJoJJ+W9/TBwsGoR1MnlgfwMIKrFeSjWbt6moabiXW9xNvtFz+97KHRfI4HQ== @@ -3255,7 +4161,29 @@ eslint-plugin-import@^2.14.0, eslint-plugin-import@^2.18.2: read-pkg-up "^2.0.0" resolve "^1.11.0" -eslint-plugin-react-hooks@^2.2.0: +eslint-plugin-jest@^23.0.1: + version "23.0.3" + resolved "https://registry.yarnpkg.com/eslint-plugin-jest/-/eslint-plugin-jest-23.0.3.tgz#d3f157f7791f97713372c13259ba1dfc436eb4c1" + integrity sha512-9cNxr66zeOyz1S9AkQL4/ouilR6QHpYj8vKOQZ60fu9hAt5PJWS4KqWqfr1aqN5NFEZSPjFOla2Azn+KTWiGwg== + dependencies: + "@typescript-eslint/experimental-utils" "^2.5.0" + +eslint-plugin-jsx-a11y@^6.2.3: + version "6.2.3" + resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.2.3.tgz#b872a09d5de51af70a97db1eea7dc933043708aa" + integrity sha512-CawzfGt9w83tyuVekn0GDPU9ytYtxyxyFZ3aSWROmnRRFQFT2BiPJd7jvRdzNDi6oLWaS2asMeYSNMjWTV4eNg== + dependencies: + "@babel/runtime" "^7.4.5" + aria-query "^3.0.0" + array-includes "^3.0.3" + ast-types-flow "^0.0.7" + axobject-query "^2.0.2" + damerau-levenshtein "^1.0.4" + emoji-regex "^7.0.2" + has "^1.0.3" + jsx-ast-utils "^2.2.1" + +eslint-plugin-react-hooks@^2.1.2: version "2.2.0" resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-2.2.0.tgz#078264e9e388da6929ace09d6abe92c85963aff4" integrity sha512-jSlnBjV2cmyIeL555H/FbvuSbQ1AtpHjLMHuPrQnt1eVA6lX8yufdygh7AArI2m8ct7ChHGx2uOaCuxq2MUn6g== @@ -3296,7 +4224,7 @@ eslint-scope@^5.0.0: esrecurse "^4.1.0" estraverse "^4.1.1" -eslint-utils@^1.3.1, eslint-utils@^1.4.3: +eslint-utils@^1.4.3: version "1.4.3" resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-1.4.3.tgz#74fec7c54d0776b6f67e0251040b5806564e981f" integrity sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q== @@ -3308,49 +4236,7 @@ eslint-visitor-keys@^1.0.0, eslint-visitor-keys@^1.1.0: resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz#e2a82cea84ff246ad6fb57f9bde5b46621459ec2" integrity sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A== -eslint@^5.6.0: - version "5.16.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-5.16.0.tgz#a1e3ac1aae4a3fbd8296fcf8f7ab7314cbb6abea" - integrity sha512-S3Rz11i7c8AA5JPv7xAH+dOyq/Cu/VXHiHXBPOU1k/JAM5dXqQPt3qcrhpHSorXmrpu2g0gkIBVXAqCpzfoZIg== - dependencies: - "@babel/code-frame" "^7.0.0" - ajv "^6.9.1" - chalk "^2.1.0" - cross-spawn "^6.0.5" - debug "^4.0.1" - doctrine "^3.0.0" - eslint-scope "^4.0.3" - eslint-utils "^1.3.1" - eslint-visitor-keys "^1.0.0" - espree "^5.0.1" - esquery "^1.0.1" - esutils "^2.0.2" - file-entry-cache "^5.0.1" - functional-red-black-tree "^1.0.1" - glob "^7.1.2" - globals "^11.7.0" - ignore "^4.0.6" - import-fresh "^3.0.0" - imurmurhash "^0.1.4" - inquirer "^6.2.2" - js-yaml "^3.13.0" - json-stable-stringify-without-jsonify "^1.0.1" - levn "^0.3.0" - lodash "^4.17.11" - minimatch "^3.0.4" - mkdirp "^0.5.1" - natural-compare "^1.4.0" - optionator "^0.8.2" - path-is-inside "^1.0.2" - progress "^2.0.0" - regexpp "^2.0.1" - semver "^5.5.1" - strip-ansi "^4.0.0" - strip-json-comments "^2.0.1" - table "^5.2.3" - text-table "^0.2.0" - -eslint@^6.6.0: +"eslint@^4.0.0 || ^5.0.0 || ^6.0.0", eslint@^6.6.0: version "6.6.0" resolved "https://registry.yarnpkg.com/eslint/-/eslint-6.6.0.tgz#4a01a2fb48d32aacef5530ee9c5a78f11a8afd04" integrity sha512-PpEBq7b6qY/qrOmpYQ/jTMDYfuQMELR4g4WI1M/NaSDDD/bdcMb+dj4Hgks7p41kW2caXsPsEZAEAyAgjVVC0g== @@ -3393,15 +4279,6 @@ eslint@^6.6.0: text-table "^0.2.0" v8-compile-cache "^2.0.3" -espree@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/espree/-/espree-5.0.1.tgz#5d6526fa4fc7f0788a5cf75b15f30323e2f81f7a" - integrity sha512-qWAZcWh4XE/RwzLJejfcofscgMc9CamR6Tn1+XRXNzrvUSSbiAjGOI/fggztjIi7y9VLPqnICMIPiGyr8JaZ0A== - dependencies: - acorn "^6.0.7" - acorn-jsx "^5.0.0" - eslint-visitor-keys "^1.0.0" - espree@^6.1.2: version "6.1.2" resolved "https://registry.yarnpkg.com/espree/-/espree-6.1.2.tgz#6c272650932b4f91c3714e5e7b5f5e2ecf47262d" @@ -3411,6 +4288,11 @@ espree@^6.1.2: acorn-jsx "^5.1.0" eslint-visitor-keys "^1.1.0" +esprima@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633" + integrity sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM= + esprima@^4.0.0, esprima@~4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" @@ -3435,7 +4317,7 @@ esrecurse@^4.1.0: dependencies: estraverse "^4.1.0" -estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1: +estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0: version "4.3.0" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== @@ -3468,6 +4350,11 @@ evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: md5.js "^1.3.4" safe-buffer "^5.1.1" +exec-sh@^0.3.2: + version "0.3.4" + resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.3.4.tgz#3a018ceb526cc6f6df2bb504b2bfe8e3a4934ec5" + integrity sha512-sEFIkc61v75sWeOe72qyrqg2Qg0OuLESziUDk/O/z2qgS15y2gWVFrI6f2Qn/qw/0/NCfCEsmNA4zOjkwEZT1A== + execa@^0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777" @@ -3507,6 +4394,26 @@ execa@^1.0.0: signal-exit "^3.0.0" strip-eof "^1.0.0" +execa@^2.0.3: + version "2.1.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-2.1.0.tgz#e5d3ecd837d2a60ec50f3da78fd39767747bbe99" + integrity sha512-Y/URAVapfbYy2Xp/gb6A0E7iR8xeqOCXsuuaoMn7A5PzrXUK84E1gyiEfq0wQd/GHA6GsoHWwhNq8anb0mleIw== + dependencies: + cross-spawn "^7.0.0" + get-stream "^5.0.0" + is-stream "^2.0.0" + merge-stream "^2.0.0" + npm-run-path "^3.0.0" + onetime "^5.1.0" + p-finally "^2.0.0" + signal-exit "^3.0.2" + strip-final-newline "^2.0.0" + +exit@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" + integrity sha1-BjJjj42HfMghB9MKD/8aF8uhzQw= + expand-brackets@^2.1.4: version "2.1.4" resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" @@ -3520,6 +4427,18 @@ expand-brackets@^2.1.4: snapdragon "^0.8.1" to-regex "^3.0.1" +expect@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/expect/-/expect-24.9.0.tgz#b75165b4817074fa4a157794f46fe9f1ba15b6ca" + integrity sha512-wvVAx8XIol3Z5m9zvZXiyZOQ+sRJqNTIm6sGjdWlaZIeupQGO3WbYI+15D/AmEwZywL6wtJkbAbJtzkOfBuR0Q== + dependencies: + "@jest/types" "^24.9.0" + ansi-styles "^3.2.0" + jest-get-type "^24.9.0" + jest-matcher-utils "^24.9.0" + jest-message-util "^24.9.0" + jest-regex-util "^24.9.0" + express-request-proxy@^2.0.0: version "2.2.2" resolved "https://registry.yarnpkg.com/express-request-proxy/-/express-request-proxy-2.2.2.tgz#ebe8966e7ab47c97b59721f2714217a6389a2a76" @@ -3673,6 +4592,17 @@ fast-glob@^2.0.2: merge2 "^1.2.3" micromatch "^3.1.10" +fast-glob@^3.0.3: + version "3.1.0" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.1.0.tgz#77375a7e3e6f6fc9b18f061cddd28b8d1eec75ae" + integrity sha512-TrUz3THiq2Vy3bjfQUB2wNyPdGBeGmdjbzzBLhfHN4YFurYptCKwGq/TfiRavbGywFRzY6U2CdmQ1zmsY5yYaw== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.0" + merge2 "^1.3.0" + micromatch "^4.0.2" + fast-json-stable-stringify@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2" @@ -3688,11 +4618,33 @@ fastparse@^1.1.1: resolved "https://registry.yarnpkg.com/fastparse/-/fastparse-1.1.2.tgz#91728c5a5942eced8531283c79441ee4122c35a9" integrity sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ== +fastq@^1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.6.0.tgz#4ec8a38f4ac25f21492673adb7eae9cfef47d1c2" + integrity sha512-jmxqQ3Z/nXoeyDmWAzF9kH1aGZSis6e/SbfPmJpUnyZ0ogr6iscHQaml4wsEepEWSdtmpy+eVXmCRIMpxaXqOA== + dependencies: + reusify "^1.0.0" + +fb-watchman@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.0.tgz#54e9abf7dfa2f26cd9b1636c588c1afc05de5d58" + integrity sha1-VOmr99+i8mzZsWNsWIwa/AXeXVg= + dependencies: + bser "^2.0.0" + figgy-pudding@^3.5.1: version "3.5.1" resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.1.tgz#862470112901c727a0e495a80744bd5baa1d6790" integrity sha512-vNKxJHTEKNThjfrdJwHc7brvM6eVevuO5nTj6ez8ZQ1qbXTvGthucRF7S4vf2cr71QVnT70V34v0S1DyQsti0w== +figures@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-1.7.0.tgz#cbe1e3affcf1cd44b80cadfed28dc793a9701d2e" + integrity sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4= + dependencies: + escape-string-regexp "^1.0.5" + object-assign "^4.1.0" + figures@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" @@ -3740,6 +4692,13 @@ fill-range@^4.0.0: repeat-string "^1.6.1" to-regex-range "^2.1.0" +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + dependencies: + to-regex-range "^5.0.1" + finalhandler@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d" @@ -3771,6 +4730,11 @@ find-cache-dir@^2.0.0, find-cache-dir@^2.1.0: make-dir "^2.0.0" pkg-dir "^3.0.0" +find-root@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/find-root/-/find-root-1.1.0.tgz#abcfc8ba76f708c42a97b3d685b7e9450bfb9ce4" + integrity sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng== + find-up@2.1.0, find-up@^2.0.0, find-up@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" @@ -3792,6 +4756,14 @@ find-up@^3.0.0: dependencies: locate-path "^3.0.0" +find-up@^4.0.0, find-up@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" + integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== + dependencies: + locate-path "^5.0.0" + path-exists "^4.0.0" + flat-cache@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-2.0.1.tgz#5d296d6f04bda44a4630a301413bdbc2ec085ec0" @@ -3824,6 +4796,11 @@ flush-write-stream@^1.0.0: inherits "^2.0.3" readable-stream "^2.3.6" +fn-name@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/fn-name/-/fn-name-2.0.1.tgz#5214d7537a4d06a4a301c0cc262feb84188002e7" + integrity sha1-UhTXU3pNBqSjAcDMJi/rhBiAAuc= + follow-redirects@1.5.10: version "1.5.10" resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.5.10.tgz#7b7a9f9aea2fdff36786a94ff643ed07f4ff5e2a" @@ -3878,19 +4855,19 @@ formidable@^1.2.1: resolved "https://registry.yarnpkg.com/formidable/-/formidable-1.2.1.tgz#70fb7ca0290ee6ff961090415f4b3df3d2082659" integrity sha512-Fs9VRguL0gqGHkXS5GQiMCr1VhZBxz0JnJs4JmMp/2jL18Fmbzvv7vOFRU+U8TBkHEE/CX1qDXzJplVULgsLeg== -formik@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/formik/-/formik-2.0.3.tgz#7cf088b1a6e0ba21782b73a90453a78426959168" - integrity sha512-kYBvcxlsYSncY8OiJHD49C0UmoWXbgmIc9V1g3N1WwBJ7SMLk34QpcJDgroYd42K1cH+mSJlXhB7PlgTXTzlWg== +formik@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/formik/-/formik-2.0.4.tgz#0743a9a5c7ab0a247d3fa2c072d599f221fc8e75" + integrity sha512-Y0mR8PGRtq/U072U4tkX1wnS/geDYs0n7uPlvmKtMTIJS4g8xCpaccAerQFWxEfClMK/JGpmEyG93zItAdASJA== dependencies: deepmerge "^2.1.1" hoist-non-react-statics "^3.3.0" lodash "^4.17.14" lodash-es "^4.17.14" react-fast-compare "^2.0.1" - scheduler "^0.14.0" + scheduler "^0.17.0" tiny-warning "^1.0.2" - tslib "^1.9.3" + tslib "^1.10.0" forwarded@~0.1.2: version "0.1.2" @@ -3922,6 +4899,15 @@ fs-constants@^1.0.0: resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== +fs-extra@^4.0.2: + version "4.0.3" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-4.0.3.tgz#0d852122e5bc5beb453fb028e9c0c9bf36340c94" + integrity sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg== + dependencies: + graceful-fs "^4.1.2" + jsonfile "^4.0.0" + universalify "^0.1.0" + fs-extra@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-5.0.0.tgz#414d0110cdd06705734d055652c5411260c31abd" @@ -3931,7 +4917,7 @@ fs-extra@^5.0.0: jsonfile "^4.0.0" universalify "^0.1.0" -fs-extra@^7.0.0: +fs-extra@^7.0.0, fs-extra@~7.0.0: version "7.0.1" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9" integrity sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw== @@ -4008,23 +4994,45 @@ get-caller-file@^1.0.1: resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a" integrity sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w== +get-caller-file@^2.0.1: + version "2.0.5" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + +get-own-enumerable-property-symbols@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.1.tgz#6f7764f88ea11e0b514bd9bd860a132259992ca4" + integrity sha512-09/VS4iek66Dh2bctjRkowueRJbY1JDGR1L/zRxO1Qk8Uxs6PnqaNSqalpizPT+CDjre3hnEsuzvhgomz9qYrA== + get-stdin@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-6.0.0.tgz#9e09bf712b360ab9225e812048f71fde9c89657b" integrity sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g== +get-stdin@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-7.0.0.tgz#8d5de98f15171a125c5e516643c7a6d0ea8a96f6" + integrity sha512-zRKcywvrXlXsA0v0i9Io4KDRaAw7+a1ZpjRwl9Wox8PFlVCCHra7E9c4kqXCoCM9nR5tBkaTTZRBoCm60bFqTQ== + get-stream@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" integrity sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ= -get-stream@^4.0.0: +get-stream@^4.0.0, get-stream@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== dependencies: pump "^3.0.0" +get-stream@^5.0.0, get-stream@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.1.0.tgz#01203cdc92597f9b909067c3e656cc1f4d3c4dc9" + integrity sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw== + dependencies: + pump "^3.0.0" + get-value@^2.0.3, get-value@^2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" @@ -4045,7 +5053,7 @@ glob-parent@^3.1.0: is-glob "^3.1.0" path-dirname "^1.0.0" -glob-parent@^5.0.0: +glob-parent@^5.0.0, glob-parent@^5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.0.tgz#5f4c1d1e748d30cd73ad2944b3577a81b081e8c2" integrity sha512-qjtRgnIVmOfnKUE3NJAQEdk+lKrxfw8t5ke7SXtfMTHcjsBfOfWXCQfdb30zfDoZQ2IRSIiidmjtbHZPZ++Ihw== @@ -4062,7 +5070,7 @@ glob-to-regexp@^0.4.1: resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== -glob@^7.0.0, glob@^7.0.3, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4: +glob@^7.0.0, glob@^7.0.3, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6, glob@~7.1.3: version "7.1.6" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== @@ -4081,11 +5089,38 @@ global-dirs@^0.1.0: dependencies: ini "^1.3.4" +global@~4.3.0: + version "4.3.2" + resolved "https://registry.yarnpkg.com/global/-/global-4.3.2.tgz#e76989268a6c74c38908b1305b10fc0e394e9d0f" + integrity sha1-52mJJopsdMOJCLEwWxD8DjlOnQ8= + dependencies: + min-document "^2.19.0" + process "~0.5.1" + globals@^11.1.0, globals@^11.7.0: version "11.12.0" resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== +globalyzer@^0.1.0: + version "0.1.4" + resolved "https://registry.yarnpkg.com/globalyzer/-/globalyzer-0.1.4.tgz#bc8e273afe1ac7c24eea8def5b802340c5cc534f" + integrity sha512-LeguVWaxgHN0MNbWC6YljNMzHkrCny9fzjmEUdnF1kQ7wATFD1RHFRqA1qxaX2tgxGENlcxjOflopBwj3YZiXA== + +globby@^10.0.1: + version "10.0.1" + resolved "https://registry.yarnpkg.com/globby/-/globby-10.0.1.tgz#4782c34cb75dd683351335c5829cc3420e606b22" + integrity sha512-sSs4inE1FB2YQiymcmTv6NWENryABjUNPeWhOvmn4SjtKybglsyPZxFB3U1/+L1bYi0rNZDqCLlHyLYDl1Pq5A== + dependencies: + "@types/glob" "^7.1.1" + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.0.3" + glob "^7.1.3" + ignore "^5.1.1" + merge2 "^1.2.3" + slash "^3.0.0" + globby@^6.1.0: version "6.1.0" resolved "https://registry.yarnpkg.com/globby/-/globby-6.1.0.tgz#f5a6d70e8395e21c858fb0489d64df02424d506c" @@ -4097,6 +5132,18 @@ globby@^6.1.0: pify "^2.0.0" pinkie-promise "^2.0.0" +globby@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/globby/-/globby-7.1.1.tgz#fb2ccff9401f8600945dfada97440cca972b8680" + integrity sha1-+yzP+UAfhgCUXfral0QMypcrhoA= + dependencies: + array-union "^1.0.1" + dir-glob "^2.0.0" + glob "^7.1.2" + ignore "^3.3.5" + pify "^3.0.0" + slash "^1.0.0" + globby@^8.0.1: version "8.0.2" resolved "https://registry.yarnpkg.com/globby/-/globby-8.0.2.tgz#5697619ccd95c5275dbb2d6faa42087c1a941d8d" @@ -4110,6 +5157,11 @@ globby@^8.0.1: pify "^3.0.0" slash "^1.0.0" +globrex@^0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/globrex/-/globrex-0.1.2.tgz#dd5d9ec826232730cd6793a5e33a9302985e6098" + integrity sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg== + got@^6.7.1: version "6.7.1" resolved "https://registry.yarnpkg.com/got/-/got-6.7.1.tgz#240cd05785a9a18e561dc1b44b41c763ef1e8db0" @@ -4127,7 +5179,24 @@ got@^6.7.1: unzip-response "^2.0.1" url-parse-lax "^1.0.0" -graceful-fs@^4.1.0, graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0: +got@^9.6.0: + version "9.6.0" + resolved "https://registry.yarnpkg.com/got/-/got-9.6.0.tgz#edf45e7d67f99545705de1f7bbeeeb121765ed85" + integrity sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q== + dependencies: + "@sindresorhus/is" "^0.14.0" + "@szmarczak/http-timer" "^1.1.2" + cacheable-request "^6.0.0" + decompress-response "^3.3.0" + duplexer3 "^0.1.4" + get-stream "^4.1.0" + lowercase-keys "^1.0.1" + mimic-response "^1.0.1" + p-cancelable "^1.0.0" + to-readable-stream "^1.0.0" + url-parse-lax "^3.0.0" + +graceful-fs@^4.1.0, graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.2: version "4.2.3" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.3.tgz#4a12ff1b60376ef09862c2093edd908328be8423" integrity sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ== @@ -4195,6 +5264,22 @@ graphql@^14.3.0, graphql@^14.5.8: dependencies: iterall "^1.2.2" +growly@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081" + integrity sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE= + +handlebars@^4.1.2: + version "4.5.2" + resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.5.2.tgz#5a4eb92ab5962ca3415ac188c86dc7f784f76a0f" + integrity sha512-29Zxv/cynYB7mkT1rVWQnV7mGX6v7H/miQ6dbEpYTKq5eJBN7PsRB+ViYJlcT6JINTSu4dVB9kOqEun78h6Exg== + dependencies: + neo-async "^2.6.0" + optimist "^0.6.1" + source-map "^0.6.1" + optionalDependencies: + uglify-js "^3.1.4" + har-schema@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" @@ -4310,11 +5395,23 @@ hosted-git-info@^2.1.4: resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.5.tgz#759cfcf2c4d156ade59b0b2dfabddc42a6b9c70c" integrity sha512-kssjab8CvdXfcXMXVcvsXum4Hwdq9XGtRD3TteMEvEbq0LXyiNQr6AprqKqfeaDXze7SxWvRxdpwE6ku7ikLkg== +html-encoding-sniffer@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz#e70d84b94da53aa375e11fe3a351be6642ca46f8" + integrity sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw== + dependencies: + whatwg-encoding "^1.0.1" + html-entities@^1.2.0: version "1.2.1" resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-1.2.1.tgz#0df29351f0721163515dfb9e5543e5f6eed5162f" integrity sha1-DfKTUfByEWNRXfueVUPl9u7VFi8= +http-cache-semantics@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.0.3.tgz#495704773277eeef6e43f9ab2c2c7d259dda25c5" + integrity sha512-TcIMG3qeVLgDr1TEd2XvHaTnMPwYQUQMIBLy+5pLSDKYFc7UIqj39w8EGzZkaxoLv/l2K8HaI0t5AVA+YYgUew== + http-errors@1.7.2: version "1.7.2" resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.2.tgz#4f5029cf13239f31036e5b2e55292bcfbcc85c8f" @@ -4376,6 +5473,23 @@ https-proxy-agent@^2.2.1: agent-base "^4.3.0" debug "^3.1.0" +husky@^3.0.9: + version "3.0.9" + resolved "https://registry.yarnpkg.com/husky/-/husky-3.0.9.tgz#a2c3e9829bfd6b4957509a9500d2eef5dbfc8044" + integrity sha512-Yolhupm7le2/MqC1VYLk/cNmYxsSsqKkTyBhzQHhPK1jFnC89mmmNVuGtLNabjDI6Aj8UNIr0KpRNuBkiC4+sg== + dependencies: + chalk "^2.4.2" + ci-info "^2.0.0" + cosmiconfig "^5.2.1" + execa "^1.0.0" + get-stdin "^7.0.0" + opencollective-postinstall "^2.0.2" + pkg-dir "^4.2.0" + please-upgrade-node "^3.2.0" + read-pkg "^5.2.0" + run-node "^1.0.0" + slash "^3.0.0" + iconv-lite@0.4.24, iconv-lite@^0.4.24, iconv-lite@^0.4.4, iconv-lite@~0.4.13: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" @@ -4439,6 +5553,11 @@ ignore@^4.0.6: resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== +ignore@^5.1.1: + version "5.1.4" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.4.tgz#84b7b3dbe64552b6ef0eca99f6743dbec6d97adf" + integrity sha512-MzbUSahkTW1u7JpKKjY7LCARd1fU5W2rLdxlM4kdkayuCwZImjkpluF9CM1aLewYJguPDqewLam18Y6AU69A8A== + import-cwd@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/import-cwd/-/import-cwd-2.1.0.tgz#aa6cf36e722761285cb371ec6519f53e2435b0a9" @@ -4474,12 +5593,30 @@ import-lazy@^2.1.0: resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-2.1.0.tgz#05698e3d45c88e8d7e9d92cb0584e77f096f3e43" integrity sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM= +import-local@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/import-local/-/import-local-2.0.0.tgz#55070be38a5993cf18ef6db7e961f5bee5c5a09d" + integrity sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ== + dependencies: + pkg-dir "^3.0.0" + resolve-cwd "^2.0.0" + imurmurhash@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= -indexes-of@^1.0.1: +indent-string@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-3.2.0.tgz#4a5fd6d27cc332f37e5419a504dbb837105c9289" + integrity sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok= + +indent-string@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" + integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== + +indexes-of@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/indexes-of/-/indexes-of-1.0.1.tgz#f30f716c8e2bd346c7b67d3df3915566a7c05607" integrity sha1-8w9xbI4r00bHtn0985FVZqfAVgc= @@ -4517,7 +5654,7 @@ ini@^1.3.4, ini@~1.3.0: resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw== -inquirer@^6.2.0, inquirer@^6.2.2: +inquirer@^6.2.0: version "6.5.2" resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.5.2.tgz#ad50942375d036d327ff528c08bd5fab089928ca" integrity sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ== @@ -4555,7 +5692,12 @@ inquirer@^7.0.0: strip-ansi "^5.1.0" through "^2.3.6" -invariant@^2.2.2: +interpret@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.2.0.tgz#d5061a6224be58e8083985f5014d844359576296" + integrity sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw== + +invariant@^2.2.2, invariant@^2.2.4: version "2.2.4" resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== @@ -4620,6 +5762,13 @@ is-ci@^1.0.10: dependencies: ci-info "^1.5.0" +is-ci@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c" + integrity sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w== + dependencies: + ci-info "^2.0.0" + is-data-descriptor@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" @@ -4701,6 +5850,16 @@ is-fullwidth-code-point@^3.0.0: resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== +is-function@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-function/-/is-function-1.0.1.tgz#12cfb98b65b57dd3d193a3121f5f6e2f437602b5" + integrity sha1-Es+5i2W1fdPRk6MSH19uL0N2ArU= + +is-generator-fn@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" + integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== + is-glob@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" @@ -4735,7 +5894,12 @@ is-number@^3.0.0: dependencies: kind-of "^3.0.2" -is-obj@^1.0.0: +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-obj@^1.0.0, is-obj@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" integrity sha1-PkcprB9f3gJc19g6iW2rn09n2w8= @@ -4745,11 +5909,23 @@ is-obj@^2.0.0: resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982" integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w== +is-observable@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-observable/-/is-observable-1.1.0.tgz#b3e986c8f44de950867cab5403f5a3465005975e" + integrity sha512-NqCa4Sa2d+u7BWc6CukaObG3Fh+CU9bvixbpcXYhy2VvYS7vVGIdAgnIS5Ks3A/cqk4rebLJ9s8zBstT2aKnIA== + dependencies: + symbol-observable "^1.1.0" + is-path-cwd@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-1.0.0.tgz#d225ec23132e89edd38fda767472e62e65f1106d" integrity sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0= +is-path-cwd@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-2.2.0.tgz#67d43b82664a7b5191fd9119127eb300048a9fdb" + integrity sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ== + is-path-in-cwd@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz#5ac48b345ef675339bd6c7a48a912110b241cf52" @@ -4764,6 +5940,11 @@ is-path-inside@^1.0.0: dependencies: path-is-inside "^1.0.1" +is-path-inside@^3.0.1: + version "3.0.2" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.2.tgz#f5220fc82a3e233757291dddc9c5877f2a1f3017" + integrity sha512-/2UGPSgmtqwo1ktx8NDHjuPwZWmHhO+gj0f93EkhLB5RgW9RZevWYYlIkS6zePc6U2WpOdQYIwHe9YC4DWEBVg== + is-plain-obj@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" @@ -4793,6 +5974,11 @@ is-regex@^1.0.4: dependencies: has "^1.0.1" +is-regexp@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-regexp/-/is-regexp-1.0.0.tgz#fd2d883545c46bac5a633e7b9a09e87fa2cb5069" + integrity sha1-/S2INUXEa6xaYz57mgnof6LLUGk= + is-retry-allowed@^1.0.0: version "1.2.0" resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz#d778488bd0a4666a3be8a1482b9f2baafedea8b4" @@ -4803,6 +5989,11 @@ is-stream@^1.0.0, is-stream@^1.0.1, is-stream@^1.1.0: resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= +is-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.0.tgz#bde9c32680d6fae04129d6ac9d921ce7815f78e3" + integrity sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw== + is-symbol@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.2.tgz#a055f6ae57192caee329e7a860118b497a950f38" @@ -4875,12 +6066,405 @@ isstream@~0.1.2: resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= +istanbul-lib-coverage@^2.0.2, istanbul-lib-coverage@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz#675f0ab69503fad4b1d849f736baaca803344f49" + integrity sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA== + +istanbul-lib-instrument@^3.0.1, istanbul-lib-instrument@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-3.3.0.tgz#a5f63d91f0bbc0c3e479ef4c5de027335ec6d630" + integrity sha512-5nnIN4vo5xQZHdXno/YDXJ0G+I3dAm4XgzfSVTPLQpj/zAV2dV6Juy0yaf10/zrJOJeHoN3fraFe+XRq2bFVZA== + dependencies: + "@babel/generator" "^7.4.0" + "@babel/parser" "^7.4.3" + "@babel/template" "^7.4.0" + "@babel/traverse" "^7.4.3" + "@babel/types" "^7.4.0" + istanbul-lib-coverage "^2.0.5" + semver "^6.0.0" + +istanbul-lib-report@^2.0.4: + version "2.0.8" + resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-2.0.8.tgz#5a8113cd746d43c4889eba36ab10e7d50c9b4f33" + integrity sha512-fHBeG573EIihhAblwgxrSenp0Dby6tJMFR/HvlerBsrCTD5bkUuoNtn3gVh29ZCS824cGGBPn7Sg7cNk+2xUsQ== + dependencies: + istanbul-lib-coverage "^2.0.5" + make-dir "^2.1.0" + supports-color "^6.1.0" + +istanbul-lib-source-maps@^3.0.1: + version "3.0.6" + resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.6.tgz#284997c48211752ec486253da97e3879defba8c8" + integrity sha512-R47KzMtDJH6X4/YW9XTx+jrLnZnscW4VpNN+1PViSYTejLVPWv7oov+Duf8YQSPyVRUvueQqz1TcsC6mooZTXw== + dependencies: + debug "^4.1.1" + istanbul-lib-coverage "^2.0.5" + make-dir "^2.1.0" + rimraf "^2.6.3" + source-map "^0.6.1" + +istanbul-reports@^2.2.6: + version "2.2.6" + resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-2.2.6.tgz#7b4f2660d82b29303a8fe6091f8ca4bf058da1af" + integrity sha512-SKi4rnMyLBKe0Jy2uUdx28h8oG7ph2PPuQPvIAh31d+Ci+lSiEu4C+h3oBPuJ9+mPKhOyW0M8gY4U5NM1WLeXA== + dependencies: + handlebars "^4.1.2" + iterall@^1.2.1, iterall@^1.2.2: version "1.2.2" resolved "https://registry.yarnpkg.com/iterall/-/iterall-1.2.2.tgz#92d70deb8028e0c39ff3164fdbf4d8b088130cd7" integrity sha512-yynBb1g+RFUPY64fTrFv7nsjRrENBQJaX2UL+2Szc9REFrSNm1rpSXHGzhmAy7a9uv3vlvgBlXnf9RqmPH1/DA== -jest-worker@24.9.0: +jest-changed-files@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-24.9.0.tgz#08d8c15eb79a7fa3fc98269bc14b451ee82f8039" + integrity sha512-6aTWpe2mHF0DhL28WjdkO8LyGjs3zItPET4bMSeXU6T3ub4FPMw+mcOcbdGXQOAfmLcxofD23/5Bl9Z4AkFwqg== + dependencies: + "@jest/types" "^24.9.0" + execa "^1.0.0" + throat "^4.0.0" + +jest-cli@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-24.9.0.tgz#ad2de62d07472d419c6abc301fc432b98b10d2af" + integrity sha512-+VLRKyitT3BWoMeSUIHRxV/2g8y9gw91Jh5z2UmXZzkZKpbC08CSehVxgHUwTpy+HwGcns/tqafQDJW7imYvGg== + dependencies: + "@jest/core" "^24.9.0" + "@jest/test-result" "^24.9.0" + "@jest/types" "^24.9.0" + chalk "^2.0.1" + exit "^0.1.2" + import-local "^2.0.0" + is-ci "^2.0.0" + jest-config "^24.9.0" + jest-util "^24.9.0" + jest-validate "^24.9.0" + prompts "^2.0.1" + realpath-native "^1.1.0" + yargs "^13.3.0" + +jest-config@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-24.9.0.tgz#fb1bbc60c73a46af03590719efa4825e6e4dd1b5" + integrity sha512-RATtQJtVYQrp7fvWg6f5y3pEFj9I+H8sWw4aKxnDZ96mob5i5SD6ZEGWgMLXQ4LE8UurrjbdlLWdUeo+28QpfQ== + dependencies: + "@babel/core" "^7.1.0" + "@jest/test-sequencer" "^24.9.0" + "@jest/types" "^24.9.0" + babel-jest "^24.9.0" + chalk "^2.0.1" + glob "^7.1.1" + jest-environment-jsdom "^24.9.0" + jest-environment-node "^24.9.0" + jest-get-type "^24.9.0" + jest-jasmine2 "^24.9.0" + jest-regex-util "^24.3.0" + jest-resolve "^24.9.0" + jest-util "^24.9.0" + jest-validate "^24.9.0" + micromatch "^3.1.10" + pretty-format "^24.9.0" + realpath-native "^1.1.0" + +jest-diff@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-24.9.0.tgz#931b7d0d5778a1baf7452cb816e325e3724055da" + integrity sha512-qMfrTs8AdJE2iqrTp0hzh7kTd2PQWrsFyj9tORoKmu32xjPjeE4NyjVRDz8ybYwqS2ik8N4hsIpiVTyFeo2lBQ== + dependencies: + chalk "^2.0.1" + diff-sequences "^24.9.0" + jest-get-type "^24.9.0" + pretty-format "^24.9.0" + +jest-docblock@^24.3.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-24.9.0.tgz#7970201802ba560e1c4092cc25cbedf5af5a8ce2" + integrity sha512-F1DjdpDMJMA1cN6He0FNYNZlo3yYmOtRUnktrT9Q37njYzC5WEaDdmbynIgy0L/IvXvvgsG8OsqhLPXTpfmZAA== + dependencies: + detect-newline "^2.1.0" + +jest-each@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-24.9.0.tgz#eb2da602e2a610898dbc5f1f6df3ba86b55f8b05" + integrity sha512-ONi0R4BvW45cw8s2Lrx8YgbeXL1oCQ/wIDwmsM3CqM/nlblNCPmnC3IPQlMbRFZu3wKdQ2U8BqM6lh3LJ5Bsog== + dependencies: + "@jest/types" "^24.9.0" + chalk "^2.0.1" + jest-get-type "^24.9.0" + jest-util "^24.9.0" + pretty-format "^24.9.0" + +jest-environment-jsdom@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-24.9.0.tgz#4b0806c7fc94f95edb369a69cc2778eec2b7375b" + integrity sha512-Zv9FV9NBRzLuALXjvRijO2351DRQeLYXtpD4xNvfoVFw21IOKNhZAEUKcbiEtjTkm2GsJ3boMVgkaR7rN8qetA== + dependencies: + "@jest/environment" "^24.9.0" + "@jest/fake-timers" "^24.9.0" + "@jest/types" "^24.9.0" + jest-mock "^24.9.0" + jest-util "^24.9.0" + jsdom "^11.5.1" + +jest-environment-node@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-24.9.0.tgz#333d2d2796f9687f2aeebf0742b519f33c1cbfd3" + integrity sha512-6d4V2f4nxzIzwendo27Tr0aFm+IXWa0XEUnaH6nU0FMaozxovt+sfRvh4J47wL1OvF83I3SSTu0XK+i4Bqe7uA== + dependencies: + "@jest/environment" "^24.9.0" + "@jest/fake-timers" "^24.9.0" + "@jest/types" "^24.9.0" + jest-mock "^24.9.0" + jest-util "^24.9.0" + +jest-get-type@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-24.9.0.tgz#1684a0c8a50f2e4901b6644ae861f579eed2ef0e" + integrity sha512-lUseMzAley4LhIcpSP9Jf+fTrQ4a1yHQwLNeeVa2cEmbCGeoZAtYPOIv8JaxLD/sUpKxetKGP+gsHl8f8TSj8Q== + +jest-haste-map@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-24.9.0.tgz#b38a5d64274934e21fa417ae9a9fbeb77ceaac7d" + integrity sha512-kfVFmsuWui2Sj1Rp1AJ4D9HqJwE4uwTlS/vO+eRUaMmd54BFpli2XhMQnPC2k4cHFVbB2Q2C+jtI1AGLgEnCjQ== + dependencies: + "@jest/types" "^24.9.0" + anymatch "^2.0.0" + fb-watchman "^2.0.0" + graceful-fs "^4.1.15" + invariant "^2.2.4" + jest-serializer "^24.9.0" + jest-util "^24.9.0" + jest-worker "^24.9.0" + micromatch "^3.1.10" + sane "^4.0.3" + walker "^1.0.7" + optionalDependencies: + fsevents "^1.2.7" + +jest-jasmine2@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-24.9.0.tgz#1f7b1bd3242c1774e62acabb3646d96afc3be6a0" + integrity sha512-Cq7vkAgaYKp+PsX+2/JbTarrk0DmNhsEtqBXNwUHkdlbrTBLtMJINADf2mf5FkowNsq8evbPc07/qFO0AdKTzw== + dependencies: + "@babel/traverse" "^7.1.0" + "@jest/environment" "^24.9.0" + "@jest/test-result" "^24.9.0" + "@jest/types" "^24.9.0" + chalk "^2.0.1" + co "^4.6.0" + expect "^24.9.0" + is-generator-fn "^2.0.0" + jest-each "^24.9.0" + jest-matcher-utils "^24.9.0" + jest-message-util "^24.9.0" + jest-runtime "^24.9.0" + jest-snapshot "^24.9.0" + jest-util "^24.9.0" + pretty-format "^24.9.0" + throat "^4.0.0" + +jest-leak-detector@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-24.9.0.tgz#b665dea7c77100c5c4f7dfcb153b65cf07dcf96a" + integrity sha512-tYkFIDsiKTGwb2FG1w8hX9V0aUb2ot8zY/2nFg087dUageonw1zrLMP4W6zsRO59dPkTSKie+D4rhMuP9nRmrA== + dependencies: + jest-get-type "^24.9.0" + pretty-format "^24.9.0" + +jest-matcher-utils@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-24.9.0.tgz#f5b3661d5e628dffe6dd65251dfdae0e87c3a073" + integrity sha512-OZz2IXsu6eaiMAwe67c1T+5tUAtQyQx27/EMEkbFAGiw52tB9em+uGbzpcgYVpA8wl0hlxKPZxrly4CXU/GjHA== + dependencies: + chalk "^2.0.1" + jest-diff "^24.9.0" + jest-get-type "^24.9.0" + pretty-format "^24.9.0" + +jest-message-util@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-24.9.0.tgz#527f54a1e380f5e202a8d1149b0ec872f43119e3" + integrity sha512-oCj8FiZ3U0hTP4aSui87P4L4jC37BtQwUMqk+zk/b11FR19BJDeZsZAvIHutWnmtw7r85UmR3CEWZ0HWU2mAlw== + dependencies: + "@babel/code-frame" "^7.0.0" + "@jest/test-result" "^24.9.0" + "@jest/types" "^24.9.0" + "@types/stack-utils" "^1.0.1" + chalk "^2.0.1" + micromatch "^3.1.10" + slash "^2.0.0" + stack-utils "^1.0.1" + +jest-mock@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-24.9.0.tgz#c22835541ee379b908673ad51087a2185c13f1c6" + integrity sha512-3BEYN5WbSq9wd+SyLDES7AHnjH9A/ROBwmz7l2y+ol+NtSFO8DYiEBzoO1CeFc9a8DYy10EO4dDFVv/wN3zl1w== + dependencies: + "@jest/types" "^24.9.0" + +jest-pnp-resolver@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.1.tgz#ecdae604c077a7fbc70defb6d517c3c1c898923a" + integrity sha512-pgFw2tm54fzgYvc/OHrnysABEObZCUNFnhjoRjaVOCN8NYc032/gVjPaHD4Aq6ApkSieWtfKAFQtmDKAmhupnQ== + +jest-regex-util@^24.3.0, jest-regex-util@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-24.9.0.tgz#c13fb3380bde22bf6575432c493ea8fe37965636" + integrity sha512-05Cmb6CuxaA+Ys6fjr3PhvV3bGQmO+2p2La4hFbU+W5uOc479f7FdLXUWXw4pYMAhhSZIuKHwSXSu6CsSBAXQA== + +jest-resolve-dependencies@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-24.9.0.tgz#ad055198959c4cfba8a4f066c673a3f0786507ab" + integrity sha512-Fm7b6AlWnYhT0BXy4hXpactHIqER7erNgIsIozDXWl5dVm+k8XdGVe1oTg1JyaFnOxarMEbax3wyRJqGP2Pq+g== + dependencies: + "@jest/types" "^24.9.0" + jest-regex-util "^24.3.0" + jest-snapshot "^24.9.0" + +jest-resolve@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-24.9.0.tgz#dff04c7687af34c4dd7e524892d9cf77e5d17321" + integrity sha512-TaLeLVL1l08YFZAt3zaPtjiVvyy4oSA6CRe+0AFPPVX3Q/VI0giIWWoAvoS5L96vj9Dqxj4fB5p2qrHCmTU/MQ== + dependencies: + "@jest/types" "^24.9.0" + browser-resolve "^1.11.3" + chalk "^2.0.1" + jest-pnp-resolver "^1.2.1" + realpath-native "^1.1.0" + +jest-runner-eslint@^0.7.5: + version "0.7.5" + resolved "https://registry.yarnpkg.com/jest-runner-eslint/-/jest-runner-eslint-0.7.5.tgz#ab413f531490b6ea42ce82186b25fcfe4ba3c2e5" + integrity sha512-R4EqQnX0gtUv2SA1vwerI6rd5hLm0tVBTq2j3j4BZBHEfh7oKGF/hlkkNVDRfd73TAOcCaM3uhgzny7R4mnWVQ== + dependencies: + chalk "^2.4.1" + cosmiconfig "^5.0.0" + create-jest-runner "^0.5.3" + eslint "^4.0.0 || ^5.0.0 || ^6.0.0" + +jest-runner@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-24.9.0.tgz#574fafdbd54455c2b34b4bdf4365a23857fcdf42" + integrity sha512-KksJQyI3/0mhcfspnxxEOBueGrd5E4vV7ADQLT9ESaCzz02WnbdbKWIf5Mkaucoaj7obQckYPVX6JJhgUcoWWg== + dependencies: + "@jest/console" "^24.7.1" + "@jest/environment" "^24.9.0" + "@jest/test-result" "^24.9.0" + "@jest/types" "^24.9.0" + chalk "^2.4.2" + exit "^0.1.2" + graceful-fs "^4.1.15" + jest-config "^24.9.0" + jest-docblock "^24.3.0" + jest-haste-map "^24.9.0" + jest-jasmine2 "^24.9.0" + jest-leak-detector "^24.9.0" + jest-message-util "^24.9.0" + jest-resolve "^24.9.0" + jest-runtime "^24.9.0" + jest-util "^24.9.0" + jest-worker "^24.6.0" + source-map-support "^0.5.6" + throat "^4.0.0" + +jest-runtime@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-24.9.0.tgz#9f14583af6a4f7314a6a9d9f0226e1a781c8e4ac" + integrity sha512-8oNqgnmF3v2J6PVRM2Jfuj8oX3syKmaynlDMMKQ4iyzbQzIG6th5ub/lM2bCMTmoTKM3ykcUYI2Pw9xwNtjMnw== + dependencies: + "@jest/console" "^24.7.1" + "@jest/environment" "^24.9.0" + "@jest/source-map" "^24.3.0" + "@jest/transform" "^24.9.0" + "@jest/types" "^24.9.0" + "@types/yargs" "^13.0.0" + chalk "^2.0.1" + exit "^0.1.2" + glob "^7.1.3" + graceful-fs "^4.1.15" + jest-config "^24.9.0" + jest-haste-map "^24.9.0" + jest-message-util "^24.9.0" + jest-mock "^24.9.0" + jest-regex-util "^24.3.0" + jest-resolve "^24.9.0" + jest-snapshot "^24.9.0" + jest-util "^24.9.0" + jest-validate "^24.9.0" + realpath-native "^1.1.0" + slash "^2.0.0" + strip-bom "^3.0.0" + yargs "^13.3.0" + +jest-serializer@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-24.9.0.tgz#e6d7d7ef96d31e8b9079a714754c5d5c58288e73" + integrity sha512-DxYipDr8OvfrKH3Kel6NdED3OXxjvxXZ1uIY2I9OFbGg+vUkkg7AGvi65qbhbWNPvDckXmzMPbK3u3HaDO49bQ== + +jest-snapshot@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-24.9.0.tgz#ec8e9ca4f2ec0c5c87ae8f925cf97497b0e951ba" + integrity sha512-uI/rszGSs73xCM0l+up7O7a40o90cnrk429LOiK3aeTvfC0HHmldbd81/B7Ix81KSFe1lwkbl7GnBGG4UfuDew== + dependencies: + "@babel/types" "^7.0.0" + "@jest/types" "^24.9.0" + chalk "^2.0.1" + expect "^24.9.0" + jest-diff "^24.9.0" + jest-get-type "^24.9.0" + jest-matcher-utils "^24.9.0" + jest-message-util "^24.9.0" + jest-resolve "^24.9.0" + mkdirp "^0.5.1" + natural-compare "^1.4.0" + pretty-format "^24.9.0" + semver "^6.2.0" + +jest-util@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-24.9.0.tgz#7396814e48536d2e85a37de3e4c431d7cb140162" + integrity sha512-x+cZU8VRmOJxbA1K5oDBdxQmdq0OIdADarLxk0Mq+3XS4jgvhG/oKGWcIDCtPG0HgjxOYvF+ilPJQsAyXfbNOg== + dependencies: + "@jest/console" "^24.9.0" + "@jest/fake-timers" "^24.9.0" + "@jest/source-map" "^24.9.0" + "@jest/test-result" "^24.9.0" + "@jest/types" "^24.9.0" + callsites "^3.0.0" + chalk "^2.0.1" + graceful-fs "^4.1.15" + is-ci "^2.0.0" + mkdirp "^0.5.1" + slash "^2.0.0" + source-map "^0.6.0" + +jest-validate@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-24.9.0.tgz#0775c55360d173cd854e40180756d4ff52def8ab" + integrity sha512-HPIt6C5ACwiqSiwi+OfSSHbK8sG7akG8eATl+IPKaeIjtPOeBUd/g3J7DghugzxrGjI93qS/+RPKe1H6PqvhRQ== + dependencies: + "@jest/types" "^24.9.0" + camelcase "^5.3.1" + chalk "^2.0.1" + jest-get-type "^24.9.0" + leven "^3.1.0" + pretty-format "^24.9.0" + +jest-watcher@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-24.9.0.tgz#4b56e5d1ceff005f5b88e528dc9afc8dd4ed2b3b" + integrity sha512-+/fLOfKPXXYJDYlks62/4R4GoT+GU1tYZed99JSCOsmzkkF7727RqKrjNAxtfO4YpGv11wybgRvCjR73lK2GZw== + dependencies: + "@jest/test-result" "^24.9.0" + "@jest/types" "^24.9.0" + "@types/yargs" "^13.0.0" + ansi-escapes "^3.0.0" + chalk "^2.0.1" + jest-util "^24.9.0" + string-length "^2.0.0" + +jest-worker@24.9.0, jest-worker@^24.0.0, jest-worker@^24.6.0, jest-worker@^24.9.0: version "24.9.0" resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-24.9.0.tgz#5dbfdb5b2d322e98567898238a9697bcce67b3e5" integrity sha512-51PE4haMSXcHohnSMdM42anbvZANYTqMrr52tVKPqqsPJMzoP6FYYDVqahX/HrAoKEKz3uUPzSvKs9A3qR4iVw== @@ -4888,6 +6472,21 @@ jest-worker@24.9.0: merge-stream "^2.0.0" supports-color "^6.1.0" +jest@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest/-/jest-24.9.0.tgz#987d290c05a08b52c56188c1002e368edb007171" + integrity sha512-YvkBL1Zm7d2B1+h5fHEOdyjCG+sGMz4f8D86/0HiqJ6MB4MnDc8FgP5vdWsGnemOQro7lnYo8UakZ3+5A0jxGw== + dependencies: + import-local "^2.0.0" + jest-cli "^24.9.0" + +jose@^1.14.0: + version "1.14.0" + resolved "https://registry.yarnpkg.com/jose/-/jose-1.14.0.tgz#8a4e6e1a3d56cfdf2fece0a2234061018e46bf28" + integrity sha512-zpD7jBTcyjrhNYQ8SCy9eTSPZQCVgpin0gnfrC5Ee9q4J0KngpiwRylAAswbgOEl6V/mDQ7kgLE68F7A6Ox7CA== + dependencies: + asn1.js "^5.2.0" + js-levenshtein@^1.1.3: version "1.1.6" resolved "https://registry.yarnpkg.com/js-levenshtein/-/js-levenshtein-1.1.6.tgz#c6cee58eb3550372df8deb85fad5ce66ce01d59d" @@ -4903,7 +6502,7 @@ js-tokens@^3.0.2: resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" integrity sha1-mGbfOVECEw449/mWvOtlRDIJwls= -js-yaml@^3.10.0, js-yaml@^3.13.0, js-yaml@^3.13.1, js-yaml@^3.9.1: +js-yaml@^3.10.0, js-yaml@^3.13.1, js-yaml@^3.9.1: version "3.13.1" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw== @@ -4916,6 +6515,38 @@ jsbn@~0.1.0: resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= +jsdom@^11.5.1: + version "11.12.0" + resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-11.12.0.tgz#1a80d40ddd378a1de59656e9e6dc5a3ba8657bc8" + integrity sha512-y8Px43oyiBM13Zc1z780FrfNLJCXTL40EWlty/LXUtcjykRBNgLlCjWXpfSPBl2iv+N7koQN+dvqszHZgT/Fjw== + dependencies: + abab "^2.0.0" + acorn "^5.5.3" + acorn-globals "^4.1.0" + array-equal "^1.0.0" + cssom ">= 0.3.2 < 0.4.0" + cssstyle "^1.0.0" + data-urls "^1.0.0" + domexception "^1.0.1" + escodegen "^1.9.1" + html-encoding-sniffer "^1.0.2" + left-pad "^1.3.0" + nwsapi "^2.0.7" + parse5 "4.0.0" + pn "^1.1.0" + request "^2.87.0" + request-promise-native "^1.0.5" + sax "^1.2.4" + symbol-tree "^3.2.2" + tough-cookie "^2.3.4" + w3c-hr-time "^1.0.1" + webidl-conversions "^4.0.2" + whatwg-encoding "^1.0.3" + whatwg-mimetype "^2.1.0" + whatwg-url "^6.4.1" + ws "^5.2.0" + xml-name-validator "^3.0.0" + jsesc@^2.5.1: version "2.5.2" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" @@ -4926,6 +6557,11 @@ jsesc@~0.5.0: resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" integrity sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0= +json-buffer@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.0.tgz#5b1f397afc75d677bde8bcfc0e47e1f9a3d9a898" + integrity sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg= + json-parse-better-errors@^1.0.1, json-parse-better-errors@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" @@ -4994,7 +6630,7 @@ jsonify@~0.0.0: resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" integrity sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM= -jsonwebtoken@^8.1.0, jsonwebtoken@^8.3.0: +jsonwebtoken@^8.1.0, jsonwebtoken@^8.3.0, jsonwebtoken@^8.5.1: version "8.5.1" resolved "https://registry.yarnpkg.com/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz#00e71e0b8df54c2121a1f26137df2280673bcc0d" integrity sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w== @@ -5045,6 +6681,13 @@ jws@^3.2.2: jwa "^1.4.1" safe-buffer "^5.0.1" +keyv@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/keyv/-/keyv-3.1.0.tgz#ecc228486f69991e49e9476485a5be1e8fc5c4d9" + integrity sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA== + dependencies: + json-buffer "3.0.0" + kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: version "3.2.2" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" @@ -5076,6 +6719,11 @@ klaw-sync@^6.0.0: dependencies: graceful-fs "^4.1.11" +kleur@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" + integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== + latest-version@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-3.1.0.tgz#a205383fea322b33b5ae3b18abee0dc2f356ee15" @@ -5105,6 +6753,16 @@ lcid@^2.0.0: dependencies: invert-kv "^2.0.0" +left-pad@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/left-pad/-/left-pad-1.3.0.tgz#5b8a3a7765dfe001261dde915589e782f8c94d1e" + integrity sha512-XI5MPzVNApjAyhQzphX8BkmKsKUxD4LdyK24iZeQGinBN9yTQT3bFlCBy/aVx2HrNcqQGsdot8ghrjyrvMCoEA== + +leven@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" + integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== + levn@^0.3.0, levn@~0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" @@ -5113,6 +6771,83 @@ levn@^0.3.0, levn@~0.3.0: prelude-ls "~1.1.2" type-check "~0.3.2" +libphonenumber-js@^1.7.29: + version "1.7.29" + resolved "https://registry.yarnpkg.com/libphonenumber-js/-/libphonenumber-js-1.7.29.tgz#0d9550d8a04b535d7b8b881e33f06a899771adc4" + integrity sha512-k0qJpAQ6DZA3b6meri1CZr2Lg1lvC539wqLljFdCWLPK8jAXLFqE433NzGzTdxKfm/EmGE8Zhm5pK8R9N7m1pg== + dependencies: + minimist "^1.2.0" + xml2js "^0.4.17" + +lines-and-columns@^1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.1.6.tgz#1c00c743b433cd0a4e80758f7b64a57440d9ff00" + integrity sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA= + +lint-staged@^9.4.3: + version "9.4.3" + resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-9.4.3.tgz#f55ad5f94f6e105294bfd6499b23142961f7b982" + integrity sha512-PejnI+rwOAmKAIO+5UuAZU9gxdej/ovSEOAY34yMfC3OS4Ac82vCBPzAWLReR9zCPOMqeVwQRaZ3bUBpAsaL2Q== + dependencies: + chalk "^2.4.2" + commander "^2.20.0" + cosmiconfig "^5.2.1" + debug "^4.1.1" + dedent "^0.7.0" + del "^5.0.0" + execa "^2.0.3" + listr "^0.14.3" + log-symbols "^3.0.0" + micromatch "^4.0.2" + normalize-path "^3.0.0" + please-upgrade-node "^3.1.1" + string-argv "^0.3.0" + stringify-object "^3.3.0" + +listr-silent-renderer@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/listr-silent-renderer/-/listr-silent-renderer-1.1.1.tgz#924b5a3757153770bf1a8e3fbf74b8bbf3f9242e" + integrity sha1-kktaN1cVN3C/Go4/v3S4u/P5JC4= + +listr-update-renderer@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/listr-update-renderer/-/listr-update-renderer-0.5.0.tgz#4ea8368548a7b8aecb7e06d8c95cb45ae2ede6a2" + integrity sha512-tKRsZpKz8GSGqoI/+caPmfrypiaq+OQCbd+CovEC24uk1h952lVj5sC7SqyFUm+OaJ5HN/a1YLt5cit2FMNsFA== + dependencies: + chalk "^1.1.3" + cli-truncate "^0.2.1" + elegant-spinner "^1.0.1" + figures "^1.7.0" + indent-string "^3.0.0" + log-symbols "^1.0.2" + log-update "^2.3.0" + strip-ansi "^3.0.1" + +listr-verbose-renderer@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/listr-verbose-renderer/-/listr-verbose-renderer-0.5.0.tgz#f1132167535ea4c1261102b9f28dac7cba1e03db" + integrity sha512-04PDPqSlsqIOaaaGZ+41vq5FejI9auqTInicFRndCBgE3bXG8D6W1I+mWhk+1nqbHmyhla/6BUrd5OSiHwKRXw== + dependencies: + chalk "^2.4.1" + cli-cursor "^2.1.0" + date-fns "^1.27.2" + figures "^2.0.0" + +listr@^0.14.3: + version "0.14.3" + resolved "https://registry.yarnpkg.com/listr/-/listr-0.14.3.tgz#2fea909604e434be464c50bddba0d496928fa586" + integrity sha512-RmAl7su35BFd/xoMamRjpIE4j3v+L28o8CT5YhAXQJm1fD+1l9ngXY8JAQRJ+tFK2i5njvi0iRUKV09vPwA0iA== + dependencies: + "@samverschueren/stream-to-observable" "^0.3.0" + is-observable "^1.1.0" + is-promise "^2.1.0" + is-stream "^1.1.0" + listr-silent-renderer "^1.1.1" + listr-update-renderer "^0.5.0" + listr-verbose-renderer "^0.5.0" + p-map "^2.0.0" + rxjs "^6.3.3" + load-json-file@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8" @@ -5123,6 +6858,16 @@ load-json-file@^2.0.0: pify "^2.0.0" strip-bom "^3.0.0" +load-json-file@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-4.0.0.tgz#2f5f45ab91e33216234fd53adab668eb4ec0993b" + integrity sha1-L19Fq5HjMhYjT9U62rZo607AmTs= + dependencies: + graceful-fs "^4.1.2" + parse-json "^4.0.0" + pify "^3.0.0" + strip-bom "^3.0.0" + loader-runner@^2.4.0: version "2.4.0" resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.4.0.tgz#ed47066bfe534d7e84c4c7b9998c2a75607d9357" @@ -5285,7 +7030,12 @@ lodash.result@^4.5.2: resolved "https://registry.yarnpkg.com/lodash.result/-/lodash.result-4.5.2.tgz#cb45b27fb914eaa8d8ee6f0ce7b2870b87cb70aa" integrity sha1-y0Wyf7kU6qjY7m8M57KHC4fLcKo= -lodash.template@^4.5.0: +lodash.sortby@^4.7.0: + version "4.7.0" + resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" + integrity sha1-7dFMgk4sycHgsKG0K7UhBRakJDg= + +lodash.template@^4.4.0, lodash.template@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-4.5.0.tgz#f976195cf3f347d0d5f52483569fe8031ccce8ab" integrity sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A== @@ -5305,16 +7055,28 @@ lodash.toarray@^4.4.0: resolved "https://registry.yarnpkg.com/lodash.toarray/-/lodash.toarray-4.4.0.tgz#24c4bfcd6b2fba38bfd0594db1179d8e9b656561" integrity sha1-JMS/zWsvuji/0FlNsRedjptlZWE= +lodash.unescape@4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/lodash.unescape/-/lodash.unescape-4.0.1.tgz#bf2249886ce514cda112fae9218cdc065211fc9c" + integrity sha1-vyJJiGzlFM2hEvrpIYzcBlIR/Jw= + lodash.uniqby@^4.7.0: version "4.7.0" resolved "https://registry.yarnpkg.com/lodash.uniqby/-/lodash.uniqby-4.7.0.tgz#d99c07a669e9e6d24e1362dfe266c67616af1302" integrity sha1-2ZwHpmnp5tJOE2Lf4mbGdhavEwI= -lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.4, lodash@^4.8.0: +lodash@4.17.15, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.4, lodash@^4.8.0: version "4.17.15" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== +log-symbols@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-1.0.2.tgz#376ff7b58ea3086a0f09facc74617eca501e1a18" + integrity sha1-N2/3tY6jCGoPCfrMdGF+ylAeGhg= + dependencies: + chalk "^1.0.0" + log-symbols@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-2.2.0.tgz#5740e1c5d6f0dfda4ad9323b5332107ef6b4c40a" @@ -5322,6 +7084,22 @@ log-symbols@^2.2.0: dependencies: chalk "^2.0.1" +log-symbols@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-3.0.0.tgz#f3a08516a5dea893336a7dee14d18a1cfdab77c4" + integrity sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ== + dependencies: + chalk "^2.4.2" + +log-update@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/log-update/-/log-update-2.3.0.tgz#88328fd7d1ce7938b29283746f0b1bc126b24708" + integrity sha1-iDKP19HOeTiykoN0bwsbwSayRwg= + dependencies: + ansi-escapes "^3.0.0" + cli-cursor "^2.0.0" + wrap-ansi "^3.0.1" + loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" @@ -5334,11 +7112,16 @@ lower-case@^1.1.1: resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-1.1.4.tgz#9a2cabd1b9e8e0ae993a4bf7d5875c39c42e8eac" integrity sha1-miyr0bno4K6ZOkv31YdcOcQujqw= -lowercase-keys@^1.0.0: +lowercase-keys@^1.0.0, lowercase-keys@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f" integrity sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA== +lowercase-keys@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz#2603e78b7b4b0006cbca2fbcc8a3202558ac9479" + integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA== + lru-cache@5.1.1, lru-cache@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" @@ -5346,7 +7129,7 @@ lru-cache@5.1.1, lru-cache@^5.1.1: dependencies: yallist "^3.0.2" -lru-cache@^4.0.1, lru-cache@^4.1.3: +lru-cache@^4.0.1, lru-cache@^4.1.1, lru-cache@^4.1.3: version "4.1.5" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd" integrity sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g== @@ -5361,7 +7144,7 @@ make-dir@^1.0.0: dependencies: pify "^3.0.0" -make-dir@^2.0.0: +make-dir@^2.0.0, make-dir@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5" integrity sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA== @@ -5383,11 +7166,18 @@ make-error-cause@^1.2.1: dependencies: make-error "^1.2.0" -make-error@^1.2.0: +make-error@^1.2.0, make-error@^1.3.5: version "1.3.5" resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.5.tgz#efe4e81f6db28cadd605c70f29c831b58ef776c8" integrity sha512-c3sIjNUow0+8swNwVpqoH4YCShKNFkMaw6oH1mNS2haDZQqkeZFlHS3dhoeEbKKmJB4vXpJucU6oH75aDYeE9g== +makeerror@1.0.x: + version "1.0.11" + resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.11.tgz#e01a5c9109f2af79660e4e8b9587790184f5a96c" + integrity sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw= + dependencies: + tmpl "1.0.x" + mamacro@^0.0.3: version "0.0.3" resolved "https://registry.yarnpkg.com/mamacro/-/mamacro-0.0.3.tgz#ad2c9576197c9f1abf308d0787865bd975a3f3e4" @@ -5466,6 +7256,11 @@ memoize-one@^5.0.0: resolved "https://registry.yarnpkg.com/memoize-one/-/memoize-one-5.1.1.tgz#047b6e3199b508eaec03504de71229b8eb1d75c0" integrity sha512-HKeeBpWvqiVJD57ZUAsJNm71eHTykffzcLZVYWiVfQeI1rJtuEaS7hQiEpWfVVk18donPwJEcFKIkCmPJNOhHA== +memory-fs@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.2.0.tgz#f2bb25368bc121e391c2520de92969caee0a0290" + integrity sha1-8rslNovBIeORwlIN6Slpyu4KApA= + memory-fs@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552" @@ -5504,7 +7299,7 @@ merge-stream@^2.0.0: resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== -merge2@^1.2.3: +merge2@^1.2.3, merge2@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.3.0.tgz#5b366ee83b2f1582c48f87e47cf1a9352103ca81" integrity sha512-2j4DAdlBOkiSZIsaXk4mTE3sRS02yBHAtfy127xRV3bQUFqXkjHCHLW6Scv7DwNRbIWNHH8zpnz9zMaKXIdvYw== @@ -5538,6 +7333,14 @@ micromatch@^3.1.10, micromatch@^3.1.4: snapdragon "^0.8.1" to-regex "^3.0.2" +micromatch@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.2.tgz#4fcb0999bf9fbc2fcbdd212f6d629b9a56c39259" + integrity sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q== + dependencies: + braces "^3.0.1" + picomatch "^2.0.5" + miller-rabin@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d" @@ -5583,6 +7386,18 @@ mimic-fn@^2.0.0, mimic-fn@^2.1.0: resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== +mimic-response@^1.0.0, mimic-response@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b" + integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ== + +min-document@^2.19.0: + version "2.19.0" + resolved "https://registry.yarnpkg.com/min-document/-/min-document-2.19.0.tgz#7bd282e3f5842ed295bb748cdd9f1ffa2c824685" + integrity sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU= + dependencies: + dom-walk "^0.1.0" + mini-css-extract-plugin@0.4.3: version "0.4.3" resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-0.4.3.tgz#98d60fcc5d228c3e36a9bd15a1d6816d6580beb8" @@ -5624,11 +7439,16 @@ minimist@0.0.8: resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0= -minimist@^1.2.0: +minimist@^1.1.1, minimist@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" integrity sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ= +minimist@~0.0.1: + version "0.0.10" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" + integrity sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8= + minipass@^2.6.0, minipass@^2.8.6, minipass@^2.9.0: version "2.9.0" resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.9.0.tgz#e713762e7d3e32fed803115cf93e04bca9fcc9a6" @@ -5644,6 +7464,22 @@ minizlib@^1.2.1: dependencies: minipass "^2.9.0" +mississippi@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-2.0.0.tgz#3442a508fafc28500486feea99409676e4ee5a6f" + integrity sha512-zHo8v+otD1J10j/tC+VNoGK9keCuByhKovAvdn74dmxJl9+mWHnx6EMsDN4lgRoMI/eYo2nchAxniIbUPb5onw== + dependencies: + concat-stream "^1.5.0" + duplexify "^3.4.2" + end-of-stream "^1.1.0" + flush-write-stream "^1.0.0" + from2 "^2.1.0" + parallel-transform "^1.1.0" + pump "^2.0.1" + pumpify "^1.3.3" + stream-each "^1.1.0" + through2 "^2.0.0" + mississippi@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-3.0.0.tgz#ea0a3291f97e0b5e8776b363d5f0a12d94c67022" @@ -5675,6 +7511,11 @@ mkdirp@0.5.1, mkdirp@^0.5.0, mkdirp@^0.5.1: dependencies: minimist "0.0.8" +moment@^2.24.0: + version "2.24.0" + resolved "https://registry.yarnpkg.com/moment/-/moment-2.24.0.tgz#0d055d53f5052aa653c9f6eb68bb5d12bf5c2b5b" + integrity sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg== + mongodb@^3.1.10: version "3.3.4" resolved "https://registry.yarnpkg.com/mongodb/-/mongodb-3.3.4.tgz#f52eec4a04005101e63715d4d1f67bf784fa0aef" @@ -5784,7 +7625,7 @@ negotiator@0.6.2: resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb" integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw== -neo-async@^2.5.0, neo-async@^2.6.1: +neo-async@^2.5.0, neo-async@^2.6.0, neo-async@^2.6.1: version "2.6.1" resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.1.tgz#ac27ada66167fa8849a6addd837f6b189ad2081c" integrity sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw== @@ -5817,10 +7658,22 @@ next-images@^1.2.0: file-loader "^4.0.0" url-loader "^2.0.0" -next@9.1.3: - version "9.1.3" - resolved "https://registry.yarnpkg.com/next/-/next-9.1.3.tgz#9fd833b2e14e3fd566fc4718e7005c3e8dacf3e4" - integrity sha512-B9/acWnr/qK+R6fU79GLvPxDKEJXS7Db1a+02cRhcVfHWaHDRzehE2WCUDhBc8cFQtbb6fYKg+sMuOYClPNXJw== +next-offline@^4.0.6: + version "4.0.6" + resolved "https://registry.yarnpkg.com/next-offline/-/next-offline-4.0.6.tgz#c2c5f1a08518b83cd60cafb9485752955ebefc00" + integrity sha512-uLU1g2DrAdIilTUUznBlrymDaQA4WFfZA3lDmTDZ6hUIai1X/JlghiMmuBEwPuuJEdZHv1ExBpyucoUSNpXjlg== + dependencies: + clean-webpack-plugin "^0.1.19" + copy-webpack-plugin "~4.5.2" + fs-extra "~7.0.0" + glob "~7.1.3" + webpack "^4.19.1" + workbox-webpack-plugin "^4.3.1" + +next@^9.1.4: + version "9.1.4" + resolved "https://registry.yarnpkg.com/next/-/next-9.1.4.tgz#32991dd6b49adca4bac302828eb5a1b3654591b6" + integrity sha512-NJA6bBdqEWLDksQEylUQ/R2PO0fXb63pOldEvkqggbhcB8j7TGe/UnyZeC0kipatez8h52emJEfoeYPdnTxxVQ== dependencies: "@ampproject/toolbox-optimizer" "1.1.1" "@babel/core" "7.6.4" @@ -5868,7 +7721,7 @@ next@9.1.3: mkdirp "0.5.1" node-fetch "2.6.0" ora "3.4.0" - path-to-regexp "2.1.0" + path-to-regexp "3.1.0" pnp-webpack-plugin "1.5.0" postcss-flexbugs-fixes "4.1.0" postcss-loader "3.0.0" @@ -5883,7 +7736,7 @@ next@9.1.3: string-hash "1.1.3" strip-ansi "5.2.0" style-loader "1.0.0" - styled-jsx "3.2.2" + styled-jsx "3.2.4" terser "4.0.0" unfetch "4.1.0" url "0.11.0" @@ -5907,6 +7760,14 @@ no-case@^2.2.0: dependencies: lower-case "^1.1.1" +node-cron@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/node-cron/-/node-cron-2.0.3.tgz#b9649784d0d6c00758410eef22fa54a10e3f602d" + integrity sha512-eJI+QitXlwcgiZwNNSRbqsjeZMp5shyajMR81RZCqeW0ZDEj4zU9tpd4nTh/1JsBiKbF8d08FCewiipDmVIYjg== + dependencies: + opencollective-postinstall "^2.0.0" + tz-offset "0.0.1" + node-emoji@^1.4.1, node-emoji@^1.8.1: version "1.10.0" resolved "https://registry.yarnpkg.com/node-emoji/-/node-emoji-1.10.0.tgz#8886abd25d9c7bb61802a658523d1f8d2a89b2da" @@ -5937,7 +7798,12 @@ node-forge@^0.7.1: resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.7.6.tgz#fdf3b418aee1f94f0ef642cd63486c77ca9724ac" integrity sha512-sol30LUpz1jQFBjOKwbjxijiE3b6pjd74YwfD0fJOKPjF+fONKb2Yg8rYgS6+bK6VDl+/wfr4IYpC7jDzLUIfw== -node-libs-browser@^2.2.1: +node-int64@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" + integrity sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs= + +"node-libs-browser@^1.0.0 || ^2.0.0", node-libs-browser@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.2.1.tgz#b64f513d18338625f90346d27b0d235e631f6425" integrity sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q== @@ -5966,6 +7832,22 @@ node-libs-browser@^2.2.1: util "^0.11.0" vm-browserify "^1.0.1" +node-modules-regexp@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz#8d9dbe28964a4ac5712e9131642107c71e90ec40" + integrity sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA= + +node-notifier@^5.4.2: + version "5.4.3" + resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-5.4.3.tgz#cb72daf94c93904098e28b9c590fd866e464bd50" + integrity sha512-M4UBGcs4jeOK9CjTsYwkvH6/MzuUmGCyTW+kCY7uO+1ZVr0+FHGdPdIf5CCLqAaxnRrWidyoQlNkMIIVwbKB8Q== + dependencies: + growly "^1.3.0" + is-wsl "^1.1.0" + semver "^5.5.0" + shellwords "^0.1.1" + which "^1.3.0" + node-pre-gyp@^0.12.0: version "0.12.0" resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.12.0.tgz#39ba4bb1439da030295f899e3b520b7785766149" @@ -6020,7 +7902,7 @@ nopt@~1.0.10: dependencies: abbrev "1" -normalize-package-data@^2.3.2: +normalize-package-data@^2.3.2, normalize-package-data@^2.5.0: version "2.5.0" resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== @@ -6057,6 +7939,11 @@ normalize-url@1.9.1: query-string "^4.1.0" sort-keys "^1.0.0" +normalize-url@^4.1.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-4.5.0.tgz#453354087e6ca96957bd8f5baf753f5982142129" + integrity sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ== + normalize.css@^8.0.1: version "8.0.1" resolved "https://registry.yarnpkg.com/normalize.css/-/normalize.css-8.0.1.tgz#9b98a208738b9cc2634caacbc42d131c97487bf3" @@ -6089,6 +7976,13 @@ npm-run-path@^2.0.0: dependencies: path-key "^2.0.0" +npm-run-path@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-3.1.0.tgz#7f91be317f6a466efed3c9f2980ad8a4ee8b0fa5" + integrity sha512-Dbl4A/VfiVGLgQv29URL9xshU8XDY1GeLy+fsaZ1AA8JDSfjvr5P5+pzRbWqRSBxk6/DW7MIh8lTM/PaGnP2kg== + dependencies: + path-key "^3.0.0" + npm-run@4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/npm-run/-/npm-run-4.1.2.tgz#1030e1ec56908c89fcc3fa366d03a2c2ba98eb99" @@ -6130,6 +8024,11 @@ number-is-nan@^1.0.0: resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= +nwsapi@^2.0.7: + version "2.2.0" + resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.0.tgz#204879a9e3d068ff2a55139c2c772780681a38b7" + integrity sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ== + oauth-sign@~0.9.0: version "0.9.0" resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" @@ -6140,7 +8039,7 @@ oauth@0.9.x: resolved "https://registry.yarnpkg.com/oauth/-/oauth-0.9.15.tgz#bd1fefaf686c96b75475aed5196412ff60cfb9c1" integrity sha1-vR/vr2hslrdUda7VGWQS/2DPucE= -object-assign@^4, object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: +object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= @@ -6154,6 +8053,11 @@ object-copy@^0.1.0: define-property "^0.2.5" kind-of "^3.0.3" +object-hash@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-2.0.0.tgz#7c4cc341eb8b53367312a7c546142f00c9e0ea20" + integrity sha512-I7zGBH0rDKwVGeGZpZoFaDhIwvJa3l1CZE+8VchylXbInNiCj7sxxea9P5dTM4ftKR5//nrqxrdeGSTWL2VpBA== + object-inspect@^1.6.0: version "1.7.0" resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.7.0.tgz#f4f6bd181ad77f006b5ece60bd0b6f398ff74a67" @@ -6201,6 +8105,14 @@ object.fromentries@^2.0.0: function-bind "^1.1.1" has "^1.0.3" +object.getownpropertydescriptors@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz#8758c846f5b407adab0f236e0986f14b051caa16" + integrity sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY= + dependencies: + define-properties "^1.1.2" + es-abstract "^1.5.1" + object.pick@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" @@ -6218,6 +8130,11 @@ object.values@^1.1.0: function-bind "^1.1.1" has "^1.0.3" +oidc-token-hash@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/oidc-token-hash/-/oidc-token-hash-5.0.0.tgz#acdfb1f4310f58e64d5d74a4e8671a426986e888" + integrity sha512-8Yr4CZSv+Tn8ZkN3iN2i2w2G92mUKClp4z7EGUfdsERiYSbj7P4i/NHm72ft+aUdsiFx9UdIPSTwbyzQ6C4URg== + on-finished@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" @@ -6251,6 +8168,26 @@ onetime@^5.1.0: dependencies: mimic-fn "^2.1.0" +opencollective-postinstall@^2.0.0, opencollective-postinstall@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/opencollective-postinstall/-/opencollective-postinstall-2.0.2.tgz#5657f1bede69b6e33a45939b061eb53d3c6c3a89" + integrity sha512-pVOEP16TrAO2/fjej1IdOyupJY8KDUM1CvsaScRbw6oddvpQoOfGk4ywha0HKKVAD6RkW4x6Q+tNBwhf3Bgpuw== + +openid-client@^3.7.2: + version "3.8.4" + resolved "https://registry.yarnpkg.com/openid-client/-/openid-client-3.8.4.tgz#4c0000a408085658f23d4a7707cc8ad3677b5e8c" + integrity sha512-+o6kYlnDIMoUQ3+vSo5iwCBSDCh0+CJPmJR/doDvAS+VB5Amf6+WwURYmYhtDo/9XI0zNg3/Wk4MqwJrvfVYiA== + dependencies: + base64url "^3.0.1" + got "^9.6.0" + jose "^1.14.0" + lodash "^4.17.15" + lru-cache "^5.1.1" + make-error "^1.3.5" + object-hash "^2.0.0" + oidc-token-hash "^5.0.0" + p-any "^2.1.0" + opn@^5.1.0: version "5.5.0" resolved "https://registry.yarnpkg.com/opn/-/opn-5.5.0.tgz#fc7164fab56d235904c51c3b27da6758ca3b9bfc" @@ -6258,7 +8195,15 @@ opn@^5.1.0: dependencies: is-wsl "^1.1.0" -optionator@^0.8.2: +optimist@^0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686" + integrity sha1-2j6nRob6IaGaERwybpDrFaAZZoY= + dependencies: + minimist "~0.0.1" + wordwrap "~0.0.2" + +optionator@^0.8.1, optionator@^0.8.2: version "0.8.3" resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== @@ -6314,22 +8259,53 @@ osenv@^0.1.4: os-homedir "^1.0.0" os-tmpdir "^1.0.0" +p-any@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/p-any/-/p-any-2.1.0.tgz#719489408e14f5f941a748f1e817f5c71cab35cb" + integrity sha512-JAERcaMBLYKMq+voYw36+x5Dgh47+/o7yuv2oQYuSSUml4YeqJEFznBrY2UeEkoSHqBua6hz518n/PsowTYLLg== + dependencies: + p-cancelable "^2.0.0" + p-some "^4.0.0" + type-fest "^0.3.0" + +p-cancelable@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-1.1.0.tgz#d078d15a3af409220c886f1d9a0ca2e441ab26cc" + integrity sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw== + +p-cancelable@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-2.0.0.tgz#4a3740f5bdaf5ed5d7c3e34882c6fb5d6b266a6e" + integrity sha512-wvPXDmbMmu2ksjkB4Z3nZWTSkJEb9lqVdMaCKpZUGJG9TMiNp9XcbG3fn9fPKjem04fJMJnXoyFPk2FmgiaiNg== + p-defer@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-1.0.0.tgz#9f6eb182f6c9aa8cd743004a7d4f96b196b0fb0c" integrity sha1-n26xgvbJqozXQwBKfU+WsZaw+ww= +p-each-series@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-each-series/-/p-each-series-1.0.0.tgz#930f3d12dd1f50e7434457a22cd6f04ac6ad7f71" + integrity sha1-kw89Et0fUOdDRFeiLNbwSsatf3E= + dependencies: + p-reduce "^1.0.0" + p-finally@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= +p-finally@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-2.0.1.tgz#bd6fcaa9c559a096b680806f4d657b3f0f240561" + integrity sha512-vpm09aKwq6H9phqRQzecoDpD8TmVyGw70qmWlyq5onxY7tqyTTFVvxMykxQSQKILBSFlbXpypIw2T1Ml7+DDtw== + p-is-promise@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/p-is-promise/-/p-is-promise-2.1.0.tgz#918cebaea248a62cf7ffab8e3bca8c5f882fc42e" integrity sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg== -p-limit@^1.1.0: +p-limit@^1.0.0, p-limit@^1.1.0: version "1.3.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" integrity sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q== @@ -6369,6 +8345,31 @@ p-map@^1.1.1: resolved "https://registry.yarnpkg.com/p-map/-/p-map-1.2.0.tgz#e4e94f311eabbc8633a1e79908165fca26241b6b" integrity sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA== +p-map@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-2.1.0.tgz#310928feef9c9ecc65b68b17693018a665cea175" + integrity sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw== + +p-map@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-3.0.0.tgz#d704d9af8a2ba684e2600d9a215983d4141a979d" + integrity sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ== + dependencies: + aggregate-error "^3.0.0" + +p-reduce@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-reduce/-/p-reduce-1.0.0.tgz#18c2b0dd936a4690a529f8231f58a0fdb6a47dfa" + integrity sha1-GMKw3ZNqRpClKfgjH1ig/bakffo= + +p-some@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/p-some/-/p-some-4.1.0.tgz#28e73bc1e0d62db54c2ed513acd03acba30d5c04" + integrity sha512-MF/HIbq6GeBqTrTIl5OJubzkGU+qfFhAFi0gnTAK6rgEIJIknEiABHOTtQu4e6JiXjIwuMPMUFQzyHh5QjCl1g== + dependencies: + aggregate-error "^3.0.0" + p-cancelable "^2.0.0" + p-try@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" @@ -6427,6 +8428,11 @@ parse-asn1@^5.0.0: pbkdf2 "^3.0.3" safe-buffer "^5.1.1" +parse-headers@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/parse-headers/-/parse-headers-2.0.3.tgz#5e8e7512383d140ba02f0c7aa9f49b4399c92515" + integrity sha512-QhhZ+DCCit2Coi2vmAKbq5RGTRcQUOE2+REgv8vdyu7MnYx2eZztegqtTx99TZ86GTIwqiy3+4nQTWZ2tgmdCA== + parse-json@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" @@ -6442,6 +8448,16 @@ parse-json@^4.0.0: error-ex "^1.3.1" json-parse-better-errors "^1.0.1" +parse-json@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.0.0.tgz#73e5114c986d143efa3712d4ea24db9a4266f60f" + integrity sha512-OOY5b7PAEFV0E2Fir1KOkxchnZNCdowAJgQ5NuxjpBKTRP3pQhwkrkxqQjeoKJ+fO7bCpmIZaogI4eZGDMEGOw== + dependencies: + "@babel/code-frame" "^7.0.0" + error-ex "^1.3.1" + json-parse-better-errors "^1.0.1" + lines-and-columns "^1.1.6" + parse5-htmlparser2-tree-adapter@5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-5.1.0.tgz#a8244ee12bbd6b8937ad2a16ea43fe348aebcc86" @@ -6449,6 +8465,11 @@ parse5-htmlparser2-tree-adapter@5.1.0: dependencies: parse5 "^5.1.0" +parse5@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-4.0.0.tgz#6d78656e3da8d78b4ec0b906f7c08ef1dfe3f608" + integrity sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA== + parse5@5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/parse5/-/parse5-5.1.0.tgz#c59341c9723f414c452975564c7c00a68d58acd2" @@ -6533,12 +8554,17 @@ path-exists@^3.0.0: resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + path-is-absolute@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= -path-is-inside@^1.0.1, path-is-inside@^1.0.2: +path-is-inside@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" integrity sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM= @@ -6548,6 +8574,11 @@ path-key@^2.0.0, path-key@^2.0.1: resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= +path-key@^3.0.0, path-key@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.0.tgz#99a10d870a803bdd5ee6f0470e58dfcd2f9a54d3" + integrity sha512-8cChqz0RP6SHJkMt48FW0A7+qUOn+OsnOsVtzI59tZ8m+5bCSk7hzwET0pulwOM2YMn9J1efb07KB9l9f30SGg== + path-parse@^1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" @@ -6558,10 +8589,10 @@ path-to-regexp@0.1.7: resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w= -path-to-regexp@2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-2.1.0.tgz#7e30f9f5b134bd6a28ffc2e3ef1e47075ac5259b" - integrity sha512-dZY7QPCPp5r9cnNuQ955mOv4ZFVDXY/yvqeV7Y1W2PJA3PEFcuow9xKFfJxbBj1pIjOAP+M2B4/7xubmykLrXw== +path-to-regexp@3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-3.1.0.tgz#f45a9cc4dc6331ae8f131e0ce4fde8607f802367" + integrity sha512-PtHLisEvUOepjc+sStXxJ/pDV/s5UBTOKWJY2SOz3e6E/iN/jLknY9WL72kTwRrwXDUbZTEAtSnJbz2fF127DA== path-to-regexp@^1.1.1: version "1.8.0" @@ -6584,6 +8615,11 @@ path-type@^3.0.0: dependencies: pify "^3.0.0" +path-type@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" + integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== + pause@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/pause/-/pause-0.0.1.tgz#1d408b3fdb76923b9543d96fb4c9dfd535d9cb5d" @@ -6651,6 +8687,11 @@ pgpass@1.x: dependencies: split "^1.0.0" +picomatch@^2.0.5: + version "2.1.1" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.1.1.tgz#ecdfbea7704adb5fe6fb47f9866c4c0e15e905c5" + integrity sha512-OYMyqkKzK7blWO/+XZYP6w8hH0LDvkBvdvKukti+7kqYFCiEAk+gI3DWnryapc0Dau05ugGTy0foQ6mqn4AHYA== + pify@^2.0.0, pify@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" @@ -6678,6 +8719,13 @@ pinkie@^2.0.0: resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA= +pirates@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.1.tgz#643a92caf894566f91b2b986d2c66950a8e2fb87" + integrity sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA== + dependencies: + node-modules-regexp "^1.0.0" + pkg-dir@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz#f6d5d1109e19d63edf428e0bd57e12777615334b" @@ -6692,6 +8740,13 @@ pkg-dir@^3.0.0: dependencies: find-up "^3.0.0" +pkg-dir@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" + integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== + dependencies: + find-up "^4.0.0" + pkg-up@^3.0.1: version "3.1.0" resolved "https://registry.yarnpkg.com/pkg-up/-/pkg-up-3.1.0.tgz#100ec235cc150e4fd42519412596a28512a0def5" @@ -6699,11 +8754,23 @@ pkg-up@^3.0.1: dependencies: find-up "^3.0.0" +please-upgrade-node@^3.1.1, please-upgrade-node@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz#aeddd3f994c933e4ad98b99d9a556efa0e2fe942" + integrity sha512-gQR3WpIgNIKwBMVLkpMUeR3e1/E1y42bqDQZfql+kDeXd8COYfM8PQA4X6y7a8u9Ua9FHmsrrmirW2vHs45hWg== + dependencies: + semver-compare "^1.0.0" + pluralize@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-7.0.0.tgz#298b89df8b93b0221dbf421ad2b1b1ea23fc6777" integrity sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow== +pn@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/pn/-/pn-1.1.0.tgz#e2f4cef0e219f463c179ab37463e4e1ecdccbafb" + integrity sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA== + pnp-webpack-plugin@1.5.0: version "1.5.0" resolved "https://registry.yarnpkg.com/pnp-webpack-plugin/-/pnp-webpack-plugin-1.5.0.tgz#62a1cd3068f46d564bb33c56eb250e4d586676eb" @@ -6711,6 +8778,11 @@ pnp-webpack-plugin@1.5.0: dependencies: ts-pnp "^1.1.2" +pop-iterate@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/pop-iterate/-/pop-iterate-1.0.1.tgz#ceacfdab4abf353d7a0f2aaa2c1fc7b3f9413ba3" + integrity sha1-zqz9q0q/NT16DyqqLB/Hs/lBO6M= + popsicle@10: version "10.0.1" resolved "https://registry.yarnpkg.com/popsicle/-/popsicle-10.0.1.tgz#2abd36130560647c74eaf08400d473ae25c4486f" @@ -7209,6 +9281,11 @@ prepend-http@^1.0.0, prepend-http@^1.0.1: resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" integrity sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw= +prepend-http@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-2.0.0.tgz#e92434bfa5ea8c19f41cdfd401d741a3c819d897" + integrity sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc= + prettier@1.16.4: version "1.16.4" resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.16.4.tgz#73e37e73e018ad2db9c76742e2647e21790c9717" @@ -7219,6 +9296,21 @@ prettier@^1.19.1: resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.19.1.tgz#f7d7f5ff8a9cd872a7be4ca142095956a60797cb" integrity sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew== +pretty-bytes@^5.1.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-5.3.0.tgz#f2849e27db79fb4d6cfe24764fc4134f165989f2" + integrity sha512-hjGrh+P926p4R4WbaB6OckyRtO0F0/lQBiT+0gnxjV+5kjPBrfVBFCsCLbMqVQeydvIoouYTCmmEURiH3R1Bdg== + +pretty-format@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-24.9.0.tgz#12fac31b37019a4eea3c11aa9a959eb7628aa7c9" + integrity sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA== + dependencies: + "@jest/types" "^24.9.0" + ansi-regex "^4.0.0" + ansi-styles "^3.2.0" + react-is "^16.8.4" + pretty-hrtime@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz#b7e3ea42435a4c9b2759d99e0f201eb195802ee1" @@ -7454,6 +9546,11 @@ process@^0.11.10: resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI= +process@~0.5.1: + version "0.5.2" + resolved "https://registry.yarnpkg.com/process/-/process-0.5.2.tgz#1638d8a8e34c2f440a91db95ab9aeb677fc185cf" + integrity sha1-FjjYqONML0QKkduVq5rrZ3/Bhc8= + progress@^2.0.0: version "2.0.3" resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" @@ -7471,6 +9568,14 @@ promise@7.1.1: dependencies: asap "~2.0.3" +prompts@^2.0.1: + version "2.3.0" + resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.3.0.tgz#a444e968fa4cc7e86689a74050685ac8006c4cc4" + integrity sha512-NfbbPPg/74fT7wk2XYQ7hAIp9zJyZp5Fu19iRbORqqy1BhtrkZ0fPafBU+7bmn8ie69DpT0R6QpJIN2oisYjJg== + dependencies: + kleur "^3.0.3" + sisteransi "^1.0.3" + prop-types-exact@1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/prop-types-exact/-/prop-types-exact-1.2.0.tgz#825d6be46094663848237e3925a98c6e944e9869" @@ -7489,6 +9594,11 @@ prop-types@15.7.2, prop-types@^15.5.4, prop-types@^15.6.2, prop-types@^15.7.2: object-assign "^4.1.1" react-is "^16.8.1" +property-expr@^1.5.0: + version "1.5.1" + resolved "https://registry.yarnpkg.com/property-expr/-/property-expr-1.5.1.tgz#22e8706894a0c8e28d58735804f6ba3a3673314f" + integrity sha512-CGuc0VUTGthpJXL36ydB6jnbyOf/rAHFvmVrJlH+Rg0DqqLFQGAP6hIaxD/G0OAmBJPhXDHuEJigrp0e0wFV6g== + protochain@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/protochain/-/protochain-1.0.5.tgz#991c407e99de264aadf8f81504b5e7faf7bfa260" @@ -7534,7 +9644,7 @@ public-encrypt@^4.0.0: randombytes "^2.0.1" safe-buffer "^5.1.2" -pump@^2.0.0: +pump@^2.0.0, pump@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/pump/-/pump-2.0.1.tgz#12399add6e4cf7526d973cbc8b5ce2e2908b3909" integrity sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA== @@ -7574,6 +9684,20 @@ punycode@^2.1.0, punycode@^2.1.1: resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== +q@2.0.x: + version "2.0.3" + resolved "https://registry.yarnpkg.com/q/-/q-2.0.3.tgz#75b8db0255a1a5af82f58c3f3aaa1efec7d0d134" + integrity sha1-dbjbAlWhpa+C9Yw/Oqoe/sfQ0TQ= + dependencies: + asap "^2.0.0" + pop-iterate "^1.0.1" + weak-map "^1.0.5" + +q@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" + integrity sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc= + qs@6.7.0: version "6.7.0" resolved "https://registry.yarnpkg.com/qs/-/qs-6.7.0.tgz#41dc1a015e3d581f1621776be31afb2876a9b1bc" @@ -7693,6 +9817,11 @@ react-is@^16.6.0, react-is@^16.7.0, react-is@^16.8.1: resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.11.0.tgz#b85dfecd48ad1ce469ff558a882ca8e8313928fa" integrity sha512-gbBVYR2p8mnriqAwWx9LbuUrShnAuSCNnuPGyc7GJrMVQtPDAh8iLpv7FRuMPFb56KkaVZIYSz1PrjI9q0QPCw== +react-is@^16.8.4: + version "16.12.0" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.12.0.tgz#2cc0fe0fba742d97fd527c42a13bec4eeb06241c" + integrity sha512-rPCkf/mWBtKc97aLL9/txD8DZdemK0vkA3JMLShjlJB3Pj3s+lpf1KaBzMfQrAmhMQB0n1cU/SUGgKKBCe837Q== + react-toastify@^5.4.1: version "5.4.1" resolved "https://registry.yarnpkg.com/react-toastify/-/react-toastify-5.4.1.tgz#27533ca33753631016c44122934c7b6548352fcb" @@ -7737,6 +9866,23 @@ read-pkg-up@^2.0.0: find-up "^2.0.0" read-pkg "^2.0.0" +read-pkg-up@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-4.0.0.tgz#1b221c6088ba7799601c808f91161c66e58f8978" + integrity sha512-6etQSH7nJGsK0RbG/2TeDzZFa8shjQ1um+SwQQ5cwKy0dhSXdOncEhb1CPpvQG4h7FyOV6EB6YlV0yJvZQNAkA== + dependencies: + find-up "^3.0.0" + read-pkg "^3.0.0" + +read-pkg-up@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-7.0.0.tgz#3f3e53858ec5ae5e6fe14bc479da0a7c98f85ff3" + integrity sha512-t2ODkS/vTTcRlKwZiZsaLGb5iwfx9Urp924aGzVyboU6+7Z2i6eGr/G1Z4mjvwLLQV3uFOBKobNRGM3ux2PD/w== + dependencies: + find-up "^4.1.0" + read-pkg "^5.2.0" + type-fest "^0.8.1" + read-pkg@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-2.0.0.tgz#8ef1c0623c6a6db0dc6713c4bfac46332b2368f8" @@ -7746,6 +9892,15 @@ read-pkg@^2.0.0: normalize-package-data "^2.3.2" path-type "^2.0.0" +read-pkg@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-3.0.0.tgz#9cbc686978fee65d16c00e2b19c237fcf6e38389" + integrity sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k= + dependencies: + load-json-file "^4.0.0" + normalize-package-data "^2.3.2" + path-type "^3.0.0" + read-pkg@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-4.0.1.tgz#963625378f3e1c4d48c85872b5a6ec7d5d093237" @@ -7755,6 +9910,16 @@ read-pkg@^4.0.1: parse-json "^4.0.0" pify "^3.0.0" +read-pkg@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-5.2.0.tgz#7bf295438ca5a33e56cd30e053b34ee7250c93cc" + integrity sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg== + dependencies: + "@types/normalize-package-data" "^2.4.0" + normalize-package-data "^2.5.0" + parse-json "^5.0.0" + type-fest "^0.6.0" + "readable-stream@1 || 2", readable-stream@2.3.6, readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.5, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.0, readable-stream@^2.3.3, readable-stream@^2.3.5, readable-stream@^2.3.6, readable-stream@~2.3.6: version "2.3.6" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" @@ -7777,6 +9942,13 @@ readdirp@^2.2.1: micromatch "^3.1.10" readable-stream "^2.0.2" +realpath-native@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/realpath-native/-/realpath-native-1.1.0.tgz#2003294fea23fb0672f2476ebe22fcf498a2d65c" + integrity sha512-wlgPA6cCIIg9gKz0fgAPjnzh4yR/LnXovwuo9hvyGvx3h8nX4+/iLZplfUWasXpqD8BdnGnP5njOFjkUwPzvjA== + dependencies: + util.promisify "^1.0.0" + redeyed@~1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/redeyed/-/redeyed-1.0.1.tgz#e96c193b40c0816b00aec842698e61185e55498a" @@ -7865,6 +10037,11 @@ regexpp@^2.0.1: resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-2.0.1.tgz#8d19d31cf632482b589049f8281f93dbcba4d07f" integrity sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw== +regexpp@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.0.0.tgz#dd63982ee3300e67b41c1956f850aa680d9d330e" + integrity sha512-Z+hNr7RAVWxznLPuA7DIh8UNX1j9CDrUQxskw9IrBE1Dxue2lyXT+shqEIeLUjrokxIP8CMy1WkjgG3rTsd5/g== + regexpu-core@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-1.0.0.tgz#86a763f58ee4d7c2f6b102e4764050de7ed90c6b" @@ -7945,7 +10122,23 @@ replaceall@^0.1.6: resolved "https://registry.yarnpkg.com/replaceall/-/replaceall-0.1.6.tgz#81d81ac7aeb72d7f5c4942adf2697a3220688d8e" integrity sha1-gdgax663LX9cSUKt8ml6MiBojY4= -request@^2.83.0, request@^2.87.0: +request-promise-core@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.3.tgz#e9a3c081b51380dfea677336061fea879a829ee9" + integrity sha512-QIs2+ArIGQVp5ZYbWD5ZLCY29D5CfWizP8eWnm8FoGD1TX61veauETVQbrV60662V0oFBkrDOuaBI8XgtuyYAQ== + dependencies: + lodash "^4.17.15" + +request-promise-native@^1.0.5: + version "1.0.8" + resolved "https://registry.yarnpkg.com/request-promise-native/-/request-promise-native-1.0.8.tgz#a455b960b826e44e2bf8999af64dff2bfe58cb36" + integrity sha512-dapwLGqkHtwL5AEbfenuzjTYg35Jd6KPytsC2/TLkVMz8rm+tNt72MGUWT1RP/aYawMpN6HqbNGBQaRcBtjQMQ== + dependencies: + request-promise-core "1.1.3" + stealthy-require "^1.1.1" + tough-cookie "^2.3.3" + +request@2.88.0, request@^2.83.0, request@^2.87.0, request@^2.88.0: version "2.88.0" resolved "https://registry.yarnpkg.com/request/-/request-2.88.0.tgz#9c2fca4f7d35b592efe57c7f0a55e81052124fef" integrity sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg== @@ -7981,6 +10174,11 @@ require-main-filename@^1.0.1: resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" integrity sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE= +require-main-filename@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" + integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== + require_optional@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/require_optional/-/require_optional-1.0.1.tgz#4cf35a4247f64ca3df8c2ef208cc494b1ca8fc2e" @@ -7989,6 +10187,13 @@ require_optional@^1.0.1: resolve-from "^2.0.0" semver "^5.1.0" +resolve-cwd@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-2.0.0.tgz#00a9f7387556e27038eae232caa372a6a59b665a" + integrity sha1-AKn3OHVW4nA46uIyyqNypqWbZlo= + dependencies: + resolve-from "^3.0.0" + resolve-from@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-2.0.0.tgz#9480ab20e94ffa1d9e80a804c7ea147611966b57" @@ -8009,6 +10214,11 @@ resolve-url@^0.2.1: resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= +resolve@1.1.7: + version "1.1.7" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" + integrity sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs= + resolve@^1.1.7, resolve@^1.10.0, resolve@^1.11.0, resolve@^1.12.0, resolve@^1.3.2, resolve@^1.5.0, resolve@^1.8.1: version "1.12.0" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.12.0.tgz#3fc644a35c84a48554609ff26ec52b66fa577df6" @@ -8016,6 +10226,13 @@ resolve@^1.1.7, resolve@^1.10.0, resolve@^1.11.0, resolve@^1.12.0, resolve@^1.3. dependencies: path-parse "^1.0.6" +responselike@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/responselike/-/responselike-1.0.2.tgz#918720ef3b631c5642be068f15ade5a46f4ba1e7" + integrity sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec= + dependencies: + lowercase-keys "^1.0.0" + restore-cursor@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" @@ -8042,6 +10259,11 @@ retry@0.12.0: resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" integrity sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs= +reusify@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" + integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== + rimraf@2.6.3: version "2.6.3" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" @@ -8049,13 +10271,20 @@ rimraf@2.6.3: dependencies: glob "^7.1.3" -rimraf@^2.2.8, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.3: +rimraf@^2.2.8, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.2, rimraf@^2.6.3: version "2.7.1" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== dependencies: glob "^7.1.3" +rimraf@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.0.tgz#614176d4b3010b75e5c390eb0ee96f6dc0cebb9b" + integrity sha512-NDGVxTsjqfunkds7CqsOiEnxln4Bo7Nddl3XhS4pXg5OzwkLqJ971ZVAAnB+DDLnF76N+VnDEiBHaVV8I06SUg== + dependencies: + glob "^7.1.3" + ripemd160@^2.0.0, ripemd160@^2.0.1: version "2.0.2" resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" @@ -8064,6 +10293,16 @@ ripemd160@^2.0.0, ripemd160@^2.0.1: hash-base "^3.0.0" inherits "^2.0.1" +rootpath@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/rootpath/-/rootpath-0.1.2.tgz#5b379a87dca906e9b91d690a599439bef267ea6b" + integrity sha1-Wzeah9ypBum5HWkKWZQ5vvJn6ms= + +rsvp@^4.8.4: + version "4.8.5" + resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-4.8.5.tgz#c8f155311d167f68f21e168df71ec5b083113734" + integrity sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA== + run-async@^2.2.0: version "2.3.0" resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0" @@ -8071,6 +10310,16 @@ run-async@^2.2.0: dependencies: is-promise "^2.1.0" +run-node@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/run-node/-/run-node-1.0.0.tgz#46b50b946a2aa2d4947ae1d886e9856fd9cabe5e" + integrity sha512-kc120TBlQ3mih1LSzdAJXo4xn/GWS2ec0l3S+syHDXP9uRr0JAT8Qd3mdMuyjqCzeZktgP3try92cEgf9Nks8A== + +run-parallel@^1.1.9: + version "1.1.9" + resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.1.9.tgz#c9dd3a7cf9f4b2c4b6244e173a6ed866e61dd679" + integrity sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q== + run-queue@^1.0.0, run-queue@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/run-queue/-/run-queue-1.0.3.tgz#e848396f057d223f24386924618e25694161ec47" @@ -8085,7 +10334,7 @@ rwlockfile@^1.4.8: dependencies: fs-extra "^5.0.0" -rxjs@^6.4.0, rxjs@^6.5.2: +rxjs@^6.3.3, rxjs@^6.4.0, rxjs@^6.5.2: version "6.5.3" resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.5.3.tgz#510e26317f4db91a7eb1de77d9dd9ba0a4899a3a" integrity sha512-wuYsAYYFdWTAnAaPoKGNhfpWwKZbJW+HgAJ+mImp+Epl7BG8oNWBCTyRM8gba9k4lk8BgWdoYm21Mo/RYhhbgA== @@ -8114,6 +10363,21 @@ safe-regex@^1.1.0: resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== +sane@^4.0.3: + version "4.1.0" + resolved "https://registry.yarnpkg.com/sane/-/sane-4.1.0.tgz#ed881fd922733a6c461bc189dc2b6c006f3ffded" + integrity sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA== + dependencies: + "@cnakazawa/watch" "^1.0.3" + anymatch "^2.0.0" + capture-exit "^2.0.0" + exec-sh "^0.3.2" + execa "^1.0.0" + fb-watchman "^2.0.0" + micromatch "^3.1.4" + minimist "^1.1.1" + walker "~1.0.5" + saslprep@^1.0.0: version "1.0.3" resolved "https://registry.yarnpkg.com/saslprep/-/saslprep-1.0.3.tgz#4c02f946b56cf54297e347ba1093e7acac4cf226" @@ -8121,19 +10385,11 @@ saslprep@^1.0.0: dependencies: sparse-bitfield "^3.0.3" -sax@^1.2.4: +sax@>=0.6.0, sax@^1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== -scheduler@^0.14.0: - version "0.14.0" - resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.14.0.tgz#b392c23c9c14bfa2933d4740ad5603cc0d59ea5b" - integrity sha512-9CgbS06Kki2f4R9FjLSITjZo5BZxPsryiRNyL3LpvrM9WxcVmhlqAOc9E+KQbeI2nqej4JIIbOsfdL51cNb4Iw== - dependencies: - loose-envify "^1.1.0" - object-assign "^4.1.1" - scheduler@^0.17.0: version "0.17.0" resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.17.0.tgz#7c9c673e4ec781fac853927916d1c426b6f3ddfe" @@ -8159,11 +10415,21 @@ schema-utils@^2.0.0, schema-utils@^2.0.1, schema-utils@^2.4.1: ajv "^6.10.2" ajv-keywords "^3.4.1" +scmp@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/scmp/-/scmp-2.0.0.tgz#247110ef22ccf897b13a3f0abddb52782393cd6a" + integrity sha1-JHEQ7yLM+JexOj8KvdtSeCOTzWo= + scuid@^1.0.2: version "1.1.0" resolved "https://registry.yarnpkg.com/scuid/-/scuid-1.1.0.tgz#d3f9f920956e737a60f72d0e4ad280bf324d5dab" integrity sha512-MuCAyrGZcTLfQoH2XoBlQ8C6bzwN88XT/0slOGz0pn8+gIP85BOAfYa44ZXQUTOwRwPU0QvgU+V+OSajl/59Xg== +semver-compare@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/semver-compare/-/semver-compare-1.0.0.tgz#0dee216a1c941ab37e9efb1788f6afc5ff5537fc" + integrity sha1-De4hahyUGrN+nvsXiPavxf9VN/w= + semver-diff@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/semver-diff/-/semver-diff-2.1.0.tgz#4bbb8437c8d37e4b0cf1a68fd726ec6d645d6d36" @@ -8181,7 +10447,7 @@ semver@4.3.2: resolved "https://registry.yarnpkg.com/semver/-/semver-4.3.2.tgz#c7a07158a80bedd052355b770d82d6640f803be7" integrity sha1-x6BxWKgL7dBSNVt3DYLWZA+AO+c= -semver@^6.0.0, semver@^6.1.2, semver@^6.3.0: +semver@^6.0.0, semver@^6.1.2, semver@^6.2.0, semver@^6.3.0: version "6.3.0" resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== @@ -8210,7 +10476,7 @@ serialize-error@^3.0.0: resolved "https://registry.yarnpkg.com/serialize-error/-/serialize-error-3.0.0.tgz#80100282b09be33c611536f50033481cb9cc87cf" integrity sha512-+y3nkkG/go1Vdw+2f/+XUXM1DXX1XcxTl99FfiD/OEPUNw4uo0i6FKABfTAN5ZcgGtjTRZcEbxcE/jtXbEY19A== -serialize-javascript@^1.7.0: +serialize-javascript@^1.4.0, serialize-javascript@^1.7.0: version "1.9.1" resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-1.9.1.tgz#cfc200aef77b600c47da9bb8149c943e798c2fdb" integrity sha512-0Vb/54WJ6k5v8sSWN09S0ora+Hnr+cX40r9F170nT+mSkaxltoE/7R3OrIdBSUv1OoiobH1QoWQbCnAO+e8J1A== @@ -8272,16 +10538,33 @@ shebang-command@^1.2.0: dependencies: shebang-regex "^1.0.0" +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + shebang-regex@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= -shell-quote@^1.6.1: +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +shell-quote@^1.6.1, shell-quote@^1.7.2: version "1.7.2" resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.7.2.tgz#67a7d02c76c9da24f99d20808fcaded0e0e04be2" integrity sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg== +shellwords@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.1.tgz#d6b9181c1a48d397324c84871efbcfc73fc0654b" + integrity sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww== + signal-exit@^3.0.0, signal-exit@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" @@ -8299,11 +10582,31 @@ simple-errors@^1.0.1: dependencies: errno "^0.1.1" +sisteransi@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.4.tgz#386713f1ef688c7c0304dc4c0632898941cad2e3" + integrity sha512-/ekMoM4NJ59ivGSfKapeG+FWtrmWvA1p6FBZwXrqojw90vJu8lBmrTxCMuBCydKtkaUe2zt4PlxeTKpjwMbyig== + slash@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" integrity sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU= +slash@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44" + integrity sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A== + +slash@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" + integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== + +slice-ansi@0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-0.0.4.tgz#edbf8903f66f7ce2f8eafd6ceed65e264c831b35" + integrity sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU= + slice-ansi@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-1.0.0.tgz#044f1a49d8842ff307aad6b505ed178bd950134d" @@ -8380,7 +10683,7 @@ source-map-support@^0.4.18: dependencies: source-map "^0.5.6" -source-map-support@~0.5.10, source-map-support@~0.5.12: +source-map-support@^0.5.6, source-map-support@~0.5.10, source-map-support@~0.5.12: version "0.5.16" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.16.tgz#0ae069e7fe3ba7538c64c98515e35339eac5a042" integrity sha512-efyLRJDr68D9hBBNIPWFjhpFzURh+KJykQwvMyW5UiZzYwoF6l4YMMDIJJEyFWxWCqfyxLzz6tSfUFR+kXXsVQ== @@ -8485,6 +10788,13 @@ sshpk@^1.7.0: safer-buffer "^2.0.2" tweetnacl "~0.14.0" +ssri@^5.2.4: + version "5.3.0" + resolved "https://registry.yarnpkg.com/ssri/-/ssri-5.3.0.tgz#ba3872c9c6d33a0704a7d71ff045e5ec48999d06" + integrity sha512-XRSIPqLij52MtgoQavH/x/dU1qVKtWUAAZeOHsR9c2Ddi4XerFy3mc1alf+dLJKl9EUIm/Ht+EowFkTUOA6GAQ== + dependencies: + safe-buffer "^5.1.1" + ssri@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/ssri/-/ssri-6.0.1.tgz#2a3c41b28dd45b62b63676ecb74001265ae9edd8" @@ -8497,6 +10807,11 @@ stack-trace@0.0.10: resolved "https://registry.yarnpkg.com/stack-trace/-/stack-trace-0.0.10.tgz#547c70b347e8d32b4e108ea1a2a159e5fdde19c0" integrity sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA= +stack-utils@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-1.0.2.tgz#33eba3897788558bebfc2db059dc158ec36cebb8" + integrity sha512-MTX+MeG5U994cazkjd/9KNAapsHnibjMLnfXodlkXw76JEea0UiNzrqidzo1emMwk7w5Qhc9jd4Bn9TBb1MFwA== + static-extend@^0.1.1: version "0.1.2" resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" @@ -8510,6 +10825,11 @@ static-extend@^0.1.1: resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= +stealthy-require@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b" + integrity sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks= + stream-browserify@^2.0.1: version "2.0.2" resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.2.tgz#87521d38a44aa7ee91ce1cd2a47df0cb49dd660b" @@ -8547,11 +10867,24 @@ strict-uri-encode@^1.0.0: resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713" integrity sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM= +string-argv@^0.3.0: + version "0.3.1" + resolved "https://registry.yarnpkg.com/string-argv/-/string-argv-0.3.1.tgz#95e2fbec0427ae19184935f816d74aaa4c5c19da" + integrity sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg== + string-hash@1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/string-hash/-/string-hash-1.1.3.tgz#e8aafc0ac1855b4666929ed7dd1275df5d6c811b" integrity sha1-6Kr8CsGFW0Zmkp7X3RJ1311sgRs= +string-length@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/string-length/-/string-length-2.0.0.tgz#d40dbb686a3ace960c1cffca562bf2c45f8363ed" + integrity sha1-1A27aGo6zpYMHP/KVivyxF+DY+0= + dependencies: + astral-regex "^1.0.0" + strip-ansi "^4.0.0" + string-similarity@^1.2.0: version "1.2.2" resolved "https://registry.yarnpkg.com/string-similarity/-/string-similarity-1.2.2.tgz#99b2c20a3c9bbb3903964eae1d89856db3d8db9b" @@ -8580,7 +10913,7 @@ string-width@^1.0.1: is-fullwidth-code-point "^2.0.0" strip-ansi "^4.0.0" -string-width@^3.0.0: +string-width@^3.0.0, string-width@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== @@ -8628,7 +10961,16 @@ string_decoder@~1.1.1: dependencies: safe-buffer "~5.1.0" -strip-ansi@5.2.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: +stringify-object@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/stringify-object/-/stringify-object-3.3.0.tgz#703065aefca19300d3ce88af4f5b3956d7556629" + integrity sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw== + dependencies: + get-own-enumerable-property-symbols "^3.0.0" + is-obj "^1.0.1" + is-regexp "^1.0.0" + +strip-ansi@5.2.0, strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== @@ -8661,21 +11003,34 @@ strip-bom@^3.0.0: resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= +strip-comments@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/strip-comments/-/strip-comments-1.0.2.tgz#82b9c45e7f05873bee53f37168af930aa368679d" + integrity sha512-kL97alc47hoyIQSV165tTt9rG5dn4w1dNnBhOQ3bOU1Nc1hel09jnXANaHJ7vzHLd4Ju8kseDGzlev96pghLFw== + dependencies: + babel-extract-comments "^1.0.0" + babel-plugin-transform-object-rest-spread "^6.26.0" + strip-eof@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8= -strip-json-comments@^2.0.1, strip-json-comments@~2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" - integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= +strip-final-newline@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" + integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== strip-json-comments@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.0.1.tgz#85713975a91fb87bf1b305cca77395e40d2a64a7" integrity sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw== +strip-json-comments@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" + integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= + style-loader@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-1.0.0.tgz#1d5296f9165e8e2c85d24eee0b7caf9ec8ca1f82" @@ -8703,14 +11058,14 @@ styled-components@^4.4.1: stylis-rule-sheet "^0.0.10" supports-color "^5.5.0" -styled-jsx@3.2.2: - version "3.2.2" - resolved "https://registry.yarnpkg.com/styled-jsx/-/styled-jsx-3.2.2.tgz#03d02d26725195d17b6a979eb8d7c34761a16bf8" - integrity sha512-Xb9TPFY2REShznvHt/fw78wk+nxejTr8poepDeS5fRvkQ7lW49CDIWWGLzzALCLcKBIRFK/1Wi4PDZNetpig4w== +styled-jsx@3.2.4: + version "3.2.4" + resolved "https://registry.yarnpkg.com/styled-jsx/-/styled-jsx-3.2.4.tgz#cbcdedcfb81d717fd355c4a0d8443f8e74527b60" + integrity sha512-UMclQzI1lss38RhyjTf7SmtXJEMbB6Q9slDz8adGtzHjirYb1PPgeWLSP8SlZc8c9f3LF6axmtv+6K/553ANdg== dependencies: babel-plugin-syntax-jsx "6.18.0" babel-types "6.26.0" - convert-source-map "1.6.0" + convert-source-map "1.7.0" loader-utils "1.2.3" source-map "0.7.3" string-hash "1.1.3" @@ -8772,16 +11127,26 @@ supports-hyperlinks@^1.0.1: has-flag "^2.0.0" supports-color "^5.0.0" -symbol-observable@^1.0.4: +symbol-observable@^1.0.4, symbol-observable@^1.1.0: version "1.2.0" resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.2.0.tgz#c22688aed4eab3cdc2dfeacbb561660560a00804" integrity sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ== +symbol-tree@^3.2.2: + version "3.2.4" + resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" + integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== + sync-exec@^0.6.2: version "0.6.2" resolved "https://registry.yarnpkg.com/sync-exec/-/sync-exec-0.6.2.tgz#717d22cc53f0ce1def5594362f3a89a2ebb91105" integrity sha1-cX0izFPwzh3vVZQ2LzqJouu5EQU= +synchronous-promise@^2.0.6: + version "2.0.10" + resolved "https://registry.yarnpkg.com/synchronous-promise/-/synchronous-promise-2.0.10.tgz#e64c6fd3afd25f423963353043f4a68ebd397fd8" + integrity sha512-6PC+JRGmNjiG3kJ56ZMNWDPL8hjyghF5cMXIFOKg+NiwwEZZIvxTWd0pinWKyD227odg9ygF8xVhhz7gb8Uq7A== + table@^4.0.1: version "4.0.3" resolved "https://registry.yarnpkg.com/table/-/table-4.0.3.tgz#00b5e2b602f1794b9acaf9ca908a76386a7813bc" @@ -8804,6 +11169,11 @@ table@^5.2.3: slice-ansi "^2.1.0" string-width "^3.0.0" +tachyons@^4.11.1: + version "4.11.1" + resolved "https://registry.yarnpkg.com/tachyons/-/tachyons-4.11.1.tgz#4e3666e7299e47aea7d820e0580dd4dc07cf3feb" + integrity sha512-n5zIZ8i8kZ8vz05vX1BdvkP8b9ufsMeSRmdqTuUtz5rlNxr03nntiZMc/HTADIsPYZj/wZJDJglxV0/yvvaiZA== + tailwindcss@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/tailwindcss/-/tailwindcss-1.1.3.tgz#ad154f78e1e44060e32e3ed44b27287c2be126a6" @@ -8824,6 +11194,11 @@ tailwindcss@^1.1.3: pretty-hrtime "^1.0.3" reduce-css-calc "^2.1.6" +tapable@^0.1.8: + version "0.1.10" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-0.1.10.tgz#29c35707c2b70e50d07482b5d202e8ed446dafd4" + integrity sha1-KcNXB8K3DlDQdIK10gLo7URtr9Q= + tapable@^1.0.0, tapable@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2" @@ -8895,11 +11270,26 @@ terser@^4.1.2: source-map "~0.6.1" source-map-support "~0.5.12" +test-exclude@^5.2.3: + version "5.2.3" + resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-5.2.3.tgz#c3d3e1e311eb7ee405e092dac10aefd09091eac0" + integrity sha512-M+oxtseCFO3EDtAaGH7iiej3CBkzXqFMbzqYAACdzKui4eZA+pq3tZEwChvOdNfa7xxy8BfbmgJSIr43cC/+2g== + dependencies: + glob "^7.1.3" + minimatch "^3.0.4" + read-pkg-up "^4.0.0" + require-main-filename "^2.0.0" + text-table@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= +throat@^4.0.0, throat@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/throat/-/throat-4.1.0.tgz#89037cbc92c56ab18926e6ba4cbb200e15672a6a" + integrity sha1-iQN8vJLFarGJJua6TLsgDhVnKmo= + through2@^2.0.0, through2@^2.0.3: version "2.0.5" resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" @@ -8925,6 +11315,14 @@ timers-browserify@^2.0.4: dependencies: setimmediate "^1.0.4" +tiny-glob@^0.2.6: + version "0.2.6" + resolved "https://registry.yarnpkg.com/tiny-glob/-/tiny-glob-0.2.6.tgz#9e056e169d9788fe8a734dfa1ff02e9b92ed7eda" + integrity sha512-A7ewMqPu1B5PWwC3m7KVgAu96Ch5LA0w4SnEN/LbDREj/gAD0nPWboRbn8YoP9ISZXqeNAlMvKSKoEuhcfK3Pw== + dependencies: + globalyzer "^0.1.0" + globrex "^0.1.1" + tiny-warning@^1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/tiny-warning/-/tiny-warning-1.0.3.tgz#94a30db453df4c643d0fd566060d60a875d84754" @@ -8937,6 +11335,11 @@ tmp@^0.0.33: dependencies: os-tmpdir "~1.0.2" +tmpl@1.0.x: + version "1.0.4" + resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.4.tgz#23640dd7b42d00433911140820e5cf440e521dd1" + integrity sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE= + to-arraybuffer@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" @@ -8964,6 +11367,11 @@ to-object-path@^0.3.0: dependencies: kind-of "^3.0.2" +to-readable-stream@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/to-readable-stream/-/to-readable-stream-1.0.0.tgz#ce0aa0c2f3df6adf852efb404a783e77c0475771" + integrity sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q== + to-regex-range@^2.1.0: version "2.1.1" resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" @@ -8972,6 +11380,13 @@ to-regex-range@^2.1.0: is-number "^3.0.0" repeat-string "^1.6.1" +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + to-regex@^3.0.1, to-regex@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" @@ -8987,6 +11402,11 @@ toidentifier@1.0.0: resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553" integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw== +toposort@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/toposort/-/toposort-2.0.2.tgz#ae21768175d1559d48bef35420b2f4962f09c330" + integrity sha1-riF2gXXRVZ1IvvNUILL0li8JwzA= + touch@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/touch/-/touch-3.1.0.tgz#fe365f5f75ec9ed4e56825e0bb76d24ab74af83b" @@ -8994,7 +11414,7 @@ touch@^3.1.0: dependencies: nopt "~1.0.10" -tough-cookie@^2.0.0: +tough-cookie@^2.0.0, tough-cookie@^2.3.3, tough-cookie@^2.3.4: version "2.5.0" resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== @@ -9010,6 +11430,13 @@ tough-cookie@~2.4.3: psl "^1.1.24" punycode "^1.4.1" +tr46@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-1.0.1.tgz#a8b13fd6bfd2489519674ccde55ba3693b706d09" + integrity sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk= + dependencies: + punycode "^2.1.0" + traverse@0.6.6: version "0.6.6" resolved "https://registry.yarnpkg.com/traverse/-/traverse-0.6.6.tgz#cbdf560fd7b9af632502fed40f918c157ea97137" @@ -9037,16 +11464,33 @@ ts-pnp@^1.1.2: resolved "https://registry.yarnpkg.com/ts-pnp/-/ts-pnp-1.1.5.tgz#840e0739c89fce5f3abd9037bb091dbff16d9dec" integrity sha512-ti7OGMOUOzo66wLF3liskw6YQIaSsBgc4GOAlWRnIEj8htCxJUxskanMUoJOD6MDCRAXo36goXJZch+nOS0VMA== -ts-toolbelt@^4.7.7: +ts-toolbelt@^4.10.7: version "4.10.7" resolved "https://registry.yarnpkg.com/ts-toolbelt/-/ts-toolbelt-4.10.7.tgz#3d076afb0e99209cbde458960b253091040c6808" integrity sha512-4YDe0TWABZ4i8am1Bup0dwGii7c1rffZ7MXE7q4kmG+ixeiKUAnaaO75iBrw04v6vJg/VookQ0yOdDD0DEQhHA== -tslib@^1.9.0, tslib@^1.9.3: +tsconfig-paths@^3.9.0: + version "3.9.0" + resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.9.0.tgz#098547a6c4448807e8fcb8eae081064ee9a3c90b" + integrity sha512-dRcuzokWhajtZWkQsDVKbWyY+jgcLC5sqJhg2PSgf4ZkH2aHPvaOY8YWGhmjb68b5qqTfasSsDO9k7RUiEmZAw== + dependencies: + "@types/json5" "^0.0.29" + json5 "^1.0.1" + minimist "^1.2.0" + strip-bom "^3.0.0" + +tslib@^1.10.0, tslib@^1.8.1, tslib@^1.9.0, tslib@^1.9.3: version "1.10.0" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.10.0.tgz#c3c19f95973fb0a62973fb09d90d961ee43e5c8a" integrity sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ== +tsutils@^3.17.1: + version "3.17.1" + resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.17.1.tgz#ed719917f11ca0dee586272b2ac49e015a2dd759" + integrity sha512-kzeQ5B8H3w60nFY2g8cJIuH7JDpsALXySGtwGJ0p2LSjLgay3NdIpqq5SoOBe46bKDW2iq25irHCr8wjomUS2g== + dependencies: + tslib "^1.8.1" + tty-browserify@0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6" @@ -9064,6 +11508,21 @@ tweetnacl@^0.14.3, tweetnacl@~0.14.0: resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= +twilio@^3.37.1: + version "3.38.0" + resolved "https://registry.yarnpkg.com/twilio/-/twilio-3.38.0.tgz#7a27389749bcd8eae0b13b604d788916239c1780" + integrity sha512-00aatGs6A/WpK3qZy2Bh1QZa8fOCMvo5lNqb2KDj0Hqd9xYN5OcwyHMiGEkmptSvBHFyqv4TcKA1VzRK3wb3UQ== + dependencies: + "@types/express" "^4.17.2" + dayjs "^1.8.17" + jsonwebtoken "^8.5.1" + lodash "^4.17.15" + q "2.0.x" + request "^2.88.0" + rootpath "^0.1.2" + scmp "^2.0.0" + xmlbuilder "^13.0.2" + type-check@~0.3.2: version "0.3.2" resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" @@ -9071,11 +11530,26 @@ type-check@~0.3.2: dependencies: prelude-ls "~1.1.2" +type-fest@^0.3.0: + version "0.3.1" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.3.1.tgz#63d00d204e059474fe5e1b7c011112bbd1dc29e1" + integrity sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ== + type-fest@^0.5.2: version "0.5.2" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.5.2.tgz#d6ef42a0356c6cd45f49485c3b6281fc148e48a2" integrity sha512-DWkS49EQKVX//Tbupb9TFa19c7+MK1XmzkrZUR8TAktmE/DizXoaoJV6TZ/tSIPXipqNiRI6CyAe7x69Jb6RSw== +type-fest@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.6.0.tgz#8d2a2370d3df886eb5c90ada1c5bf6188acf838b" + integrity sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg== + +type-fest@^0.8.1: + version "0.8.1" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" + integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== + type-is@^1.6.16, type-is@~1.6.17, type-is@~1.6.18: version "1.6.18" resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" @@ -9096,11 +11570,29 @@ typedarray@^0.0.6: resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= +typescript@^2.9.2: + version "2.9.2" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.9.2.tgz#1cbf61d05d6b96269244eb6a3bce4bd914e0f00c" + integrity sha512-Gr4p6nFNaoufRIY4NMdpQRNmgxVIGMs4Fcu/ujdYk3nAZqk7supzBE9idmvfZIlH/Cuj//dvi+019qEue9lV0w== + typescript@^3.7.2: version "3.7.2" resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.7.2.tgz#27e489b95fa5909445e9fef5ee48d81697ad18fb" integrity sha512-ml7V7JfiN2Xwvcer+XAf2csGO1bPBdRbFCkYBczNZggrBZ9c7G3riSUeJmqEU5uOtXNPMhE3n+R4FA/3YOAWOQ== +tz-offset@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/tz-offset/-/tz-offset-0.0.1.tgz#fef920257024d3583ed9072a767721a18bdb8a76" + integrity sha512-kMBmblijHJXyOpKzgDhKx9INYU4u4E1RPMB0HqmKSgWG8vEcf3exEfLh4FFfzd3xdQOw9EuIy/cP0akY6rHopQ== + +uglify-js@^3.1.4: + version "3.6.9" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.6.9.tgz#85d353edb6ddfb62a9d798f36e91792249320611" + integrity sha512-pcnnhaoG6RtrvHJ1dFncAe8Od6Nuy30oaJ82ts6//sGSXOP5UjBMEthiProjXmMNHOfd93sqlkztifFMcb+4yw== + dependencies: + commander "~2.20.3" + source-map "~0.6.1" + uid-safe@~2.1.5: version "2.1.5" resolved "https://registry.yarnpkg.com/uid-safe/-/uid-safe-2.1.5.tgz#2b3d5c7240e8fc2e58f8aa269e5ee49c0857bd3a" @@ -9163,7 +11655,7 @@ uniq@^1.0.1: resolved "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff" integrity sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8= -unique-filename@^1.1.1: +unique-filename@^1.1.0, unique-filename@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.1.tgz#1d69769369ada0583103a1e6ae87681b56573230" integrity sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ== @@ -9292,6 +11784,13 @@ url-parse-lax@^1.0.0: dependencies: prepend-http "^1.0.1" +url-parse-lax@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-3.0.0.tgz#16b5cafc07dbe3676c1b1999177823d6503acb0c" + integrity sha1-FrXK/Afb42dsGxmZF3gj1lA6yww= + dependencies: + prepend-http "^2.0.0" + url@0.11.0, url@^0.11.0: version "0.11.0" resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" @@ -9315,6 +11814,14 @@ util-deprecate@~1.0.1: resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= +util.promisify@^1.0.0, util.promisify@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.0.0.tgz#440f7165a459c9a16dc145eb8e72f35687097030" + integrity sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA== + dependencies: + define-properties "^1.1.2" + object.getownpropertydescriptors "^2.0.3" + util@0.10.3: version "0.10.3" resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9" @@ -9357,7 +11864,7 @@ validate-npm-package-license@^3.0.1: spdx-correct "^3.0.0" spdx-expression-parse "^3.0.0" -vary@^1, vary@~1.1.2: +vary@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= @@ -9376,6 +11883,20 @@ vm-browserify@^1.0.1: resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.2.tgz#78641c488b8e6ca91a75f511e7a3b32a86e5dda0" integrity sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ== +w3c-hr-time@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.1.tgz#82ac2bff63d950ea9e3189a58a65625fedf19045" + integrity sha1-gqwr/2PZUOqeMYmlimViX+3xkEU= + dependencies: + browser-process-hrtime "^0.1.2" + +walker@^1.0.7, walker@~1.0.5: + version "1.0.7" + resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.7.tgz#2f7f9b8fd10d677262b18a884e28d19618e028fb" + integrity sha1-L3+bj9ENZ3JisYqITijRlhjgKPs= + dependencies: + makeerror "1.0.x" + watchpack@2.0.0-beta.5: version "2.0.0-beta.5" resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.0.0-beta.5.tgz#c005db39570d81d9d34334870abc0f548901b880" @@ -9401,6 +11922,16 @@ wcwidth@^1.0.1: dependencies: defaults "^1.0.3" +weak-map@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/weak-map/-/weak-map-1.0.5.tgz#79691584d98607f5070bd3b70a40e6bb22e401eb" + integrity sha1-eWkVhNmGB/UHC9O3CkDmuyLkAes= + +webidl-conversions@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad" + integrity sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg== + webpack-dev-middleware@3.7.0: version "3.7.0" resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-3.7.0.tgz#ef751d25f4e9a5c8a35da600c5fda3582b5c6cff" @@ -9473,6 +12004,42 @@ webpack@4.39.0: watchpack "^1.6.0" webpack-sources "^1.4.1" +webpack@^4.19.1, webpack@^4.41.2: + version "4.41.2" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.41.2.tgz#c34ec76daa3a8468c9b61a50336d8e3303dce74e" + integrity sha512-Zhw69edTGfbz9/8JJoyRQ/pq8FYUoY0diOXqW0T6yhgdhCv6wr0hra5DwwWexNRns2Z2+gsnrNcbe9hbGBgk/A== + dependencies: + "@webassemblyjs/ast" "1.8.5" + "@webassemblyjs/helper-module-context" "1.8.5" + "@webassemblyjs/wasm-edit" "1.8.5" + "@webassemblyjs/wasm-parser" "1.8.5" + acorn "^6.2.1" + ajv "^6.10.2" + ajv-keywords "^3.4.1" + chrome-trace-event "^1.0.2" + enhanced-resolve "^4.1.0" + eslint-scope "^4.0.3" + json-parse-better-errors "^1.0.2" + loader-runner "^2.4.0" + loader-utils "^1.2.3" + memory-fs "^0.4.1" + micromatch "^3.1.10" + mkdirp "^0.5.1" + neo-async "^2.6.1" + node-libs-browser "^2.2.1" + schema-utils "^1.0.0" + tapable "^1.1.3" + terser-webpack-plugin "^1.4.1" + watchpack "^1.6.0" + webpack-sources "^1.4.1" + +whatwg-encoding@^1.0.1, whatwg-encoding@^1.0.3: + version "1.0.5" + resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz#5abacf777c32166a51d085d6b4f3e7d27113ddb0" + integrity sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw== + dependencies: + iconv-lite "0.4.24" + whatwg-fetch@2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-2.0.4.tgz#dde6a5df315f9d39991aa17621853d720b85566f" @@ -9483,18 +12050,48 @@ whatwg-fetch@3.0.0, whatwg-fetch@>=0.10.0: resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.0.0.tgz#fc804e458cc460009b1a2b966bc8817d2578aefb" integrity sha512-9GSJUgz1D4MfyKU7KRqwOjXCXTqWdFNvEr7eUBYchQiVc744mqK/MzXPNR2WsPkmkOa4ywfg8C2n8h+13Bey1Q== +whatwg-mimetype@^2.1.0, whatwg-mimetype@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz#3d4b1e0312d2079879f826aff18dbeeca5960fbf" + integrity sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g== + +whatwg-url@^6.4.1: + version "6.5.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-6.5.0.tgz#f2df02bff176fd65070df74ad5ccbb5a199965a8" + integrity sha512-rhRZRqx/TLJQWUpQ6bmrt2UV4f0HCQ463yQuONJqC6fO2VoEb1pTYddbe59SkYq87aoM5A3bdhMZiUiVws+fzQ== + dependencies: + lodash.sortby "^4.7.0" + tr46 "^1.0.1" + webidl-conversions "^4.0.2" + +whatwg-url@^7.0.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-7.1.0.tgz#c2c492f1eca612988efd3d2266be1b9fc6170d06" + integrity sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg== + dependencies: + lodash.sortby "^4.7.0" + tr46 "^1.0.1" + webidl-conversions "^4.0.2" + which-module@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= -which@^1.2.10, which@^1.2.9: +which@^1.2.10, which@^1.2.9, which@^1.3.0: version "1.3.1" resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== dependencies: isexe "^2.0.0" +which@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.1.tgz#f1cf94d07a8e571b6ff006aeb91d0300c47ef0a4" + integrity sha512-N7GBZOTswtB9lkQBZA4+zAXrjEIWAUOB93AvzUiudRzRxhUdLURQ7D/gAIMY1gatT/LTbmbcv8SiYazy3eYB7w== + dependencies: + isexe "^2.0.0" + wide-align@^1.1.0: version "1.1.3" resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" @@ -9514,6 +12111,146 @@ word-wrap@~1.2.3: resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== +wordwrap@~0.0.2: + version "0.0.3" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" + integrity sha1-o9XabNXAvAAI03I0u68b7WMFkQc= + +workbox-background-sync@^4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/workbox-background-sync/-/workbox-background-sync-4.3.1.tgz#26821b9bf16e9e37fd1d640289edddc08afd1950" + integrity sha512-1uFkvU8JXi7L7fCHVBEEnc3asPpiAL33kO495UMcD5+arew9IbKW2rV5lpzhoWcm/qhGB89YfO4PmB/0hQwPRg== + dependencies: + workbox-core "^4.3.1" + +workbox-broadcast-update@^4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/workbox-broadcast-update/-/workbox-broadcast-update-4.3.1.tgz#e2c0280b149e3a504983b757606ad041f332c35b" + integrity sha512-MTSfgzIljpKLTBPROo4IpKjESD86pPFlZwlvVG32Kb70hW+aob4Jxpblud8EhNb1/L5m43DUM4q7C+W6eQMMbA== + dependencies: + workbox-core "^4.3.1" + +workbox-build@^4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/workbox-build/-/workbox-build-4.3.1.tgz#414f70fb4d6de47f6538608b80ec52412d233e64" + integrity sha512-UHdwrN3FrDvicM3AqJS/J07X0KXj67R8Cg0waq1MKEOqzo89ap6zh6LmaLnRAjpB+bDIz+7OlPye9iii9KBnxw== + dependencies: + "@babel/runtime" "^7.3.4" + "@hapi/joi" "^15.0.0" + common-tags "^1.8.0" + fs-extra "^4.0.2" + glob "^7.1.3" + lodash.template "^4.4.0" + pretty-bytes "^5.1.0" + stringify-object "^3.3.0" + strip-comments "^1.0.2" + workbox-background-sync "^4.3.1" + workbox-broadcast-update "^4.3.1" + workbox-cacheable-response "^4.3.1" + workbox-core "^4.3.1" + workbox-expiration "^4.3.1" + workbox-google-analytics "^4.3.1" + workbox-navigation-preload "^4.3.1" + workbox-precaching "^4.3.1" + workbox-range-requests "^4.3.1" + workbox-routing "^4.3.1" + workbox-strategies "^4.3.1" + workbox-streams "^4.3.1" + workbox-sw "^4.3.1" + workbox-window "^4.3.1" + +workbox-cacheable-response@^4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/workbox-cacheable-response/-/workbox-cacheable-response-4.3.1.tgz#f53e079179c095a3f19e5313b284975c91428c91" + integrity sha512-Rp5qlzm6z8IOvnQNkCdO9qrDgDpoPNguovs0H8C+wswLuPgSzSp9p2afb5maUt9R1uTIwOXrVQMmPfPypv+npw== + dependencies: + workbox-core "^4.3.1" + +workbox-core@^4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/workbox-core/-/workbox-core-4.3.1.tgz#005d2c6a06a171437afd6ca2904a5727ecd73be6" + integrity sha512-I3C9jlLmMKPxAC1t0ExCq+QoAMd0vAAHULEgRZ7kieCdUd919n53WC0AfvokHNwqRhGn+tIIj7vcb5duCjs2Kg== + +workbox-expiration@^4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/workbox-expiration/-/workbox-expiration-4.3.1.tgz#d790433562029e56837f341d7f553c4a78ebe921" + integrity sha512-vsJLhgQsQouv9m0rpbXubT5jw0jMQdjpkum0uT+d9tTwhXcEZks7qLfQ9dGSaufTD2eimxbUOJfWLbNQpIDMPw== + dependencies: + workbox-core "^4.3.1" + +workbox-google-analytics@^4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/workbox-google-analytics/-/workbox-google-analytics-4.3.1.tgz#9eda0183b103890b5c256e6f4ea15a1f1548519a" + integrity sha512-xzCjAoKuOb55CBSwQrbyWBKqp35yg1vw9ohIlU2wTy06ZrYfJ8rKochb1MSGlnoBfXGWss3UPzxR5QL5guIFdg== + dependencies: + workbox-background-sync "^4.3.1" + workbox-core "^4.3.1" + workbox-routing "^4.3.1" + workbox-strategies "^4.3.1" + +workbox-navigation-preload@^4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/workbox-navigation-preload/-/workbox-navigation-preload-4.3.1.tgz#29c8e4db5843803b34cd96dc155f9ebd9afa453d" + integrity sha512-K076n3oFHYp16/C+F8CwrRqD25GitA6Rkd6+qAmLmMv1QHPI2jfDwYqrytOfKfYq42bYtW8Pr21ejZX7GvALOw== + dependencies: + workbox-core "^4.3.1" + +workbox-precaching@^4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/workbox-precaching/-/workbox-precaching-4.3.1.tgz#9fc45ed122d94bbe1f0ea9584ff5940960771cba" + integrity sha512-piSg/2csPoIi/vPpp48t1q5JLYjMkmg5gsXBQkh/QYapCdVwwmKlU9mHdmy52KsDGIjVaqEUMFvEzn2LRaigqQ== + dependencies: + workbox-core "^4.3.1" + +workbox-range-requests@^4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/workbox-range-requests/-/workbox-range-requests-4.3.1.tgz#f8a470188922145cbf0c09a9a2d5e35645244e74" + integrity sha512-S+HhL9+iTFypJZ/yQSl/x2Bf5pWnbXdd3j57xnb0V60FW1LVn9LRZkPtneODklzYuFZv7qK6riZ5BNyc0R0jZA== + dependencies: + workbox-core "^4.3.1" + +workbox-routing@^4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/workbox-routing/-/workbox-routing-4.3.1.tgz#a675841af623e0bb0c67ce4ed8e724ac0bed0cda" + integrity sha512-FkbtrODA4Imsi0p7TW9u9MXuQ5P4pVs1sWHK4dJMMChVROsbEltuE79fBoIk/BCztvOJ7yUpErMKa4z3uQLX+g== + dependencies: + workbox-core "^4.3.1" + +workbox-strategies@^4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/workbox-strategies/-/workbox-strategies-4.3.1.tgz#d2be03c4ef214c115e1ab29c9c759c9fe3e9e646" + integrity sha512-F/+E57BmVG8dX6dCCopBlkDvvhg/zj6VDs0PigYwSN23L8hseSRwljrceU2WzTvk/+BSYICsWmRq5qHS2UYzhw== + dependencies: + workbox-core "^4.3.1" + +workbox-streams@^4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/workbox-streams/-/workbox-streams-4.3.1.tgz#0b57da70e982572de09c8742dd0cb40a6b7c2cc3" + integrity sha512-4Kisis1f/y0ihf4l3u/+ndMkJkIT4/6UOacU3A4BwZSAC9pQ9vSvJpIi/WFGQRH/uPXvuVjF5c2RfIPQFSS2uA== + dependencies: + workbox-core "^4.3.1" + +workbox-sw@^4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/workbox-sw/-/workbox-sw-4.3.1.tgz#df69e395c479ef4d14499372bcd84c0f5e246164" + integrity sha512-0jXdusCL2uC5gM3yYFT6QMBzKfBr2XTk0g5TPAV4y8IZDyVNDyj1a8uSXy3/XrvkVTmQvLN4O5k3JawGReXr9w== + +workbox-webpack-plugin@^4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/workbox-webpack-plugin/-/workbox-webpack-plugin-4.3.1.tgz#47ff5ea1cc074b6c40fb5a86108863a24120d4bd" + integrity sha512-gJ9jd8Mb8wHLbRz9ZvGN57IAmknOipD3W4XNE/Lk/4lqs5Htw4WOQgakQy/o/4CoXQlMCYldaqUg+EJ35l9MEQ== + dependencies: + "@babel/runtime" "^7.0.0" + json-stable-stringify "^1.0.1" + workbox-build "^4.3.1" + +workbox-window@^4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/workbox-window/-/workbox-window-4.3.1.tgz#ee6051bf10f06afa5483c9b8dfa0531994ede0f3" + integrity sha512-C5gWKh6I58w3GeSc0wp2Ne+rqVw8qwcmZnQGpjiek8A2wpbxSJb1FdCoQVO+jDJs35bFgo/WETgl1fqgsxN0Hg== + dependencies: + workbox-core "^4.3.1" + worker-farm@^1.7.0: version "1.7.0" resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.7.0.tgz#26a94c5391bbca926152002f69b84a4bf772e5a8" @@ -9536,11 +12273,37 @@ wrap-ansi@^2.0.0: string-width "^1.0.1" strip-ansi "^3.0.1" +wrap-ansi@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-3.0.1.tgz#288a04d87eda5c286e060dfe8f135ce8d007f8ba" + integrity sha1-KIoE2H7aXChuBg3+jxNc6NAH+Lo= + dependencies: + string-width "^2.1.1" + strip-ansi "^4.0.0" + +wrap-ansi@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09" + integrity sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q== + dependencies: + ansi-styles "^3.2.0" + string-width "^3.0.0" + strip-ansi "^5.0.0" + wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= +write-file-atomic@2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.4.1.tgz#d0b05463c188ae804396fd5ab2a370062af87529" + integrity sha512-TGHFeZEZMnv+gBFRfjAcxL5bPHrsGKtnb4qsFAws7/vlh+QfwAaySIw4AXP9ZskTTh5GWu3FLuJhsWVdiJPGvg== + dependencies: + graceful-fs "^4.1.11" + imurmurhash "^0.1.4" + signal-exit "^3.0.2" + write-file-atomic@^2.0.0: version "2.4.3" resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.4.3.tgz#1fd2e9ae1df3e75b8d8c367443c692d4ca81f481" @@ -9586,6 +12349,40 @@ xdg-basedir@^3.0.0: resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-3.0.0.tgz#496b2cc109eca8dbacfe2dc72b603c17c5870ad4" integrity sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ= +xhr@2.3.3: + version "2.3.3" + resolved "https://registry.yarnpkg.com/xhr/-/xhr-2.3.3.tgz#ad6b810e0917ce72b5ec704f5d41f1503b8e7524" + integrity sha1-rWuBDgkXznK17HBPXUHxUDuOdSQ= + dependencies: + global "~4.3.0" + is-function "^1.0.1" + parse-headers "^2.0.0" + xtend "^4.0.0" + +xml-name-validator@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a" + integrity sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw== + +xml2js@^0.4.17: + version "0.4.22" + resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.4.22.tgz#4fa2d846ec803237de86f30aa9b5f70b6600de02" + integrity sha512-MWTbxAQqclRSTnehWWe5nMKzI3VmJ8ltiJEco8akcC6j3miOhjjfzKum5sId+CWhfxdOs/1xauYr8/ZDBtQiRw== + dependencies: + sax ">=0.6.0" + util.promisify "~1.0.0" + xmlbuilder "~11.0.0" + +xmlbuilder@^13.0.2: + version "13.0.2" + resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-13.0.2.tgz#02ae33614b6a047d1c32b5389c1fdacb2bce47a7" + integrity sha512-Eux0i2QdDYKbdbA6AM6xE4m6ZTZr4G4xF9kahI2ukSEMCzwce2eX9WlTI5J3s+NU7hpasFsr8hWIONae7LluAQ== + +xmlbuilder@~11.0.0: + version "11.0.1" + resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-11.0.1.tgz#be9bae1c8a046e76b31127726347d0ad7002beb3" + integrity sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA== + xtend@^4.0.0, xtend@~4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" @@ -9619,6 +12416,14 @@ yargs-parser@^11.1.1: camelcase "^5.0.0" decamelize "^1.2.0" +yargs-parser@^13.1.1: + version "13.1.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.1.tgz#d26058532aa06d365fe091f6a1fc06b2f7e5eca0" + integrity sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ== + dependencies: + camelcase "^5.0.0" + decamelize "^1.2.0" + yargs@^12.0.5: version "12.0.5" resolved "https://registry.yarnpkg.com/yargs/-/yargs-12.0.5.tgz#05f5997b609647b64f66b81e3b4b10a368e7ad13" @@ -9637,6 +12442,34 @@ yargs@^12.0.5: y18n "^3.2.1 || ^4.0.0" yargs-parser "^11.1.1" +yargs@^13.3.0: + version "13.3.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.0.tgz#4c657a55e07e5f2cf947f8a366567c04a0dedc83" + integrity sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA== + dependencies: + cliui "^5.0.0" + find-up "^3.0.0" + get-caller-file "^2.0.1" + require-directory "^2.1.1" + require-main-filename "^2.0.0" + set-blocking "^2.0.0" + string-width "^3.0.0" + which-module "^2.0.0" + y18n "^4.0.0" + yargs-parser "^13.1.1" + +yup@^0.27.0: + version "0.27.0" + resolved "https://registry.yarnpkg.com/yup/-/yup-0.27.0.tgz#f8cb198c8e7dd2124beddc2457571329096b06e7" + integrity sha512-v1yFnE4+u9za42gG/b/081E7uNW9mUj3qtkmelLbW5YPROZzSH/KUUyJu9Wt8vxFJcT9otL/eZopS0YK1L5yPQ== + dependencies: + "@babel/runtime" "^7.0.0" + fn-name "~2.0.1" + lodash "^4.17.11" + property-expr "^1.5.0" + synchronous-promise "^2.0.6" + toposort "^2.0.2" + zen-observable-ts@^0.8.20: version "0.8.20" resolved "https://registry.yarnpkg.com/zen-observable-ts/-/zen-observable-ts-0.8.20.tgz#44091e335d3fcbc97f6497e63e7f57d5b516b163"