diff --git a/package.json b/package.json index 07e1477e..6eb32130 100644 --- a/package.json +++ b/package.json @@ -53,11 +53,17 @@ "@storybook/preset-typescript": "^1.2.0", "@storybook/react": "^5.3.0-rc.4", "@storybook/source-loader": "^5.3.0-rc.4", + "@types/lowdb": "^1.0.9", + "@types/pouchdb": "^6.4.0", "babel-loader": "^8.0.6", + "dexie": "^3.0.1", "eslint-plugin-prettier": "^3.1.1", "fork-ts-checker-webpack-plugin": "^3.1.1", "gh-pages": "^2.2.0", + "lowdb": "^1.0.0", + "miragejs": "^0.1.38", "msw": "^0.15.4", + "pouchdb": "^7.2.1", "prettier": "1.18.2", "react-app-rewired": "^2.1.5", "react-docgen-typescript-loader": "^3.6.0", diff --git a/src/_api/README.md b/src/_api/README.md new file mode 100644 index 00000000..c0e55fb4 --- /dev/null +++ b/src/_api/README.md @@ -0,0 +1,10 @@ +# Rest API client with browser mocking + + +Refs: +https://medium.com/@mranjan215/client-side-databases-34e3ec912015 + + +https://github.com/techfort/LokiJS +https://github.com/typicode/lowdb +https://github.com/louischatriot/nedb diff --git a/src/_api/_mocks/_data/notificationsData.ts b/src/_api/_data/notificationsData.ts similarity index 100% rename from src/_api/_mocks/_data/notificationsData.ts rename to src/_api/_data/notificationsData.ts diff --git a/src/_api/_data/organizationsData.ts b/src/_api/_data/organizationsData.ts new file mode 100644 index 00000000..3a38e18f --- /dev/null +++ b/src/_api/_data/organizationsData.ts @@ -0,0 +1,53 @@ +import _keyBy from 'lodash/keyBy' +import Organization from '../_types/Organization' + +export interface OrganizationsData { + list: Organization[] + byId: { [key: number]: Organization } +} + +export const create = function( + { includeUsers } = { includeUsers: false }, +): OrganizationsData { + const list: Organization[] = [ + { + id: 1, + name: 'ModularCode', + plan: { + id: 'silver', + name: 'Silver', + }, + }, + { + id: 2, + name: 'Cool LLC', + plan: { + id: 'gold', + name: 'Gold', + }, + // organizationToUsers: organizationsToUsersData.byOrganizationId[2], + }, + { + id: 3, + name: 'Other LLC', + plan: { + id: 'trial', + name: 'Trial', + }, + // organizationToUsers: organizationsToUsersData.byOrganizationId[3], + }, + ] + + const byId: { [key: number]: Organization } = _keyBy(list, 'id') + + const organizationsData = { + list, + byId, + } + + return organizationsData +} + +export default { + create, +} diff --git a/src/_api/_data/organizationsPlansData.ts b/src/_api/_data/organizationsPlansData.ts new file mode 100644 index 00000000..b1c6ea43 --- /dev/null +++ b/src/_api/_data/organizationsPlansData.ts @@ -0,0 +1 @@ +export default {} diff --git a/src/_api/_data/usersData.ts b/src/_api/_data/usersData.ts new file mode 100644 index 00000000..cca5ef90 --- /dev/null +++ b/src/_api/_data/usersData.ts @@ -0,0 +1,201 @@ +import { get as _get, keyBy as _keyBy } from 'lodash' +import moment from 'moment' +import User from '../_types/User' +import UserToOrganization from '../_types/UserToOrganization' +import usersToOrganizationsData from './usersToOrganizationsData' +import organizationsData from './organizationsData' + +export interface UsersData { + list: User[] + byId: { [key: number]: User } + current: User +} + +export const create = function( + { includeOrganizations } = { includeOrganizations: true }, +): UsersData { + const usersToOrganizationsDataSet = usersToOrganizationsData.create() + const organizationsDataSet = organizationsData.create() + + const list: User[] = [ + { + id: 1, + firstName: 'Gevorg', + lastName: 'Harutyunyan', + username: 'modularcoder', + email: 'modularcoder@gmail.com', + avatarUrl: 'https://avatars3.githubusercontent.com/u/3959008?v=3&s=40', + globalRole: 'admin', + status: 'active', + }, + { + id: 2, + firstName: 'Jay', + lastName: 'Nickolson', + username: null, + email: 'example@gmail.com', + avatarUrl: + 'https://tinyfac.es/data/avatars/475605E3-69C5-4D2B-8727-61B7BB8C4699-500w.jpeg', + status: 'active', + }, + { + id: 3, + firstName: 'Ana', + lastName: 'De Armas', + username: null, + email: 'Ana+De+Armas@example.com', + avatarUrl: + 'https://images-na.ssl-images-amazon.com/images/M/MV5BMjA3NjYzMzE1MV5BMl5BanBnXkFtZTgwNTA4NDY4OTE@._V1_UX172_CR0,0,172,256_AL_.jpg', + status: 'active', + }, + { + id: 4, + firstName: 'Armas', + lastName: 'De Ana', + username: null, + email: 'Ana+De+Armas@example.com', + avatarUrl: + 'https://images-na.ssl-images-amazon.com/images/M/MV5BMTc0MzgxMzQ5N15BMl5BanBnXkFtZTgwMzMzNjkwOTE@._V1_UX172_CR0,0,172,256_AL_.jpg', + status: 'active', + }, + { + id: 5, + firstName: 'Sonequa', + lastName: 'Martin-Green', + email: 'Sonequa+Martin+Green@example.com', + avatarUrl: + 'https://images-na.ssl-images-amazon.com/images/M/MV5BMTgxMTc1MTYzM15BMl5BanBnXkFtZTgwNzI5NjMwOTE@._V1_UY256_CR16,0,172,256_AL_.jpg', + status: 'disabled', + }, + { + id: 6, + firstName: 'Bessie', + lastName: 'Walker', + username: 'bwalk', + email: 'bessie.walker@example.com', + avatarUrl: 'https://randomuser.me/api/portraits/women/29.jpg', + globalRole: 'admin', + status: 'active', + }, + { + id: 7, + firstName: 'Scarlett', + lastName: 'Sanders', + username: 'sanders', + email: 'scarlett.sanders@example.com', + avatarUrl: 'https://randomuser.me/api/portraits/women/26.jpg', + status: 'active', + }, + { + id: 8, + firstName: 'Scott', + lastName: 'Jensen', + username: 'scjx', + email: 'scott.jensen@example.com', + avatarUrl: 'https://randomuser.me/api/portraits/men/87.jpg', + status: 'pending', + }, + { + id: 9, + firstName: 'Marcus ', + lastName: 'Barrett', + username: null, + email: 'marcus.barrett@example.com', + avatarUrl: 'https://randomuser.me/api/portraits/men/88.jpg', + status: 'pending', + }, + { + id: 10, + firstName: 'Penny', + lastName: 'Lawrence', + email: 'penny.lawrence@example.com', + avatarUrl: 'https://randomuser.me/api/portraits/women/79.jpg', + status: 'active', + }, + { + id: 11, + firstName: 'Melvin', + lastName: 'Sutton', + username: 'johndoe1', + email: 'melvin.sutton@example.com', + avatarUrl: 'https://randomuser.me/api/portraits/men/85.jpg', + globalRole: 'admin', + status: 'disabled', + }, + { + id: 12, + firstName: 'Della', + lastName: 'Case', + username: null, + email: 'della.case@example.com', + avatarUrl: + 'https://images.unsplash.com/photo-1510227272981-87123e259b17?ixlib=rb-0.3.5&q=80&fm=jpg&crop=entropy&cs=tinysrgb&w=200&fit=max&s=3759e09a5b9fbe53088b23c615b6312e', + status: 'pending', + }, + { + id: 13, + firstName: 'Fischer', + lastName: 'Garland', + username: 'fgfr', + email: 'Fischer+Garland@example.com', + avatarUrl: + 'https://images.unsplash.com/photo-1456327102063-fb5054efe647?ixlib=rb-0.3.5&q=80&fm=jpg&crop=entropy&cs=tinysrgb&w=200&fit=max&s=f05c14dd4db49f08a789e6449604c490', + status: 'active', + }, + { + id: 14, + firstName: 'Abdullah', + lastName: 'Hadley', + username: 'hadley', + email: 'Hadley+Abdullah@example.com', + avatarUrl: + 'https://images.unsplash.com/photo-1507003211169-0a1dd7228f2d?ixlib=rb-0.3.5&q=80&fm=jpg&crop=entropy&cs=tinysrgb&w=200&fit=max&s=a72ca28288878f8404a795f39642a46f', + status: 'active', + }, + { + id: 15, + firstName: 'Lucy', + lastName: 'Walker', + email: 'Lucy+Walker@example.com', + avatarUrl: 'https://randomuser.me/api/portraits/women/0.jpg', + status: 'active', + }, + ].map(user => { + const userToOrganization = includeOrganizations + ? usersToOrganizationsDataSet.byUserId[user.id] || [] + : [] + + const userOrganizations = includeOrganizations + ? { + userOgranizations: userToOrganization.map((relation: UserToOrganization) => { + return { + ...relation, + organization: _get(organizationsDataSet.byId, relation.organizationId, {}), + } + }), + } + : {} + + return { + ...user, + ...userOrganizations, + createdAt: moment() + .subtract(user.id, 'days') + .format(), + } + }) + + const byId: { [key: number]: User } = _keyBy(list, 'id') + + const usersData = { + list, + byId, + current: byId[1], + } + + return usersData +} + +export default { + create, +} diff --git a/src/_api/_data/usersToOrganizationsData.ts b/src/_api/_data/usersToOrganizationsData.ts new file mode 100644 index 00000000..346b07af --- /dev/null +++ b/src/_api/_data/usersToOrganizationsData.ts @@ -0,0 +1,68 @@ +import _groupBy from 'lodash/groupBy' +import UserToOrganization from '../_types/UserToOrganization' + +export const create = function() { + const list: UserToOrganization[] = [ + { + id: 1, + organizationId: 1, + userId: 1, + role: 'owner', + // organization: organizationsData.byId[1], + // user: usersData.byId[1], + }, + { + id: 2, + organizationId: 1, + userId: 2, + role: 'admin', + // organization: organizationsData.byId[1], + // user: usersData.byId[2], + }, + { + id: 3, + organizationId: 1, + userId: 2, + role: 'member', + // organization: organizationsData.byId[1], + // user: usersData.byId[2], + }, + { + id: 4, + organizationId: 2, + userId: 2, + role: 'owner', + // organization: organizationsData.byId[2], + // user: usersData.byId[2], + }, + { + id: 5, + organizationId: 3, + userId: 3, + role: 'owner', + // organization: organizationsData.byId[3], + // user: usersData.byId[3], + }, + { + id: 6, + organizationId: 3, + userId: 2, + role: 'member', + // organization: organizationsData.byId[3], + // user: usersData.byId[2], + }, + ] + + const byUserId = _groupBy(list, 'userId') + const byOrganizationId = _groupBy(list, 'organizationId') + + return { + list, + byUserId, + byOrganizationId, + } +} + +export default { + create, +} diff --git a/src/_api/_mocks/_data/organizationsData.ts b/src/_api/_mocks/_data/organizationsData.ts deleted file mode 100644 index e1db7fa3..00000000 --- a/src/_api/_mocks/_data/organizationsData.ts +++ /dev/null @@ -1,41 +0,0 @@ -import _keyBy from 'lodash/keyBy' -import Organization from '../../_types/Organization' -// import organizationsToUsersData from './organizationsToUsersData' - -const list: Organization[] = [ - { - id: 1, - name: 'ModularCode', - plan: { - id: 'silver', - name: 'Silver', - }, - }, - { - id: 2, - name: 'Cool LLC', - plan: { - id: 'gold', - name: 'Gold', - }, - // organizationToUsers: organizationsToUsersData.byOrganizationId[2], - }, - { - id: 3, - name: 'Other LLC', - plan: { - id: 'trial', - name: 'Trial', - }, - // organizationToUsers: organizationsToUsersData.byOrganizationId[3], - }, -] - -const byId: { [key: number]: Organization } = _keyBy(list, 'id') - -const organizationsData = { - list, - byId, -} - -export default organizationsData diff --git a/src/_api/_mocks/_data/usersData.ts b/src/_api/_mocks/_data/usersData.ts deleted file mode 100644 index 69491092..00000000 --- a/src/_api/_mocks/_data/usersData.ts +++ /dev/null @@ -1,176 +0,0 @@ -import { get as _get, keyBy as _keyBy } from 'lodash' -import moment from 'moment' -import User from '../../_types/User' -import UserToOrganization from '../../_types/UserToOrganization' -import usersToOrganizationsData from './usersToOrganizationsData' -import organizationsData from './organizationsData' - -const list: User[] = [ - { - id: 1, - firstName: 'Gevorg', - lastName: 'Harutyunyan', - username: 'modularcoder', - email: 'modularcoder@gmail.com', - avatarUrl: 'https://avatars3.githubusercontent.com/u/3959008?v=3&s=40', - globalRole: 'admin', - status: 'active', - }, - { - id: 2, - firstName: 'Jay', - lastName: 'Nickolson', - username: null, - email: 'example@gmail.com', - avatarUrl: - 'https://tinyfac.es/data/avatars/475605E3-69C5-4D2B-8727-61B7BB8C4699-500w.jpeg', - status: 'active', - }, - { - id: 3, - firstName: 'Ana', - lastName: 'De Armas', - username: null, - email: 'Ana+De+Armas@example.com', - avatarUrl: - 'https://images-na.ssl-images-amazon.com/images/M/MV5BMjA3NjYzMzE1MV5BMl5BanBnXkFtZTgwNTA4NDY4OTE@._V1_UX172_CR0,0,172,256_AL_.jpg', - status: 'active', - }, - { - id: 4, - firstName: 'Armas', - lastName: 'De Ana', - username: null, - email: 'Ana+De+Armas@example.com', - avatarUrl: - 'https://images-na.ssl-images-amazon.com/images/M/MV5BMTc0MzgxMzQ5N15BMl5BanBnXkFtZTgwMzMzNjkwOTE@._V1_UX172_CR0,0,172,256_AL_.jpg', - status: 'active', - }, - { - id: 5, - firstName: 'Sonequa', - lastName: 'Martin-Green', - email: 'Sonequa+Martin+Green@example.com', - avatarUrl: - 'https://images-na.ssl-images-amazon.com/images/M/MV5BMTgxMTc1MTYzM15BMl5BanBnXkFtZTgwNzI5NjMwOTE@._V1_UY256_CR16,0,172,256_AL_.jpg', - status: 'disabled', - }, - { - id: 6, - firstName: 'Bessie', - lastName: 'Walker', - username: 'bwalk', - email: 'bessie.walker@example.com', - avatarUrl: 'https://randomuser.me/api/portraits/women/29.jpg', - globalRole: 'admin', - status: 'active', - }, - { - id: 7, - firstName: 'Scarlett', - lastName: 'Sanders', - username: 'sanders', - email: 'scarlett.sanders@example.com', - avatarUrl: 'https://randomuser.me/api/portraits/women/26.jpg', - status: 'active', - }, - { - id: 8, - firstName: 'Scott', - lastName: 'Jensen', - username: 'scjx', - email: 'scott.jensen@example.com', - avatarUrl: 'https://randomuser.me/api/portraits/men/87.jpg', - status: 'pending', - }, - { - id: 9, - firstName: 'Marcus ', - lastName: 'Barrett', - username: null, - email: 'marcus.barrett@example.com', - avatarUrl: 'https://randomuser.me/api/portraits/men/88.jpg', - status: 'pending', - }, - { - id: 10, - firstName: 'Penny', - lastName: 'Lawrence', - email: 'penny.lawrence@example.com', - avatarUrl: 'https://randomuser.me/api/portraits/women/79.jpg', - status: 'active', - }, - { - id: 11, - firstName: 'Melvin', - lastName: 'Sutton', - username: 'johndoe1', - email: 'melvin.sutton@example.com', - avatarUrl: 'https://randomuser.me/api/portraits/men/85.jpg', - globalRole: 'admin', - status: 'disabled', - }, - { - id: 12, - firstName: 'Della', - lastName: 'Case', - username: null, - email: 'della.case@example.com', - avatarUrl: - 'https://images.unsplash.com/photo-1510227272981-87123e259b17?ixlib=rb-0.3.5&q=80&fm=jpg&crop=entropy&cs=tinysrgb&w=200&fit=max&s=3759e09a5b9fbe53088b23c615b6312e', - status: 'pending', - }, - { - id: 13, - firstName: 'Fischer', - lastName: 'Garland', - username: 'fgfr', - email: 'Fischer+Garland@example.com', - avatarUrl: - 'https://images.unsplash.com/photo-1456327102063-fb5054efe647?ixlib=rb-0.3.5&q=80&fm=jpg&crop=entropy&cs=tinysrgb&w=200&fit=max&s=f05c14dd4db49f08a789e6449604c490', - status: 'active', - }, - { - id: 14, - firstName: 'Abdullah', - lastName: 'Hadley', - username: 'hadley', - email: 'Hadley+Abdullah@example.com', - avatarUrl: - 'https://images.unsplash.com/photo-1507003211169-0a1dd7228f2d?ixlib=rb-0.3.5&q=80&fm=jpg&crop=entropy&cs=tinysrgb&w=200&fit=max&s=a72ca28288878f8404a795f39642a46f', - status: 'active', - }, - { - id: 15, - firstName: 'Lucy', - lastName: 'Walker', - email: 'Lucy+Walker@example.com', - avatarUrl: 'https://randomuser.me/api/portraits/women/0.jpg', - status: 'active', - }, -].map(user => { - const userToOrganization = usersToOrganizationsData.byUserId[user.id] || [] - - return { - ...user, - userOgranizations: userToOrganization.map((relation: UserToOrganization) => { - return { - ...relation, - organization: _get(organizationsData.byId, relation.organizationId, {}), - } - }), - createdAt: moment() - .subtract(user.id, 'days') - .format(), - } -}) - -const byId: { [key: number]: User } = _keyBy(list, 'id') - -const usersData = { - list, - byId, - current: byId[1], -} - -export default usersData diff --git a/src/_api/_mocks/_data/usersToOrganizationsData.ts b/src/_api/_mocks/_data/usersToOrganizationsData.ts deleted file mode 100644 index d82aa6e4..00000000 --- a/src/_api/_mocks/_data/usersToOrganizationsData.ts +++ /dev/null @@ -1,65 +0,0 @@ -import _groupBy from 'lodash/groupBy' -import UserToOrganization from '../../_types/UserToOrganization' - -// import organizationsData from './organizationsData' -// import usersData from './usersData' - -const list: UserToOrganization[] = [ - { - id: 1, - organizationId: 1, - userId: 1, - role: 'owner', - // organization: organizationsData.byId[1], - // user: usersData.byId[1], - }, - { - id: 2, - organizationId: 1, - userId: 2, - role: 'admin', - // organization: organizationsData.byId[1], - // user: usersData.byId[2], - }, - { - id: 3, - organizationId: 1, - userId: 2, - role: 'member', - // organization: organizationsData.byId[1], - // user: usersData.byId[2], - }, - { - id: 4, - organizationId: 2, - userId: 2, - role: 'owner', - // organization: organizationsData.byId[2], - // user: usersData.byId[2], - }, - { - id: 5, - organizationId: 3, - userId: 3, - role: 'owner', - // organization: organizationsData.byId[3], - // user: usersData.byId[3], - }, - { - id: 6, - organizationId: 3, - userId: 2, - role: 'member', - // organization: organizationsData.byId[3], - // user: usersData.byId[2], - }, -] - -const byUserId = _groupBy(list, 'userId') -const byOrganizationId = _groupBy(list, 'organizationId') - -export default { - list, - byUserId, - byOrganizationId, -} diff --git a/src/_api/_mocks/_ref/index.ts b/src/_api/_mocks/_ref/index.ts deleted file mode 100644 index e63c114c..00000000 --- a/src/_api/_mocks/_ref/index.ts +++ /dev/null @@ -1,22 +0,0 @@ -console.log('hello mocks!') - -export default {} - -// import { AxiosInstance } from 'axios' -// import MockAdapter from 'axios-mock-adapter' - -// import usersMocks from './usersMocks' -// import organizationsMocks from './organizationsMocks' - -// const init = (instance: AxiosInstance) => { -// const mockAdapter = new MockAdapter(instance, { delayResponse: 200 }) - -// usersMocks.init(mockAdapter, instance) -// organizationsMocks.init(mockAdapter, instance) - -// return mockAdapter -// } - -// export default { -// init, -// } diff --git a/src/_api/_mocks/index.ts b/src/_api/_mocks/index.ts deleted file mode 100644 index 73ccf6e4..00000000 --- a/src/_api/_mocks/index.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { setupWorker } from 'msw' -import usersMocks from './usersMocks' - -const { start } = setupWorker(...usersMocks) - -export default { - init: start, -} diff --git a/src/_api/_mocksAxios/index.ts b/src/_api/_mocksAxios/index.ts new file mode 100644 index 00000000..11665a37 --- /dev/null +++ b/src/_api/_mocksAxios/index.ts @@ -0,0 +1,18 @@ +import { AxiosInstance } from 'axios' +import MockAdapter from 'axios-mock-adapter' + +import usersMocks from './usersMocks' +import organizationsMocks from './organizationsMocks' + +const init = (instance: AxiosInstance) => { + const mockAdapter = new MockAdapter(instance, { delayResponse: 200 }) + + usersMocks.init(mockAdapter, instance) + organizationsMocks.init(mockAdapter, instance) + + return mockAdapter +} + +export default { + init, +} diff --git a/src/_api/_mocks/_ref/organizationsMocksAxios.ts b/src/_api/_mocksAxios/organizationsMocks.ts similarity index 92% rename from src/_api/_mocks/_ref/organizationsMocksAxios.ts rename to src/_api/_mocksAxios/organizationsMocks.ts index 0045e054..bdda1fe8 100644 --- a/src/_api/_mocks/_ref/organizationsMocksAxios.ts +++ b/src/_api/_mocksAxios/organizationsMocks.ts @@ -1,6 +1,8 @@ import { AxiosInstance } from 'axios' import MockAdapter from 'axios-mock-adapter' -import organizationsData from './../_data/organizationsData' +import { create as createOrganizationsData } from '../_data/organizationsData' + +const organizationsData = createOrganizationsData() export default { init(mock: MockAdapter, instance: AxiosInstance) { diff --git a/src/_api/_mocks/_ref/usersMocksAxios.ts b/src/_api/_mocksAxios/usersMocks.ts similarity index 93% rename from src/_api/_mocks/_ref/usersMocksAxios.ts rename to src/_api/_mocksAxios/usersMocks.ts index b407c0d6..ec18741f 100644 --- a/src/_api/_mocks/_ref/usersMocksAxios.ts +++ b/src/_api/_mocksAxios/usersMocks.ts @@ -1,7 +1,9 @@ import _ from 'lodash' import { AxiosInstance } from 'axios' import MockAdapter from 'axios-mock-adapter' -import usersData from '../_data/usersData' +import { create as createUsersData } from '../_data/usersData' + +const usersData = createUsersData({ includeOrganizations: true }) export default { init(mock: MockAdapter, instance: AxiosInstance) { diff --git a/src/_api/_mocksMirage+TS/index.ts b/src/_api/_mocksMirage+TS/index.ts new file mode 100644 index 00000000..c4d5f012 --- /dev/null +++ b/src/_api/_mocksMirage+TS/index.ts @@ -0,0 +1,45 @@ +import { Server, Model } from 'miragejs' +import config from '@/_config/index' +import { create as createUsersData } from '../_data/usersData' +import { create as createUsersToOrganizationsData } from '../_data/usersToOrganizationsData' +import { create as createOrganizationsData } from '../_data/organizationsData' + +import usersRoutes from './users' +import organizationsRoutes from './organizations' + +const usersData = createUsersData({ includeOrganizations: false }) +const usersToOrganizationsData = createUsersToOrganizationsData() +const organizationsData = createOrganizationsData({ includeUsers: false }) + +export function init({ environment }: { environment: 'development' }) { + return new Server({ + environment, + logging: true, + + models: { + user: Model, + usersToOrganization: Model, + organization: Model, + }, + + routes() { + // this.namespace = 'api' + this.urlPrefix = config.api.url + this.timing = 200 + + usersRoutes(this) + organizationsRoutes(this) + }, + seeds(server) { + server.db.loadData({ + users: usersData.list, + usersToOrganizations: usersToOrganizationsData.list, + organizations: organizationsData.list, + }) + }, + }) +} + +export default { + init, +} diff --git a/src/_api/_mocksMirage+TS/organizations.ts b/src/_api/_mocksMirage+TS/organizations.ts new file mode 100644 index 00000000..75428a3e --- /dev/null +++ b/src/_api/_mocksMirage+TS/organizations.ts @@ -0,0 +1,7 @@ +import { Server } from 'miragejs' + +const organizationsRoutes = function(server: Server) { + server.get('/organizations') +} + +export default organizationsRoutes diff --git a/src/_api/_mocksMirage+TS/users.ts b/src/_api/_mocksMirage+TS/users.ts new file mode 100644 index 00000000..e4bcbf0b --- /dev/null +++ b/src/_api/_mocksMirage+TS/users.ts @@ -0,0 +1,11 @@ +import { Server } from 'miragejs' + +const usersRoutes = function(server: Server) { + server.get('/users', (schema: any, request) => { + console.log('schema', schema) + + return schema.users.all() + }) +} + +export default usersRoutes diff --git a/src/_api/_mocksMirage/index.js b/src/_api/_mocksMirage/index.js new file mode 100644 index 00000000..180c8757 --- /dev/null +++ b/src/_api/_mocksMirage/index.js @@ -0,0 +1,52 @@ +import { Server, Model, hasMany, belongsTo } from 'miragejs' +import config from '@/_config/index' +import { create as createUsersData } from '../_data/usersData' +import { create as createUsersToOrganizationsData } from '../_data/usersToOrganizationsData' +import { create as createOrganizationsData } from '../_data/organizationsData' + +import usersRoutes from './users' +import organizationsRoutes from './organizations' + +const usersData = createUsersData({ includeOrganizations: false }) +const usersToOrganizationsData = createUsersToOrganizationsData() +const organizationsData = createOrganizationsData({ includeUsers: false }) + +export function init({ environment }) { + return new Server({ + environment, + logging: true, + + models: { + user: Model.extend({ + usersToOrganization: hasMany(), + }), + usersToOrganization: Model.extend({ + user: belongsTo(), + // organization: belongsTo(), + }), + // organization: Model.extend({ + // usersToOrganization: hasMany(), + // }), + }, + + routes() { + // this.namespace = 'api' + this.urlPrefix = config.api.url + this.timing = 200 + + usersRoutes(this) + organizationsRoutes(this) + }, + seeds(server) { + server.db.loadData({ + users: usersData.list, + usersToOrganizations: usersToOrganizationsData.list, + organizations: organizationsData.list, + }) + }, + }) +} + +export default { + init, +} diff --git a/src/_api/_mocksMirage/organizations.js b/src/_api/_mocksMirage/organizations.js new file mode 100644 index 00000000..40165412 --- /dev/null +++ b/src/_api/_mocksMirage/organizations.js @@ -0,0 +1,7 @@ +import { Server } from 'miragejs' + +const organizationsRoutes = function(server) { + server.get('/organizations') +} + +export default organizationsRoutes diff --git a/src/_api/_mocksMirage/users.js b/src/_api/_mocksMirage/users.js new file mode 100644 index 00000000..0378e996 --- /dev/null +++ b/src/_api/_mocksMirage/users.js @@ -0,0 +1,16 @@ +import { Server } from 'miragejs' + +const usersRoutes = function(server) { + server.get('/users', (schema, request) => { + const selection = schema.users.all() + + console.log('selection', selection) + + return { + ...schema.users.all().slice(0, 10), + count: schema.users.length, + } + }) +} + +export default usersRoutes diff --git a/src/_api/_mocksSW+dexie/db.ts b/src/_api/_mocksSW+dexie/db.ts new file mode 100644 index 00000000..436cfe74 --- /dev/null +++ b/src/_api/_mocksSW+dexie/db.ts @@ -0,0 +1,62 @@ +import Dexie from 'dexie' + +import { User } from '../_types/User' +import { UserToOrganization } from '../_types/UserToOrganization' +import { Organization } from '../_types/Organization' + +import { create as createUsersData } from '../_data/usersData' +import { create as createUsersToOrganizationsData } from '../_data/usersToOrganizationsData' +import { create as createOrganizationsData } from '../_data/organizationsData' + +const usersData = createUsersData({ includeOrganizations: false }) +const usersToOrganizationsData = createUsersToOrganizationsData() +const organizationsData = createOrganizationsData({ includeUsers: false }) + +console.log('usersData', usersData) + +// +// Declare Database +// +class ModularAdminDatabase extends Dexie { + public users: Dexie.Table // id is number in this case + public usersToOrganizations: Dexie.Table // id is number in this case + public organizations: Dexie.Table // id is number in this case + + public constructor() { + super('ModularAdminDatabase') + this.version(1).stores({ + organizations: '++id,name,username,updatedAt,createdAt', + users: + '++id,firstName,lastName,displayName,username,email,password,avatarUrl,globalRole,status,updatedAt,createdAt', + usersToOrganizations: '++id,organizationId,userId,role,updatedAt,createdAt', + }) + this.organizations = this.table('organizations') + this.users = this.table('users') + this.usersToOrganizations = this.table('usersToOrganizations') + } +} + +const db = new ModularAdminDatabase() + +export const init = async function() { + console.log('Setting up a local session db...') + + try { + // Clear the DB + await db.organizations.clear() + await db.users.clear() + await db.usersToOrganizations.clear() + + // Add the data + await db.users.bulkAdd(usersData.list) + await db.organizations.bulkAdd(organizationsData.list) + await db.usersToOrganizations.bulkAdd(usersToOrganizationsData.list) + + console.log('Successfully set a local session db: ', db) + } catch (e) { + console.error('Error setting up local DB') + } + return db +} + +export default db diff --git a/src/_api/_mocksSW+dexie/index.ts b/src/_api/_mocksSW+dexie/index.ts new file mode 100644 index 00000000..2efd606c --- /dev/null +++ b/src/_api/_mocksSW+dexie/index.ts @@ -0,0 +1,27 @@ +import { setupWorker } from 'msw' +import usersMocks from './usersMocks' +import db, { init as initDb } from './db' + +declare global { + interface Window { + db: any + } +} + +window.db = db + +export default { + async init() { + // Remove all SW caches + const cachesNames = await caches.keys() + + await Promise.all(cachesNames.map(name => caches.delete(name))) + + // Setup a DB + await initDb() + + const { start } = setupWorker(...usersMocks) + + return start() + }, +} diff --git a/src/_api/_mocks/organizationsMocks.ts b/src/_api/_mocksSW+dexie/organizationsMocks.ts similarity index 93% rename from src/_api/_mocks/organizationsMocks.ts rename to src/_api/_mocksSW+dexie/organizationsMocks.ts index 7e41c3ac..0bb53533 100644 --- a/src/_api/_mocks/organizationsMocks.ts +++ b/src/_api/_mocksSW+dexie/organizationsMocks.ts @@ -2,9 +2,10 @@ import _ from 'lodash' import { rest } from 'msw' import config from '_config' -import organizationsData from './_data/organizationsData' +import { create as createOrganizationsData } from '../_data/organizationsData' const apiUrl = config.api.url +const organizationsData = createOrganizationsData({ includeUsers: true }) export default [ rest.get(`${apiUrl}/organizations`, (req, res, ctx) => { diff --git a/src/_api/_mocks/usersMocks.ts b/src/_api/_mocksSW+dexie/usersMocks.ts similarity index 59% rename from src/_api/_mocks/usersMocks.ts rename to src/_api/_mocksSW+dexie/usersMocks.ts index 3df86aa8..fdf92a48 100644 --- a/src/_api/_mocks/usersMocks.ts +++ b/src/_api/_mocksSW+dexie/usersMocks.ts @@ -2,12 +2,14 @@ import _ from 'lodash' import { rest } from 'msw' import config from '_config' -import usersData from './_data/usersData' +import db from './db' +import { create as createUsersData } from '../_data/usersData' const apiUrl = config.api.url +const usersData = createUsersData({ includeOrganizations: true }) export default [ - rest.get(`${apiUrl}/users/profile`, (rex, res, ctx) => { + rest.get(`${apiUrl}/users/me`, (rex, res, ctx) => { return res(ctx.json(usersData.current)) }), @@ -16,23 +18,49 @@ export default [ let offset = parseInt(req.query.get('offset') || '10') let order = JSON.parse(req.query.get('order') || '{}') - const usersAll = order - ? _.orderBy(usersData.list, [order.orderBy], [order.order]) - : usersData.list + try { + let table = db.users + let selection = table.toCollection() + let selectionResult = table.toCollection() - const result = { - users: usersAll.slice(offset, offset + limit), - count: usersAll.length, - } + if (order && order.order === 'desc') { + selectionResult = table.orderBy(order.orderBy).reverse() + } else if (order && order.order !== 'desc') { + selectionResult = table.orderBy(order.orderBy) + } - return res( - // Set custom status - ctx.status(200), - // Delay the response - ctx.delay(500), - // send JSON response body - ctx.json(result), - ) + selectionResult = selection.limit(limit).offset(offset) + + const users = await selectionResult + .limit(limit) + .offset(offset) + .toArray() + const count = await selection.count() + + console.log('users', users) + console.log('count', count) + + return res( + // Set custom status + ctx.status(200), + // Delay the response + ctx.delay(500), + // send JSON response body + ctx.json({ + users, + count, + }), + ) + } catch (err) { + console.error(err) + + return res( + ctx.status(400), + ctx.json({ + message: err.message, + }), + ) + } }), rest.get(`${apiUrl}/users/:userId`, (req, res, ctx) => { diff --git a/src/_api/_mocksSW+lowdb/db.ts b/src/_api/_mocksSW+lowdb/db.ts new file mode 100644 index 00000000..8a26836f --- /dev/null +++ b/src/_api/_mocksSW+lowdb/db.ts @@ -0,0 +1,48 @@ +import low from 'lowdb' +import LocalStorage from 'lowdb/adapters/LocalStorage' + +// import { User } from '../_types/User' +// import { UserToOrganization } from '../_types/UserToOrganization' +// import { Organization } from '../_types/Organization' + +import { create as createUsersData } from '../_data/usersData' +import { create as createUsersToOrganizationsData } from '../_data/usersToOrganizationsData' +import { create as createOrganizationsData } from '../_data/organizationsData' + +const usersData = createUsersData({ includeOrganizations: false }) +const usersToOrganizationsData = createUsersToOrganizationsData() +const organizationsData = createOrganizationsData({ includeUsers: false }) + +const adapter = new LocalStorage('db') +const db = low(adapter) + +db.defaults({ + users: usersData.list, + usersToOrganizations: usersToOrganizationsData.list, + organizations: organizationsData.list, +}).write() + +export const init = async function() { + // console.log('Setting up a local session db...') + + try { + db.set('users', usersData.list).write() + db.set('usersToOrganizations', usersToOrganizationsData.list).write() + db.set('organizations', organizationsData.list).write() + + // // // Clear the DB + // // await db.organizations.clear() + // // await db.users.clear() + // // await db.usersToOrganizations.clear() + // // // Add the data + // // await db.users.bulkAdd(usersData.list) + // // await db.organizations.bulkAdd(organizationsData.list) + // // await db.usersToOrganizations.bulkAdd(usersToOrganizationsData.list) + // // console.log('Successfully set a local session db: ', db) + } catch (err) { + console.error('Error setting up local DB', err) + } + return db +} + +export default db diff --git a/src/_api/_mocksSW+lowdb/index.ts b/src/_api/_mocksSW+lowdb/index.ts new file mode 100644 index 00000000..cbc5b0b9 --- /dev/null +++ b/src/_api/_mocksSW+lowdb/index.ts @@ -0,0 +1,27 @@ +import { setupWorker } from 'msw' +import usersMocks from './usersMocks.js' +import db, { init as initDb } from './db' + +declare global { + interface Window { + db: any + } +} + +window.db = db + +export default { + async init() { + // Remove all SW caches + const cachesNames = await caches.keys() + + await Promise.all(cachesNames.map(name => caches.delete(name))) + + // Setup a DB + await initDb() + + const { start } = setupWorker(...usersMocks) + + return start() + }, +} diff --git a/src/_api/_mocksSW+lowdb/organizationsMocks.ts b/src/_api/_mocksSW+lowdb/organizationsMocks.ts new file mode 100644 index 00000000..0bb53533 --- /dev/null +++ b/src/_api/_mocksSW+lowdb/organizationsMocks.ts @@ -0,0 +1,97 @@ +import _ from 'lodash' +import { rest } from 'msw' + +import config from '_config' +import { create as createOrganizationsData } from '../_data/organizationsData' + +const apiUrl = config.api.url +const organizationsData = createOrganizationsData({ includeUsers: true }) + +export default [ + rest.get(`${apiUrl}/organizations`, (req, res, ctx) => { + const { limit = 10, offset = 0, order = {} } = req.params + const organizationsAll = order + ? _.orderBy(organizationsData.list, [order.orderBy], [order.order]) + : organizationsData.list + + const result = { + organizations: organizationsAll.slice(offset, offset + limit), + count: organizationsAll.length, + } + + return res( + // Set custom status + ctx.status(200), + // Delay the response + ctx.delay(1000), + // send JSON response body + ctx.json(result), + ) + }), + + rest.get(`${apiUrl}/organizations/:organizationId`, (req, res, ctx) => { + const { organizationId } = req.params + const organization = organizationsData.byId[organizationId] + + if (organization) { + return res(ctx.status(200), ctx.delay(200), ctx.json(organization)) + } else { + return res( + ctx.status(404), + ctx.status(200), + ctx.json({ + message: 'organization not found', + }), + ) + } + }), + + rest.post(`${apiUrl}/organizations`, (req, res, ctx) => { + return res( + ctx.status(200), + ctx.delay(200), + ctx.json({ + // @ts-ignore + ...req.body, + }), + ) + }), + + rest.put(`${apiUrl}/organizations/:organizationId`, (req, res, ctx) => { + const { organizationId } = req.params + const organization = organizationsData.byId[organizationId] + + if (organization) { + return res( + ctx.status(200), + ctx.delay(200), + ctx.json({ + ...organization, + // ...req.body, + }), + ) + } else { + return res(ctx.status(403), ctx.json({ message: 'Update not permitted' })) + } + }), + + rest.delete(`${apiUrl}/organizations/:organizationId`, (req, res, ctx) => { + const { organizationId } = req.params + const organization = organizationsData.byId[organizationId] + + if (organization) { + return res( + ctx.status(200), + ctx.delay(200), + ctx.json({ + message: 'Organization removed', + }), + ) + } else { + return res( + ctx.status(403), + ctx.json({ message: 'Organization not found or forbidden' }), + ) + } + }), +] diff --git a/src/_api/_mocksSW+lowdb/usersMocks.js b/src/_api/_mocksSW+lowdb/usersMocks.js new file mode 100644 index 00000000..ef9461af --- /dev/null +++ b/src/_api/_mocksSW+lowdb/usersMocks.js @@ -0,0 +1,135 @@ +import _ from 'lodash' +import { rest } from 'msw' + +import config from '_config' +import db from './db' +import { create as createUsersData } from '../_data/usersData' + +const apiUrl = config.api.url +const usersData = createUsersData({ includeOrganizations: true }) + +export default [ + rest.get(`${apiUrl}/users/me`, (rex, res, ctx) => { + return res(ctx.json(usersData.current)) + }), + + rest.get(`${apiUrl}/users`, async (req, res, ctx) => { + let limit = parseInt(req.query.get('limit') || '0') + let offset = parseInt(req.query.get('offset') || '10') + let order = JSON.parse(req.query.get('order') || '{}') + + try { + let selection = db.get('users') + // .filter({ published: true }) + // .sortBy('views') + // .take(5) + + console.log('selection', selection) + + // let table = db.users + // let selection = table.toCollection() + // let selectionResult = table.toCollection() + + // if (order && order.order === 'desc') { + // selectionResult = table.orderBy(order.orderBy).reverse() + // } else if (order && order.order !== 'desc') { + // selectionResult = table.orderBy(order.orderBy) + // } + + // selectionResult = selection.limit(limit).offset(offset) + + // const users = await selectionResult + // .limit(limit) + // .offset(offset) + // .toArray() + // const count = await selection.count() + + // console.log('users', users) + // console.log('count', count) + + return res( + // Set custom status + ctx.status(200), + // Delay the response + ctx.delay(500), + // send JSON response body + ctx.json({ + users: [], + count: [], + }), + ) + } catch (err) { + console.error(err) + + return res( + ctx.status(400), + ctx.json({ + message: err.message, + }), + ) + } + }), + + rest.get(`${apiUrl}/users/:userId`, (req, res, ctx) => { + const { userId } = req.params + const user = usersData.byId[userId] + + if (user) { + return res(ctx.status(200), ctx.delay(200), ctx.json(user)) + } else { + return res( + ctx.status(404), + ctx.status(200), + ctx.json({ + message: 'User not found', + }), + ) + } + }), + + rest.post(`${apiUrl}/users`, (req, res, ctx) => { + return res( + ctx.status(200), + ctx.delay(200), + ctx.json({ + // @ts-ignore + ...req.body, + }), + ) + }), + + rest.put(`${apiUrl}/users/:userId`, (req, res, ctx) => { + const { userId } = req.params + const user = usersData.byId[userId] + + if (user) { + return res( + ctx.status(200), + ctx.delay(200), + ctx.json({ + ...user, + // ...req.body, + }), + ) + } else { + return res(ctx.status(403), ctx.json({ message: 'Update not permitted' })) + } + }), + + rest.delete(`${apiUrl}/users/:userId`, (req, res, ctx) => { + const { userId } = req.params + const user = usersData.byId[userId] + + if (user) { + return res( + ctx.status(200), + ctx.delay(200), + ctx.json({ + message: 'User removed', + }), + ) + } else { + return res(ctx.status(403), ctx.json({ message: 'User not found or forbidden' })) + } + }), +] diff --git a/src/_api/_types/Entity.ts b/src/_api/_types/Entity.ts index 0607cab5..d4cae64d 100644 --- a/src/_api/_types/Entity.ts +++ b/src/_api/_types/Entity.ts @@ -1,6 +1,8 @@ export type EntityId = number | string -export default interface Entity { +export interface Entity { createdAt?: string updatedAt?: string } + +export default Entity diff --git a/src/_api/_types/Organization.ts b/src/_api/_types/Organization.ts index 86d70815..ceae7e36 100644 --- a/src/_api/_types/Organization.ts +++ b/src/_api/_types/Organization.ts @@ -14,9 +14,11 @@ export interface OrganizationSubmissionData { username?: string } -export default interface Organization extends OrganizationSubmissionData, Entity { +export interface Organization extends OrganizationSubmissionData, Entity { id: OrganizationId plan: OrganizationPlan users?: User[] organizationUsers?: UserToOrganization[] } + +export default Organization diff --git a/src/_api/_types/User.ts b/src/_api/_types/User.ts index 615f325e..109d7b7d 100644 --- a/src/_api/_types/User.ts +++ b/src/_api/_types/User.ts @@ -21,8 +21,10 @@ export interface UserSubmissionData { status?: string } -export default interface User extends UserSubmissionData, Entity { +export interface User extends UserSubmissionData, Entity { id: UserId organizations?: Organization[] userToOrganizations?: UserToOrganization[] } + +export default User diff --git a/src/_api/_types/UserToOrganization.ts b/src/_api/_types/UserToOrganization.ts index b37d45e2..10130bc1 100644 --- a/src/_api/_types/UserToOrganization.ts +++ b/src/_api/_types/UserToOrganization.ts @@ -6,7 +6,7 @@ import User, { UserId } from './User' export type UserToOrganizationId = EntityId export type UserRole = 'member' | 'admin' | 'owner' -export default interface UserToOrganization extends Entity { +export interface UserToOrganization extends Entity { id: UserToOrganizationId organizationId: OrganizationId userId: UserId @@ -14,3 +14,5 @@ export default interface UserToOrganization extends Entity { organization?: Organization user?: User } + +export default UserToOrganization diff --git a/src/_api/index.ts b/src/_api/index.ts index db835a70..0426e833 100644 --- a/src/_api/index.ts +++ b/src/_api/index.ts @@ -1,22 +1,25 @@ +import config from '@/_config' + import instance from './client' import organizations from './organizations' import users from './users' -import config from '_config' -let apiMocks: any +declare global { + interface Window { + server: any + } +} + +let mockServer: any if (config.api.useMocks) { - apiMocks = require('./_mocks/') + mockServer = require('./_mocksMirage') } const init = async () => { - if (apiMocks) { - // Remove all SW caches - const cachesNames = await caches.keys() - - await Promise.all(cachesNames.map(name => caches.delete(name))) - - await apiMocks.default.init() + if (config.api.useMocks) { + window.server = await mockServer.default.init({ environment: 'development' }) + // await mockServer.default.init() } return instance diff --git a/yarn.lock b/yarn.lock index ad34ec10..bdb7e31a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1529,6 +1529,11 @@ resolved "https://registry.yarnpkg.com/@mdx-js/util/-/util-1.5.3.tgz#49f939313a8561814ef72c231257865aa127ca55" integrity sha512-OXeOtHO+eN50QlIkm4Vj4vqNGtowv4FH9L21WvcbEM0eeZrb7aANiFTN70lBQEXcucxCMRkd/6IA9LxhotZEQw== +"@miragejs/pretender-node-polyfill@^0.1.0": + version "0.1.2" + resolved "https://registry.yarnpkg.com/@miragejs/pretender-node-polyfill/-/pretender-node-polyfill-0.1.2.tgz#d26b6b7483fb70cd62189d05c95d2f67153e43f2" + integrity sha512-M/BexG/p05C5lFfMunxo/QcgIJnMT2vDVCd00wNqK2ImZONIlEETZwWJu1QtLxtmYlSHlCFl3JNzp0tLe7OJ5g== + "@mrmlnc/readdir-enhanced@^2.2.1": version "2.2.1" resolved "https://registry.yarnpkg.com/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz#524af240d1a360527b730475ecfa1344aa540dde" @@ -2223,6 +2228,11 @@ resolved "https://registry.yarnpkg.com/@types/color-name/-/color-name-1.1.1.tgz#1c1261bbeaa10a8055bbc5d8ab84b7b2afc846a0" integrity sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ== +"@types/debug@*": + version "4.1.5" + resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.5.tgz#b14efa8852b7768d898906613c23f688713e02cd" + integrity sha512-Q1y515GcOdTHgagaVFhHnIFQ38ygs/kmxdNpvpou+raI9UO3YZcHDngBSYKQklcKlvA7iuQlmIKbzvmxcOE9CQ== + "@types/eslint-visitor-keys@^1.0.0": version "1.0.0" resolved "https://registry.yarnpkg.com/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#1ee30d79544ca84d68d4b3cdb0af4f205663dd2d" @@ -2276,11 +2286,31 @@ resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.4.tgz#38fd73ddfd9b55abb1e1b2ed578cb55bd7b7d339" integrity sha512-8+KAKzEvSUdeo+kmqnKrqgeE+LcA0tjYWFY7RPProVYwnqDjukzO+3b6dLD56rYX5TdWejnEOLJYOIeh4CXKuA== +"@types/lodash@*": + version "4.14.150" + resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.150.tgz#649fe44684c3f1fcb6164d943c5a61977e8cf0bd" + integrity sha512-kMNLM5JBcasgYscD9x/Gvr6lTAv2NVgsKtet/hm93qMyf/D1pt+7jeEZklKJKxMVmXjxbRVQQGfqDSfipYCO6w== + "@types/lodash@^4.14.149": version "4.14.149" resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.149.tgz#1342d63d948c6062838fbf961012f74d4e638440" integrity sha512-ijGqzZt/b7BfzcK9vTrS6MFljQRPn5BFWOx8oE0GYxribu6uV+aA9zZuXI1zc/etK9E8nrgdoF2+LgUw7+9tJQ== +"@types/lowdb@^1.0.9": + version "1.0.9" + resolved "https://registry.yarnpkg.com/@types/lowdb/-/lowdb-1.0.9.tgz#1f6c27df72dd1c64522cc9a4566796d2dd058d38" + integrity sha512-LBRG5EPXFOJDoJc9jACstMhtMP+u+UkPYllBeGQXXKiaHc+uzJs9+/Aynb/5KkX33DtrIiKyzNVTPQc/4RcD6A== + dependencies: + "@types/lodash" "*" + +"@types/node-fetch@*": + version "2.5.7" + resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.5.7.tgz#20a2afffa882ab04d44ca786449a276f9f6bbf3c" + integrity sha512-o2WVNf5UhWRkxlf6eq+jMZDu7kjgpgJfl4xVNlvryc95O/6F2ld8ztKX+qu+Rjyet93WAWm5LjeX9H5FGkODvw== + dependencies: + "@types/node" "*" + form-data "^3.0.0" + "@types/node@*": version "13.1.5" resolved "https://registry.yarnpkg.com/@types/node/-/node-13.1.5.tgz#4d5efc52a1d3e45d13e5ec9f911cbc5b089ccaec" @@ -2291,6 +2321,153 @@ resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0" integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== +"@types/pouchdb-adapter-cordova-sqlite@*": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@types/pouchdb-adapter-cordova-sqlite/-/pouchdb-adapter-cordova-sqlite-1.0.0.tgz#6ede3773ab22a548ca30e9efb8b659e100aea1db" + integrity sha512-NsqpEYKunBS/BPvttlOVQ5Me6LdU6UYZB0Qak3XS/AvLeIRdF61MZ/czSuL/ozydYr6bikewt6dvlpCK1HWG9Q== + dependencies: + "@types/pouchdb-core" "*" + +"@types/pouchdb-adapter-fruitdown@*": + version "6.1.3" + resolved "https://registry.yarnpkg.com/@types/pouchdb-adapter-fruitdown/-/pouchdb-adapter-fruitdown-6.1.3.tgz#9b140ad9645cc56068728acf08ec19ac0046658e" + integrity sha512-Wz1Z1JLOW1hgmFQjqnSkmyyfH7by/iWb4abKn684WMvQfmxx6BxKJpJ4+eulkVPQzzgMMSgU1MpnQOm9FgRkbw== + dependencies: + "@types/pouchdb-core" "*" + +"@types/pouchdb-adapter-http@*": + version "6.1.3" + resolved "https://registry.yarnpkg.com/@types/pouchdb-adapter-http/-/pouchdb-adapter-http-6.1.3.tgz#6e592d5f48deb6274a21ddac1498dd308096bcf3" + integrity sha512-9Z4TLbF/KJWy/D2sWRPBA+RNU0odQimfdvlDX+EY7rGcd3aVoH8qjD/X0Xcd/0dfBH5pKrNIMFFQgW/TylRCmA== + dependencies: + "@types/pouchdb-core" "*" + +"@types/pouchdb-adapter-idb@*": + version "6.1.3" + resolved "https://registry.yarnpkg.com/@types/pouchdb-adapter-idb/-/pouchdb-adapter-idb-6.1.3.tgz#0d7cc70c0b0e5317c84b965c87e0c0034c0c2ddd" + integrity sha512-K4G9pmHkR2JyL8d6cllIEix2dtQFVIJyDcgoT7ctrbIyyhT4kRjieGc3O7tzIhm1bv7W2qz1aResO9lq7qjKVQ== + dependencies: + "@types/pouchdb-core" "*" + +"@types/pouchdb-adapter-leveldb@*": + version "6.1.3" + resolved "https://registry.yarnpkg.com/@types/pouchdb-adapter-leveldb/-/pouchdb-adapter-leveldb-6.1.3.tgz#17c7e75d75b992050bca15991e97fba575c61bb3" + integrity sha512-ex8NFqQGFwEpFi7AaZ5YofmuemfZNsL3nTFZBUCAKYMBkazQij1pe2ILLStSvJr0XS0qxgXjCEW19T5Wqiiskg== + dependencies: + "@types/pouchdb-core" "*" + +"@types/pouchdb-adapter-localstorage@*": + version "6.1.3" + resolved "https://registry.yarnpkg.com/@types/pouchdb-adapter-localstorage/-/pouchdb-adapter-localstorage-6.1.3.tgz#0dde02ba6b9d6073a295a20196563942ba9a54bd" + integrity sha512-oor040tye1KKiGLWYtIy7rRT7C2yoyX3Tf6elEJRpjOA7Ja/H8lKc4LaSh9ATbptIcES6MRqZDxtp7ly9hsW3Q== + dependencies: + "@types/pouchdb-core" "*" + +"@types/pouchdb-adapter-memory@*": + version "6.1.3" + resolved "https://registry.yarnpkg.com/@types/pouchdb-adapter-memory/-/pouchdb-adapter-memory-6.1.3.tgz#9eabdbc890fcf58960ee8b68b8685f837e75c844" + integrity sha512-gVbsIMzDzgZYThFVT4eVNsmuZwVm/4jDxP1sjlgc3qtDIxbtBhGgyNfcskwwz9Zu5Lv1avkDsIWvcxQhnvRlHg== + dependencies: + "@types/pouchdb-core" "*" + +"@types/pouchdb-adapter-node-websql@*": + version "6.1.3" + resolved "https://registry.yarnpkg.com/@types/pouchdb-adapter-node-websql/-/pouchdb-adapter-node-websql-6.1.3.tgz#aa18bc68af8cf509acd12c400010dcd5fab2243d" + integrity sha512-F/P+os6Jsa7CgHtH64+Z0HfwIcj0hIRB5z8gNhF7L7dxPWoAfkopK5H2gydrP3sQrlGyN4WInF+UJW/Zu1+FKg== + dependencies: + "@types/pouchdb-adapter-websql" "*" + "@types/pouchdb-core" "*" + +"@types/pouchdb-adapter-websql@*": + version "6.1.3" + resolved "https://registry.yarnpkg.com/@types/pouchdb-adapter-websql/-/pouchdb-adapter-websql-6.1.3.tgz#9e59884c2ded956f05e80ee06dc776735979322e" + integrity sha512-0AsCWnliwg/3PKj5NAoFuzpnMQKXGBOl+6q8aNxK3N9Tq3SbV91QhgW/mdJsOdqSOw0EBudkGdE6/CZlrgeLpw== + dependencies: + "@types/pouchdb-core" "*" + +"@types/pouchdb-browser@*": + version "6.1.3" + resolved "https://registry.yarnpkg.com/@types/pouchdb-browser/-/pouchdb-browser-6.1.3.tgz#8f33d6ef58d6817d1f6d36979148a1c7f63244d8" + integrity sha512-EdYowrWxW9SWBMX/rux2eq7dbHi5Zeyzz+FF/IAsgQKnUxgeCO5VO2j4zTzos0SDyJvAQU+EYRc11r7xGn5tvA== + dependencies: + "@types/pouchdb-adapter-http" "*" + "@types/pouchdb-adapter-idb" "*" + "@types/pouchdb-adapter-websql" "*" + "@types/pouchdb-core" "*" + "@types/pouchdb-mapreduce" "*" + "@types/pouchdb-replication" "*" + +"@types/pouchdb-core@*": + version "7.0.5" + resolved "https://registry.yarnpkg.com/@types/pouchdb-core/-/pouchdb-core-7.0.5.tgz#d04af55159bc23afce409f4cb6cc90f8bd5e45e3" + integrity sha512-jTR9Yy0a7cNn0+zhwPQF0mQywC9fHD1cKLNwlCF/NX5EQLS7FN4R55gbo3CgcNJ3Gu59EJd4nkA9RzR66zwKRw== + dependencies: + "@types/debug" "*" + "@types/node-fetch" "*" + "@types/pouchdb-find" "*" + +"@types/pouchdb-find@*": + version "6.3.5" + resolved "https://registry.yarnpkg.com/@types/pouchdb-find/-/pouchdb-find-6.3.5.tgz#439002c935b9f8cfab67a0faa044d098e566dfe5" + integrity sha512-YvtUQyi1xmPcx/I7AAWVpaX2uIWCnY9c0MvNyCcHOtdgPj2iG8d4tEZHmD2LJ9wvKoz4f+KV9LPeo6/BnsF22Q== + dependencies: + "@types/pouchdb-core" "*" + +"@types/pouchdb-http@*": + version "6.1.3" + resolved "https://registry.yarnpkg.com/@types/pouchdb-http/-/pouchdb-http-6.1.3.tgz#09576c0d409da1f8dee34ec5b768415e2472ea52" + integrity sha512-0e9E5SqNOyPl/3FnEIbENssB4FlJsNYuOy131nxrZk36S+y1R/6qO7ZVRypWpGTqBWSuVd7gCsq2UDwO/285+w== + dependencies: + "@types/pouchdb-adapter-http" "*" + "@types/pouchdb-core" "*" + +"@types/pouchdb-mapreduce@*": + version "6.1.4" + resolved "https://registry.yarnpkg.com/@types/pouchdb-mapreduce/-/pouchdb-mapreduce-6.1.4.tgz#bc747eacd4e734a7486e9f4ef895fad7c45485e9" + integrity sha512-c8cZ8E9zEl7ZMcrE5jaF2qOm+cxQ01+B0NG9oGHVX3Mj5G8m4oIBAUELJmJw9LvEq3r9nXXn6g9TvvN8NiRalg== + dependencies: + "@types/pouchdb-core" "*" + +"@types/pouchdb-node@*": + version "6.1.3" + resolved "https://registry.yarnpkg.com/@types/pouchdb-node/-/pouchdb-node-6.1.3.tgz#ad998eccd683091af18e0fae1c01f09589bebfd6" + integrity sha512-rZb3eWGLKJo4LBhUIJLofyoric/5wKYI6HVUld8CfDWeVZgYVUJ/GEw/vXuqXsbgbsaNyk6XeU9461ULBt+0qg== + dependencies: + "@types/pouchdb-adapter-http" "*" + "@types/pouchdb-adapter-leveldb" "*" + "@types/pouchdb-core" "*" + "@types/pouchdb-mapreduce" "*" + "@types/pouchdb-replication" "*" + +"@types/pouchdb-replication@*": + version "6.4.2" + resolved "https://registry.yarnpkg.com/@types/pouchdb-replication/-/pouchdb-replication-6.4.2.tgz#e523764cdc9872f6493d5e039ce7bf54ee0a2888" + integrity sha512-BbuwkCv6nu8RUVjymUvhSw/Oo+VOCWyUpio3ujOoxhVdef/JZ5AUjsotgKWHiG0OtkZ8O5oCbAx5uH1Zf6w9XA== + dependencies: + "@types/pouchdb-core" "*" + "@types/pouchdb-find" "*" + +"@types/pouchdb@^6.4.0": + version "6.4.0" + resolved "https://registry.yarnpkg.com/@types/pouchdb/-/pouchdb-6.4.0.tgz#f9c41ca64b23029f9bf2eb4bf6956e6431cb79f8" + integrity sha512-eGCpX+NXhd5VLJuJMzwe3L79fa9+IDTrAG3CPaf4s/31PD56hOrhDJTSmRELSXuiqXr6+OHzzP0PldSaWsFt7w== + dependencies: + "@types/pouchdb-adapter-cordova-sqlite" "*" + "@types/pouchdb-adapter-fruitdown" "*" + "@types/pouchdb-adapter-http" "*" + "@types/pouchdb-adapter-idb" "*" + "@types/pouchdb-adapter-leveldb" "*" + "@types/pouchdb-adapter-localstorage" "*" + "@types/pouchdb-adapter-memory" "*" + "@types/pouchdb-adapter-node-websql" "*" + "@types/pouchdb-adapter-websql" "*" + "@types/pouchdb-browser" "*" + "@types/pouchdb-core" "*" + "@types/pouchdb-http" "*" + "@types/pouchdb-mapreduce" "*" + "@types/pouchdb-node" "*" + "@types/pouchdb-replication" "*" + "@types/prop-types@*": version "15.7.3" resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.3.tgz#2ab0d5da2e5815f94b0b9d4b95d1e5f243ab2ca7" @@ -2633,6 +2810,43 @@ abab@^2.0.0: resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.3.tgz#623e2075e02eb2d3f2475e49f99c91846467907a" integrity sha512-tsFzPpcttalNjFBCFMqsKYQcWxxen1pgJR56by//QwvJc4/OUS3kPOOttx2tSIfjsylB0pYu7f5D3K1RCxUnUg== +abort-controller@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/abort-controller/-/abort-controller-3.0.0.tgz#eaf54d53b62bae4138e809ca225c8439a6efb392" + integrity sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg== + dependencies: + event-target-shim "^5.0.0" + +abstract-leveldown@^6.2.1: + version "6.3.0" + resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-6.3.0.tgz#d25221d1e6612f820c35963ba4bd739928f6026a" + integrity sha512-TU5nlYgta8YrBMNpc9FwQzRbiXsj49gsALsXadbGHt9CROPzX5fB0rWDR5mtdpOOKa5XqRFpbj1QroPAoPzVjQ== + dependencies: + buffer "^5.5.0" + immediate "^3.2.3" + level-concat-iterator "~2.0.0" + level-supports "~1.0.0" + xtend "~4.0.0" + +abstract-leveldown@~6.0.0: + version "6.0.3" + resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-6.0.3.tgz#b4b6159343c74b0c5197b2817854782d8f748c4a" + integrity sha512-jzewKKpZbaYUa6HTThnrl+GrJhzjEAeuc7hTVpZdzg7kupXZFoqQDFwyOwLNbmJKJlmzw8yiipMPkDiuKkT06Q== + dependencies: + level-concat-iterator "~2.0.0" + xtend "~4.0.0" + +abstract-leveldown@~6.2.1, abstract-leveldown@~6.2.3: + version "6.2.3" + resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-6.2.3.tgz#036543d87e3710f2528e47040bc3261b77a9a8eb" + integrity sha512-BsLm5vFMRUrrLeCcRc+G0t2qOaTzpoJQLOubq2XM72eNpjF5UdU5o/5NvlNhx95XHcAvcl8OMXr4mlg/fRgUXQ== + dependencies: + buffer "^5.5.0" + immediate "^3.2.3" + level-concat-iterator "~2.0.0" + level-supports "~1.0.0" + xtend "~4.0.0" + accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.7: version "1.3.7" resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd" @@ -2894,6 +3108,11 @@ argparse@^1.0.7: dependencies: sprintf-js "~1.0.2" +argsarray@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/argsarray/-/argsarray-0.0.1.tgz#6e7207b4ecdb39b0af88303fa5ae22bda8df61cb" + integrity sha1-bnIHtOzbObCviDA/pa4ivajfYcs= + aria-query@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-3.0.0.tgz#65b3fcc1ca1155a8c9ae64d6eee297f15d5133cc" @@ -3850,6 +4069,11 @@ bser@2.1.1: dependencies: node-int64 "^0.4.0" +buffer-from@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.0.tgz#87fcaa3a298358e0ade6e442cfce840740d1ad04" + integrity sha512-c5mRlguI/Pe2dSZmpER62rSCu0ryKmWddzRYsuXc50U2/g8jMOulc31VZMa4mYx31U5xsmSOpDCgH88Vl9cDGQ== + buffer-from@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" @@ -3874,6 +4098,14 @@ buffer@^4.3.0: ieee754 "^1.1.4" isarray "^1.0.0" +buffer@^5.5.0: + version "5.6.0" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.6.0.tgz#a31749dc7d81d84db08abf937b6b8c4033f62786" + integrity sha512-/gDYp/UtU0eA1ys8bOs9J6a+E/KWIY+DZ+Q2WESNUA0jFRsJOc0SNUO6xJ5SGA1xueg3NL65W6s+NY5l9cunuw== + dependencies: + base64-js "^1.0.2" + ieee754 "^1.1.4" + builtin-status-codes@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" @@ -4335,6 +4567,11 @@ cliui@^6.0.0: strip-ansi "^6.0.0" wrap-ansi "^6.2.0" +clone-buffer@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/clone-buffer/-/clone-buffer-1.0.0.tgz#e3e25b207ac4e701af721e2cb5a16792cac3dc58" + integrity sha1-4+JbIHrE5wGvch4staFnksrD3Fg= + clone-deep@^0.2.4: version "0.2.4" resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-0.2.4.tgz#4e73dd09e9fb971cc38670c5dced9c1896481cc6" @@ -4442,7 +4679,7 @@ colors@^1.1.2: resolved "https://registry.yarnpkg.com/colors/-/colors-1.4.0.tgz#c50491479d4c1bdaed2c9ced32cf7c7dc2360f78" integrity sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA== -combined-stream@^1.0.6, combined-stream@~1.0.6: +combined-stream@^1.0.6, combined-stream@^1.0.8, combined-stream@~1.0.6: version "1.0.8" resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== @@ -5183,6 +5420,22 @@ default-gateway@^4.2.0: execa "^1.0.0" ip-regex "^2.1.0" +deferred-leveldown@~5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/deferred-leveldown/-/deferred-leveldown-5.1.0.tgz#c21e40641a8e48530255a4ad31371cc7fe76b332" + integrity sha512-PvDY+BT2ONu2XVRgxHb77hYelLtMYxKSGuWuJJdVRXh9ntqx9GYTFJno/SKAz5xcd+yjQwyQeIZrUPjPvA52mg== + dependencies: + abstract-leveldown "~6.0.0" + inherits "^2.0.3" + +deferred-leveldown@~5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/deferred-leveldown/-/deferred-leveldown-5.3.0.tgz#27a997ad95408b61161aa69bd489b86c71b78058" + integrity sha512-a59VOT+oDy7vtAbLRCZwWgxu2BaCfd5Hk7wxJd48ei7I+nsg8Orlb9CLG0PMZienk9BSUKgeAqkO2+Lw+1+Ukw== + dependencies: + abstract-leveldown "~6.2.1" + inherits "^2.0.3" + define-properties@^1.1.2, define-properties@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" @@ -5295,6 +5548,11 @@ detect-port@^1.3.0: address "^1.0.1" debug "^2.6.0" +dexie@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/dexie/-/dexie-3.0.1.tgz#faafeb94be0d5e18b25d700546a2c05725511cfc" + integrity sha512-/s4KzlaerQnCad/uY1ZNdFckTrbdMVhLlziYQzz62Ff9Ick1lHGomvTXNfwh4ApEZATyXRyVk5F6/y8UU84B0w== + diff-sequences@^24.9.0: version "24.9.0" resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-24.9.0.tgz#5715d6244e2aa65f48bba0bc972db0b0b11e95b5" @@ -5485,6 +5743,11 @@ dotenv@^8.0.0, dotenv@^8.2.0: resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-8.2.0.tgz#97e619259ada750eea3e4ea3e26bceea5424b16a" integrity sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw== +double-ended-queue@2.1.0-0: + version "2.1.0-0" + resolved "https://registry.yarnpkg.com/double-ended-queue/-/double-ended-queue-2.1.0-0.tgz#103d3527fd31528f40188130c841efdd78264e5c" + integrity sha1-ED01J/0xUo9AGIEwyEHv3XgmTlw= + duplexer@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.1.tgz#ace6ff808c1ce66b57d1ebf97977acb02334cfc1" @@ -5582,6 +5845,16 @@ encodeurl@~1.0.2: resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= +encoding-down@^6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/encoding-down/-/encoding-down-6.3.0.tgz#b1c4eb0e1728c146ecaef8e32963c549e76d082b" + integrity sha512-QKrV0iKR6MZVJV08QY0wp1e7vF6QbhnbQhb07bwpEyuz4uZiZgPlEGdkCROuFkUwdxlFaiPIhjyarH1ee/3vhw== + dependencies: + abstract-leveldown "^6.2.1" + inherits "^2.0.3" + level-codec "^9.0.0" + level-errors "^2.0.0" + encoding@^0.1.11: version "0.1.12" resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.12.tgz#538b66f3ee62cd1ab51ec323829d1f9480c74beb" @@ -5596,6 +5869,13 @@ end-of-stream@^1.0.0, end-of-stream@^1.1.0: dependencies: once "^1.4.0" +end-stream@~0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/end-stream/-/end-stream-0.1.0.tgz#32003f3f438a2b0143168137f8fa6e9866c81ed5" + integrity sha1-MgA/P0OKKwFDFoE3+PpumGbIHtU= + dependencies: + write-stream "~0.4.3" + enhanced-resolve@^4.0.0, enhanced-resolve@^4.1.0, enhanced-resolve@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.1.1.tgz#2937e2b8066cd0fe7ce0990a98f0d71a35189f66" @@ -5631,7 +5911,7 @@ env-ci@^4.5.1: execa "^3.2.0" java-properties "^1.0.0" -errno@^0.1.3, errno@~0.1.7: +errno@^0.1.3, errno@~0.1.1, errno@~0.1.7: version "0.1.7" resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.7.tgz#4684d71779ad39af177e3f007996f7c67c852618" integrity sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg== @@ -5703,6 +5983,11 @@ es5-shim@^4.5.13: resolved "https://registry.yarnpkg.com/es5-shim/-/es5-shim-4.5.13.tgz#5d88062de049f8969f83783f4a4884395f21d28b" integrity sha512-xi6hh6gsvDE0MaW4Vp1lgNEBpVcCXRWfPXj5egDvtgLz4L9MEvNwYEMdJH+JJinWkwa8c3c3o5HduV7dB/e1Hw== +es6-denodeify@^0.1.1: + version "0.1.5" + resolved "https://registry.yarnpkg.com/es6-denodeify/-/es6-denodeify-0.1.5.tgz#31d4d5fe9c5503e125460439310e16a2a3f39c1f" + integrity sha1-MdTV/pxVA+ElRgQ5MQ4WoqPznB8= + es6-iterator@2.0.3, es6-iterator@~2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7" @@ -5971,6 +6256,11 @@ etag@~1.8.1: resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= +event-target-shim@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/event-target-shim/-/event-target-shim-5.0.1.tgz#5d4d3ebdf9583d63a5333ce2deb7480ab2b05789" + integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ== + eventemitter3@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.0.tgz#d65176163887ee59f386d64c82610b696a4a74eb" @@ -6161,6 +6451,11 @@ fake-tag@^1.0.0, fake-tag@^1.0.1: resolved "https://registry.yarnpkg.com/fake-tag/-/fake-tag-1.0.1.tgz#1d59da482240a02bd83500ca98976530ed154b0d" integrity sha512-qmewZoBpa71mM+y6oxXYW/d1xOYQmeIvnEXAt1oCmdP0sqcogWYLepR87QL1jQVLSVMVYDq2cjY6ec/Wu8/4pg== +fake-xml-http-request@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/fake-xml-http-request/-/fake-xml-http-request-2.1.1.tgz#279fdac235840d7a4dff77d98ec44bce9fc690a6" + integrity sha512-Kn2WYYS6cDBS5jq/voOfSGCA0TafOYAUPbEp8mUVpD/DVV5bQIDjlq+MLLvNUokkbTpjBVlLDaM5PnX+PwZMlw== + fast-deep-equal@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49" @@ -6254,6 +6549,14 @@ fbjs@^0.8.0: setimmediate "^1.0.5" ua-parser-js "^0.7.18" +fetch-cookie@0.7.3: + version "0.7.3" + resolved "https://registry.yarnpkg.com/fetch-cookie/-/fetch-cookie-0.7.3.tgz#b8d023f421dd2b2f4a0eca9cd7318a967ed4eed8" + integrity sha512-rZPkLnI8x5V+zYAiz8QonAHsTb4BY+iFowFBI1RFn0zrO343AVp9X7/yUj/9wL6Ef/8fLls8b/vGtzUvmyAUGA== + dependencies: + es6-denodeify "^0.1.1" + tough-cookie "^2.3.3" + figgy-pudding@^3.5.1: version "3.5.1" resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.1.tgz#862470112901c727a0e495a80744bd5baa1d6790" @@ -6535,6 +6838,15 @@ fork-ts-checker-webpack-plugin@^3.1.1: tapable "^1.0.0" worker-rpc "^0.1.0" +form-data@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-3.0.0.tgz#31b7e39c85f1355b7139ee0c647cf0de7f83c682" + integrity sha512-CKMFDglpbMi6PyN+brwB9Q/GOw0eAnsrEZDgcsH5Krhz5Od/haKHAX0NmQfha2zPPz0JpWzA7GJHGSnvCRLWsg== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.8" + mime-types "^2.1.12" + form-data@~2.3.2: version "2.3.3" resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" @@ -6881,6 +7193,11 @@ graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6 resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.3.tgz#4a12ff1b60376ef09862c2093edd908328be8423" integrity sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ== +graceful-fs@^4.1.3: + version "4.2.4" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb" + integrity sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw== + graphql@^15.0.0: version "15.0.0" resolved "https://registry.yarnpkg.com/graphql/-/graphql-15.0.0.tgz#042a5eb5e2506a2e2111ce41eb446a8e570b8be9" @@ -7390,6 +7707,16 @@ ignore@^4.0.6: resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== +immediate@3.0.6: + version "3.0.6" + resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.0.6.tgz#9db1dbd0faf8de6fbe0f5dd5e56bb606280de69b" + integrity sha1-nbHb0Pr43m++D13V5Wu2BigN5ps= + +immediate@^3.2.3: + version "3.2.3" + resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.2.3.tgz#d140fa8f614659bd6541233097ddaac25cdd991c" + integrity sha1-0UD6j2FGWb1lQSMwl92qwlzdmRw= + immer@1.10.0: version "1.10.0" resolved "https://registry.yarnpkg.com/immer/-/immer-1.10.0.tgz#bad67605ba9c810275d91e1c2a47d4582e98286d" @@ -7458,6 +7785,11 @@ infer-owner@^1.0.3, infer-owner@^1.0.4: resolved "https://registry.yarnpkg.com/infer-owner/-/infer-owner-1.0.4.tgz#c4cefcaa8e51051c2a40ba2ce8a3d27295af9467" integrity sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A== +inflected@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inflected/-/inflected-2.0.4.tgz#323770961ccbe992a98ea930512e9a82d3d3ef77" + integrity sha512-HQPzFLTTUvwfeUH6RAGjD8cHS069mBqXG5n4qaxX7sJXBhVQrsGgF+0ZJGkSuN6a8pcUWB/GXStta11kKi/WvA== + inflight@^1.0.4: version "1.0.6" resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" @@ -7466,7 +7798,7 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.1, inherits@~2.0.3: +inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, inherits@~2.0.3: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== @@ -8957,6 +9289,113 @@ left-pad@^1.3.0: resolved "https://registry.yarnpkg.com/left-pad/-/left-pad-1.3.0.tgz#5b8a3a7765dfe001261dde915589e782f8c94d1e" integrity sha512-XI5MPzVNApjAyhQzphX8BkmKsKUxD4LdyK24iZeQGinBN9yTQT3bFlCBy/aVx2HrNcqQGsdot8ghrjyrvMCoEA== +level-codec@9.0.1, level-codec@^9.0.0: + version "9.0.1" + resolved "https://registry.yarnpkg.com/level-codec/-/level-codec-9.0.1.tgz#042f4aa85e56d4328ace368c950811ba802b7247" + integrity sha512-ajFP0kJ+nyq4i6kptSM+mAvJKLOg1X5FiFPtLG9M5gCEZyBmgDi3FkDrvlMkEzrUn1cWxtvVmrvoS4ASyO/q+Q== + +level-concat-iterator@~2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/level-concat-iterator/-/level-concat-iterator-2.0.1.tgz#1d1009cf108340252cb38c51f9727311193e6263" + integrity sha512-OTKKOqeav2QWcERMJR7IS9CUo1sHnke2C0gkSmcR7QuEtFNLLzHQAvnMw8ykvEcv0Qtkg0p7FOwP1v9e5Smdcw== + +level-errors@^2.0.0, level-errors@~2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/level-errors/-/level-errors-2.0.1.tgz#2132a677bf4e679ce029f517c2f17432800c05c8" + integrity sha512-UVprBJXite4gPS+3VznfgDSU8PTRuVX0NXwoWW50KLxd2yw4Y1t2JUR5In1itQnudZqRMT9DlAM3Q//9NCjCFw== + dependencies: + errno "~0.1.1" + +level-iterator-stream@~4.0.0: + version "4.0.2" + resolved "https://registry.yarnpkg.com/level-iterator-stream/-/level-iterator-stream-4.0.2.tgz#7ceba69b713b0d7e22fcc0d1f128ccdc8a24f79c" + integrity sha512-ZSthfEqzGSOMWoUGhTXdX9jv26d32XJuHz/5YnuHZzH6wldfWMOVwI9TBtKcya4BKTyTt3XVA0A3cF3q5CY30Q== + dependencies: + inherits "^2.0.4" + readable-stream "^3.4.0" + xtend "^4.0.2" + +level-js@^5.0.0: + version "5.0.2" + resolved "https://registry.yarnpkg.com/level-js/-/level-js-5.0.2.tgz#5e280b8f93abd9ef3a305b13faf0b5397c969b55" + integrity sha512-SnBIDo2pdO5VXh02ZmtAyPP6/+6YTJg2ibLtl9C34pWvmtMEmRTWpra+qO/hifkUtBTOtfx6S9vLDjBsBK4gRg== + dependencies: + abstract-leveldown "~6.2.3" + buffer "^5.5.0" + inherits "^2.0.3" + ltgt "^2.1.2" + +level-packager@^5.1.0: + version "5.1.1" + resolved "https://registry.yarnpkg.com/level-packager/-/level-packager-5.1.1.tgz#323ec842d6babe7336f70299c14df2e329c18939" + integrity sha512-HMwMaQPlTC1IlcwT3+swhqf/NUO+ZhXVz6TY1zZIIZlIR0YSn8GtAAWmIvKjNY16ZkEg/JcpAuQskxsXqC0yOQ== + dependencies: + encoding-down "^6.3.0" + levelup "^4.3.2" + +level-supports@~1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/level-supports/-/level-supports-1.0.1.tgz#2f530a596834c7301622521988e2c36bb77d122d" + integrity sha512-rXM7GYnW8gsl1vedTJIbzOrRv85c/2uCMpiiCzO2fndd06U/kUXEEU9evYn4zFggBOg36IsBW8LzqIpETwwQzg== + dependencies: + xtend "^4.0.2" + +level-write-stream@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/level-write-stream/-/level-write-stream-1.0.0.tgz#3f7fbb679a55137c0feb303dee766e12ee13c1dc" + integrity sha1-P3+7Z5pVE3wP6zA97nZuEu4Twdw= + dependencies: + end-stream "~0.1.0" + +level@6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/level/-/level-6.0.0.tgz#d216fb9b9c3940bcec15c5880d8da775ca086c5c" + integrity sha512-3oAi7gXLLNr7pHj8c4vbI6lHkXf35m8qb7zWMrNTrOax6CXBVggQAwL1xnC/1CszyYrW3BsLXsY5TMgTxtKfFA== + dependencies: + level-js "^5.0.0" + level-packager "^5.1.0" + leveldown "^5.4.0" + opencollective-postinstall "^2.0.0" + +leveldown@5.4.1: + version "5.4.1" + resolved "https://registry.yarnpkg.com/leveldown/-/leveldown-5.4.1.tgz#83a8fdd9bb52b1ed69be2ef59822b6cdfcdb51ec" + integrity sha512-3lMPc7eU3yj5g+qF1qlALInzIYnkySIosR1AsUKFjL9D8fYbTLuENBAeDRZXIG4qeWOAyqRItOoLu2v2avWiMA== + dependencies: + abstract-leveldown "~6.2.1" + napi-macros "~2.0.0" + node-gyp-build "~4.1.0" + +leveldown@^5.4.0: + version "5.6.0" + resolved "https://registry.yarnpkg.com/leveldown/-/leveldown-5.6.0.tgz#16ba937bb2991c6094e13ac5a6898ee66d3eee98" + integrity sha512-iB8O/7Db9lPaITU1aA2txU/cBEXAt4vWwKQRrrWuS6XDgbP4QZGj9BL2aNbwb002atoQ/lIotJkfyzz+ygQnUQ== + dependencies: + abstract-leveldown "~6.2.1" + napi-macros "~2.0.0" + node-gyp-build "~4.1.0" + +levelup@4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/levelup/-/levelup-4.1.0.tgz#49ab5d3a341731cd102f91c6bc17a1acb1969a17" + integrity sha512-+Qhe2/jb5affN7BeFgWUUWVdYoGXO2nFS3QLEZKZynnQyP9xqA+7wgOz3fD8SST2UKpHQuZgjyJjTcB2nMl2dQ== + dependencies: + deferred-leveldown "~5.1.0" + level-errors "~2.0.0" + level-iterator-stream "~4.0.0" + xtend "~4.0.0" + +levelup@^4.3.2: + version "4.4.0" + resolved "https://registry.yarnpkg.com/levelup/-/levelup-4.4.0.tgz#f89da3a228c38deb49c48f88a70fb71f01cafed6" + integrity sha512-94++VFO3qN95cM/d6eBXvd894oJE0w3cInq9USsyQzzoJxmiYzPAocNcuGCPGGjoXqDVJcr3C1jzt1TSjyaiLQ== + dependencies: + deferred-leveldown "~5.3.0" + level-errors "~2.0.0" + level-iterator-stream "~4.0.0" + level-supports "~1.0.0" + xtend "~4.0.0" + leven@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" @@ -9056,16 +9495,116 @@ lodash._reinterpolate@^3.0.0: resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d" integrity sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0= +lodash.assign@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-4.2.0.tgz#0d99f3ccd7a6d261d19bdaeb9245005d285808e7" + integrity sha1-DZnzzNem0mHRm9rrkkUAXShYCOc= + +lodash.camelcase@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" + integrity sha1-soqmKIorn8ZRA1x3EfZathkDMaY= + +lodash.clonedeep@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" + integrity sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8= + +lodash.compact@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/lodash.compact/-/lodash.compact-3.0.1.tgz#540ce3837745975807471e16b4a2ba21e7256ca5" + integrity sha1-VAzjg3dFl1gHRx4WtKK6IeclbKU= + lodash.debounce@^4.0.8: version "4.0.8" resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" integrity sha1-gteb/zCmfEAF/9XiUVMArZyk168= +lodash.find@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash.find/-/lodash.find-4.6.0.tgz#cb0704d47ab71789ffa0de8b97dd926fb88b13b1" + integrity sha1-ywcE1Hq3F4n/oN6Ll92Sb7iLE7E= + +lodash.flatten@^4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/lodash.flatten/-/lodash.flatten-4.4.0.tgz#f31c22225a9632d2bbf8e4addbef240aa765a61f" + integrity sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8= + +lodash.forin@^4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/lodash.forin/-/lodash.forin-4.4.0.tgz#5d3f20ae564011fbe88381f7d98949c9c9519731" + integrity sha1-XT8grlZAEfvog4H32YlJyclRlzE= + +lodash.get@^4.4.2: + version "4.4.2" + resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99" + integrity sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk= + +lodash.has@^4.5.2: + version "4.5.2" + resolved "https://registry.yarnpkg.com/lodash.has/-/lodash.has-4.5.2.tgz#d19f4dc1095058cccbe2b0cdf4ee0fe4aa37c862" + integrity sha1-0Z9NwQlQWMzL4rDN9O4P5Ko3yGI= + +lodash.invokemap@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash.invokemap/-/lodash.invokemap-4.6.0.tgz#1748cda5d8b0ef8369c4eb3ec54c21feba1f2d62" + integrity sha1-F0jNpdiw74NpxOs+xUwh/rofLWI= + +lodash.isempty@^4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/lodash.isempty/-/lodash.isempty-4.4.0.tgz#6f86cbedd8be4ec987be9aaf33c9684db1b31e7e" + integrity sha1-b4bL7di+TsmHvpqvM8loTbGzHn4= + +lodash.isequal@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0" + integrity sha1-QVxEePK8wwEgwizhDtMib30+GOA= + +lodash.isfunction@^3.0.9: + version "3.0.9" + resolved "https://registry.yarnpkg.com/lodash.isfunction/-/lodash.isfunction-3.0.9.tgz#06de25df4db327ac931981d1bdb067e5af68d051" + integrity sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw== + +lodash.isinteger@^4.0.4: + version "4.0.4" + resolved "https://registry.yarnpkg.com/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz#619c0af3d03f8b04c31f5882840b77b11cd68343" + integrity sha1-YZwK89A/iwTDH1iChAt3sRzWg0M= + +lodash.isplainobject@^4.0.6: + version "4.0.6" + resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb" + integrity sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs= + +lodash.lowerfirst@^4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/lodash.lowerfirst/-/lodash.lowerfirst-4.3.1.tgz#de3c7b12e02c6524a0059c2f6cb7c5c52655a13d" + integrity sha1-3jx7EuAsZSSgBZwvbLfFxSZVoT0= + +lodash.map@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash.map/-/lodash.map-4.6.0.tgz#771ec7839e3473d9c4cde28b19394c3562f4f6d3" + integrity sha1-dx7Hg540c9nEzeKLGTlMNWL09tM= + +lodash.mapvalues@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash.mapvalues/-/lodash.mapvalues-4.6.0.tgz#1bafa5005de9dd6f4f26668c30ca37230cc9689c" + integrity sha1-G6+lAF3p3W9PJmaMMMo3IwzJaJw= + lodash.memoize@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" integrity sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4= +lodash.pick@^4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/lodash.pick/-/lodash.pick-4.4.0.tgz#52f05610fff9ded422611441ed1fc123a03001b3" + integrity sha1-UvBWEP/53tQiYRRB7R/BI6AwAbM= + +lodash.snakecase@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz#39d714a35357147837aefd64b5dcbb16becd8f8d" + integrity sha1-OdcUo1NXFHg3rv1ktdy7Fr7Nj40= + lodash.sortby@^4.7.0: version "4.7.0" resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" @@ -9101,7 +9640,17 @@ lodash.uniq@4.5.0, lodash.uniq@^4.5.0: resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M= -"lodash@>=3.5 <5", lodash@^4.0.1, lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.4, lodash@^4.17.5: +lodash.uniqby@^4.7.0: + version "4.7.0" + resolved "https://registry.yarnpkg.com/lodash.uniqby/-/lodash.uniqby-4.7.0.tgz#d99c07a669e9e6d24e1362dfe266c67616af1302" + integrity sha1-2ZwHpmnp5tJOE2Lf4mbGdhavEwI= + +lodash.values@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/lodash.values/-/lodash.values-4.3.0.tgz#a3a6c2b0ebecc5c2cba1c17e6e620fe81b53d347" + integrity sha1-o6bCsOvsxcLLocF+bmIP6BtT00c= + +lodash@4, "lodash@>=3.5 <5", lodash@^4.0.1, lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.4, lodash@^4.17.5: version "4.17.15" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== @@ -9146,6 +9695,17 @@ loud-rejection@^1.0.0: currently-unhandled "^0.4.1" signal-exit "^3.0.0" +lowdb@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/lowdb/-/lowdb-1.0.0.tgz#5243be6b22786ccce30e50c9a33eac36b20c8064" + integrity sha512-2+x8esE/Wb9SQ1F9IHaYWfsC9FIecLOPrK4g17FGEayjUWH172H6nwicRovGvSE2CPZouc2MCIqCI7h9d+GftQ== + dependencies: + graceful-fs "^4.1.3" + is-promise "^2.1.0" + lodash "4" + pify "^3.0.0" + steno "^0.4.1" + lower-case@^1.1.1: version "1.1.4" resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-1.1.4.tgz#9a2cabd1b9e8e0ae993a4bf7d5875c39c42e8eac" @@ -9174,6 +9734,11 @@ lru-cache@^5.1.1: dependencies: yallist "^3.0.2" +ltgt@2.2.1, ltgt@^2.1.2: + version "2.2.1" + resolved "https://registry.yarnpkg.com/ltgt/-/ltgt-2.2.1.tgz#f35ca91c493f7b73da0e07495304f17b31f87ee5" + integrity sha1-81ypHEk/e3PaDgdJUwTxezH4fuU= + make-dir@^2.0.0, make-dir@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5" @@ -9575,6 +10140,38 @@ minipass@^3.0.0, minipass@^3.1.1: dependencies: yallist "^4.0.0" +miragejs@^0.1.38: + version "0.1.38" + resolved "https://registry.yarnpkg.com/miragejs/-/miragejs-0.1.38.tgz#f2fd3f02d1470119c9aa654c9484785dcdd83e1a" + integrity sha512-6vw0U7QxR9aCHC+u7J+oaUeMxmxwgbUQLxglTINSzqNKfRgWSYk4XtZtgxmkOAheo2fzaNZa+XglbN1iAoRYUg== + dependencies: + "@miragejs/pretender-node-polyfill" "^0.1.0" + inflected "^2.0.4" + lodash.assign "^4.2.0" + lodash.camelcase "^4.3.0" + lodash.clonedeep "^4.5.0" + lodash.compact "^3.0.1" + lodash.find "^4.6.0" + lodash.flatten "^4.4.0" + lodash.forin "^4.4.0" + lodash.get "^4.4.2" + lodash.has "^4.5.2" + lodash.invokemap "^4.6.0" + lodash.isempty "^4.4.0" + lodash.isequal "^4.5.0" + lodash.isfunction "^3.0.9" + lodash.isinteger "^4.0.4" + lodash.isplainobject "^4.0.6" + lodash.lowerfirst "^4.3.1" + lodash.map "^4.6.0" + lodash.mapvalues "^4.6.0" + lodash.pick "^4.4.0" + lodash.snakecase "^4.1.1" + lodash.uniq "^4.5.0" + lodash.uniqby "^4.7.0" + lodash.values "^4.3.0" + pretender "^3.4.0" + mississippi@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-3.0.0.tgz#ea0a3291f97e0b5e8776b363d5f0a12d94c67022" @@ -9704,6 +10301,11 @@ nanomatch@^1.2.9: snapdragon "^0.8.1" to-regex "^3.0.1" +napi-macros@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/napi-macros/-/napi-macros-2.0.0.tgz#2b6bae421e7b96eb687aa6c77a7858640670001b" + integrity sha512-A0xLykHtARfueITVDernsAWdtIMbOJgKgcluwENp3AlsKN/PloyO10HtmoqnFAQAcxPkgZN7wdfPfEd0zNGxbg== + natural-compare@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" @@ -9748,6 +10350,11 @@ node-dir@^0.1.10, node-dir@^0.1.17: dependencies: minimatch "^3.0.2" +node-fetch@2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.4.1.tgz#b2e38f1117b8acbedbe0524f041fb3177188255d" + integrity sha512-P9UbpFK87NyqBZzUuDBDz4f6Yiys8xm8j7ACDbi6usvFm6KItklQUKjeoqTrYS/S1k6I8oaOC2YLLDr/gg26Mw== + node-fetch@^1.0.1: version "1.7.3" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.7.3.tgz#980f6f72d85211a5347c6b2bc18c5b84c3eb47ef" @@ -9766,6 +10373,11 @@ node-forge@0.9.0: resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.9.0.tgz#d624050edbb44874adca12bb9a52ec63cb782579" integrity sha512-7ASaDa3pD+lJ3WvXFsxekJQelBKRpne+GOVbLbtHYdd7pFspyeuJHnWfLplGf3SwKGbfs/aYl5V/JCIaHVUKKQ== +node-gyp-build@~4.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.1.1.tgz#d7270b5d86717068d114cc57fff352f96d745feb" + integrity sha512-dSq1xmcPDKPZ2EED2S6zw/b9NKsqzXRE6dVr8TVQnI3FJOTteUMuqF3Qqs6LZg+mLGYJWqQzMbIjMtJqTv87nQ== + node-int64@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" @@ -10083,6 +10695,11 @@ open@^7.0.0: dependencies: is-wsl "^2.1.0" +opencollective-postinstall@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/opencollective-postinstall/-/opencollective-postinstall-2.0.2.tgz#5657f1bede69b6e33a45939b061eb53d3c6c3a89" + integrity sha512-pVOEP16TrAO2/fjej1IdOyupJY8KDUM1CvsaScRbw6oddvpQoOfGk4ywha0HKKVAD6RkW4x6Q+tNBwhf3Bgpuw== + openurl@1.1.1, openurl@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/openurl/-/openurl-1.1.1.tgz#3875b4b0ef7a52c156f0db41d4609dbb0f94b387" @@ -11287,6 +11904,32 @@ postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.14, postcss@^7.0.16, postcss@^7.0.1 source-map "^0.6.1" supports-color "^6.1.0" +pouchdb@^7.2.1: + version "7.2.1" + resolved "https://registry.yarnpkg.com/pouchdb/-/pouchdb-7.2.1.tgz#619e3d5c2463ddd94a4b1bf40d44408c46e9de79" + integrity sha512-AoDPdr6tFqj3xs7oiD2oioYj5MMu87c3UemRHZ/p++BwU+ZsKn5jpnL09OvWTLvMvaICGAOufiaUzmM1/KKoKQ== + dependencies: + abort-controller "3.0.0" + argsarray "0.0.1" + buffer-from "1.1.0" + clone-buffer "1.0.0" + double-ended-queue "2.1.0-0" + fetch-cookie "0.7.3" + immediate "3.0.6" + inherits "2.0.4" + level "6.0.0" + level-codec "9.0.1" + level-write-stream "1.0.0" + leveldown "5.4.1" + levelup "4.1.0" + ltgt "2.2.1" + node-fetch "2.4.1" + readable-stream "1.0.33" + spark-md5 "3.0.0" + through2 "3.0.1" + uuid "3.3.3" + vuvuzela "1.0.3" + prelude-ls@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" @@ -11297,6 +11940,14 @@ prepend-http@^1.0.0: resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" integrity sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw= +pretender@^3.4.0: + version "3.4.1" + resolved "https://registry.yarnpkg.com/pretender/-/pretender-3.4.1.tgz#04345d99f0da8266f545ff377d4a9f23db9b99dd" + integrity sha512-qIQk0vKo739Dbx940Qq2hMZjIXHxWj9bDRQCfWSgoMWDfZTgn0bJ3lD0aJa37F5/MRzG5AtbYXf5JHzoXMsW/Q== + dependencies: + fake-xml-http-request "^2.1.1" + route-recognizer "^0.3.3" + prettier-linter-helpers@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz#d23d41fe1375646de2d0104d3454a3008802cf7b" @@ -12245,6 +12896,25 @@ read-pkg@^3.0.0: string_decoder "~1.1.1" util-deprecate "~1.0.1" +readable-stream@1.0.33: + version "1.0.33" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.33.tgz#3a360dd66c1b1d7fd4705389860eda1d0f61126c" + integrity sha1-OjYN1mwbHX/UcFOJhg7aHQ9hEmw= + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "0.0.1" + string_decoder "~0.10.x" + +"readable-stream@2 || 3", readable-stream@^3.4.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" + integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + readable-stream@^3.0.6, readable-stream@^3.1.1: version "3.4.0" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.4.0.tgz#a51c26754658e0a3c21dbf59163bd45ba6f447fc" @@ -12254,6 +12924,11 @@ readable-stream@^3.0.6, readable-stream@^3.1.1: string_decoder "^1.1.1" util-deprecate "^1.0.1" +readable-stream@~0.0.2: + version "0.0.4" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-0.0.4.tgz#f32d76e3fb863344a548d79923007173665b3b8d" + integrity sha1-8y124/uGM0SlSNeZIwBxc2ZbO40= + readdirp@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525" @@ -12755,6 +13430,11 @@ rotating-file-stream@^1.4.6: resolved "https://registry.yarnpkg.com/rotating-file-stream/-/rotating-file-stream-1.4.6.tgz#42725b951835f6c3b5c16f8f6126e65758ef1d61" integrity sha512-QS7vGxBK6sGc1mCqlmAuwV4J0fmmVCKaUgMvKbkTueZr4jdkXN3bSpTEOQxtdtAVEzi1aUqdHzwIQ0ejNn+CQg== +route-recognizer@^0.3.3: + version "0.3.4" + resolved "https://registry.yarnpkg.com/route-recognizer/-/route-recognizer-0.3.4.tgz#39ab1ffbce1c59e6d2bdca416f0932611e4f3ca3" + integrity sha512-2+MhsfPhvauN1O8KaXpXAOfR/fwe8dnUXVM+xw7yt40lJRfPVQxV6yryZm0cgRvAj5fMF/mdRZbL2ptwbs5i2g== + rsvp@^4.8.4: version "4.8.5" resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-4.8.5.tgz#c8f155311d167f68f21e168df71ec5b083113734" @@ -13263,6 +13943,11 @@ space-separated-tokens@^1.0.0, space-separated-tokens@^1.1.2: resolved "https://registry.yarnpkg.com/space-separated-tokens/-/space-separated-tokens-1.1.4.tgz#27910835ae00d0adfcdbd0ad7e611fb9544351fa" integrity sha512-UyhMSmeIqZrQn2UdjYpxEkwY9JUrn8pP+7L4f91zRzOQuI8MF1FGLfYU9DKCYeLdo7LXMxwrX5zKFy7eeeVHuA== +spark-md5@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/spark-md5/-/spark-md5-3.0.0.tgz#3722227c54e2faf24b1dc6d933cc144e6f71bfef" + integrity sha1-NyIifFTi+vJLHcbZM8wUTm9xv+8= + spdx-correct@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.0.tgz#fb83e504445268f154b074e218c87c003cd31df4" @@ -13404,6 +14089,13 @@ stealthy-require@^1.1.1: resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b" integrity sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks= +steno@^0.4.1: + version "0.4.4" + resolved "https://registry.yarnpkg.com/steno/-/steno-0.4.4.tgz#071105bdfc286e6615c0403c27e9d7b5dcb855cb" + integrity sha1-BxEFvfwobmYVwEA8J+nXtdy4Vcs= + dependencies: + graceful-fs "^4.1.3" + store2@^2.7.1: version "2.10.0" resolved "https://registry.yarnpkg.com/store2/-/store2-2.10.0.tgz#46b82bb91878daf1b0d56dec2f1d41e54d5103cf" @@ -13627,6 +14319,11 @@ string_decoder@^1.0.0, string_decoder@^1.1.1: dependencies: safe-buffer "~5.2.0" +string_decoder@~0.10.x: + version "0.10.31" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" + integrity sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ= + string_decoder@~1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" @@ -13961,6 +14658,13 @@ throttle-debounce@^2.1.0: resolved "https://registry.yarnpkg.com/throttle-debounce/-/throttle-debounce-2.1.0.tgz#257e648f0a56bd9e54fe0f132c4ab8611df4e1d5" integrity sha512-AOvyNahXQuU7NN+VVvOOX+uW6FPaWdAOdRP5HfwYxAfCzXTFKRMoIMk+n+po318+ktcChx+F1Dd91G3YHeMKyg== +through2@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/through2/-/through2-3.0.1.tgz#39276e713c3302edf9e388dd9c812dd3b825bd5a" + integrity sha512-M96dvTalPT3YbYLaKaCuwu+j06D/8Jfib0o/PxbVt6Amhv3dUAtW6rTV1jPgJSBG83I/e04Y6xkVdVhSRhi0ww== + dependencies: + readable-stream "2 || 3" + through2@^2.0.0, through2@^2.0.2, through2@~2.0.3: version "2.0.5" resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" @@ -14601,7 +15305,7 @@ utils-merge@1.0.1: resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= -uuid@^3.0.1, uuid@^3.1.0, uuid@^3.3.2, uuid@^3.3.3: +uuid@3.3.3, uuid@^3.0.1, uuid@^3.1.0, uuid@^3.3.2, uuid@^3.3.3: version "3.3.3" resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.3.tgz#4568f0216e78760ee1dbf3a4d2cf53e224112866" integrity sha512-pW0No1RGHgzlpHJO1nsVrHKpOEIxkGg1xB+v0ZmdNH5OAeAwzAVrCnI2/6Mtx+Uys6iaylxa+D3g4j63IKKjSQ== @@ -14710,6 +15414,11 @@ vue-template-compiler@^2.0.0: de-indent "^1.0.2" he "^1.1.0" +vuvuzela@1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/vuvuzela/-/vuvuzela-1.0.3.tgz#3be145e58271c73ca55279dd851f12a682114b0b" + integrity sha1-O+FF5YJxxzylUnndhR8SpoIRSws= + w3c-hr-time@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.1.tgz#82ac2bff63d950ea9e3189a58a65625fedf19045" @@ -15244,6 +15953,13 @@ write-file-atomic@^2.3.0: imurmurhash "^0.1.4" signal-exit "^3.0.2" +write-stream@~0.4.3: + version "0.4.3" + resolved "https://registry.yarnpkg.com/write-stream/-/write-stream-0.4.3.tgz#83cc8c0347d0af6057a93862b4e3ae01de5c81c1" + integrity sha1-g8yMA0fQr2BXqThitOOuAd5cgcE= + dependencies: + readable-stream "~0.0.2" + write@1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/write/-/write-1.0.3.tgz#0800e14523b923a387e415123c865616aae0f5c3" @@ -15285,7 +16001,7 @@ xregexp@4.0.0: resolved "https://registry.yarnpkg.com/xregexp/-/xregexp-4.0.0.tgz#e698189de49dd2a18cc5687b05e17c8e43943020" integrity sha512-PHyM+sQouu7xspQQwELlGwwd05mXUFqwFYfqPO0cC7x4fxyHnnuetmQr6CjJiafIDoH4MogHb9dOoJzR/Y4rFg== -xtend@^4.0.0, xtend@^4.0.1, xtend@~4.0.1: +xtend@^4.0.0, xtend@^4.0.1, xtend@^4.0.2, xtend@~4.0.0, xtend@~4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==