diff --git a/packages/be/README.md b/packages/be/README.md index bca3375..a1086bd 100644 --- a/packages/be/README.md +++ b/packages/be/README.md @@ -7,7 +7,7 @@ ## gql types / codegen -- `yarn codegen` +- `yarn generate` ## db types diff --git a/packages/be/package.json b/packages/be/package.json index 78cf993..441bd6f 100644 --- a/packages/be/package.json +++ b/packages/be/package.json @@ -21,6 +21,7 @@ "dependencies": { "@babel/runtime": "^7.13.10", "@koa/cors": "^3.1.0", + "@types/yup": "^0.29.11", "apollo-server-koa": "^2.21.2", "cross-env": "^7.0.3", "dotenv-safe": "^8.2.0", diff --git a/packages/be/seasy.db b/packages/be/seasy.db index 6bc9b5a..adbc9b7 100644 Binary files a/packages/be/seasy.db and b/packages/be/seasy.db differ diff --git a/packages/be/src/db/amenity.ts b/packages/be/src/db/amenity.ts index b80e22c..439a91e 100644 --- a/packages/be/src/db/amenity.ts +++ b/packages/be/src/db/amenity.ts @@ -1,4 +1,15 @@ import { amenityDb } from "../types/GeneratedDb"; import kx from "./kx"; +export const getAmenityByMarinaId = (marinaId: number) => { + return getAmenityBase() + .join( + "marina_and_amenity", + "amenity.code", + "marina_and_amenity.amenity_code" + ) + .where("marina_id", marinaId) + .select("code"); +}; + export const getAmenityBase = () => kx("amenity"); diff --git a/packages/be/src/db/kx.ts b/packages/be/src/db/kx.ts index 27be1bb..9ebd8c4 100644 --- a/packages/be/src/db/kx.ts +++ b/packages/be/src/db/kx.ts @@ -17,11 +17,8 @@ const kxConfig = { const kx = Knex(knexStringcase(kxConfig)); -// kx.on("query-response", (res) => { -// // if (res && res[0] && res[0].dateTo) { -// // console.log(res.length); -// // } -// console.log(res); -// }); +kx.on("query-response", res => { + // console.log(res); +}); export default kx; diff --git a/packages/be/src/db/marina.ts b/packages/be/src/db/marina.ts index defc5ca..3a96670 100644 --- a/packages/be/src/db/marina.ts +++ b/packages/be/src/db/marina.ts @@ -1,4 +1,64 @@ -import { marinaDb } from "../types/GeneratedDb"; +import { marinaDb, cityDb, countryDb, photoDb, marinaAndAmenityDb } from "../types/GeneratedDb"; +import { MutationAddMarinaArgs } from "../types/GeneratedGql"; + import kx from "./kx"; +import { getOrCreateEntity } from "./utils"; + +export const getMarinaBase = () => { + return kx("marina"); +}; + +export const getMarinaById = (id: number) => { + return getMarinaBase() + .where("id", id) + .first(); +}; + +export const getAllMarinasInACity = (cityCode: string) => { + return getMarinaBase().where("city_code", cityCode); +} + +export const getAllMarinasInACountry = (countryCode: string) => { + return getMarinaBase().where("country_code", countryCode); +} + +export const saveMarinaToDb = async (input: MutationAddMarinaArgs["input"]) => { + const countryPromise = getOrCreateEntity( + "country", + "code", + input.country, + {} + ); + const cityPromise = getOrCreateEntity("city", "code", input.city, { + countryCode: input.country, + lat: input.lat, + lon: input.lon, + }); + let photoPromise: Promise = Promise.resolve(null); + if (input.photoUrl) { + photoPromise = getOrCreateEntity("photo", "url", input.photoUrl, { + url: input.photoUrl, + }); + } -export const getMarinaBase = () => kx("marina"); + return Promise.all([countryPromise, cityPromise, photoPromise]).then( + ([country, city, photo]) => { + return kx("marina").insert({ + name: input.name, + cityCode: city.code, + lat: city.lat, + lon: city.lon, + countryCode: country.code, + photoId: photo ? photo.id : undefined, + }); + } + ).then(marina => { + const marinaId = marina[0]; + const marinaAndAmenity = input.amenities ? input.amenities.map(code => ({marinaId, amenityCode: code})) : null; + let amenitiesPromise = Promise.resolve(); + if (marinaAndAmenity) { + amenitiesPromise = kx("marina_and_amenity").insert(marinaAndAmenity); + } + return Promise.all([Promise.resolve(marina), amenitiesPromise]); + }); +}; diff --git a/packages/be/src/db/utils.ts b/packages/be/src/db/utils.ts new file mode 100644 index 0000000..1e66b8b --- /dev/null +++ b/packages/be/src/db/utils.ts @@ -0,0 +1,32 @@ +import kx from "./kx"; + +export const getOrCreateEntity = ( + tableName: string, + whereArgName: string, + whereArgValue: string, + extraDataToInsert: Partial + ) => { + return kx + .transaction((trx) => { + trx(tableName) + .where(whereArgName, whereArgValue) + .then((res) => { + if (res.length === 0) { + return kx(tableName) + .transacting(trx) + .insert({ [whereArgName]: whereArgValue, ...extraDataToInsert }) + + .then(() => { + return trx(tableName).where(whereArgName, whereArgValue); + }); + } else { + return res; + } + }) + .then(trx.commit) + .catch(trx.rollback); + }) + .then((res) => { + return res[0]; + }); + }; diff --git a/packages/be/src/mutations/marina.ts b/packages/be/src/mutations/marina.ts index 5ae1e29..2691fd9 100644 --- a/packages/be/src/mutations/marina.ts +++ b/packages/be/src/mutations/marina.ts @@ -1,15 +1,52 @@ import { ApolloError } from "apollo-server-koa"; import { fromGlobalId } from "graphql-relay"; +import * as Yup from "yup"; + +import { getMarinaBase, saveMarinaToDb } from "../db/marina"; import { ApolloContext } from "../types/ApolloContext"; import { MutationAddMarinaArgs } from "../types/GeneratedGql"; +const schemaValidation = Yup.object().shape({ + name: Yup.string() + .min(3) + .required("Required"), + photoUrl: Yup.string().url(), + lat: Yup.number().required("Required"), + lon: Yup.number().required("Required"), + city: Yup.string() + .min(3) + .required("Required"), + country: Yup.string() + .min(3) + .required("Required"), + amenities: Yup.array() + .of(Yup.string().min(3)) + .required("Required"), +}); + export const addMarina = async ( parent: unknown, { input }: MutationAddMarinaArgs, ctx: ApolloContext ) => { - const dbId = fromGlobalId(input.id); - - // TODO: + return schemaValidation + .isValid(input) + .then((isValid) => { + if (isValid) { + return saveMarinaToDb(input); + } else { + throw new ApolloError("Invalid input arguments."); + } + }) + .then(async ([result]) => { + if (result && result.length) { + const marina = await getMarinaBase() + .where({ id: result[0] }) + .first(); + return { marina }; + } else { + throw new ApolloError("Marina not created."); + } + }); }; diff --git a/packages/be/src/query/index.ts b/packages/be/src/query/index.ts index 08cccc6..e72544a 100644 --- a/packages/be/src/query/index.ts +++ b/packages/be/src/query/index.ts @@ -1,18 +1,68 @@ import { gql } from "apollo-server-koa"; -import { getMarinaBase } from "../db/marina"; +import { getMarinaBase, getMarinaById } from "../db/marina"; import { QueryResolvers } from "../types/GeneratedGql"; +import { fromGlobalId } from "graphql-relay"; +import { getAmenityBase } from "../db/amenity"; +import { getCityBase } from "../db/city"; +import { getCountryBase } from "../db/country"; +import { getPhotoBase } from "../db/photo"; +import { marinaDb } from "../types/GeneratedDb"; export const schema = gql` + type MarinaConnection { + edges: [MarinaEdge] + pageInfo: PageInfo! + } + + type MarinaEdge { + cursor: String! + node: Marina + } + type Query { marinas: [Marina!] cities: [City!] countries: [Country!] amenities: [Amenity!] photos: [Photo!] + + marina(id: ID!): Marina + + marinaConnection(first: Int, after: String): MarinaConnection } `; export const resolver: QueryResolvers = { marinas: () => getMarinaBase(), - // TODO: + amenities: () => getAmenityBase(), + cities: () => getCityBase(), + countries: () => getCountryBase(), + photos: () => getPhotoBase(), + + marina: (parent, args) => getMarinaById(parseInt(fromGlobalId(args.id).id)), + + marinaConnection: async (parent, args) => { + const first = args.first; + const after = parseInt(args.after || "0"); // could be more opaque + const length = (await getMarinaBase().count("id"))[0]['count(`id`)'] || 0; + + let marinasQuery = getMarinaBase().offset(after); + if (first) { + marinasQuery = getMarinaBase().offset(after).limit(first); + } + const marinas = await marinasQuery; + + return { + edges: marinas.map((marina, index) => ({ + node: marina, + cursor: `${index + after}`, + })), + pageInfo: { + hasNextPage: first ? first + after < length : false, + hasPreviousPage: after > 0, + endCursor: first ? `${first + after}` : `${length}`, + startCursor: `${after}` + } + }; + }, }; diff --git a/packages/be/src/root.ts b/packages/be/src/root.ts index 6531c8f..dc43966 100644 --- a/packages/be/src/root.ts +++ b/packages/be/src/root.ts @@ -1,6 +1,6 @@ import { ApolloServer, IResolvers } from "apollo-server-koa"; -import type { DocumentNode } from "graphql"; -import type { Context as KoaContext } from "koa"; +import { DocumentNode } from "graphql"; +import { Context as KoaContext } from "koa"; import { ApolloContext } from "./types/ApolloContext"; import * as query from "./query"; @@ -11,7 +11,7 @@ import * as marina from "./schemas/marina"; import * as photo from "./schemas/photo"; import * as amenity from "./schemas/amenity"; import * as country from "./schemas/country"; -// import * as mutation from "./mutation"; + import * as node from "./query/node"; const typeDefs: DocumentNode[] = [ @@ -25,7 +25,7 @@ const typeDefs: DocumentNode[] = [ marina.schema, query.schema, - mutations.schema, + mutations.schema ]; const resolvers: IResolvers = { @@ -36,9 +36,10 @@ const resolvers: IResolvers = { [country.TYPE]: country.resolver, [photo.TYPE]: photo.resolver, [marina.TYPE]: marina.resolver, + [amenity.TYPE]: amenity.resolver, Query: query.resolver, - Mutation: mutations.resolver, + Mutation: mutations.resolver }; type Request = { @@ -57,7 +58,7 @@ const server = new ApolloServer({ }, introspection: true, debug: true, - context: async({ ctx}: Request): Promise => { + context: async ({ ctx }: Request): Promise => { return {}; } }); diff --git a/packages/be/src/schemas/amenity.ts b/packages/be/src/schemas/amenity.ts index edc12dc..78811a6 100644 --- a/packages/be/src/schemas/amenity.ts +++ b/packages/be/src/schemas/amenity.ts @@ -1,7 +1,6 @@ import { gql, IResolverObject } from "apollo-server-koa"; import { toGlobalId } from "graphql-relay"; -import type { cityDb } from "../types/GeneratedDb"; import { AmenityResolvers } from "../types/GeneratedGql"; export const TYPE = "Amenity"; @@ -13,4 +12,6 @@ export const schema = gql` } `; -export const resolver: AmenityResolvers = {}; +export const resolver: AmenityResolvers = { + id: ({ code }) => toGlobalId(TYPE, code) +}; diff --git a/packages/be/src/schemas/city.ts b/packages/be/src/schemas/city.ts index 993c1f3..b2b8977 100644 --- a/packages/be/src/schemas/city.ts +++ b/packages/be/src/schemas/city.ts @@ -1,8 +1,8 @@ import { gql, IResolverObject } from "apollo-server-koa"; import { toGlobalId } from "graphql-relay"; -import type { cityDb } from "../types/GeneratedDb"; import { CityResolvers } from "../types/GeneratedGql"; +import { getCountryBase } from "../db/country"; export const TYPE = "City"; @@ -16,4 +16,8 @@ export const schema = gql` } `; -export const resolver: CityResolvers = {}; +export const resolver: CityResolvers = { + id: ({ code }) => toGlobalId(TYPE, code), + country: ({ countryCode }) => + getCountryBase().where("code", countryCode).first(), +}; diff --git a/packages/be/src/schemas/country.ts b/packages/be/src/schemas/country.ts index d886389..e5311ea 100644 --- a/packages/be/src/schemas/country.ts +++ b/packages/be/src/schemas/country.ts @@ -1,7 +1,6 @@ import { gql, IResolverObject } from "apollo-server-koa"; import { toGlobalId } from "graphql-relay"; -import type { cityDb } from "../types/GeneratedDb"; import { CountryResolvers } from "../types/GeneratedGql"; export const TYPE = "Country"; @@ -13,4 +12,6 @@ export const schema = gql` } `; -export const resolver: CountryResolvers = {}; +export const resolver: CountryResolvers = { + id: ({ code }) => toGlobalId(TYPE, code) +}; diff --git a/packages/be/src/schemas/marina.ts b/packages/be/src/schemas/marina.ts index fb12452..4f1ef55 100644 --- a/packages/be/src/schemas/marina.ts +++ b/packages/be/src/schemas/marina.ts @@ -1,9 +1,11 @@ import { gql, IResolverObject } from "apollo-server-koa"; import { toGlobalId } from "graphql-relay"; -import type { cityDb } from "../types/GeneratedDb"; import { MarinaResolvers } from "../types/GeneratedGql"; import { getCityBase } from "../db/city"; +import { getCountryBase } from "../db/country"; +import { getAmenityByMarinaId } from "../db/amenity"; +import { getPhotoBase } from "../db/photo"; export const TYPE = "Marina"; @@ -20,8 +22,13 @@ export const schema = gql` } input Add${TYPE}Input { - id: ID! - # TODO + name: String! + photoUrl: String + lat: Float! + lon: Float! + city: String! + country: String! + amenities: [String!] } type ${TYPE}Payload { @@ -31,6 +38,14 @@ export const schema = gql` export const resolver: MarinaResolvers = { id: ({ id }) => toGlobalId(TYPE, String(id)), - city: ({ cityCode }) => getCityBase().where({ code: cityCode }).first() - // TODO: + city: ({ cityCode }) => + getCityBase() + .where({ code: cityCode }) + .first(), + country: ({ countryCode }) => + getCountryBase() + .where({ code: countryCode }) + .first(), + amenities: ({ id }) => getAmenityByMarinaId(id), + photo: ({photoId}) => photoId ? getPhotoBase().where({id: photoId}).first() : null }; diff --git a/packages/be/src/schemas/photo.ts b/packages/be/src/schemas/photo.ts index 7dbaf20..83cb574 100644 --- a/packages/be/src/schemas/photo.ts +++ b/packages/be/src/schemas/photo.ts @@ -1,7 +1,5 @@ import { gql, IResolverObject } from "apollo-server-koa"; -import { toGlobalId } from "graphql-relay"; -import type { cityDb } from "../types/GeneratedDb"; import { PhotoResolvers } from "../types/GeneratedGql"; export const TYPE = "Photo"; diff --git a/packages/be/src/types/GeneratedGql.ts b/packages/be/src/types/GeneratedGql.ts index d4f42a5..038e4ae 100644 --- a/packages/be/src/types/GeneratedGql.ts +++ b/packages/be/src/types/GeneratedGql.ts @@ -18,7 +18,13 @@ export type Scalars = { export type AddMarinaInput = { - id: Scalars['ID']; + name: Scalars['String']; + photoUrl?: Maybe; + lat: Scalars['Float']; + lon: Scalars['Float']; + city: Scalars['String']; + country: Scalars['String']; + amenities?: Maybe>; }; export type Amenity = Node & { @@ -59,6 +65,18 @@ export type Marina = Node & { amenities?: Maybe>>; }; +export type MarinaConnection = { + __typename?: 'MarinaConnection'; + edges?: Maybe>>; + pageInfo: PageInfo; +}; + +export type MarinaEdge = { + __typename?: 'MarinaEdge'; + cursor: Scalars['String']; + node?: Maybe; +}; + export type MarinaPayload = { __typename?: 'MarinaPayload'; marina?: Maybe; @@ -99,6 +117,19 @@ export type Query = { countries?: Maybe>; amenities?: Maybe>; photos?: Maybe>; + marina?: Maybe; + marinaConnection?: Maybe; +}; + + +export type QueryMarinaArgs = { + id: Scalars['ID']; +}; + + +export type QueryMarinaConnectionArgs = { + first?: Maybe; + after?: Maybe; }; @@ -180,14 +211,16 @@ export type DirectiveResolverFn; - Amenity: ResolverTypeWrapper; String: ResolverTypeWrapper; + Float: ResolverTypeWrapper; + Amenity: ResolverTypeWrapper; + ID: ResolverTypeWrapper; CacheControlScope: CacheControlScope; City: ResolverTypeWrapper; - Float: ResolverTypeWrapper; Country: ResolverTypeWrapper; Marina: ResolverTypeWrapper; + MarinaConnection: ResolverTypeWrapper & { edges?: Maybe>> }>; + MarinaEdge: ResolverTypeWrapper & { node?: Maybe }>; MarinaPayload: ResolverTypeWrapper & { marina?: Maybe }>; Mutation: ResolverTypeWrapper<{}>; Node: ResolversTypes['Amenity'] | ResolversTypes['City'] | ResolversTypes['Country'] | ResolversTypes['Marina'] | ResolversTypes['Photo']; @@ -201,13 +234,15 @@ export type ResolversTypes = { /** Mapping between all available schema types and the resolvers parents */ export type ResolversParentTypes = { AddMarinaInput: AddMarinaInput; - ID: Scalars['ID']; - Amenity: amenityDb; String: Scalars['String']; - City: cityDb; Float: Scalars['Float']; + Amenity: amenityDb; + ID: Scalars['ID']; + City: cityDb; Country: countryDb; Marina: marinaDb; + MarinaConnection: Omit & { edges?: Maybe>> }; + MarinaEdge: Omit & { node?: Maybe }; MarinaPayload: Omit & { marina?: Maybe }; Mutation: {}; Node: ResolversParentTypes['Amenity'] | ResolversParentTypes['City'] | ResolversParentTypes['Country'] | ResolversParentTypes['Marina'] | ResolversParentTypes['Photo']; @@ -256,6 +291,18 @@ export type MarinaResolvers; }; +export type MarinaConnectionResolvers = { + edges?: Resolver>>, ParentType, ContextType>; + pageInfo?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type MarinaEdgeResolvers = { + cursor?: Resolver; + node?: Resolver, ParentType, ContextType>; + __isTypeOf?: IsTypeOfResolverFn; +}; + export type MarinaPayloadResolvers = { marina?: Resolver, ParentType, ContextType>; __isTypeOf?: IsTypeOfResolverFn; @@ -290,6 +337,8 @@ export type QueryResolvers>, ParentType, ContextType>; amenities?: Resolver>, ParentType, ContextType>; photos?: Resolver>, ParentType, ContextType>; + marina?: Resolver, ParentType, ContextType, RequireFields>; + marinaConnection?: Resolver, ParentType, ContextType, RequireFields>; }; export type Resolvers = { @@ -297,6 +346,8 @@ export type Resolvers = { City?: CityResolvers; Country?: CountryResolvers; Marina?: MarinaResolvers; + MarinaConnection?: MarinaConnectionResolvers; + MarinaEdge?: MarinaEdgeResolvers; MarinaPayload?: MarinaPayloadResolvers; Mutation?: MutationResolvers; Node?: NodeResolvers; diff --git a/packages/fe/package.json b/packages/fe/package.json index 15d24d3..ccacf20 100644 --- a/packages/fe/package.json +++ b/packages/fe/package.json @@ -12,12 +12,16 @@ "@graphql-codegen/schema-ast": "^1.18.1", "@graphql-codegen/typescript": "^1.21.1", "@graphql-codegen/typescript-resolvers": "^1.19.0", + "@material-ui/core": "^4.11.3", + "@material-ui/icons": "^4.11.2", + "@material-ui/lab": "^4.0.0-alpha.57", "@pmmmwh/react-refresh-webpack-plugin": "0.4.3", "@svgr/webpack": "5.5.0", "@testing-library/jest-dom": "^5.11.4", "@testing-library/react": "^11.1.0", "@testing-library/user-event": "^12.1.10", "@types/jest": "^26.0.15", + "@types/mapbox-gl": "^2.1.1", "@types/node": "^12.0.0", "@types/react": "^17.0.0", "@types/react-dom": "^17.0.0", @@ -58,7 +62,9 @@ "jest-circus": "26.6.0", "jest-resolve": "26.6.0", "jest-watch-typeahead": "0.6.1", + "mapbox-gl": "^2.2.0", "mini-css-extract-plugin": "0.11.3", + "node-sass": "^5.0.0", "npm-run-all": "^4.1.5", "optimize-css-assets-webpack-plugin": "5.0.4", "pnp-webpack-plugin": "1.6.4", @@ -123,7 +129,9 @@ "last 1 safari version" ] }, - "devDependencies": {}, + "devDependencies": { + "typed-scss-modules": "^4.1.1" + }, "jest": { "roots": [ "/src" diff --git a/packages/fe/public/index.html b/packages/fe/public/index.html index aa069f2..c9ccacf 100644 --- a/packages/fe/public/index.html +++ b/packages/fe/public/index.html @@ -24,7 +24,10 @@ work correctly both with client-side routing and a non-root public URL. Learn how to configure a non-root public URL by running `npm run build`. --> - React App + + + + Seasy Test Project diff --git a/packages/fe/schema.graphql b/packages/fe/schema.graphql index 3507b51..b6c33e0 100644 --- a/packages/fe/schema.graphql +++ b/packages/fe/schema.graphql @@ -1,7 +1,13 @@ directive @cacheControl(maxAge: Int, scope: CacheControlScope) on FIELD_DEFINITION | OBJECT | INTERFACE input AddMarinaInput { - id: ID! + name: String! + photoUrl: String + lat: Float! + lon: Float! + city: String! + country: String! + amenities: [String!] } type Amenity implements Node { @@ -38,6 +44,16 @@ type Marina implements Node { amenities: [Amenity] } +type MarinaConnection { + edges: [MarinaEdge] + pageInfo: PageInfo! +} + +type MarinaEdge { + cursor: String! + node: Marina +} + type MarinaPayload { marina: Marina } @@ -68,4 +84,6 @@ type Query { countries: [Country!] amenities: [Amenity!] photos: [Photo!] + marina(id: ID!): Marina + marinaConnection(first: Int, after: String): MarinaConnection } diff --git a/packages/fe/src/App.module.scss b/packages/fe/src/App.module.scss new file mode 100644 index 0000000..b405d31 --- /dev/null +++ b/packages/fe/src/App.module.scss @@ -0,0 +1,12 @@ +@import "sass/constants.scss"; + +.wrapper { + background-color: $white; + margin: 0 auto; + padding: 90px 20px 20px; + + @media #{$md} { + max-width: 896px; + padding: 110px 0 20px; + } +} diff --git a/packages/fe/src/App.module.scss.d.ts b/packages/fe/src/App.module.scss.d.ts new file mode 100644 index 0000000..e3282a4 --- /dev/null +++ b/packages/fe/src/App.module.scss.d.ts @@ -0,0 +1 @@ +export const wrapper: string; diff --git a/packages/fe/src/App.tsx b/packages/fe/src/App.tsx index 6b6ea8d..06f4218 100644 --- a/packages/fe/src/App.tsx +++ b/packages/fe/src/App.tsx @@ -1,44 +1,28 @@ import React from "react"; import { Route, Switch } from "react-router-dom"; -import logo from "./logo.svg"; -import "./App.css"; +import { Routes } from "routes"; +import Header from "components/header"; -import NotFound from "./scenes/NotFound"; -import MarinaList from "./scenes/MarinaList"; -import MarinaDetail from "./scenes/MarinaDetail"; +import MarinaList from "scenes/MarinaList"; +import MarinaDetail from "scenes/MarinaDetail"; +import NotFound from "scenes/NotFound"; +import AddMarina from "scenes/AddMarina"; + +import styles from './App.module.scss'; function App() { return ( - <> +
+
- - + + + - +
); - - // return ( - //
- //
- // logo - //

