diff --git a/.env.docker-compose-dist b/.env.docker-compose-dist new file mode 100644 index 0000000..55d214f --- /dev/null +++ b/.env.docker-compose-dist @@ -0,0 +1,4 @@ +POSTGRES_USER=postgres +POSTGRES_PASSWORD= +POSTGRES_DB=postgres + diff --git a/.gitignore b/.gitignore index 48d43e5..69df68a 100644 --- a/.gitignore +++ b/.gitignore @@ -1,12 +1,86 @@ -.vs +### Node ### +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# Runtime data +pids +*.pid +*.seed +*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage + +# nyc test coverage +.nyc_output + +# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# Bower dependency directory (https://bower.io/) +bower_components + +# node-waf configuration +.lock-wscript + +# Dependency directories +node_modules/ +jspm_packages/ + +# TypeScript v1 declaration files +typings/ + +# Optional npm cache directory +.npm + +# Optional eslint cache +.eslintcache + +# Optional REPL history +.node_repl_history + +# Output of 'npm pack' +*.tgz + +# Yarn Integrity file +.yarn-integrity + +# dotenv environment variables file +.env +.env.test + +# parcel-bundler cache (https://parceljs.org/) +.cache + +# next.js build output +.next + +# nuxt.js build output +.nuxt + +# vuepress build output +.vuepress/dist + +# Serverless directories +.serverless/ + +# FuseBox cache +.fusebox/ + +# DynamoDB Local files +.dynamodb/ + +# Custom +.vs* .idea __generated__ build -node_modules docker-compose.override.yml -npm-error.log* -npm-debug.log* -yarn-error.log* -yarn-debug.log* -lerna-debug.log* backup.sql diff --git a/.vscode/settings.json b/.vscode/settings.json deleted file mode 100644 index f108e7f..0000000 --- a/.vscode/settings.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "editor.formatOnSave": true, - "flow.useNPMPackagedFlow": true, - "javascript.format.enable": false, - "javascript.validate.enable": false, - "search.exclude": { - "**/build": true, - "**/node_modules": true, - "**/yarn.lock": true, - "**/__generated__": true - }, - "typescript.tsdk": "./node_modules/typescript/lib" -} diff --git a/api/.env b/api/.env deleted file mode 100644 index dc665f7..0000000 --- a/api/.env +++ /dev/null @@ -1,19 +0,0 @@ -# CORS - -API_ORIGIN=http://localhost:8080 -CORS_ORIGIN=http://localhost -CRM_ORIGIN=http://localhost:3001 - -# https://www.postgresql.org/docs/current/static/libpq-envars.html - -PGHOST=localhost -PGPORT=5432 -PGUSER=postgres -PGPASSWORD= -PGDATABASE=database -PGAPP=api -PGDEBUG=false - - - - diff --git a/api/.env.dist b/api/.env.dist new file mode 100644 index 0000000..1f4e677 --- /dev/null +++ b/api/.env.dist @@ -0,0 +1,13 @@ +PORT=8080 + +# DB +PG_LISTINGS_HOST= +PG_LISTINGS_USER= +PG_LISTINGS_PASSWORD= +PG_LISTINGS_DATABASE= + +# CORS +API_ORIGIN=http://localhost:8080 +CORS_ORIGIN=http://localhost +CRM_ORIGIN=http://localhost:3001 + diff --git a/api/.vscode/launch.json b/api/.vscode/launch.json deleted file mode 100644 index c7646c0..0000000 --- a/api/.vscode/launch.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - // Use IntelliSense to learn about possible Node.js debug attributes. - // Hover to view descriptions of existing attributes. - // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 - "version": "0.2.0", - "configurations": [ - { - "name": "Run", - "type": "node", - "request": "attach", - "port": 9229, - "protocol": "inspector", - "localRoot": "${workspaceRoot}", - "remoteRoot": "/usr/src/app" - }, - { - "name": "Server", - "type": "node", - "request": "attach", - "port": 9230, - "protocol": "inspector", - "sourceMaps": true, - "localRoot": "${workspaceRoot}", - "remoteRoot": "/usr/src/app", - "restart": true - } - ], - "compounds": [ - { - "name": "Run/Server", - "configurations": ["Run", "Server"] - } - ] -} diff --git a/api/.vscode/settings.json b/api/.vscode/settings.json deleted file mode 100644 index 2cfbc4e..0000000 --- a/api/.vscode/settings.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "editor.formatOnSave": true, - "flow.useNPMPackagedFlow": true, - "javascript.format.enable": false, - "javascript.validate.enable": false, - "vsicons.presets.angular": false, - "search.exclude": { - "**/.idea": true, - "**/build": true, - "**/node_modules": true, - "**/yarn-error.log": true, - "**/yarn.lock": true - } -} diff --git a/api/.vscode/snippets/javascript.json b/api/.vscode/snippets/javascript.json deleted file mode 100644 index a435856..0000000 --- a/api/.vscode/snippets/javascript.json +++ /dev/null @@ -1,47 +0,0 @@ -{ - "GraphQL Type": { - "prefix": "type", - "body": [ - "/* @flow */", - "", - "import { GraphQLObjectType, GraphQLString } from 'graphql';", - "import { globalIdField } from 'graphql-relay';", - "", - "export default new GraphQLObjectType({", - " name: '${1:name}',", - " fields: {", - " id: globalIdField(),", - " ${2:field}", - " },", - "});", - "" - ], - "description": "GraphQL Type" - }, - "GraphQL Field": { - "prefix": "field", - "body": [ - "${1:field}: {", - " type: ${2:type},", - " resolve(${3:parent}, args, { ${4:loader} }) {", - " return ${4:loader}.load(${3:parent}.id);", - " },", - "}," - ], - "description": "GraphQL Field" - }, - "Test": { - "prefix": "test", - "body": [ - "/* eslint-env jest */", - "", - "describe('${1:namespace}', () => {", - " test('${2:test}', () => {", - " expect(${3:expect})$0;", - " });", - "});", - "" - ], - "description": "Test Script" - } -} diff --git a/api/Dockerfile b/api/Dockerfile new file mode 100644 index 0000000..f0b3e37 --- /dev/null +++ b/api/Dockerfile @@ -0,0 +1,14 @@ +FROM node:8-alpine + +WORKDIR /app + +COPY package*.json ./ +COPY yarn.lock ./ + +RUN apk update \ + && apk add --no-cache curl bash \ + && sh -c "curl -o- -L https://yarnpkg.com/install.sh | bash" \ + && yarn install + +EXPOSE 8080 +CMD [ "yarn", "dev" ] diff --git a/api/docker-compose.yml b/api/docker-compose.yml deleted file mode 100644 index 9ca2787..0000000 --- a/api/docker-compose.yml +++ /dev/null @@ -1,20 +0,0 @@ -# Docker Compose settings for launching PostgreSQL and Redis databases -# You can override these settings in docker-compose.override.yml -# https://docs.docker.com/compose/compose-file/ - -version: '3' - -volumes: - ? db - -services: - # SQL and document data store - db: - image: db - build: - context: ./images/db - volumes: - - db:/var/lib/postgresql/data - - ./postgres-initdb.sh:/docker-entrypoint-initdb.d/initdb.sh - ports: - - '127.0.0.1:5432:5432' diff --git a/api/images/db/Dockerfile b/api/images/db/Dockerfile deleted file mode 100644 index 1795a72..0000000 --- a/api/images/db/Dockerfile +++ /dev/null @@ -1,2 +0,0 @@ -FROM postgres:9.6.9-alpine - diff --git a/api/knexfile.js b/api/knexfile.js index f73474e..a2d3c4d 100644 --- a/api/knexfile.js +++ b/api/knexfile.js @@ -9,7 +9,12 @@ dotenv.config({ path: '.env' }); module.exports = { client: 'pg', - connection: {}, + connection: { + host: process.env.PG_LISTINGS_HOST, + user: process.env.PG_LISTINGS_USER, + password: process.env.PG_LISTINGS_PASSWORD, + database: process.env.PG_LISTINGS_DATABASE, + }, migrations: { tableName: 'migrations', }, diff --git a/api/migrations/201902252336_properties_alter.js b/api/migrations/201902252336_properties_alter.js new file mode 100644 index 0000000..05f0cb1 --- /dev/null +++ b/api/migrations/201902252336_properties_alter.js @@ -0,0 +1,23 @@ +/* prettier-ignore */ + +module.exports.up = async db => { + console.log('append land_surface, number_of_rooms, number_of_parkings to properties table'); + + await db.schema.alterTable('properties', table => { + table.float('land_surface'); + table.float('number_of_rooms'); + table.integer('number_of_parkings'); + }); +}; + +module.exports.down = async db => { + console.log('drop land_surface, number_of_rooms, number_of_parkings to properties table'); + + await db.schema.alterTable('properties', table => { + table.dropColumn('land_surface'); + table.dropColumn('number_of_rooms'); + table.dropColumn('number_of_parkings'); + }); +}; + +module.exports.config = { transaction: true }; diff --git a/api/package.json b/api/package.json index d20f04b..633cec3 100755 --- a/api/package.json +++ b/api/package.json @@ -23,7 +23,7 @@ "graphql-relay": "^0.5.5", "graphql-type-json": "^0.2.1", "idx": "^2.2.0", - "knex": "^0.15.2", + "knex": "^0.16.3", "lodash": "^4.17.4", "lru-cache": "^4.1.1", "morgan": "^1.9.0", @@ -77,6 +77,7 @@ "db-seed": "node scripts/db.js seed", "db-restore": "./scripts/db-restore.sh", "update-schema": "node scripts/update-schema.js", - "start": "node --icu-data-dir=`yarn -s run node-full-icu-path` ./server.js" + "start": "node --icu-data-dir=`yarn -s run node-full-icu-path` ./server.js", + "dev": "npm run db-migrate && npm run start" } } diff --git a/api/postgres-initdb.sh b/api/postgres-initdb.sh index 8e3baf3..34a5723 100644 --- a/api/postgres-initdb.sh +++ b/api/postgres-initdb.sh @@ -1,10 +1,6 @@ #!/bin/sh -e -psql --variable=ON_ERROR_STOP=1 --username "$POSTGRES_USER" <<-EOSQL - CREATE DATABASE "database"; -EOSQL - -psql --variable=ON_ERROR_STOP=1 --username "$POSTGRES_USER" --dbname=database <<-EOSQL +psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" --dbname "$POSTGRES_DB" <<-EOSQL CREATE EXTENSION "uuid-ossp"; EOSQL diff --git a/api/schema.graphql b/api/schema.graphql index 3fb90e7..ee3e71c 100644 --- a/api/schema.graphql +++ b/api/schema.graphql @@ -44,6 +44,9 @@ type Property implements Node { # The ID of an object id: ID! livingSurface: Float + landSurface: Float + numberOfRooms: Float + numberOfParkings: Int createdAt: DateTime updatedAt: DateTime } @@ -75,6 +78,9 @@ input PropertyFilters { input PropertyInput { id: ID livingSurface: Float + landSurface: Float + numberOfRooms: Float + numberOfParkings: Int } type Query { diff --git a/api/server.js b/api/server.js index c68e736..15ca7f7 100644 --- a/api/server.js +++ b/api/server.js @@ -10,10 +10,8 @@ if (process.env.NODE_ENV === 'production') { // Otherwise, built it from source and launch // on http://localhost:8080/ with "live reload" require('source-map-support').install(); - const cp = require('child_process'); const restart = require('restart'); const build = require('./scripts/build'); - cp.spawnSync('docker-compose', ['up', '-d'], { stdio: 'inherit' }); build({ watch: true, onComplete: () => restart('./build/server'), diff --git a/api/src/db_.js b/api/src/db_.js index 8f91c4d..f3721af 100644 --- a/api/src/db_.js +++ b/api/src/db_.js @@ -11,7 +11,12 @@ import knex from 'knex'; const db = knex({ client: 'pg', - connection: {}, + connection: { + host: process.env.PG_LISTINGS_HOST, + user: process.env.PG_LISTINGS_USER, + password: process.env.PG_LISTINGS_PASSWORD, + database: process.env.PG_LISTINGS_DATABASE, + }, migrations: { tableName: 'migrations', }, diff --git a/api/src/schema/PropertyInputType.js b/api/src/schema/PropertyInputType.js index ec106b8..3e06371 100644 --- a/api/src/schema/PropertyInputType.js +++ b/api/src/schema/PropertyInputType.js @@ -1,8 +1,11 @@ -import { GraphQLID, GraphQLInputObjectType, GraphQLFloat } from 'graphql'; +import { GraphQLID, GraphQLInputObjectType, GraphQLFloat, GraphQLInt } from 'graphql'; export const fields = { id: { type: GraphQLID }, livingSurface: { type: GraphQLFloat }, + landSurface: { type: GraphQLFloat }, + numberOfRooms: { type: GraphQLFloat }, + numberOfParkings: { type: GraphQLInt } }; export const PropertyInputType = new GraphQLInputObjectType({ diff --git a/api/src/schema/PropertyType.js b/api/src/schema/PropertyType.js index f861c96..c4ddb74 100644 --- a/api/src/schema/PropertyType.js +++ b/api/src/schema/PropertyType.js @@ -1,6 +1,6 @@ /* @flow */ -import { GraphQLObjectType, GraphQLFloat } from 'graphql'; +import { GraphQLObjectType, GraphQLFloat, GraphQLInt } from 'graphql'; import { GraphQLDateTime } from 'graphql-iso-date'; import { globalIdField } from 'graphql-relay'; @@ -17,6 +17,21 @@ export const PropertyType = new GraphQLObjectType({ resolve: parent => parent.living_surface, }, + landSurface: { + type: GraphQLFloat, + resolve: parent => parent.land_surface, + }, + + numberOfRooms: { + type: GraphQLFloat, + resolve: parent => parent.number_of_rooms, + }, + + numberOfParkings: { + type: GraphQLInt, + resolve: parent => parent.number_of_parkings, + }, + createdAt: { type: GraphQLDateTime, resolve: parent => parent.created_at, diff --git a/api/src/schema/property/validate.js b/api/src/schema/property/validate.js index 89e5803..aec680e 100644 --- a/api/src/schema/property/validate.js +++ b/api/src/schema/property/validate.js @@ -9,7 +9,14 @@ export default async function(input: any, ctx: Context) { .field('id') .fromGlobalId('Property') .field('livingSurface', { as: 'living_surface' }) - .isFloat({ min: 20, max: 5000 }), + .isFloat({ min: 20, max: 5000 }) + .field('landSurface', { as: 'land_surface' }) + .isFloat({ min: 20, max: 5000 }) + .field('numberOfRooms', { as: 'number_of_rooms' }) + .isFloat({ min: 1, max: 10 }) + .field('numberOfParkings', { as: 'number_of_parkings' }) + .isInt({ min: 1, max: 5 }) + .field('createdAt', { as: 'created_at' }) ); return data; diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..e1a98f5 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,43 @@ +version: '3' + +services: + web: + build: + context: ./web + volumes: + - ./web:/app + - ./api:/api + ports: + - '3000:3000' + networks: + - default + links: + - api + api: + build: + context: ./api + volumes: + - ./api:/app + ports: + - '8080:8080' + networks: + - default + links: + - db + db: + image: postgres:9.6.9-alpine + volumes: + - db-data:/var/lib/postgresql/data + - ./api/postgres-initdb.sh:/docker-entrypoint-initdb.d/init-api.sh + expose: + - '5432' + networks: + - default + +volumes: + db-data: + driver: local + +networks: + default: + driver: bridge diff --git a/web/.env.dist b/web/.env.dist new file mode 100644 index 0000000..a7b0ed2 --- /dev/null +++ b/web/.env.dist @@ -0,0 +1 @@ +API_ENDPOINT=http://api:8080/graphql diff --git a/web/Dockerfile b/web/Dockerfile new file mode 100644 index 0000000..6f3c94a --- /dev/null +++ b/web/Dockerfile @@ -0,0 +1,14 @@ +FROM node:8-alpine + +WORKDIR /app + +COPY package*.json ./ +COPY yarn.lock ./ + +RUN apk update \ + && apk add --no-cache curl bash \ + && sh -c "curl -o- -L https://yarnpkg.com/install.sh | bash" \ + && yarn install + +EXPOSE 3000 +CMD [ "yarn", "dev" ] diff --git a/web/controls/relay/mutation.js b/web/controls/relay/mutation.js index c120de4..0396c9a 100644 --- a/web/controls/relay/mutation.js +++ b/web/controls/relay/mutation.js @@ -88,12 +88,14 @@ export function createMutation< const rootField = getRootFieldName(environment, mutation); if (!rootField) { + console.log('root field with errors!') return; } const payload = store.getRootField(rootField); if (!payload) { // mutation contains errors + console.log('mutation commited with errors!') return; } diff --git a/web/package.json b/web/package.json index 1421a47..4f2e822 100644 --- a/web/package.json +++ b/web/package.json @@ -5,6 +5,7 @@ "license": "CC-BY-4.0", "dependencies": { "@material-ui/core": "^3.4.0", + "@material-ui/icons": "^3.0.2", "@material-ui/lab": "^3.0.0-alpha.23", "@rebass/components": "^4.0.0-1", "@rebass/grid": "^6.0.0-4", @@ -18,9 +19,11 @@ "esm": "^3.0.82", "fast-memoize": "^2.5.1", "flow-remove-types": "^1.2.3", + "formik": "^1.5.1", "full-icu": "^1.2.1", "i18next": "^11.5.0", "jss": "^9.8.7", + "momentjs": "^2.0.0", "next": "^7.0.1", "path-to-regexp": "^2.2.1", "polished": "^2.0.3", @@ -117,7 +120,6 @@ "node": "8" }, "config": { - "API_ENDPOINT": "http://localhost:8080/graphql", "descr": [ "SCRIPTS description", "test - pregenerate files and run tests", @@ -131,11 +133,11 @@ }, "scripts": { "test": "yarn relay && eslint ./ && flow && jest", - "start": "API_ENDPOINT=$npm_package_config_API_ENDPOINT NODE_ENV=production node --icu-data-dir=`yarn -s run node-full-icu-path` server/index.js", + "start": "NODE_ENV=production node server/index.js", "build": "yarn relay && next build", "dev": "yarn relay && yarn dev:raw", - "dev:raw": "API_ENDPOINT=$npm_package_config_API_ENDPOINT node --icu-data-dir=`yarn -s run node-full-icu-path` server/index.js", - "relay": "relay-compiler --src . --schema ../api/schema.graphql", + "dev:raw": "node --icu-data-dir=`yarn -s run node-full-icu-path` server/index.js", + "relay": "relay-compiler --src . --schema /api/schema.graphql", "relay:clean": "rimraf $TMPDIR/* && rimraf ./**/__generated__/*.graphql.js" } } diff --git a/web/pages/_document.js b/web/pages/_document.js index e99947f..d406c34 100644 --- a/web/pages/_document.js +++ b/web/pages/_document.js @@ -32,9 +32,9 @@ export default class MyDocument extends Document { const styles = extractCritical(initialProps.html); const muiCss = pageContext ? pageContext.sheetsRegistry.toString() : ''; - if (ctx.res.statusCode < 200 || ctx.res.statusCode >= 400) { - return { ...initialProps, ...styles, muiCss, headTags }; - } + // if (ctx.res.statusCode < 200 || ctx.res.statusCode >= 400) { + // return { ...initialProps, ...styles, muiCss, headTags }; + // } return { ...initialProps, diff --git a/web/pages/index.js b/web/pages/index.js index a0ca893..ddf3b55 100644 --- a/web/pages/index.js +++ b/web/pages/index.js @@ -28,9 +28,9 @@ export default () => ( Hello, Welcome to Total React Starter: - + + + + + + + Properties +
+ + + + + + Created At + Living surface + Land surface + Number Of Rooms + Number of parkings + + + + + {(root.properties.edges || []).map(({ node }) => { + return ( + + + + {moment(node.createdAt).fromNow()} + + + + {node.livingSurface} + + + {node.landSurface} + + + {node.numberOfRooms} + + + {node.numberOfParkings} + + + + {({ mutate }) => ( + { + mutate({ propertyId: node.id }); + }} + > + + + )} + + + + ); + })} + +
+ + + )} + + ); +}; diff --git a/web/shared/Properties/index.js b/web/shared/Properties/index.js new file mode 100644 index 0000000..0240b55 --- /dev/null +++ b/web/shared/Properties/index.js @@ -0,0 +1 @@ +export { Properties } from './Properties'; diff --git a/web/shared/Property/Property.js b/web/shared/Property/Property.js index 16e4ea3..ff4932d 100644 --- a/web/shared/Property/Property.js +++ b/web/shared/Property/Property.js @@ -2,10 +2,14 @@ import React from 'react'; import { graphql } from 'react-relay'; +import Router from 'next/router'; import { Flex } from '@rebass/grid/emotion'; +import { Formik, Field } from 'formik'; import Paper from '@material-ui/core/Paper'; -import Typography from '@material-ui/core/Typography'; import Button from '@material-ui/core/Button'; +import TextField from '@material-ui/core/TextField'; +import Grid from '@material-ui/core/Grid'; + import { Link } from '../../controls/link'; import { @@ -25,21 +29,29 @@ const PropertyFragment = createFragment( graphql` fragment Property_property on Property { id + numberOfRooms livingSurface + landSurface + numberOfParkings } ` ); -const PropertyUpsertLead = createMutation(graphql` - mutation PropertyUpsertMutation($input: UpsertPropertyInput!) { - upsertProperty(input: $input) { - property { - id - livingSurface +const PropertyUpsertProperty = createMutation( + graphql` + mutation PropertyUpsertMutation($input: UpsertPropertyInput!) { + upsertProperty(input: $input) { + property { + id + livingSurface + landSurface + numberOfRooms + numberOfParkings + } } } - } -`); + ` +); type Props = {| ...FragmentRefs, @@ -48,34 +60,108 @@ type Props = {| export const Property = (props: Props) => { return ( - <> - - {(/* use { property } to get the query data*/) => ( - - - - {(/* use { mutate, mutating } to commit changes to the API */) => ( - <> - Start here - - + +
+ + + + {({ mutate }) => ( + { + mutate({ property: values }); + Router.push('/properties'); + }} + render={props => ( +
+ + + ( + + )} + /> + + + ( + + )} + /> + + + ( + + )} + /> + + + ( + + )} + /> + + + - Back to instructions - - - - )} - - - - )} - - + + +
+ )} + /> + )} +
+
+
+ )} + ); }; diff --git a/web/yarn.lock b/web/yarn.lock index 332b0a6..17436b2 100644 --- a/web/yarn.lock +++ b/web/yarn.lock @@ -661,6 +661,13 @@ dependencies: regenerator-runtime "^0.12.0" +"@babel/runtime@^7.2.0": + version "7.3.4" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.3.4.tgz#73d12ba819e365fcf7fd152aed56d6df97d21c83" + integrity sha512-IvfvnMdSaLBateu0jfsYIpZTxAc2cKEXEMiezGGN75QcBcecDUKd3PgLAncT0oOgxKy8dd8hrJKj9MfzgfZd6g== + dependencies: + regenerator-runtime "^0.12.0" + "@babel/template@7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.0.0.tgz#c2bc9870405959c89a9c814376a2ecb247838c80" @@ -785,6 +792,14 @@ recompose "0.28.0 - 0.30.0" warning "^4.0.1" +"@material-ui/icons@^3.0.2": + version "3.0.2" + resolved "https://registry.yarnpkg.com/@material-ui/icons/-/icons-3.0.2.tgz#d67a6dd1ec8312d3a88ec97944a63daeef24fe10" + integrity sha512-QY/3gJnObZQ3O/e6WjH+0ah2M3MOgLOzCy8HTUoUx9B6dDrS18vP7Ycw3qrDEKlB6q1KNxy6CZHm5FCauWGy2g== + dependencies: + "@babel/runtime" "^7.2.0" + recompose "0.28.0 - 0.30.0" + "@material-ui/lab@^3.0.0-alpha.23": version "3.0.0-alpha.23" resolved "https://registry.yarnpkg.com/@material-ui/lab/-/lab-3.0.0-alpha.23.tgz#816e9821c1b25b608856639605ff116584d45b9d" @@ -2481,6 +2496,14 @@ 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-react-context@^0.2.2: + version "0.2.3" + resolved "https://registry.yarnpkg.com/create-react-context/-/create-react-context-0.2.3.tgz#9ec140a6914a22ef04b8b09b7771de89567cb6f3" + integrity sha512-CQBmD0+QGgTaxDL3OX1IDXYqjkp2It4RIbcb99jS6AEg27Ga+a9G3JtK6SIu0HBwPLZlmwt9F7UwWA4Bn92Rag== + dependencies: + fbjs "^0.8.0" + gud "^1.0.0" + cross-spawn@5.1.0, cross-spawn@^5.0.1: version "5.1.0" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" @@ -3164,7 +3187,7 @@ fb-watchman@^2.0.0: dependencies: bser "^2.0.0" -fbjs@0.8.17, fbjs@^0.8.1: +fbjs@0.8.17, fbjs@^0.8.0, fbjs@^0.8.1: version "0.8.17" resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-0.8.17.tgz#c4d598ead6949112653d6588b01a5cdcd9f90fdd" dependencies: @@ -3315,6 +3338,21 @@ form-data@~2.3.2: combined-stream "^1.0.6" mime-types "^2.1.12" +formik@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/formik/-/formik-1.5.1.tgz#ef5687e1ade5b1fe5f1d51435b422238aad107e9" + integrity sha512-FBWGBKQkcCE4d5b5l2fKccD9d1QxNxw/0bQTRvp3EjzA8Bnjmsm9H/Oy0375UA8P3FPmfJkF4cXLLdEqK7fP5A== + dependencies: + create-react-context "^0.2.2" + deepmerge "^2.1.1" + hoist-non-react-statics "^2.5.5" + lodash "^4.17.11" + lodash-es "^4.17.11" + prop-types "^15.6.1" + react-fast-compare "^2.0.1" + tiny-warning "^1.0.2" + tslib "^1.9.3" + forwarded@~0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84" @@ -3512,6 +3550,11 @@ growly@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081" +gud@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/gud/-/gud-1.0.0.tgz#a489581b17e6a70beca9abe3ae57de7a499852c0" + integrity sha512-zGEOVKFM5sVPPrYs7J5/hYEw2Pof8KCyOwyhG8sAF26mCAeUFAcYPu1mwB7hhpIP29zOIBaDqwuHdLp0jvZXjw== + gzip-size@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/gzip-size/-/gzip-size-4.1.0.tgz#8ae096257eabe7d69c45be2b67c448124ffb517c" @@ -3654,7 +3697,7 @@ hmac-drbg@^1.0.0: minimalistic-assert "^1.0.0" minimalistic-crypto-utils "^1.0.1" -hoist-non-react-statics@2.5.5, hoist-non-react-statics@^2.3.1, hoist-non-react-statics@^2.5.0: +hoist-non-react-statics@2.5.5, hoist-non-react-statics@^2.3.1, hoist-non-react-statics@^2.5.0, hoist-non-react-statics@^2.5.5: version "2.5.5" resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-2.5.5.tgz#c5903cf409c0dfd908f388e619d86b9c1174cb47" @@ -4786,6 +4829,11 @@ locate-path@^3.0.0: p-locate "^3.0.0" path-exists "^3.0.0" +lodash-es@^4.17.11: + version "4.17.11" + resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.11.tgz#145ab4a7ac5c5e52a3531fb4f310255a152b4be0" + integrity sha512-DHb1ub+rMjjrxqlB3H56/6MXtm1lSksDp2rA2cNWjG8mlDUYFhUj3Di2Zn5IwSU87xLv8tNIQ7sSwE/YOX/D/Q== + lodash.debounce@^4.0.8: version "4.0.8" resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" @@ -4794,7 +4842,7 @@ lodash.sortby@^4.7.0: version "4.7.0" resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" -lodash@^4.13.1, lodash@^4.17.10, lodash@^4.17.4, lodash@^4.17.5: +lodash@^4.13.1, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.4, lodash@^4.17.5: version "4.17.11" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d" @@ -5078,6 +5126,11 @@ moment@^2.22.1: version "2.22.2" resolved "https://registry.yarnpkg.com/moment/-/moment-2.22.2.tgz#3c257f9839fc0e93ff53149632239eb90783ff66" +momentjs@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/momentjs/-/momentjs-2.0.0.tgz#73df904b4fa418f6e3c605e831cef6ed5518ebd4" + integrity sha1-c9+QS0+kGPbjxgXoMc727VUY69Q= + move-concurrently@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/move-concurrently/-/move-concurrently-1.0.1.tgz#be2c005fda32e0b29af1f05d7c4b33214c701f92" @@ -5783,6 +5836,15 @@ prop-types@15.6.2, prop-types@^15.5.8, prop-types@^15.6.0, prop-types@^15.6.2: loose-envify "^1.3.1" object-assign "^4.1.1" +prop-types@^15.6.1: + version "15.7.2" + resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.7.2.tgz#52c41e75b8c87e72b9d9360e0206b99dcbffa6c5" + integrity sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ== + dependencies: + loose-envify "^1.4.0" + object-assign "^4.1.1" + react-is "^16.8.1" + proxy-addr@~2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.4.tgz#ecfc733bf22ff8c6f407fa275327b9ab67e48b93" @@ -5934,10 +5996,20 @@ react-event-listener@^0.6.2: prop-types "^15.6.0" warning "^4.0.1" +react-fast-compare@^2.0.1: + version "2.0.4" + resolved "https://registry.yarnpkg.com/react-fast-compare/-/react-fast-compare-2.0.4.tgz#e84b4d455b0fec113e0402c329352715196f81f9" + integrity sha512-suNP+J1VU1MWFKcyt7RtjiSWUjvidmQSlqu+eHslq+342xCbGTYmC0mEhPCOHxlW0CywylOC1u2DFAT+bv4dBw== + react-is@^16.3.2: version "16.6.3" resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.6.3.tgz#d2d7462fcfcbe6ec0da56ad69047e47e56e7eac0" +react-is@^16.8.1: + version "16.8.3" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.8.3.tgz#4ad8b029c2a718fc0cfc746c8d4e1b7221e5387d" + integrity sha512-Y4rC1ZJmsxxkkPuMLwvKvlL1Zfpbcu+Bf4ZigkHup3v9EfdYhAlWAaVyA19olXq2o2mGn0w+dFKvk3pVVlYcIA== + react-jss@^8.6.1: version "8.6.1" resolved "https://registry.yarnpkg.com/react-jss/-/react-jss-8.6.1.tgz#a06e2e1d2c4d91b4d11befda865e6c07fbd75252" @@ -6979,6 +7051,11 @@ tiny-invariant@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/tiny-invariant/-/tiny-invariant-1.0.3.tgz#91efaaa0269ccb6271f0296aeedb05fc3e067b7a" +tiny-warning@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/tiny-warning/-/tiny-warning-1.0.2.tgz#1dfae771ee1a04396bdfde27a3adcebc6b648b28" + integrity sha512-rru86D9CpQRLvsFG5XFdy0KdLAvjdQDyZCsRcuu60WtzFylDM3eAWSxEVz5kzL2Gp544XiUvPbVKtOA/txLi9Q== + tmpl@1.0.x: version "1.0.4" resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.4.tgz#23640dd7b42d00433911140820e5cf440e521dd1" @@ -7044,7 +7121,7 @@ tryer@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/tryer/-/tryer-1.0.1.tgz#f2c85406800b9b0f74c9f7465b81eaad241252f8" -tslib@^1.9.0: +tslib@^1.9.0, tslib@^1.9.3: version "1.9.3" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.3.tgz#d7e4dd79245d85428c4d7e4822a79917954ca286"