- // Edit src/App.tsx and save to reload. - //

- // - // Learn React - // - //
- //
- //
- //
- // ); } export default App; diff --git a/packages/fe/src/__generated__/AddMarinaAmenitiesQuery.graphql.ts b/packages/fe/src/__generated__/AddMarinaAmenitiesQuery.graphql.ts new file mode 100644 index 0000000..ef025bf --- /dev/null +++ b/packages/fe/src/__generated__/AddMarinaAmenitiesQuery.graphql.ts @@ -0,0 +1,85 @@ +/* tslint:disable */ +/* eslint-disable */ +// @ts-nocheck + +import { ConcreteRequest } from "relay-runtime"; +export type AddMarinaAmenitiesQueryVariables = {}; +export type AddMarinaAmenitiesQueryResponse = { + readonly amenities: ReadonlyArray<{ + readonly id: string; + readonly code: string; + }> | null; +}; +export type AddMarinaAmenitiesQuery = { + readonly response: AddMarinaAmenitiesQueryResponse; + readonly variables: AddMarinaAmenitiesQueryVariables; +}; + + + +/* +query AddMarinaAmenitiesQuery { + amenities { + id + code + } +} +*/ + +const node: ConcreteRequest = (function(){ +var v0 = [ + { + "alias": null, + "args": null, + "concreteType": "Amenity", + "kind": "LinkedField", + "name": "amenities", + "plural": true, + "selections": [ + { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "id", + "storageKey": null + }, + { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "code", + "storageKey": null + } + ], + "storageKey": null + } +]; +return { + "fragment": { + "argumentDefinitions": [], + "kind": "Fragment", + "metadata": null, + "name": "AddMarinaAmenitiesQuery", + "selections": (v0/*: any*/), + "type": "Query", + "abstractKey": null + }, + "kind": "Request", + "operation": { + "argumentDefinitions": [], + "kind": "Operation", + "name": "AddMarinaAmenitiesQuery", + "selections": (v0/*: any*/) + }, + "params": { + "cacheID": "270e6a2e1e36a974eb16a4ce5bfb2e54", + "id": null, + "metadata": {}, + "name": "AddMarinaAmenitiesQuery", + "operationKind": "query", + "text": "query AddMarinaAmenitiesQuery {\n amenities {\n id\n code\n }\n}\n" + } +}; +})(); +(node as any).hash = '92b725d718b47a30b8135f8b6f36eeb8'; +export default node; diff --git a/packages/fe/src/__generated__/AddMarinaMutation.graphql.ts b/packages/fe/src/__generated__/AddMarinaMutation.graphql.ts new file mode 100644 index 0000000..0a250c0 --- /dev/null +++ b/packages/fe/src/__generated__/AddMarinaMutation.graphql.ts @@ -0,0 +1,117 @@ +/* tslint:disable */ +/* eslint-disable */ +// @ts-nocheck + +import { ConcreteRequest } from "relay-runtime"; +export type AddMarinaInput = { + name: string; + photoUrl?: string | null; + lat: number; + lon: number; + city: string; + country: string; + amenities?: Array | null; +}; +export type AddMarinaMutationVariables = { + input: AddMarinaInput; +}; +export type AddMarinaMutationResponse = { + readonly addMarina: { + readonly marina: { + readonly id: string; + } | null; + } | null; +}; +export type AddMarinaMutation = { + readonly response: AddMarinaMutationResponse; + readonly variables: AddMarinaMutationVariables; +}; + + + +/* +mutation AddMarinaMutation( + $input: AddMarinaInput! +) { + addMarina(input: $input) { + marina { + id + } + } +} +*/ + +const node: ConcreteRequest = (function(){ +var v0 = [ + { + "defaultValue": null, + "kind": "LocalArgument", + "name": "input" + } +], +v1 = [ + { + "alias": null, + "args": [ + { + "kind": "Variable", + "name": "input", + "variableName": "input" + } + ], + "concreteType": "MarinaPayload", + "kind": "LinkedField", + "name": "addMarina", + "plural": false, + "selections": [ + { + "alias": null, + "args": null, + "concreteType": "Marina", + "kind": "LinkedField", + "name": "marina", + "plural": false, + "selections": [ + { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "id", + "storageKey": null + } + ], + "storageKey": null + } + ], + "storageKey": null + } +]; +return { + "fragment": { + "argumentDefinitions": (v0/*: any*/), + "kind": "Fragment", + "metadata": null, + "name": "AddMarinaMutation", + "selections": (v1/*: any*/), + "type": "Mutation", + "abstractKey": null + }, + "kind": "Request", + "operation": { + "argumentDefinitions": (v0/*: any*/), + "kind": "Operation", + "name": "AddMarinaMutation", + "selections": (v1/*: any*/) + }, + "params": { + "cacheID": "1b51e16d567211a0f71abb9f1b210737", + "id": null, + "metadata": {}, + "name": "AddMarinaMutation", + "operationKind": "mutation", + "text": "mutation AddMarinaMutation(\n $input: AddMarinaInput!\n) {\n addMarina(input: $input) {\n marina {\n id\n }\n }\n}\n" + } +}; +})(); +(node as any).hash = '4e17c4add4ebfb5ad685a76298bb91b7'; +export default node; diff --git a/packages/fe/src/__generated__/MarinaDetailQuery.graphql.ts b/packages/fe/src/__generated__/MarinaDetailQuery.graphql.ts new file mode 100644 index 0000000..f7aa116 --- /dev/null +++ b/packages/fe/src/__generated__/MarinaDetailQuery.graphql.ts @@ -0,0 +1,216 @@ +/* tslint:disable */ +/* eslint-disable */ +// @ts-nocheck + +import { ConcreteRequest } from "relay-runtime"; +export type MarinaDetailQueryVariables = { + id: string; +}; +export type MarinaDetailQueryResponse = { + readonly marina: { + readonly id: string; + readonly name: string; + readonly photo: { + readonly id: string; + readonly url: string; + } | null; + readonly city: { + readonly id: string; + readonly lat: number; + readonly lon: number; + readonly code: string; + } | null; + readonly country: { + readonly id: string; + readonly code: string; + } | null; + readonly amenities: ReadonlyArray<{ + readonly id: string; + readonly code: string; + } | null> | null; + } | null; +}; +export type MarinaDetailQuery = { + readonly response: MarinaDetailQueryResponse; + readonly variables: MarinaDetailQueryVariables; +}; + + + +/* +query MarinaDetailQuery( + $id: ID! +) { + marina(id: $id) { + id + name + photo { + id + url + } + city { + id + lat + lon + code + } + country { + id + code + } + amenities { + id + code + } + } +} +*/ + +const node: ConcreteRequest = (function(){ +var v0 = [ + { + "defaultValue": null, + "kind": "LocalArgument", + "name": "id" + } +], +v1 = { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "id", + "storageKey": null +}, +v2 = { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "code", + "storageKey": null +}, +v3 = [ + (v1/*: any*/), + (v2/*: any*/) +], +v4 = [ + { + "alias": null, + "args": [ + { + "kind": "Variable", + "name": "id", + "variableName": "id" + } + ], + "concreteType": "Marina", + "kind": "LinkedField", + "name": "marina", + "plural": false, + "selections": [ + (v1/*: any*/), + { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "name", + "storageKey": null + }, + { + "alias": null, + "args": null, + "concreteType": "Photo", + "kind": "LinkedField", + "name": "photo", + "plural": false, + "selections": [ + (v1/*: any*/), + { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "url", + "storageKey": null + } + ], + "storageKey": null + }, + { + "alias": null, + "args": null, + "concreteType": "City", + "kind": "LinkedField", + "name": "city", + "plural": false, + "selections": [ + (v1/*: any*/), + { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "lat", + "storageKey": null + }, + { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "lon", + "storageKey": null + }, + (v2/*: any*/) + ], + "storageKey": null + }, + { + "alias": null, + "args": null, + "concreteType": "Country", + "kind": "LinkedField", + "name": "country", + "plural": false, + "selections": (v3/*: any*/), + "storageKey": null + }, + { + "alias": null, + "args": null, + "concreteType": "Amenity", + "kind": "LinkedField", + "name": "amenities", + "plural": true, + "selections": (v3/*: any*/), + "storageKey": null + } + ], + "storageKey": null + } +]; +return { + "fragment": { + "argumentDefinitions": (v0/*: any*/), + "kind": "Fragment", + "metadata": null, + "name": "MarinaDetailQuery", + "selections": (v4/*: any*/), + "type": "Query", + "abstractKey": null + }, + "kind": "Request", + "operation": { + "argumentDefinitions": (v0/*: any*/), + "kind": "Operation", + "name": "MarinaDetailQuery", + "selections": (v4/*: any*/) + }, + "params": { + "cacheID": "efc0f5dda1afda46c21d418799629094", + "id": null, + "metadata": {}, + "name": "MarinaDetailQuery", + "operationKind": "query", + "text": "query MarinaDetailQuery(\n $id: ID!\n) {\n marina(id: $id) {\n id\n name\n photo {\n id\n url\n }\n city {\n id\n lat\n lon\n code\n }\n country {\n id\n code\n }\n amenities {\n id\n code\n }\n }\n}\n" + } +}; +})(); +(node as any).hash = 'f2f654bdff5ec4247efbedf8f371325d'; +export default node; diff --git a/packages/fe/src/__generated__/MarinaListQuery.graphql.ts b/packages/fe/src/__generated__/MarinaListQuery.graphql.ts index c52b3cd..3aaeb66 100644 --- a/packages/fe/src/__generated__/MarinaListQuery.graphql.ts +++ b/packages/fe/src/__generated__/MarinaListQuery.graphql.ts @@ -3,12 +3,40 @@ // @ts-nocheck import { ConcreteRequest } from "relay-runtime"; -export type MarinaListQueryVariables = {}; +export type MarinaListQueryVariables = { + first?: number | null; +}; export type MarinaListQueryResponse = { - readonly marinas: ReadonlyArray<{ - readonly id: string; - readonly name: string; - }> | null; + readonly marinaConnection: { + readonly edges: ReadonlyArray<{ + readonly node: { + readonly id: string; + readonly name: string; + readonly photo: { + readonly id: string; + readonly url: string; + } | null; + readonly city: { + readonly id: string; + readonly lat: number; + readonly lon: number; + readonly code: string; + } | null; + readonly country: { + readonly id: string; + readonly code: string; + } | null; + readonly amenities: ReadonlyArray<{ + readonly id: string; + readonly code: string; + } | null> | null; + } | null; + } | null> | null; + readonly pageInfo: { + readonly hasNextPage: boolean | null; + readonly endCursor: string | null; + }; + } | null; }; export type MarinaListQuery = { readonly response: MarinaListQueryResponse; @@ -18,36 +46,202 @@ export type MarinaListQuery = { /* -query MarinaListQuery { - marinas { - id - name +query MarinaListQuery( + $first: Int +) { + marinaConnection(first: $first) { + edges { + node { + id + name + photo { + id + url + } + city { + id + lat + lon + code + } + country { + id + code + } + amenities { + id + code + } + } + } + pageInfo { + hasNextPage + endCursor + } } } */ const node: ConcreteRequest = (function(){ var v0 = [ + { + "defaultValue": null, + "kind": "LocalArgument", + "name": "first" + } +], +v1 = { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "id", + "storageKey": null +}, +v2 = { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "code", + "storageKey": null +}, +v3 = [ + (v1/*: any*/), + (v2/*: any*/) +], +v4 = [ { "alias": null, - "args": null, - "concreteType": "Marina", + "args": [ + { + "kind": "Variable", + "name": "first", + "variableName": "first" + } + ], + "concreteType": "MarinaConnection", "kind": "LinkedField", - "name": "marinas", - "plural": true, + "name": "marinaConnection", + "plural": false, "selections": [ { "alias": null, "args": null, - "kind": "ScalarField", - "name": "id", + "concreteType": "MarinaEdge", + "kind": "LinkedField", + "name": "edges", + "plural": true, + "selections": [ + { + "alias": null, + "args": null, + "concreteType": "Marina", + "kind": "LinkedField", + "name": "node", + "plural": false, + "selections": [ + (v1/*: any*/), + { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "name", + "storageKey": null + }, + { + "alias": null, + "args": null, + "concreteType": "Photo", + "kind": "LinkedField", + "name": "photo", + "plural": false, + "selections": [ + (v1/*: any*/), + { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "url", + "storageKey": null + } + ], + "storageKey": null + }, + { + "alias": null, + "args": null, + "concreteType": "City", + "kind": "LinkedField", + "name": "city", + "plural": false, + "selections": [ + (v1/*: any*/), + { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "lat", + "storageKey": null + }, + { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "lon", + "storageKey": null + }, + (v2/*: any*/) + ], + "storageKey": null + }, + { + "alias": null, + "args": null, + "concreteType": "Country", + "kind": "LinkedField", + "name": "country", + "plural": false, + "selections": (v3/*: any*/), + "storageKey": null + }, + { + "alias": null, + "args": null, + "concreteType": "Amenity", + "kind": "LinkedField", + "name": "amenities", + "plural": true, + "selections": (v3/*: any*/), + "storageKey": null + } + ], + "storageKey": null + } + ], "storageKey": null }, { "alias": null, "args": null, - "kind": "ScalarField", - "name": "name", + "concreteType": "PageInfo", + "kind": "LinkedField", + "name": "pageInfo", + "plural": false, + "selections": [ + { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "hasNextPage", + "storageKey": null + }, + { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "endCursor", + "storageKey": null + } + ], "storageKey": null } ], @@ -56,30 +250,30 @@ var v0 = [ ]; return { "fragment": { - "argumentDefinitions": [], + "argumentDefinitions": (v0/*: any*/), "kind": "Fragment", "metadata": null, "name": "MarinaListQuery", - "selections": (v0/*: any*/), + "selections": (v4/*: any*/), "type": "Query", "abstractKey": null }, "kind": "Request", "operation": { - "argumentDefinitions": [], + "argumentDefinitions": (v0/*: any*/), "kind": "Operation", "name": "MarinaListQuery", - "selections": (v0/*: any*/) + "selections": (v4/*: any*/) }, "params": { - "cacheID": "946a0736d178d80c2050413ecb4f6b1e", + "cacheID": "72f99122b78e4858f99ba2618441a60a", "id": null, "metadata": {}, "name": "MarinaListQuery", "operationKind": "query", - "text": "query MarinaListQuery {\n marinas {\n id\n name\n }\n}\n" + "text": "query MarinaListQuery(\n $first: Int\n) {\n marinaConnection(first: $first) {\n edges {\n node {\n id\n name\n photo {\n id\n url\n }\n city {\n id\n lat\n lon\n code\n }\n country {\n id\n code\n }\n amenities {\n id\n code\n }\n }\n }\n pageInfo {\n hasNextPage\n endCursor\n }\n }\n}\n" } }; })(); -(node as any).hash = 'b5e576de9d78c837a5d48724fbead9d0'; +(node as any).hash = 'cdafb735a878fd6fa9df82594dae8bfd'; export default node; diff --git a/packages/fe/src/components/amenity/amenity.module.scss b/packages/fe/src/components/amenity/amenity.module.scss new file mode 100644 index 0000000..6a35187 --- /dev/null +++ b/packages/fe/src/components/amenity/amenity.module.scss @@ -0,0 +1,24 @@ +@import "sass/constants.scss"; + +.inline { + margin-right: 5px; + + display: inline-flex; +} + +.badge { + width: 30px; + height: 30px; + border-radius: 40px; + padding: 6px; + margin-right: 5px; + + display: flex; + align-items: center; + justify-content: center; + + background-color: $white; + color: $grey; + + box-shadow: 3px 3px 19px -5px rgba(0, 0, 0, 0.75); +} diff --git a/packages/fe/src/components/amenity/amenity.module.scss.d.ts b/packages/fe/src/components/amenity/amenity.module.scss.d.ts new file mode 100644 index 0000000..0bd7283 --- /dev/null +++ b/packages/fe/src/components/amenity/amenity.module.scss.d.ts @@ -0,0 +1,2 @@ +export const badge: string; +export const inline: string; diff --git a/packages/fe/src/components/amenity/index.tsx b/packages/fe/src/components/amenity/index.tsx new file mode 100644 index 0000000..6253340 --- /dev/null +++ b/packages/fe/src/components/amenity/index.tsx @@ -0,0 +1,44 @@ +import React from "react"; + +import { MarinaDetailQuery } from "__generated__/MarinaDetailQuery.graphql"; + +import LocalGasStationIcon from "@material-ui/icons/LocalGasStation"; +import FlightIcon from "@material-ui/icons/Flight"; +import BatteryChargingFullIcon from "@material-ui/icons/BatteryChargingFull"; + +import styles from "./amenity.module.scss"; + +type AmenityType = NonNullable< + NonNullable< + NonNullable["amenities"] + >[0] +>; + +interface Props { + isInline: boolean; + amenity: AmenityType; +} + +const CODE_TO_ICON_COMPONENT = { + electricity: BatteryChargingFullIcon, + fuel: LocalGasStationIcon, + helicopter_pad: FlightIcon, +}; + +const Amenity: React.FC = ({ amenity, isInline }) => { + const IconComponent = (CODE_TO_ICON_COMPONENT as any)[amenity.code]; + + return isInline ? ( + + {amenity.code} +   + {React.createElement(IconComponent, { fontSize: "small" })} + + ) : ( +
+ {React.createElement(IconComponent, { fontSize: "small" })} +
+ ); +}; + +export default Amenity; diff --git a/packages/fe/src/components/header/header.module.scss b/packages/fe/src/components/header/header.module.scss new file mode 100644 index 0000000..17b88a8 --- /dev/null +++ b/packages/fe/src/components/header/header.module.scss @@ -0,0 +1,61 @@ +@import "sass/constants.scss"; + +.header { + width: 100%; + min-height: 70px; + padding: 0px; + + position: fixed; + top: 0px; + left: 0px; + right: 0px; + + margin: 0px; + z-index: 700; + + background-color: $white; + box-shadow: 3px 3px 19px -5px rgba(0, 0, 0, 0.75); +} + +.headerContent { + max-width: 90%; + min-height: 70px; + margin: 0 auto; + + display: flex; + align-items: center; + + @media #{$md} { + max-width: 896px; + } +} + +.logo { + width: 150px; + height: 60px; + object-fit: scale-down; +} + +.links { + margin: 0 auto; + + @media #{$md} { + width: 600px; + } +} + +.link { + text-decoration: none; + color: $black; + font-size: 1.5rem; + + &:not(:last-child) { + margin-right: 20px; + } +} + +.active { + text-decoration: underline; + color: $blue; + font-size: 1.5rem; +} diff --git a/packages/fe/src/components/header/header.module.scss.d.ts b/packages/fe/src/components/header/header.module.scss.d.ts new file mode 100644 index 0000000..1f75266 --- /dev/null +++ b/packages/fe/src/components/header/header.module.scss.d.ts @@ -0,0 +1,6 @@ +export const active: string; +export const header: string; +export const headerContent: string; +export const link: string; +export const links: string; +export const logo: string; diff --git a/packages/fe/src/components/header/index.tsx b/packages/fe/src/components/header/index.tsx new file mode 100644 index 0000000..f508354 --- /dev/null +++ b/packages/fe/src/components/header/index.tsx @@ -0,0 +1,34 @@ +import React from "react"; +import { NavLink } from "react-router-dom"; +import { Routes } from "routes"; + +import logo from "./logo.png"; +import styles from "./header.module.scss"; + +const Header: React.FC = () => { + return ( +
+
+ logo +
+ + Marinas + + + Add Marina + +
+
+
+ ); +}; + +export default Header; diff --git a/packages/fe/src/components/header/logo.png b/packages/fe/src/components/header/logo.png new file mode 100644 index 0000000..a3f2bda Binary files /dev/null and b/packages/fe/src/components/header/logo.png differ diff --git a/packages/fe/src/index.tsx b/packages/fe/src/index.tsx index 62b5d67..173ae73 100644 --- a/packages/fe/src/index.tsx +++ b/packages/fe/src/index.tsx @@ -7,8 +7,6 @@ import "./index.css"; import App from "./App"; import { makeRelayEnvironment } from "./environment"; -// import reportWebVitals from './reportWebVitals'; - const { environment } = makeRelayEnvironment(); // @ts-expect-error window.environment = environment; @@ -16,15 +14,10 @@ window.environment = environment; ReactDOM.render( - - - + + + , document.getElementById("root") ); - -// If you want to start measuring performance in your app, pass a function -// to log results (for example: reportWebVitals(console.log)) -// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals -// reportWebVitals(); diff --git a/packages/fe/src/routes.ts b/packages/fe/src/routes.ts new file mode 100644 index 0000000..05a9fe5 --- /dev/null +++ b/packages/fe/src/routes.ts @@ -0,0 +1,12 @@ +export class Routes { + static MARINA_LIST = "/marina-list"; + static MARINA_DETAIL = "/marina-detail/:id"; + static ADD_MARINA = "/add-marina"; + + static getTo = (route: string, args: { id?: string }) => { + if (route === Routes.MARINA_DETAIL) { + return `/marina-detail/${args.id}/`; + } + return route; + }; +} diff --git a/packages/fe/src/sass/_constants.scss b/packages/fe/src/sass/_constants.scss new file mode 100644 index 0000000..3538ec3 --- /dev/null +++ b/packages/fe/src/sass/_constants.scss @@ -0,0 +1,9 @@ +$mdBreakpoint: 896px; + +$md: "(min-width: #{$mdBreakpoint})"; + +$black: #000; +$white: #fff; +$blue: rgb(97, 97, 163); +$grey: rgb(59, 57, 57); +$lightgrey: rgb(148, 143, 143); diff --git a/packages/fe/src/scenes/AddMarina/add-marina.module.scss b/packages/fe/src/scenes/AddMarina/add-marina.module.scss new file mode 100644 index 0000000..4d8ce8b --- /dev/null +++ b/packages/fe/src/scenes/AddMarina/add-marina.module.scss @@ -0,0 +1,8 @@ +.inputMargin { + margin-top: 20px; +} + +.map { + min-height: 400px; + margin-top: 30px; +} diff --git a/packages/fe/src/scenes/AddMarina/add-marina.module.scss.d.ts b/packages/fe/src/scenes/AddMarina/add-marina.module.scss.d.ts new file mode 100644 index 0000000..fc4f0f2 --- /dev/null +++ b/packages/fe/src/scenes/AddMarina/add-marina.module.scss.d.ts @@ -0,0 +1,2 @@ +export const inputMargin: string; +export const map: string; diff --git a/packages/fe/src/scenes/AddMarina/add-marina.scss.d.ts b/packages/fe/src/scenes/AddMarina/add-marina.scss.d.ts new file mode 100644 index 0000000..fc4f0f2 --- /dev/null +++ b/packages/fe/src/scenes/AddMarina/add-marina.scss.d.ts @@ -0,0 +1,2 @@ +export const inputMargin: string; +export const map: string; diff --git a/packages/fe/src/scenes/AddMarina/index.tsx b/packages/fe/src/scenes/AddMarina/index.tsx new file mode 100644 index 0000000..25fc201 --- /dev/null +++ b/packages/fe/src/scenes/AddMarina/index.tsx @@ -0,0 +1,323 @@ +import React, { useEffect, useRef, useState } from "react"; +import mapboxgl from "mapbox-gl"; +import { + TextField, + Button, + FormGroup, + FormControlLabel, + Checkbox, + CircularProgress, + FormLabel, + Snackbar, +} from "@material-ui/core"; +import { Alert } from "@material-ui/lab"; +import { useHistory } from "react-router"; +import { GraphQLError } from "graphql"; +import { useMutation, useQuery } from "relay-hooks"; +import graphql from "babel-plugin-relay/macro"; +import { Add, CheckCircleOutlineOutlined } from "@material-ui/icons"; +import "mapbox-gl/dist/mapbox-gl.css"; + +import { Routes } from "routes"; + +import { AddMarinaAmenitiesQuery } from "__generated__/AddMarinaAmenitiesQuery.graphql"; +import { AddMarinaMutation } from "__generated__/AddMarinaMutation.graphql"; + +import { ACCESS_TOKEN_MAPBOX, getCityCountryFromLonLat } from "./utils"; +import styles from "./add-marina.module.scss"; + +const MARINA_KREMIK_LON_LAT: [number, number] = [15.9379, 43.5696]; + +interface FormState { + name: string; + photoUrl: string; + amenities: Set; + city: string; + country: string; +} + +interface FormSubmitState { + submitted: boolean; + sucess: boolean; + error: null | string; +} + +export default function AddMarina() { + const history = useHistory(); + + const mapElementRef = useRef(null); + const map = useRef(); + const locationMarker = useRef(); + + const [submitState, setSubmitState] = useState({ + submitted: false, + sucess: false, + error: null, + }); + const [formState, setFormState] = useState({ + amenities: new Set(), + name: "", + photoUrl: "", + city: "", + country: "", + }); + + const { data } = useQuery( + graphql` + query AddMarinaAmenitiesQuery { + amenities { + id + code + } + } + `, + {}, + { + fetchPolicy: "store-and-network", + onComplete: () => {}, + } + ); + + const [commit, { loading }] = useMutation(graphql` + mutation AddMarinaMutation($input: AddMarinaInput!) { + addMarina(input: $input) { + marina { + id + } + } + } + `); + + useEffect(() => { + if (!map.current) { + loadMapbox(); + } + + return () => map.current && map.current.remove(); + }, []); + + const loadMapbox = () => { + mapboxgl.accessToken = ACCESS_TOKEN_MAPBOX; + map.current = new mapboxgl.Map({ + style: "mapbox://styles/mapbox/streets-v11", // style URL + container: mapElementRef.current?.id || "mapElementId", // container ID + center: MARINA_KREMIK_LON_LAT, // starting position [lng, lat] + zoom: 12, // starting zoom + }); + + locationMarker.current = new mapboxgl.Marker({ + draggable: true, + }) + .setLngLat(MARINA_KREMIK_LON_LAT) + .addTo(map.current); + + locationMarker.current.on("dragend", async (e) => { + if (locationMarker.current) { + const lngLat = locationMarker.current.getLngLat(); + + const [city, country] = await getCityCountryFromLonLat( + lngLat.lng, + lngLat.lat + ); + + setFormState((prev) => ({ + ...prev, + city, + country, + })); + } + }); + }; + + const handleInputChange = (event: React.ChangeEvent) => { + const target = event.target; + const value = target.type === "checkbox" ? target.checked : target.value; + const name = target.name; + + setFormState({ + ...formState, + [name]: value, + }); + }; + + const handleAmenityChange = (code: string) => { + const amenities = new Set(formState.amenities); + + if (amenities.has(code)) { + amenities.delete(code); + } else { + amenities.add(code); + } + + setFormState({ + ...formState, + amenities, + }); + }; + + const submit = () => { + const savePromise = commit({ + variables: { + input: getMutationInput(), + }, + }); + + savePromise + .then((result) => { + if (result && result.addMarina?.marina?.id) { + setSubmitSuccess(); + redirectToMarinaAfterDelay(result!.addMarina!.marina!.id); + } else { + setSubmitError("There was an error creating marina."); + } + }) + .catch((error: GraphQLError) => { + setSubmitError(error.message); + }); + }; + + const getMutationInput = () => { + const lngLat = locationMarker.current!.getLngLat(); + + return { + ...formState, + amenities: Array.from(formState.amenities), + lon: lngLat.lng, + lat: lngLat.lat, + }; + }; + + const setSubmitSuccess = () => { + setSubmitState({ + submitted: true, + sucess: true, + error: null, + }); + }; + + const setSubmitError = (msg: string) => { + setSubmitState({ + submitted: true, + sucess: false, + error: msg, + }); + }; + + const redirectToMarinaAfterDelay = (marinaId: string) => { + setTimeout(() => { + history.push( + Routes.getTo(Routes.MARINA_DETAIL, { + id: marinaId, + }) + ); + }, 1500); + }; + + const handleAlertClose = () => { + setSubmitState({ + submitted: false, + sucess: false, + error: null, + }); + }; + + return ( + <> +

Add Marina

+
+ + + + Amenities + + + {data?.amenities?.map((amenity) => ( + handleAmenityChange(amenity.code)} + name={amenity.code} + color="primary" + /> + } + label={amenity.code} + /> + ))} + + + + + +
+ + + + + {submitState.sucess + ? "Marina successfully created, you will be redirected." + : submitState.error} + + + + ); +} diff --git a/packages/fe/src/scenes/AddMarina/utils.ts b/packages/fe/src/scenes/AddMarina/utils.ts new file mode 100644 index 0000000..392b9cc --- /dev/null +++ b/packages/fe/src/scenes/AddMarina/utils.ts @@ -0,0 +1,31 @@ + +const MAPBOX_WEBSERVICES_URL = "https://api.mapbox.com"; +export const ACCESS_TOKEN_MAPBOX = + "pk.eyJ1Ijoib2h1c2FyIiwiYSI6ImNrbXJ1bDRyMzBia2IycHJzbmdpbjVobWYifQ.7EthsV5t9R6ve15oUewRjQ"; + +export const getCityCountryFromLonLat = async (lon: number, lat: number) => { + const url = `${MAPBOX_WEBSERVICES_URL}/geocoding/v5/mapbox.places/${lon},${lat}.json?access_token=${ACCESS_TOKEN_MAPBOX}`; + const response = (await (await fetch(url)).json()) as any; + + let city = "", + country = ""; + + if (response.features && response.features.length) { + (response.features as Array).forEach((feature: any) => { + if ( + !city && + (feature["place_type"].indexOf("place") !== -1 || + feature["place_type"].indexOf("region") !== -1) + ) { + city = feature.text; + } + }); + + (response.features as Array).reverse().forEach((feature: any) => { + if (!country && feature["place_type"].indexOf("country") !== -1) { + country = feature.text; + } + }); + } + return [city, country]; + }; \ No newline at end of file diff --git a/packages/fe/src/scenes/MarinaDetail/index.tsx b/packages/fe/src/scenes/MarinaDetail/index.tsx index 1113f09..10e923b 100644 --- a/packages/fe/src/scenes/MarinaDetail/index.tsx +++ b/packages/fe/src/scenes/MarinaDetail/index.tsx @@ -1,5 +1,120 @@ import React from "react"; +import graphql from "babel-plugin-relay/macro"; +import { useQuery } from "relay-hooks"; +import { useRouteMatch } from "react-router"; +import { MarinaDetailQuery } from "__generated__/MarinaDetailQuery.graphql"; + +import styles from "./marina-detail.module.scss"; +import Amenity from "components/amenity"; export default function MarinaDetail() { - return <>MarinaDetail; + const match = useRouteMatch<{ id: string }>(); + + const { data, error } = useQuery( + graphql` + query MarinaDetailQuery($id: ID!) { + marina(id: $id) { + id + name + photo { + id + url + } + city { + id + lat + lon + code + } + country { + id + code + } + amenities { + id + code + } + } + } + `, + { id: match.params.id }, + { + fetchPolicy: "store-and-network", + } + ); + + const marina = data?.marina; + return marina ? ( +
+
+ marina-detail +
+
+
+
+
MARINA · 16.6 mi
+

{marina.name}

+
+ {marina.country?.code} · {marina.city?.code}{" "} +
+
+
+
+
Berths available
+
37/256
+ +
Depth
+
2.5 - 20m
+
+
+
Reservation
+
Possible
+ +
Type of berthing
+
Mooring line
+
+
+
+ +
+

+ Bacon ipsum dolor amet venison tongue swine, rump jowl chislic + turkey chicken. Ball tip turducken short ribs salami fatback beef + ribs, pork belly venison burgdoggen tri-tip. Pork belly tri-tip pork + chop burgdoggen bacon ham tenderloin, andouille swine short ribs + fatback ground round chuck ball tip ham hock. Capicola sausage + turducken, flank corned beef tri-tip pastrami prosciutto chicken + jowl short ribs biltong pig. Chuck pork sirloin, jerky strip steak + pastrami shank porchetta. Biltong ham hock corned beef swine picanha + ribeye jowl tenderloin kevin beef ribs boudin pork belly. Prosciutto + jerky leberkas, shank fatback strip steak filet mignon sirloin + kielbasa. +

+

+ Tri-tip pig venison buffalo shoulder landjaeger fatback kielbasa + pork loin turducken ground round alcatra frankfurter meatloaf. + Shankle buffalo salami, beef ball tip pork belly pork chop cow + porchetta corned beef fatback frankfurter t-bone. Landjaeger + porchetta sirloin venison. Ground round hamburger turducken + prosciutto jerky, cow ball tip rump pig meatloaf corned beef. + Bresaola bacon filet mignon flank hamburger jowl ham t-bone jerky. + Chicken corned beef frankfurter leberkas ball tip shank tail venison + jerky pork chop capicola chuck. Beef salami short loin picanha. +

+
+ {marina.amenities ? ( +
+

Amenities

+ {marina.amenities.map((amenity) => ( + + ))} +
+ ) : null} +
+
+ ) : null; } diff --git a/packages/fe/src/scenes/MarinaDetail/marina-detail.module.scss b/packages/fe/src/scenes/MarinaDetail/marina-detail.module.scss new file mode 100644 index 0000000..50045b5 --- /dev/null +++ b/packages/fe/src/scenes/MarinaDetail/marina-detail.module.scss @@ -0,0 +1,163 @@ +@import "sass/constants.scss"; + +.wrapper { + width: 100%; + position: relative; +} + +.imageWrapper { + position: relative; +} + +.image { + width: 100%; + height: 350px; + object-fit: cover; +} + +.info { + position: absolute; + top: 300px; + background-color: $white; + + border: 1px solid $lightgrey; + border-radius: 20px 20px 0 0; + padding: 20px; + + @media #{$md} { + position: static; + margin-top: 30px; + + border: 0; + border-radius: 0; + padding: 0; + } +} + +.sections { + display: flex; + justify-content: space-between; + align-items: flex-start; + flex-direction: column; + + @media #{$md} { + flex-direction: row; + } +} + +.section1 { + width: 100%; + + display: flex; + flex-direction: row; + flex-wrap: wrap; + align-items: flex-end; + justify-content: space-between; + + @media #{$md} { + width: auto; + + flex-direction: column; + align-items: flex-start; + justify-content: flex-start; + flex-wrap: nowrap; + } +} + +.type { + order: 2; + + font-size: 1rem; + color: $blue; + + @media #{$md} { + order: 1; + } +} + +.name { + order: 1; + + margin: 10px 0 0; + padding: 0; + + font-weight: 600; + font-size: 2.5rem; + line-height: 1; + + @media #{$md} { + order: 2; + } +} + +.location { + order: 3; + + margin: 10px 0 0; + + font-size: 1rem; + font-weight: 300; +} + +.section2 { + width: 100%; + + display: flex; + margin-top: 20px; + + @media #{$md} { + margin-top: 0; + width: auto; + } +} + +.section3 { + @media #{$md} { + margin-right: 30px; + } +} + +.section4, +.section3 { + width: 50%; + + display: flex; + flex-direction: column; + + @media #{$md} { + width: 170px; + } +} + +.label { + color: $lightgrey; + font-weight: 500; + + &:not(:first-child) { + margin-top: 20px; + } +} + +.value { + margin-top: 10px; + font-weight: 600; +} + +.about { + margin-top: 40px; + + font-weight: 300; + line-height: 1.75; +} + +.amenities { + margin-top: 10px; +} + +.amenitiesTitle { + margin: 0 0 10px; + padding: 0; + + font-weight: 600; + font-size: 1.3rem; +} diff --git a/packages/fe/src/scenes/MarinaDetail/marina-detail.module.scss.d.ts b/packages/fe/src/scenes/MarinaDetail/marina-detail.module.scss.d.ts new file mode 100644 index 0000000..5b98aa5 --- /dev/null +++ b/packages/fe/src/scenes/MarinaDetail/marina-detail.module.scss.d.ts @@ -0,0 +1,17 @@ +export const about: string; +export const amenities: string; +export const amenitiesTitle: string; +export const image: string; +export const imageWrapper: string; +export const info: string; +export const label: string; +export const location: string; +export const name: string; +export const section1: string; +export const section2: string; +export const section3: string; +export const section4: string; +export const sections: string; +export const type: string; +export const value: string; +export const wrapper: string; diff --git a/packages/fe/src/scenes/MarinaList/bg.jpg b/packages/fe/src/scenes/MarinaList/bg.jpg new file mode 100644 index 0000000..c2a9e0c Binary files /dev/null and b/packages/fe/src/scenes/MarinaList/bg.jpg differ diff --git a/packages/fe/src/scenes/MarinaList/index.tsx b/packages/fe/src/scenes/MarinaList/index.tsx index 4915278..3f96f7f 100644 --- a/packages/fe/src/scenes/MarinaList/index.tsx +++ b/packages/fe/src/scenes/MarinaList/index.tsx @@ -1,30 +1,118 @@ -import React from "react"; +import React, { useState } from "react"; import { useQuery } from "relay-hooks"; import graphql from "babel-plugin-relay/macro"; +import { Link } from "react-router-dom"; +import { Routes } from "routes"; import { MarinaListQuery } from "__generated__/MarinaListQuery.graphql"; +import styles from "./marina-list.module.scss"; +import Amenity from "components/amenity"; +import { Button } from "@material-ui/core"; + export default function MarinaList() { + const [first, setFirst] = useState(3); + const { data } = useQuery( graphql` - query MarinaListQuery { - marinas { - id - name + query MarinaListQuery($first: Int) { + marinaConnection(first: $first) { + edges { + node { + id + name + photo { + id + url + } + city { + id + lat + lon + code + } + country { + id + code + } + amenities { + id + code + } + } + } + pageInfo { + hasNextPage + endCursor + } } } `, - {}, + {first}, { - fetchPolicy: "store-and-network" + fetchPolicy: "store-and-network", } ); + + return ( <> -
MarinaList
-
-
{JSON.stringify(data || {}, null, 2)}
+
+

CROATIA

+
+ 130+ marines for booking +
+
+
+ {data?.marinaConnection?.edges?.map((marinaEdge, index) => ( +
+
+ {marinaEdge?.node?.name} + {marinaEdge?.node?.amenities ? ( +
+ {marinaEdge?.node?.amenities.map((amenity) => ( + + ))} +
+ ) : null} +
+
+ {marinaEdge?.node?.city?.code} |{" "} + {marinaEdge?.node?.country?.code} +
+ + {marinaEdge?.node?.name} + +
76€ per night
+
+ ))} +
+
+ +
); diff --git a/packages/fe/src/scenes/MarinaList/marina-list.module.scss b/packages/fe/src/scenes/MarinaList/marina-list.module.scss new file mode 100644 index 0000000..34f4356 --- /dev/null +++ b/packages/fe/src/scenes/MarinaList/marina-list.module.scss @@ -0,0 +1,132 @@ +@import "sass/constants.scss"; + +.title { + height: 160px; + border-radius: 10px; + + display: flex; + justify-content: center; + align-items: center; + flex-direction: column; + + background-image: url("./bg.jpg"); + background-repeat: no-repeat; + background-position: center; + background-size: cover; + + @media #{$md} { + height: 160px; + } +} + +.h1 { + padding: 0; + margin: 0 0 10px; + font-size: 3.6rem; + + color: $white; + + @media #{$md} { + font-size: 4.8rem; + } +} + +.count { + font-size: 1.6rem; + + color: $white; + + @media #{$md} { + font-size: 1.5rem; + } +} + +.marinas { + margin-top: 20px; + + display: flex; + flex-direction: column; + + @media #{$md} { + flex-direction: row; + flex-wrap: wrap; + justify-content: space-between; + } +} + +.marinaCard { + width: 100%; + margin-bottom: 15px; + + display: flex; + flex-direction: column; + align-items: center; + + @media #{$md} { + width: 32%; + + align-items: flex-start; + } + + .cardImage { + width: 100%; + height: 180px; + border-radius: 10px; + + object-fit: cover; + + @media #{$md} { + width: 290px; + height: 180px; + } + } + + .amenities { + position: absolute; + top: 155px; + right: 10px; + + display: flex; + justify-content: space-evenly; + } + + .locationRow { + margin-top: 10px; + } + + .location { + color: $blue; + } + + .name { + margin-top: 5px; + + display: block; + + font-size: 2.1rem; + font-weight: 600; + text-decoration: none; + color: $black; + } + + .price { + margin-top: 5px; + color: $grey; + + font-size: 1.3rem; + font-weight: 300; + } +} + +.relativeWrapper { + width: 100%; + position: relative; +} + +.fetchMore { + width: 100%; + margin-top: 20px; + + display: flex; + justify-content: center; +} diff --git a/packages/fe/src/scenes/MarinaList/marina-list.module.scss.d.ts b/packages/fe/src/scenes/MarinaList/marina-list.module.scss.d.ts new file mode 100644 index 0000000..adea5a0 --- /dev/null +++ b/packages/fe/src/scenes/MarinaList/marina-list.module.scss.d.ts @@ -0,0 +1,13 @@ +export const amenities: string; +export const cardImage: string; +export const count: string; +export const fetchMore: string; +export const h1: string; +export const location: string; +export const locationRow: string; +export const marinaCard: string; +export const marinas: string; +export const name: string; +export const price: string; +export const relativeWrapper: string; +export const title: string; diff --git a/packages/fe/src/types/GeneratedGQL.ts b/packages/fe/src/types/GeneratedGQL.ts index 10331b3..f480ae1 100644 --- a/packages/fe/src/types/GeneratedGQL.ts +++ b/packages/fe/src/types/GeneratedGQL.ts @@ -13,7 +13,13 @@ export type Scalars = { export type AddMarinaInput = { - id: Scalars['ID']; + name: Scalars['String']; + photoUrl?: Maybe; + lat: Scalars['Float']; + lon: Scalars['Float']; + city: Scalars['String']; + country: Scalars['String']; + amenities?: Maybe>; }; export type Amenity = Node & { @@ -54,6 +60,18 @@ export type Marina = Node & { amenities?: Maybe>>; }; +export type MarinaConnection = { + __typename?: 'MarinaConnection'; + edges?: Maybe>>; + pageInfo: PageInfo; +}; + +export type MarinaEdge = { + __typename?: 'MarinaEdge'; + cursor: Scalars['String']; + node?: Maybe; +}; + export type MarinaPayload = { __typename?: 'MarinaPayload'; marina?: Maybe; @@ -94,4 +112,17 @@ export type Query = { countries?: Maybe>; amenities?: Maybe>; photos?: Maybe>; + marina?: Maybe; + marinaConnection?: Maybe; +}; + + +export type QueryMarinaArgs = { + id: Scalars['ID']; +}; + + +export type QueryMarinaConnectionArgs = { + first?: Maybe; + after?: Maybe; }; diff --git a/packages/fe/tsconfig.json b/packages/fe/tsconfig.json index c500d9b..da5d2dc 100644 --- a/packages/fe/tsconfig.json +++ b/packages/fe/tsconfig.json @@ -19,7 +19,7 @@ "resolveJsonModule": true, "isolatedModules": true, "noEmit": true, - "jsx": "react-jsx" + "jsx": "react" }, "include": [ "src" diff --git a/yarn.lock b/yarn.lock index 0aa96ec..f0683e4 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1243,7 +1243,7 @@ dependencies: regenerator-runtime "^0.13.4" -"@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2", "@babel/runtime@^7.10.2", "@babel/runtime@^7.10.5", "@babel/runtime@^7.11.2", "@babel/runtime@^7.12.1", "@babel/runtime@^7.12.5", "@babel/runtime@^7.13.10", "@babel/runtime@^7.5.5", "@babel/runtime@^7.7.2", "@babel/runtime@^7.8.4", "@babel/runtime@^7.9.2": +"@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2", "@babel/runtime@^7.10.2", "@babel/runtime@^7.10.5", "@babel/runtime@^7.11.2", "@babel/runtime@^7.12.1", "@babel/runtime@^7.12.5", "@babel/runtime@^7.13.10", "@babel/runtime@^7.3.1", "@babel/runtime@^7.4.4", "@babel/runtime@^7.5.5", "@babel/runtime@^7.7.2", "@babel/runtime@^7.8.3", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2": version "7.13.10" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.13.10.tgz#47d42a57b6095f4468da440388fdbad8bebf0d7d" integrity sha512-4QPkjJq6Ns3V/RgpEahRk+AGfL0eO6RHHtTWoNNr5mO49G6B5+X6d6THgWEAvTrznU5xYpbAlVKRYcsCgh/Akw== @@ -1330,6 +1330,11 @@ resolved "https://registry.yarnpkg.com/@csstools/normalize.css/-/normalize.css-10.1.0.tgz#f0950bba18819512d42f7197e56c518aa491cf18" integrity sha512-ij4wRiunFfaJxjB0BdrYHIH8FxBJpOwNPhhAcunlmPdXudL1WQV1qoP9un6JsEBAgQH+7UXyyjh0g7jTxXK6tg== +"@emotion/hash@^0.8.0": + version "0.8.0" + resolved "https://registry.yarnpkg.com/@emotion/hash/-/hash-0.8.0.tgz#bbbff68978fefdbe68ccb533bc8cbe1d1afb5413" + integrity sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow== + "@endemolshinegroup/cosmiconfig-typescript-loader@3.0.2": version "3.0.2" resolved "https://registry.yarnpkg.com/@endemolshinegroup/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-3.0.2.tgz#eea4635828dde372838b0909693ebd9aafeec22d" @@ -2708,6 +2713,138 @@ npmlog "^4.1.2" write-file-atomic "^3.0.3" +"@mapbox/geojson-rewind@^0.5.0": + version "0.5.0" + resolved "https://registry.yarnpkg.com/@mapbox/geojson-rewind/-/geojson-rewind-0.5.0.tgz#91f0ad56008c120caa19414b644d741249f4f560" + integrity sha512-73l/qJQgj/T/zO1JXVfuVvvKDgikD/7D/rHAD28S9BG1OTstgmftrmqfCx4U+zQAmtsB6HcDA3a7ymdnJZAQgg== + dependencies: + concat-stream "~2.0.0" + minimist "^1.2.5" + +"@mapbox/geojson-types@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@mapbox/geojson-types/-/geojson-types-1.0.2.tgz#9aecf642cb00eab1080a57c4f949a65b4a5846d6" + integrity sha512-e9EBqHHv3EORHrSfbR9DqecPNn+AmuAoQxV6aL8Xu30bJMJR1o8PZLZzpk1Wq7/NfCbuhmakHTPYRhoqLsXRnw== + +"@mapbox/jsonlint-lines-primitives@^2.0.2": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@mapbox/jsonlint-lines-primitives/-/jsonlint-lines-primitives-2.0.2.tgz#ce56e539f83552b58d10d672ea4d6fc9adc7b234" + integrity sha1-zlblOfg1UrWNENZy6k1vya3HsjQ= + +"@mapbox/mapbox-gl-supported@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@mapbox/mapbox-gl-supported/-/mapbox-gl-supported-2.0.0.tgz#bb133cd91e562c006713fbc83f21e4b6f711a388" + integrity sha512-zu4udqYiBrKMQKwpKJ4hhPON7tz0QR/JZ3iGpHnNWFmH3Sv/ysxlICATUtGCFpsyJf2v1WpFhlzaZ3GhhKmPMA== + +"@mapbox/point-geometry@0.1.0", "@mapbox/point-geometry@^0.1.0", "@mapbox/point-geometry@~0.1.0": + version "0.1.0" + resolved "https://registry.yarnpkg.com/@mapbox/point-geometry/-/point-geometry-0.1.0.tgz#8a83f9335c7860effa2eeeca254332aa0aeed8f2" + integrity sha1-ioP5M1x4YO/6Lu7KJUMyqgru2PI= + +"@mapbox/tiny-sdf@^1.2.5": + version "1.2.5" + resolved "https://registry.yarnpkg.com/@mapbox/tiny-sdf/-/tiny-sdf-1.2.5.tgz#424c620a96442b20402552be70a7f62a8407cc59" + integrity sha512-cD8A/zJlm6fdJOk6DqPUV8mcpyJkRz2x2R+/fYcWDYG3oWbG7/L7Yl/WqQ1VZCjnL9OTIMAn6c+BC5Eru4sQEw== + +"@mapbox/unitbezier@^0.0.0": + version "0.0.0" + resolved "https://registry.yarnpkg.com/@mapbox/unitbezier/-/unitbezier-0.0.0.tgz#15651bd553a67b8581fb398810c98ad86a34524e" + integrity sha1-FWUb1VOme4WB+zmIEMmK2Go0Uk4= + +"@mapbox/vector-tile@^1.3.1": + version "1.3.1" + resolved "https://registry.yarnpkg.com/@mapbox/vector-tile/-/vector-tile-1.3.1.tgz#d3a74c90402d06e89ec66de49ec817ff53409666" + integrity sha512-MCEddb8u44/xfQ3oD+Srl/tNcQoqTw3goGk2oLsrFxOTc3dUp+kAnby3PvAeeBYSMSjSPD1nd1AJA6W49WnoUw== + dependencies: + "@mapbox/point-geometry" "~0.1.0" + +"@mapbox/whoots-js@^3.1.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@mapbox/whoots-js/-/whoots-js-3.1.0.tgz#497c67a1cef50d1a2459ba60f315e448d2ad87fe" + integrity sha512-Es6WcD0nO5l+2BOQS4uLfNPYQaNDfbot3X1XUoloz+x0mPDS3eeORZJl06HXjwBG1fOGwCRnzK88LMdxKRrd6Q== + +"@material-ui/core@^4.11.3": + version "4.11.3" + resolved "https://registry.yarnpkg.com/@material-ui/core/-/core-4.11.3.tgz#f22e41775b0bd075e36a7a093d43951bf7f63850" + integrity sha512-Adt40rGW6Uds+cAyk3pVgcErpzU/qxc7KBR94jFHBYretU4AtWZltYcNsbeMn9tXL86jjVL1kuGcIHsgLgFGRw== + dependencies: + "@babel/runtime" "^7.4.4" + "@material-ui/styles" "^4.11.3" + "@material-ui/system" "^4.11.3" + "@material-ui/types" "^5.1.0" + "@material-ui/utils" "^4.11.2" + "@types/react-transition-group" "^4.2.0" + clsx "^1.0.4" + hoist-non-react-statics "^3.3.2" + popper.js "1.16.1-lts" + prop-types "^15.7.2" + react-is "^16.8.0 || ^17.0.0" + react-transition-group "^4.4.0" + +"@material-ui/icons@^4.11.2": + version "4.11.2" + resolved "https://registry.yarnpkg.com/@material-ui/icons/-/icons-4.11.2.tgz#b3a7353266519cd743b6461ae9fdfcb1b25eb4c5" + integrity sha512-fQNsKX2TxBmqIGJCSi3tGTO/gZ+eJgWmMJkgDiOfyNaunNaxcklJQFaFogYcFl0qFuaEz1qaXYXboa/bUXVSOQ== + dependencies: + "@babel/runtime" "^7.4.4" + +"@material-ui/lab@^4.0.0-alpha.57": + version "4.0.0-alpha.57" + resolved "https://registry.yarnpkg.com/@material-ui/lab/-/lab-4.0.0-alpha.57.tgz#e8961bcf6449e8a8dabe84f2700daacfcafbf83a" + integrity sha512-qo/IuIQOmEKtzmRD2E4Aa6DB4A87kmY6h0uYhjUmrrgmEAgbbw9etXpWPVXuRK6AGIQCjFzV6WO2i21m1R4FCw== + dependencies: + "@babel/runtime" "^7.4.4" + "@material-ui/utils" "^4.11.2" + clsx "^1.0.4" + prop-types "^15.7.2" + react-is "^16.8.0 || ^17.0.0" + +"@material-ui/styles@^4.11.3": + version "4.11.3" + resolved "https://registry.yarnpkg.com/@material-ui/styles/-/styles-4.11.3.tgz#1b8d97775a4a643b53478c895e3f2a464e8916f2" + integrity sha512-HzVzCG+PpgUGMUYEJ2rTEmQYeonGh41BYfILNFb/1ueqma+p1meSdu4RX6NjxYBMhf7k+jgfHFTTz+L1SXL/Zg== + dependencies: + "@babel/runtime" "^7.4.4" + "@emotion/hash" "^0.8.0" + "@material-ui/types" "^5.1.0" + "@material-ui/utils" "^4.11.2" + clsx "^1.0.4" + csstype "^2.5.2" + hoist-non-react-statics "^3.3.2" + jss "^10.5.1" + jss-plugin-camel-case "^10.5.1" + jss-plugin-default-unit "^10.5.1" + jss-plugin-global "^10.5.1" + jss-plugin-nested "^10.5.1" + jss-plugin-props-sort "^10.5.1" + jss-plugin-rule-value-function "^10.5.1" + jss-plugin-vendor-prefixer "^10.5.1" + prop-types "^15.7.2" + +"@material-ui/system@^4.11.3": + version "4.11.3" + resolved "https://registry.yarnpkg.com/@material-ui/system/-/system-4.11.3.tgz#466bc14c9986798fd325665927c963eb47cc4143" + integrity sha512-SY7otguNGol41Mu2Sg6KbBP1ZRFIbFLHGK81y4KYbsV2yIcaEPOmsCK6zwWlp+2yTV3J/VwT6oSBARtGIVdXPw== + dependencies: + "@babel/runtime" "^7.4.4" + "@material-ui/utils" "^4.11.2" + csstype "^2.5.2" + prop-types "^15.7.2" + +"@material-ui/types@^5.1.0": + version "5.1.0" + resolved "https://registry.yarnpkg.com/@material-ui/types/-/types-5.1.0.tgz#efa1c7a0b0eaa4c7c87ac0390445f0f88b0d88f2" + integrity sha512-7cqRjrY50b8QzRSYyhSpx4WRw2YuO0KKIGQEVk5J8uoz2BanawykgZGoWEqKm7pVIbzFDN0SpPcVV4IhOFkl8A== + +"@material-ui/utils@^4.11.2": + version "4.11.2" + resolved "https://registry.yarnpkg.com/@material-ui/utils/-/utils-4.11.2.tgz#f1aefa7e7dff2ebcb97d31de51aecab1bb57540a" + integrity sha512-Uul8w38u+PICe2Fg2pDKCaIG7kOyhowZ9vjiC1FsVwPABTW8vPPKfF6OvxRq3IiBaI1faOJmgdvMG7rMJARBhA== + dependencies: + "@babel/runtime" "^7.4.4" + prop-types "^15.7.2" + react-is "^16.8.0 || ^17.0.0" + "@nicolo-ribaudo/chokidar-2@2.1.8-no-fsevents": version "2.1.8-no-fsevents" resolved "https://registry.yarnpkg.com/@nicolo-ribaudo/chokidar-2/-/chokidar-2-2.1.8-no-fsevents.tgz#da7c3996b8e6e19ebd14d82eaced2313e7769f9b" @@ -3351,6 +3488,11 @@ dependencies: "@types/node" "*" +"@types/geojson@*": + version "7946.0.7" + resolved "https://registry.yarnpkg.com/@types/geojson/-/geojson-7946.0.7.tgz#c8fa532b60a0042219cdf173ca21a975ef0666ad" + integrity sha512-wE2v81i4C4Ol09RtsWFAqg3BUitWbHSpSlIo+bNdsCJijO9sjme+zm+73ZMCa/qMC8UEERxzGbvmr1cffo2SiQ== + "@types/glob@^7.1.1": version "7.1.3" resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.1.3.tgz#e6ba80f36b7daad2c685acd9266382e68985c183" @@ -3511,6 +3653,13 @@ resolved "https://registry.yarnpkg.com/@types/long/-/long-4.0.1.tgz#459c65fa1867dafe6a8f322c4c51695663cc55e9" integrity sha512-5tXH6Bx/kNGd3MgffdmP4dy2Z+G4eaXw0SE81Tq3BNadtnMR5/ySMzX4SLEzHJzSmPNn4HIdpQsBvXMUykr58w== +"@types/mapbox-gl@^2.1.1": + version "2.1.1" + resolved "https://registry.yarnpkg.com/@types/mapbox-gl/-/mapbox-gl-2.1.1.tgz#c1ef62f5e296ec58899f7a039ca56a3d61a5f99a" + integrity sha512-oDgHhkAC9iYIj/H/9iwm6gHHKKPzweTUgOlozcrvWr8T07dyymGty6mON2j4kEeBGyTTI291vI6gP9k2ArxvHw== + dependencies: + "@types/geojson" "*" + "@types/mime@^1": version "1.3.2" resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.2.tgz#93e25bf9ee75fe0fd80b594bc4feb0e862111b5a" @@ -3616,6 +3765,13 @@ "@types/history" "*" "@types/react" "*" +"@types/react-transition-group@^4.2.0": + version "4.4.1" + resolved "https://registry.yarnpkg.com/@types/react-transition-group/-/react-transition-group-4.4.1.tgz#e1a3cb278df7f47f17b5082b1b3da17170bd44b1" + integrity sha512-vIo69qKKcYoJ8wKCJjwSgCTM+z3chw3g18dkrDfVX665tMH7tmbDxEAnPdey4gTlwZz5QuHGzd+hul0OVZDqqQ== + dependencies: + "@types/react" "*" + "@types/react@*", "@types/react@^17.0.0": version "17.0.3" resolved "https://registry.yarnpkg.com/@types/react/-/react-17.0.3.tgz#ba6e215368501ac3826951eef2904574c262cc79" @@ -3733,6 +3889,11 @@ dependencies: "@types/yargs-parser" "*" +"@types/yup@^0.29.11": + version "0.29.11" + resolved "https://registry.yarnpkg.com/@types/yup/-/yup-0.29.11.tgz#d654a112973f5e004bf8438122bd7e56a8e5cd7e" + integrity sha512-9cwk3c87qQKZrT251EDoibiYRILjCmxBvvcb4meofCmx1vdnNcR9gyildy5vOHASpOKMsn42CugxUvcwK5eu1g== + "@types/zen-observable@^0.8.0": version "0.8.2" resolved "https://registry.yarnpkg.com/@types/zen-observable/-/zen-observable-0.8.2.tgz#808c9fa7e4517274ed555fa158f2de4b4f468e71" @@ -4164,6 +4325,11 @@ alphanum-sort@^1.0.0: resolved "https://registry.yarnpkg.com/alphanum-sort/-/alphanum-sort-1.0.2.tgz#97a1119649b211ad33691d9f9f486a8ec9fbe0a3" integrity sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM= +amdefine@>=0.0.4: + version "1.0.1" + resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" + integrity sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU= + ansi-align@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-3.0.0.tgz#b536b371cf687caaef236c18d3e21fe3797467cb" @@ -4656,6 +4822,11 @@ async-each@^1.0.1: resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.3.tgz#b727dbf87d7651602f06f4d4ac387f47d91b0cbf" integrity sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ== +async-foreach@^0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/async-foreach/-/async-foreach-0.1.3.tgz#36121f845c0578172de419a97dbeb1d16ec34542" + integrity sha1-NhIfhFwFeBct5Bmpfb6x0W7DRUI= + async-limiter@~1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd" @@ -5566,7 +5737,7 @@ chalk@2.4.2, chalk@^2.0.0, chalk@^2.4.1, chalk@^2.4.2: escape-string-regexp "^1.0.5" supports-color "^5.3.0" -chalk@^1.0.0, chalk@^1.1.3: +chalk@^1.0.0, chalk@^1.1.1, chalk@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" integrity sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg= @@ -5661,7 +5832,7 @@ chokidar@^2.1.8: optionalDependencies: fsevents "^1.2.7" -chokidar@^3.2.2, chokidar@^3.4.0, chokidar@^3.4.1, chokidar@^3.4.3: +chokidar@^3.2.2, chokidar@^3.3.0, chokidar@^3.4.0, chokidar@^3.4.1, chokidar@^3.4.3: version "3.5.1" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.1.tgz#ee9ce7bbebd2b79f49f304799d5468e31e14e68a" integrity sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw== @@ -5818,6 +5989,11 @@ clone@^1.0.2: resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" integrity sha1-2jCcwmPfFZlMaIypAheco8fNfH4= +clsx@^1.0.4: + version "1.1.1" + resolved "https://registry.yarnpkg.com/clsx/-/clsx-1.1.1.tgz#98b3134f9abbdf23b2663491ace13c5c03a73188" + integrity sha512-6/bPho624p3S2pMyvP5kKBPXnI3ufHLObBFCfgx+LkeR5lg2XYy2hqZqUf45ypD8COn2bhgGJSUE+l5dhNBieA== + cmd-shim@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/cmd-shim/-/cmd-shim-4.1.0.tgz#b3a904a6743e9fede4148c6f3800bf2a08135bdd" @@ -6027,7 +6203,7 @@ concat-stream@^1.5.0: readable-stream "^2.2.2" typedarray "^0.0.6" -concat-stream@^2.0.0: +concat-stream@^2.0.0, concat-stream@~2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-2.0.0.tgz#414cf5af790a48c60ab9be4527d56d5e41133cb1" integrity sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A== @@ -6469,6 +6645,18 @@ css-loader@4.3.0: schema-utils "^2.7.1" semver "^7.3.2" +css-modules-loader-core@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/css-modules-loader-core/-/css-modules-loader-core-1.1.0.tgz#5908668294a1becd261ae0a4ce21b0b551f21d16" + integrity sha1-WQhmgpShvs0mGuCkziGwtVHyHRY= + dependencies: + icss-replace-symbols "1.1.0" + postcss "6.0.1" + postcss-modules-extract-imports "1.1.0" + postcss-modules-local-by-default "1.2.0" + postcss-modules-scope "1.1.0" + postcss-modules-values "1.3.0" + css-prefers-color-scheme@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/css-prefers-color-scheme/-/css-prefers-color-scheme-3.1.1.tgz#6f830a2714199d4f0d0d0bb8a27916ed65cff1f4" @@ -6491,6 +6679,14 @@ css-select@^2.0.0, css-select@^2.0.2: domutils "^1.7.0" nth-check "^1.0.2" +css-selector-tokenizer@^0.7.0: + version "0.7.3" + resolved "https://registry.yarnpkg.com/css-selector-tokenizer/-/css-selector-tokenizer-0.7.3.tgz#735f26186e67c749aaf275783405cf0661fae8f1" + integrity sha512-jWQv3oCEL5kMErj4wRnK/OPoBi0D+P1FR2cDCKYPaMeD2eW3/mttav8HT4hT1CKopiJI/psEULjkClhvJo4Lvg== + dependencies: + cssesc "^3.0.0" + fastparse "^1.1.2" + css-tree@1.0.0-alpha.37: version "1.0.0-alpha.37" resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.0.0-alpha.37.tgz#98bebd62c4c1d9f960ec340cf9f7522e30709a22" @@ -6507,6 +6703,14 @@ css-tree@^1.1.2: mdn-data "2.0.14" source-map "^0.6.1" +css-vendor@^2.0.8: + version "2.0.8" + resolved "https://registry.yarnpkg.com/css-vendor/-/css-vendor-2.0.8.tgz#e47f91d3bd3117d49180a3c935e62e3d9f7f449d" + integrity sha512-x9Aq0XTInxrkuFeHKbYC7zWY8ai7qJ04Kxd9MnvbC1uO5DagxoHQjm4JvG+vCdXOoFtCjbL2XSZfxmoYa9uQVQ== + dependencies: + "@babel/runtime" "^7.8.3" + is-in-browser "^1.0.2" + css-what@^3.2.1: version "3.4.2" resolved "https://registry.yarnpkg.com/css-what/-/css-what-3.4.2.tgz#ea7026fcb01777edbde52124e21f327e7ae950e4" @@ -6536,6 +6740,11 @@ css@^3.0.0: source-map "^0.6.1" source-map-resolve "^0.6.0" +csscolorparser@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/csscolorparser/-/csscolorparser-1.0.3.tgz#b34f391eea4da8f3e98231e2ccd8df9c041f171b" + integrity sha1-s085HupNqPPpgjHizNjfnAQfFxs= + cssdb@^4.4.0: version "4.4.0" resolved "https://registry.yarnpkg.com/cssdb/-/cssdb-4.4.0.tgz#3bf2f2a68c10f5c6a08abd92378331ee803cddb0" @@ -6648,6 +6857,11 @@ cssstyle@^2.3.0: dependencies: cssom "~0.3.6" +csstype@^2.5.2: + version "2.6.16" + resolved "https://registry.yarnpkg.com/csstype/-/csstype-2.6.16.tgz#544d69f547013b85a40d15bff75db38f34fe9c39" + integrity sha512-61FBWoDHp/gRtsoDkq/B1nWrCUG/ok1E3tUrcNbZjsE9Cxd9yzUirjS3+nAATB8U4cTtaQmAHbNndoFz5L6C9Q== + csstype@^3.0.2: version "3.0.7" resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.0.7.tgz#2a5fb75e1015e84dd15692f71e89a1450290950b" @@ -7219,6 +7433,14 @@ dom-converter@^0.2: dependencies: utila "~0.4" +dom-helpers@^5.0.1: + version "5.2.0" + resolved "https://registry.yarnpkg.com/dom-helpers/-/dom-helpers-5.2.0.tgz#57fd054c5f8f34c52a3eeffdb7e7e93cd357d95b" + integrity sha512-Ru5o9+V8CpunKnz5LGgWXkmrH/20cGKwcHwS4m73zIvs54CN9epEmT/HLqFJW3kXpakAFkEdzgy1hzlJe3E4OQ== + dependencies: + "@babel/runtime" "^7.8.7" + csstype "^3.0.2" + dom-serializer@0: version "0.2.2" resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.2.2.tgz#1afb81f533717175d478655debc5e332d9f9bb51" @@ -7328,6 +7550,11 @@ duplexify@^3.4.2, duplexify@^3.6.0: readable-stream "^2.0.0" stream-shift "^1.0.0" +earcut@^2.2.2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/earcut/-/earcut-2.2.2.tgz#41b0bc35f63e0fe80da7cddff28511e7e2e80d11" + integrity sha512-eZoZPPJcUHnfRZ0PjLvx2qBordSiO8ofC3vt+qACLM95u+4DovnbYNpQtJh0DNsWj8RnxrQytD4WA8gj5cRIaQ== + ecc-jsbn@~0.1.1: version "0.1.2" resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" @@ -8091,6 +8318,11 @@ fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.6: resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= +fastparse@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/fastparse/-/fastparse-1.1.2.tgz#91728c5a5942eced8531283c79441ee4122c35a9" + integrity sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ== + fastq@^1.6.0: version "1.11.0" resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.11.0.tgz#bb9fb955a07130a918eb63c1f5161cc32a5d0858" @@ -8565,11 +8797,23 @@ gauge@~2.7.3: strip-ansi "^3.0.1" wide-align "^1.1.0" +gaze@^1.0.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/gaze/-/gaze-1.1.3.tgz#c441733e13b927ac8c0ff0b4c3b033f28812924a" + integrity sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g== + dependencies: + globule "^1.0.0" + gensync@^1.0.0-beta.1, gensync@^1.0.0-beta.2: version "1.0.0-beta.2" resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== +geojson-vt@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/geojson-vt/-/geojson-vt-3.2.1.tgz#f8adb614d2c1d3f6ee7c4265cad4bbf3ad60c8b7" + integrity sha512-EvGQQi/zPrDA6zr6BnJD/YhwAkBP8nnJ9emh3EnHQKVMfg/MRVtPbMYdgVy/IaEmn4UfagD2a6fafPDL5hbtwg== + get-amd-module-type@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/get-amd-module-type/-/get-amd-module-type-3.0.0.tgz#bb334662fa04427018c937774570de495845c288" @@ -8708,6 +8952,11 @@ gitconfiglocal@^1.0.0: dependencies: ini "^1.3.2" +gl-matrix@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/gl-matrix/-/gl-matrix-3.3.0.tgz#232eef60b1c8b30a28cbbe75b2caf6c48fd6358b" + integrity sha512-COb7LDz+SXaHtl/h4LeaFcNdJdAQSDeVqjiIihSXNrkWObZLhDI4hIkZC11Aeqp7bcE72clzB0BnDXr2SmslRA== + glob-parent@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" @@ -8723,7 +8972,7 @@ glob-parent@^5.0.0, glob-parent@^5.1.0, glob-parent@^5.1.1, glob-parent@~5.1.0: dependencies: is-glob "^4.0.1" -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.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.1: version "7.1.6" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== @@ -8844,6 +9093,15 @@ globby@^6.1.0: pify "^2.0.0" pinkie-promise "^2.0.0" +globule@^1.0.0: + version "1.3.2" + resolved "https://registry.yarnpkg.com/globule/-/globule-1.3.2.tgz#d8bdd9e9e4eef8f96e245999a5dee7eb5d8529c4" + integrity sha512-7IDTQTIu2xzXkT+6mlluidnWo+BypnbSoEVVQCGfzqnl5Ik8d3e1d4wycb8Rj9tWW+Z39uPWsdlquqiqPCd/pA== + dependencies: + glob "~7.1.1" + lodash "~4.17.10" + minimatch "~3.0.2" + gonzales-pe@^4.2.3: version "4.3.0" resolved "https://registry.yarnpkg.com/gonzales-pe/-/gonzales-pe-4.3.0.tgz#fe9dec5f3c557eead09ff868c65826be54d067b3" @@ -9013,6 +9271,11 @@ graphviz@0.0.9: dependencies: temp "~0.4.0" +grid-index@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/grid-index/-/grid-index-1.1.0.tgz#97f8221edec1026c8377b86446a7c71e79522ea7" + integrity sha512-HZRwumpOGUrHyxO5bqKZL0B0GlUpwtCAzZ42sgxUPniu33R1LSFH5yrIcBCHjkctCAh3mtWKcKd9J4vDDdeVHA== + growly@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081" @@ -9078,6 +9341,11 @@ has-bigints@^1.0.0: resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.1.tgz#64fe6acb020673e3b78db035a5af69aa9d07b113" integrity sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA== +has-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" + integrity sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo= + has-flag@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" @@ -9443,6 +9711,11 @@ humanize-ms@^1.2.1: dependencies: ms "^2.0.0" +hyphenate-style-name@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/hyphenate-style-name/-/hyphenate-style-name-1.0.4.tgz#691879af8e220aea5750e8827db4ef62a54e361d" + integrity sha512-ygGZLjmXfPHj+ZWh6LwbC37l43MhfztxetbFCoYTM2VjkIUpeHgSNn7QIyVFj7YQ1Wl9Cbw5sholVJPzWvC2MQ== + i@0.3.x: version "0.3.6" resolved "https://registry.yarnpkg.com/i/-/i-0.3.6.tgz#d96c92732076f072711b6b10fd7d4f65ad8ee23d" @@ -9462,6 +9735,11 @@ iconv-lite@^0.6.2: dependencies: safer-buffer ">= 2.1.2 < 3.0.0" +icss-replace-symbols@1.1.0, icss-replace-symbols@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz#06ea6f83679a7749e386cfe1fe812ae5db223ded" + integrity sha1-Bupvg2ead0njhs/h/oEq5dsiPe0= + icss-utils@^4.0.0, icss-utils@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-4.1.1.tgz#21170b53789ee27447c2f47dd683081403f9a467" @@ -9476,7 +9754,7 @@ identity-obj-proxy@3.0.0: dependencies: harmony-reflect "^1.4.6" -ieee754@^1.1.13, ieee754@^1.1.4: +ieee754@^1.1.12, ieee754@^1.1.13, ieee754@^1.1.4: version "1.2.1" resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== @@ -9586,6 +9864,13 @@ imurmurhash@^0.1.4: resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= +indefinite-observable@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/indefinite-observable/-/indefinite-observable-2.0.1.tgz#574af29bfbc17eb5947793797bddc94c9d859400" + integrity sha512-G8vgmork+6H9S8lUAg1gtXEj2JxIQTo0g2PbFiYOdjkziSI0F7UYBiVwhZRuixhBCNGczAls34+5HJPyZysvxQ== + dependencies: + symbol-observable "1.2.0" + indent-string@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80" @@ -9959,6 +10244,11 @@ is-glob@^3.1.0: dependencies: is-extglob "^2.1.0" +is-in-browser@^1.0.2, is-in-browser@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/is-in-browser/-/is-in-browser-1.1.3.tgz#56ff4db683a078c6082eb95dad7dc62e1d04f835" + integrity sha1-Vv9NtoOgeMYILrldrX3GLh0E+DU= + is-installed-globally@^0.3.1: version "0.3.2" resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.3.2.tgz#fd3efa79ee670d1187233182d5b0a1dd00313141" @@ -10759,6 +11049,11 @@ jest@26.6.0: import-local "^3.0.2" jest-cli "^26.6.0" +js-base64@^2.1.8: + version "2.6.4" + resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.6.4.tgz#f4e686c5de1ea1f867dbcad3d46d969428df98c4" + integrity sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ== + "js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" @@ -10957,6 +11252,77 @@ jsprim@^1.2.2: json-schema "0.2.3" verror "1.10.0" +jss-plugin-camel-case@^10.5.1: + version "10.6.0" + resolved "https://registry.yarnpkg.com/jss-plugin-camel-case/-/jss-plugin-camel-case-10.6.0.tgz#93d2cd704bf0c4af70cc40fb52d74b8a2554b170" + integrity sha512-JdLpA3aI/npwj3nDMKk308pvnhoSzkW3PXlbgHAzfx0yHWnPPVUjPhXFtLJzgKZge8lsfkUxvYSQ3X2OYIFU6A== + dependencies: + "@babel/runtime" "^7.3.1" + hyphenate-style-name "^1.0.3" + jss "10.6.0" + +jss-plugin-default-unit@^10.5.1: + version "10.6.0" + resolved "https://registry.yarnpkg.com/jss-plugin-default-unit/-/jss-plugin-default-unit-10.6.0.tgz#af47972486819b375f0f3a9e0213403a84b5ef3b" + integrity sha512-7y4cAScMHAxvslBK2JRK37ES9UT0YfTIXWgzUWD5euvR+JR3q+o8sQKzBw7GmkQRfZijrRJKNTiSt1PBsLI9/w== + dependencies: + "@babel/runtime" "^7.3.1" + jss "10.6.0" + +jss-plugin-global@^10.5.1: + version "10.6.0" + resolved "https://registry.yarnpkg.com/jss-plugin-global/-/jss-plugin-global-10.6.0.tgz#3e8011f760f399cbadcca7f10a485b729c50e3ed" + integrity sha512-I3w7ji/UXPi3VuWrTCbHG9rVCgB4yoBQLehGDTmsnDfXQb3r1l3WIdcO8JFp9m0YMmyy2CU7UOV6oPI7/Tmu+w== + dependencies: + "@babel/runtime" "^7.3.1" + jss "10.6.0" + +jss-plugin-nested@^10.5.1: + version "10.6.0" + resolved "https://registry.yarnpkg.com/jss-plugin-nested/-/jss-plugin-nested-10.6.0.tgz#5f83c5c337d3b38004834e8426957715a0251641" + integrity sha512-fOFQWgd98H89E6aJSNkEh2fAXquC9aZcAVjSw4q4RoQ9gU++emg18encR4AT4OOIFl4lQwt5nEyBBRn9V1Rk8g== + dependencies: + "@babel/runtime" "^7.3.1" + jss "10.6.0" + tiny-warning "^1.0.2" + +jss-plugin-props-sort@^10.5.1: + version "10.6.0" + resolved "https://registry.yarnpkg.com/jss-plugin-props-sort/-/jss-plugin-props-sort-10.6.0.tgz#297879f35f9fe21196448579fee37bcde28ce6bc" + integrity sha512-oMCe7hgho2FllNc60d9VAfdtMrZPo9n1Iu6RNa+3p9n0Bkvnv/XX5San8fTPujrTBScPqv9mOE0nWVvIaohNuw== + dependencies: + "@babel/runtime" "^7.3.1" + jss "10.6.0" + +jss-plugin-rule-value-function@^10.5.1: + version "10.6.0" + resolved "https://registry.yarnpkg.com/jss-plugin-rule-value-function/-/jss-plugin-rule-value-function-10.6.0.tgz#3c1a557236a139d0151e70a82c810ccce1c1c5ea" + integrity sha512-TKFqhRTDHN1QrPTMYRlIQUOC2FFQb271+AbnetURKlGvRl/eWLswcgHQajwuxI464uZk91sPiTtdGi7r7XaWfA== + dependencies: + "@babel/runtime" "^7.3.1" + jss "10.6.0" + tiny-warning "^1.0.2" + +jss-plugin-vendor-prefixer@^10.5.1: + version "10.6.0" + resolved "https://registry.yarnpkg.com/jss-plugin-vendor-prefixer/-/jss-plugin-vendor-prefixer-10.6.0.tgz#e1fcd499352846890c38085b11dbd7aa1c4f2c78" + integrity sha512-doJ7MouBXT1lypLLctCwb4nJ6lDYqrTfVS3LtXgox42Xz0gXusXIIDboeh6UwnSmox90QpVnub7au8ybrb0krQ== + dependencies: + "@babel/runtime" "^7.3.1" + css-vendor "^2.0.8" + jss "10.6.0" + +jss@10.6.0, jss@^10.5.1: + version "10.6.0" + resolved "https://registry.yarnpkg.com/jss/-/jss-10.6.0.tgz#d92ff9d0f214f65ca1718591b68e107be4774149" + integrity sha512-n7SHdCozmxnzYGXBHe0NsO0eUf9TvsHVq2MXvi4JmTn3x5raynodDVE/9VQmBdWFyyj9HpHZ2B4xNZ7MMy7lkw== + dependencies: + "@babel/runtime" "^7.3.1" + csstype "^3.0.2" + indefinite-observable "^2.0.1" + is-in-browser "^1.1.3" + tiny-warning "^1.0.2" + "jsx-ast-utils@^2.4.1 || ^3.0.0", jsx-ast-utils@^3.1.0: version "3.2.0" resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.2.0.tgz#41108d2cec408c3453c1bbe8a4aae9e1e2bd8f82" @@ -10982,6 +11348,11 @@ jws@^3.2.2: jwa "^1.4.1" safe-buffer "^5.0.1" +kdbush@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/kdbush/-/kdbush-3.0.0.tgz#f8484794d47004cc2d85ed3a79353dbe0abc2bf0" + integrity sha512-hRkd6/XW4HTsA9vjVpY9tuXJYLSlelnkTmVFu4M9/7MIYQtFcHpbugAU7UbOfjOiVSVYl2fqgBuJ32JUmRo5Ew== + keygrip@~1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/keygrip/-/keygrip-1.1.0.tgz#871b1681d5e159c62a445b0c74b615e0917e7226" @@ -11483,7 +11854,7 @@ lodash.uniq@^4.5.0: resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M= -lodash@4.17.21, "lodash@>=3.5 <5", lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.17.5, lodash@^4.7.0, lodash@~4.17.20: +lodash@4.17.21, "lodash@>=3.5 <5", lodash@^4.0.0, lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.17.5, lodash@^4.7.0, lodash@~4.17.10, lodash@~4.17.20: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== @@ -11692,6 +12063,35 @@ map-visit@^1.0.0: dependencies: object-visit "^1.0.0" +mapbox-gl@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/mapbox-gl/-/mapbox-gl-2.2.0.tgz#f0228a251c5fb733a341528be0114612bfc5a982" + integrity sha512-/9OQjaOIpQcZfXMFMxnjjAjhVGPjuAxQFAbdvG6CXD5aLhm1j2D3zxCCfxxMCEuILRBCbkxEAhVf3JoT+aFXEQ== + dependencies: + "@mapbox/geojson-rewind" "^0.5.0" + "@mapbox/geojson-types" "^1.0.2" + "@mapbox/jsonlint-lines-primitives" "^2.0.2" + "@mapbox/mapbox-gl-supported" "^2.0.0" + "@mapbox/point-geometry" "^0.1.0" + "@mapbox/tiny-sdf" "^1.2.5" + "@mapbox/unitbezier" "^0.0.0" + "@mapbox/vector-tile" "^1.3.1" + "@mapbox/whoots-js" "^3.1.0" + csscolorparser "~1.0.3" + earcut "^2.2.2" + geojson-vt "^3.2.1" + gl-matrix "^3.3.0" + grid-index "^1.1.0" + minimist "^1.2.5" + murmurhash-js "^1.0.0" + pbf "^3.2.1" + potpack "^1.0.1" + quickselect "^2.0.0" + rw "^1.3.3" + supercluster "^7.1.2" + tinyqueue "^2.0.3" + vt-pbf "^3.1.1" + md5.js@^1.3.4: version "1.3.5" resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" @@ -11737,7 +12137,7 @@ memorystream@^0.3.1: resolved "https://registry.yarnpkg.com/memorystream/-/memorystream-0.3.1.tgz#86d7090b30ce455d63fbae12dda51a47ddcaf9b2" integrity sha1-htcJCzDORV1j+64S3aUaR93K+bI= -meow@^3.3.0: +meow@^3.3.0, meow@^3.7.0: version "3.7.0" resolved "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb" integrity sha1-cstmi0JSKCkKu/qFaJJYcwioAfs= @@ -11900,7 +12300,7 @@ minimalistic-crypto-utils@^1.0.1: resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo= -minimatch@3.0.4, minimatch@^3.0.4: +minimatch@3.0.4, minimatch@^3.0.4, minimatch@~3.0.2: version "3.0.4" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== @@ -12128,12 +12528,17 @@ multimatch@^5.0.0: arrify "^2.0.1" minimatch "^3.0.4" +murmurhash-js@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/murmurhash-js/-/murmurhash-js-1.0.0.tgz#b06278e21fc6c37fa5313732b0412bcb6ae15f51" + integrity sha1-sGJ44h/Gw3+lMTcysEEry2rhX1E= + mute-stream@0.0.8, mute-stream@~0.0.4: version "0.0.8" resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== -nan@^2.12.1: +nan@^2.12.1, nan@^2.13.2: version "2.14.2" resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.2.tgz#f5376400695168f4cc694ac9393d0c9585eeea19" integrity sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ== @@ -12362,6 +12767,28 @@ node-releases@^1.1.61, node-releases@^1.1.70: resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.71.tgz#cb1334b179896b1c89ecfdd4b725fb7bbdfc7dbb" integrity sha512-zR6HoT6LrLCRBwukmrVbHv0EpEQjksO6GmFcZQQuCAy139BEsoVKPYnf3jongYW83fAa1torLGYwxxky/p28sg== +node-sass@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/node-sass/-/node-sass-5.0.0.tgz#4e8f39fbef3bac8d2dc72ebe3b539711883a78d2" + integrity sha512-opNgmlu83ZCF792U281Ry7tak9IbVC+AKnXGovcQ8LG8wFaJv6cLnRlc6DIHlmNxWEexB5bZxi9SZ9JyUuOYjw== + dependencies: + async-foreach "^0.1.3" + chalk "^1.1.1" + cross-spawn "^7.0.3" + gaze "^1.0.0" + get-stdin "^4.0.1" + glob "^7.0.3" + lodash "^4.17.15" + meow "^3.7.0" + mkdirp "^0.5.1" + nan "^2.13.2" + node-gyp "^7.1.0" + npmlog "^4.0.0" + request "^2.88.0" + sass-graph "2.2.5" + stdout-stream "^1.4.0" + "true-case-path" "^1.0.2" + node-source-walk@^4.0.0, node-source-walk@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/node-source-walk/-/node-source-walk-4.2.0.tgz#c2efe731ea8ba9c03c562aa0a9d984e54f27bc2c" @@ -12585,7 +13012,7 @@ npm-run-path@^4.0.0, npm-run-path@^4.0.1: dependencies: path-key "^3.0.0" -"npmlog@0 || 1 || 2 || 3 || 4", npmlog@^4.0.2, npmlog@^4.1.2: +"npmlog@0 || 1 || 2 || 3 || 4", npmlog@^4.0.0, npmlog@^4.0.2, npmlog@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg== @@ -13067,7 +13494,7 @@ parallel-transform@^1.1.0: inherits "^2.0.3" readable-stream "^2.1.5" -param-case@^3.0.3, param-case@^3.0.4: +param-case@^3.0.2, param-case@^3.0.3, param-case@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/param-case/-/param-case-3.0.4.tgz#7d17fe4aa12bde34d4a77d91acfb6219caad01c5" integrity sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A== @@ -13304,6 +13731,22 @@ path-type@^4.0.0: resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== +path@^0.12.7: + version "0.12.7" + resolved "https://registry.yarnpkg.com/path/-/path-0.12.7.tgz#d4dc2a506c4ce2197eb481ebfcd5b36c0140b10f" + integrity sha1-1NwqUGxM4hl+tIHr/NWzbAFAsQ8= + dependencies: + process "^0.11.1" + util "^0.10.3" + +pbf@^3.0.5, pbf@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/pbf/-/pbf-3.2.1.tgz#b4c1b9e72af966cd82c6531691115cc0409ffe2a" + integrity sha512-ClrV7pNOn7rtmoQVF4TS1vyU0WhYRnP92fzbfF75jAIwpnzdJXf8iTd4CMEqO4yUenH6NDqLiwjqlh6QgZzgLQ== + dependencies: + ieee754 "^1.1.12" + resolve-protobuf-schema "^2.1.0" + pbkdf2@^3.0.3: version "3.1.1" resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.1.tgz#cb8724b0fada984596856d1a6ebafd3584654b94" @@ -13414,6 +13857,11 @@ pnp-webpack-plugin@1.6.4: dependencies: ts-pnp "^1.1.6" +popper.js@1.16.1-lts: + version "1.16.1-lts" + resolved "https://registry.yarnpkg.com/popper.js/-/popper.js-1.16.1-lts.tgz#cf6847b807da3799d80ee3d6d2f90df8a3f50b05" + integrity sha512-Kjw8nKRl1m+VrSFCoVGPph93W/qrSO7ZkqPpTf7F4bk/sqcfWK019dWBUpE/fBOsOQY1dks/Bmcbfn1heM/IsA== + portfinder@^1.0.26: version "1.0.28" resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.28.tgz#67c4622852bd5374dd1dd900f779f53462fac778" @@ -13742,6 +14190,13 @@ postcss-minify-selectors@^4.0.2: postcss "^7.0.0" postcss-selector-parser "^3.0.0" +postcss-modules-extract-imports@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.1.0.tgz#b614c9720be6816eaee35fb3a5faa1dba6a05ddb" + integrity sha1-thTJcgvmgW6u41+zpfqh26agXds= + dependencies: + postcss "^6.0.1" + postcss-modules-extract-imports@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz#818719a1ae1da325f9832446b01136eeb493cd7e" @@ -13749,6 +14204,14 @@ postcss-modules-extract-imports@^2.0.0: dependencies: postcss "^7.0.5" +postcss-modules-local-by-default@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-1.2.0.tgz#f7d80c398c5a393fa7964466bd19500a7d61c069" + integrity sha1-99gMOYxaOT+nlkRmvRlQCn1hwGk= + dependencies: + css-selector-tokenizer "^0.7.0" + postcss "^6.0.1" + postcss-modules-local-by-default@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-3.0.3.tgz#bb14e0cc78279d504dbdcbfd7e0ca28993ffbbb0" @@ -13759,6 +14222,14 @@ postcss-modules-local-by-default@^3.0.3: postcss-selector-parser "^6.0.2" postcss-value-parser "^4.1.0" +postcss-modules-scope@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-1.1.0.tgz#d6ea64994c79f97b62a72b426fbe6056a194bb90" + integrity sha1-1upkmUx5+XtipytCb75gVqGUu5A= + dependencies: + css-selector-tokenizer "^0.7.0" + postcss "^6.0.1" + postcss-modules-scope@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-2.2.0.tgz#385cae013cc7743f5a7d7602d1073a89eaae62ee" @@ -13767,6 +14238,14 @@ postcss-modules-scope@^2.2.0: postcss "^7.0.6" postcss-selector-parser "^6.0.0" +postcss-modules-values@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-1.3.0.tgz#ecffa9d7e192518389f42ad0e83f72aec456ea20" + integrity sha1-7P+p1+GSUYOJ9CrQ6D9yrsRW6iA= + dependencies: + icss-replace-symbols "^1.1.0" + postcss "^6.0.1" + postcss-modules-values@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-3.0.0.tgz#5b5000d6ebae29b4255301b4a3a54574423e7f10" @@ -14072,6 +14551,15 @@ postcss-values-parser@^2.0.0, postcss-values-parser@^2.0.1: indexes-of "^1.0.1" uniq "^1.0.1" +postcss@6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-6.0.1.tgz#000dbd1f8eef217aa368b9a212c5fc40b2a8f3f2" + integrity sha1-AA29H47vIXqjaLmiEsX8QLKo8/I= + dependencies: + chalk "^1.1.3" + source-map "^0.5.6" + supports-color "^3.2.3" + postcss@7.0.21: version "7.0.21" resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.21.tgz#06bb07824c19c2021c5d056d5b10c35b989f7e17" @@ -14081,6 +14569,15 @@ postcss@7.0.21: source-map "^0.6.1" supports-color "^6.1.0" +postcss@^6.0.1: + version "6.0.23" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-6.0.23.tgz#61c82cc328ac60e677645f979054eb98bc0e3324" + integrity sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag== + dependencies: + chalk "^2.4.1" + source-map "^0.6.1" + supports-color "^5.4.0" + postcss@^7, postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.14, postcss@^7.0.17, postcss@^7.0.2, postcss@^7.0.26, postcss@^7.0.27, postcss@^7.0.32, postcss@^7.0.5, postcss@^7.0.6: version "7.0.35" resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.35.tgz#d2be00b998f7f211d8a276974079f2e92b970e24" @@ -14099,6 +14596,11 @@ postcss@^8.1.0, postcss@^8.1.7: nanoid "^3.1.20" source-map "^0.6.1" +potpack@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/potpack/-/potpack-1.0.1.tgz#d1b1afd89e4c8f7762865ec30bd112ab767e2ebf" + integrity sha512-15vItUAbViaYrmaB/Pbw7z6qX2xENbFSTA7Ii4tgbPtasxm5v6ryKhKtL91tpWovDJzTiZqdwzhcFBCwiMVdVw== + precinct@^7.0.0: version "7.1.0" resolved "https://registry.yarnpkg.com/precinct/-/precinct-7.1.0.tgz#a0311e0b59029647eaf57c2d30b8efa9c85d129a" @@ -14178,7 +14680,7 @@ process-nextick-args@~2.0.0: resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== -process@^0.11.10: +process@^0.11.1, process@^0.11.10: version "0.11.10" resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI= @@ -14260,6 +14762,11 @@ proto-list@~1.2.1: resolved "https://registry.yarnpkg.com/proto-list/-/proto-list-1.2.4.tgz#212d5bfe1318306a420f6402b8e26ff39647a849" integrity sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk= +protocol-buffers-schema@^3.3.1: + version "3.5.1" + resolved "https://registry.yarnpkg.com/protocol-buffers-schema/-/protocol-buffers-schema-3.5.1.tgz#8388e768d383ac8cbea23e1280dfadb79f4122ad" + integrity sha512-YVCvdhxWNDP8/nJDyXLuM+UFsuPk4+1PB7WGPVDzm3HTHbzFLxQYeW2iZpS4mmnXrQJGBzt230t/BbEb7PrQaw== + protocols@^1.1.0, protocols@^1.4.0: version "1.4.8" resolved "https://registry.yarnpkg.com/protocols/-/protocols-1.4.8.tgz#48eea2d8f58d9644a4a32caae5d5db290a075ce8" @@ -14417,6 +14924,11 @@ quick-lru@^4.0.1: resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-4.0.1.tgz#5b8878f113a58217848c6482026c73e1ba57727f" integrity sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g== +quickselect@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/quickselect/-/quickselect-2.0.0.tgz#f19680a486a5eefb581303e023e98faaf25dd018" + integrity sha512-RKJ22hX8mHe3Y6wH/N3wCM6BWtjaxIyyUIkpHOvfFnxdI4yD4tBXEBKSbriGujF6jnSVkJrffuo6vxACiSSxIw== + raf@^3.4.1: version "3.4.1" resolved "https://registry.yarnpkg.com/raf/-/raf-3.4.1.tgz#0742e99a4a6552f445d73e3ee0328af0ff1ede39" @@ -14535,7 +15047,7 @@ 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.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== -react-is@^17.0.1: +"react-is@^16.8.0 || ^17.0.0", react-is@^17.0.1: version "17.0.2" resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0" integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== @@ -14592,6 +15104,16 @@ react-router@5.2.0: tiny-invariant "^1.0.2" tiny-warning "^1.0.0" +react-transition-group@^4.4.0: + version "4.4.1" + resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-4.4.1.tgz#63868f9325a38ea5ee9535d828327f85773345c9" + integrity sha512-Djqr7OQ2aPUiYurhPalTrVy9ddmFCCzwhqQmtN+J3+3DzLO209Fdr70QrN8Z3DsglWql6iY1lDWAfpFiBtuKGw== + dependencies: + "@babel/runtime" "^7.5.5" + dom-helpers "^5.0.1" + loose-envify "^1.4.0" + prop-types "^15.6.2" + react@^17.0.2: version "17.0.2" resolved "https://registry.yarnpkg.com/react/-/react-17.0.2.tgz#d0b5cc516d29eb3eee383f75b62864cfb6800037" @@ -15122,6 +15644,11 @@ reselect@^4.0.0: resolved "https://registry.yarnpkg.com/reselect/-/reselect-4.0.0.tgz#f2529830e5d3d0e021408b246a206ef4ea4437f7" integrity sha512-qUgANli03jjAyGlnbYVAV5vvnOmJnODyABz51RdBN7M4WaVu8mecZWgyQNkG8Yqe3KRGRt0l4K4B3XVEULC4CA== +reserved-words@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/reserved-words/-/reserved-words-0.1.2.tgz#00a0940f98cd501aeaaac316411d9adc52b31ab1" + integrity sha1-AKCUD5jNUBrqqsMWQR2a3FKzGrE= + resolve-cwd@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-2.0.0.tgz#00a9f7387556e27038eae232caa372a6a59b665a" @@ -15169,6 +15696,13 @@ resolve-pathname@^3.0.0: resolved "https://registry.yarnpkg.com/resolve-pathname/-/resolve-pathname-3.0.0.tgz#99d02224d3cf263689becbb393bc560313025dcd" integrity sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng== +resolve-protobuf-schema@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/resolve-protobuf-schema/-/resolve-protobuf-schema-2.1.0.tgz#9ca9a9e69cf192bbdaf1006ec1973948aa4a3758" + integrity sha512-kI5ffTiZWmJaS/huM8wZfEMer1eRd7oJQhDuxeCLe3t7N7mX3z94CN0xPxBQxFYQTSNz9T0i+v6inKqSdK8xrQ== + dependencies: + protocol-buffers-schema "^3.3.1" + resolve-url-loader@^3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/resolve-url-loader/-/resolve-url-loader-3.1.2.tgz#235e2c28e22e3e432ba7a5d4e305c59a58edfc08" @@ -15361,6 +15895,11 @@ run-queue@^1.0.0, run-queue@^1.0.3: dependencies: aproba "^1.1.1" +rw@^1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/rw/-/rw-1.3.3.tgz#3f862dfa91ab766b14885ef4d01124bfda074fb4" + integrity sha1-P4Yt+pGrdmsUiF700BEkv9oHT7Q= + rxjs@^6.3.3, rxjs@^6.6.0: version "6.6.6" resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.6.tgz#14d8417aa5a07c5e633995b525e1e3c0dec03b70" @@ -15410,6 +15949,16 @@ sanitize.css@^10.0.0: resolved "https://registry.yarnpkg.com/sanitize.css/-/sanitize.css-10.0.0.tgz#b5cb2547e96d8629a60947544665243b1dc3657a" integrity sha512-vTxrZz4dX5W86M6oVWVdOVe72ZiPs41Oi7Z6Km4W5Turyz28mrXSJhhEBZoRtzJWIv3833WKVwLSDWWkEfupMg== +sass-graph@2.2.5: + version "2.2.5" + resolved "https://registry.yarnpkg.com/sass-graph/-/sass-graph-2.2.5.tgz#a981c87446b8319d96dce0671e487879bd24c2e8" + integrity sha512-VFWDAHOe6mRuT4mZRd4eKE+d8Uedrk6Xnh7Sh9b4NGufQLQjOrvf/MQoOdx+0s92L89FeyUUNfU597j/3uNpag== + dependencies: + glob "^7.0.0" + lodash "^4.0.0" + scss-tokenizer "^0.2.3" + yargs "^13.3.2" + sass-loader@^10.0.5: version "10.1.1" resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-10.1.1.tgz#4ddd5a3d7638e7949065dd6e9c7c04037f7e663d" @@ -15475,6 +16024,14 @@ schema-utils@^3.0.0: ajv "^6.12.5" ajv-keywords "^3.5.2" +scss-tokenizer@^0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz#8eb06db9a9723333824d3f5530641149847ce5d1" + integrity sha1-jrBtualyMzOCTT9VMGQRSYR85dE= + dependencies: + js-base64 "^2.1.8" + source-map "^0.4.2" + scuid@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/scuid/-/scuid-1.1.0.tgz#d3f9f920956e737a60f72d0e4ad280bf324d5dab" @@ -15893,6 +16450,13 @@ source-map@0.6.1, source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0, sourc resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== +source-map@^0.4.2: + version "0.4.4" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b" + integrity sha1-66T12pwNyZneaAMti092FzZSA2s= + dependencies: + amdefine ">=0.0.4" + source-map@^0.5.0, source-map@^0.5.6: version "0.5.7" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" @@ -16103,6 +16667,13 @@ static-extend@^0.1.1: resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= +stdout-stream@^1.4.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/stdout-stream/-/stdout-stream-1.4.1.tgz#5ac174cdd5cd726104aa0c0b2bd83815d8d535de" + integrity sha512-j4emi03KXqJWcIeF8eIXkjMFN1Cmb8gUlDYGeBALLPo5qdyTfA9bOtl8m33lRoC+vFMkP3gl0WsDr6+gzxbbTA== + dependencies: + readable-stream "^2.0.1" + stealthy-require@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b" @@ -16406,12 +16977,26 @@ subscriptions-transport-ws@^0.9.11: symbol-observable "^1.0.4" ws "^5.2.0" +supercluster@^7.1.2: + version "7.1.2" + resolved "https://registry.yarnpkg.com/supercluster/-/supercluster-7.1.2.tgz#cf02a60283a0118212024f3bf02e4e63bb148e2c" + integrity sha512-bGA0pk3DYMjLTY1h+rbh0imi/I8k/Lg0rzdBGfyQs0Xkiix7jK2GUmH1qSD8+jq6U0Vu382QHr3+rbbiHqdKJA== + dependencies: + kdbush "^3.0.0" + supports-color@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc= -supports-color@^5.3.0, supports-color@^5.5.0: +supports-color@^3.2.3: + version "3.2.3" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6" + integrity sha1-ZawFBLOVQXHYpklGsq48u4pfVPY= + dependencies: + has-flag "^1.0.0" + +supports-color@^5.3.0, supports-color@^5.4.0, supports-color@^5.5.0: version "5.5.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== @@ -16471,7 +17056,7 @@ swap-case@^2.0.1: dependencies: tslib "^2.0.3" -symbol-observable@^1.0.4, symbol-observable@^1.1.0: +symbol-observable@1.2.0, 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== @@ -16715,11 +17300,16 @@ tiny-invariant@^1.0.2: resolved "https://registry.yarnpkg.com/tiny-invariant/-/tiny-invariant-1.1.0.tgz#634c5f8efdc27714b7f386c35e6760991d230875" integrity sha512-ytxQvrb1cPc9WBEI/HSeYYoGD0kWnGEOR8RY6KomWLBVhqz0RgTwVO9dLrGz7dC+nN9llyI7OKAgRq8Vq4ZBSw== -tiny-warning@^1.0.0, tiny-warning@^1.0.3: +tiny-warning@^1.0.0, tiny-warning@^1.0.2, tiny-warning@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/tiny-warning/-/tiny-warning-1.0.3.tgz#94a30db453df4c643d0fd566060d60a875d84754" integrity sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA== +tinyqueue@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/tinyqueue/-/tinyqueue-2.0.3.tgz#64d8492ebf39e7801d7bd34062e29b45b2035f08" + integrity sha512-ppJZNDuKGgxzkHihX8v9v9G5f+18gzaTfrukGrq6ueg0lmH4nqVnA2IPG0AEH3jKEk2GRJCUhDoqpoiw3PHLBA== + title-case@^3.0.2: version "3.0.3" resolved "https://registry.yarnpkg.com/title-case/-/title-case-3.0.3.tgz#bc689b46f02e411f1d1e1d081f7c3deca0489982" @@ -16842,6 +17432,13 @@ trim-off-newlines@^1.0.0: resolved "https://registry.yarnpkg.com/trim-off-newlines/-/trim-off-newlines-1.0.1.tgz#9f9ba9d9efa8764c387698bcbfeb2c848f11adb3" integrity sha1-n5up2e+odkw4dpi8v+sshI8RrbM= +"true-case-path@^1.0.2": + version "1.0.3" + resolved "https://registry.yarnpkg.com/true-case-path/-/true-case-path-1.0.3.tgz#f813b5a8c86b40da59606722b144e3225799f47d" + integrity sha512-m6s2OdQe5wgpFMC+pAJ+q9djG82O2jcHPOI6RNg1yy9rCYR+WD6Nbpl32fDpfC56nirdRy+opFa/Vk7HYhqaew== + dependencies: + glob "^7.1.2" + tryer@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/tryer/-/tryer-1.0.1.tgz#f2c85406800b9b0f74c9f7465b81eaad241252f8" @@ -17023,6 +17620,22 @@ type@^2.0.0: resolved "https://registry.yarnpkg.com/type/-/type-2.5.0.tgz#0a2e78c2e77907b252abe5f298c1b01c63f0db3d" integrity sha512-180WMDQaIMm3+7hGXWf12GtdniDEy7nYcyFMKJn/eZz/6tSLXrUN9V0wKSbMjej0I1WHWbpREDEKHtqPQa9NNw== +typed-scss-modules@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/typed-scss-modules/-/typed-scss-modules-4.1.1.tgz#eab12f25511a329f8e4837842c3b484ffd66b449" + integrity sha512-eVRej2pMRRbrMQ7oyLNR+GcMCD4Tmc+MMzq+6qo8pTXiz2GQR1dTaYTs9vDeoCE7iJv9JZ7U36fATbIVECJ+fQ== + dependencies: + camelcase "^5.0.0" + chalk "^3.0.0" + chokidar "^3.3.0" + css-modules-loader-core "^1.1.0" + glob "^7.1.6" + param-case "^3.0.2" + path "^0.12.7" + reserved-words "^0.1.2" + slash "^3.0.0" + yargs "^15.0.2" + typedarray-to-buffer@^3.1.5: version "3.1.5" resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" @@ -17343,6 +17956,13 @@ util@0.10.3: dependencies: inherits "2.0.1" +util@^0.10.3: + version "0.10.4" + resolved "https://registry.yarnpkg.com/util/-/util-0.10.4.tgz#3aa0125bfe668a4672de58857d3ace27ecb76901" + integrity sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A== + dependencies: + inherits "2.0.3" + util@^0.11.0: version "0.11.1" resolved "https://registry.yarnpkg.com/util/-/util-0.11.1.tgz#3236733720ec64bb27f6e26f421aaa2e1b588d61" @@ -17452,6 +18072,15 @@ 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== +vt-pbf@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/vt-pbf/-/vt-pbf-3.1.1.tgz#b0f627e39a10ce91d943b898ed2363d21899fb82" + integrity sha512-pHjWdrIoxurpmTcbfBWXaPwSmtPAHS105253P1qyEfSTV2HJddqjM+kIHquaT/L6lVJIk9ltTGc0IxR/G47hYA== + dependencies: + "@mapbox/point-geometry" "0.1.0" + "@mapbox/vector-tile" "^1.3.1" + pbf "^3.0.5" + w3c-hr-time@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz#0a89cdf5cc15822df9c360543676963e0cc308cd" @@ -18119,7 +18748,7 @@ yargs@^13.3.2: y18n "^4.0.0" yargs-parser "^13.1.2" -yargs@^15.3.1, yargs@^15.4.1: +yargs@^15.0.2, yargs@^15.3.1, yargs@^15.4.1: version "15.4.1" resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.4.1.tgz#0d87a16de01aee9d8bec2bfbf74f67851730f4f8" integrity sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==