diff --git a/CHANGELOG.md b/CHANGELOG.md index 7b1f15cc..122a2e93 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,9 +4,20 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html). +## [2.4.0] - 2020-11-15 + +Ackee now ignores your own visits once you have logged into the dashboard. Make sure to enable the [`ignoreOwnVisits` option in ackee-tracker](https://github.com/electerious/ackee-tracker#-options) to use this feature. It's currently opt-in, because it requires [a new `Access-Control-Allow-Credentials` header](docs/CORS%20headers.md#credentials), which wasn't previously required. It will be turned on by default in the next major release of Ackee. + +> ℹ️ Some browsers strictly block third-party cookies when Ackee runs on a different domain than the site you're visiting. Therefore, it may happen that your own visits still find their way into your statistics, even when the option `ignoreOwnVisits` is turned on. + +### Added + +- Ignore own visits (#100, thanks @yehudab) +- Tons of new tests (#171, thanks @yehudab) + ## [2.3.0] - 2020-11-04 -This release adds [support for Vercel](https://github.com/electerious/Ackee/blob/master/docs/Get%20started.md) and updates the included `ackee-tracker` which now ignores bots. +This release adds [support for Vercel](docs/Get%20started.md) and updates the included `ackee-tracker` which now ignores bots. ### Added @@ -15,7 +26,7 @@ This release adds [support for Vercel](https://github.com/electerious/Ackee/blob ### Changed -- `ackee-tracker` updated to version 4.1.0 +- ackee-tracker updated to version 4.1.0 ## [2.2.0] - 2020-11-01 @@ -42,7 +53,7 @@ This release introduces support for serverless functions. You can now deploy Ack ### Added - Support for serverless functions and Netlify (#155) -- Added "Deploy to Netlify" to the [Get Started](https://github.com/electerious/Ackee/blob/master/docs/Get%20started.md) guide +- Added "Deploy to Netlify" to the [Get Started](docs/Get%20started.md) guide - Build all static files into `/dist` by running `yarn build` - Start the server without rebuilding static files using `yarn server` @@ -159,7 +170,7 @@ The first major back-end and front-end rewrite of Ackee with new API, dashboard, ### Added -- Ackee can track detailed data ([optional](https://github.com/electerious/ackee-tracker#options)) and now shows more of them in the "Detailed"-menu +- Ackee can track detailed data ([optional](https://github.com/electerious/ackee-tracker#-options)) and now shows more of them in the "Detailed"-menu ## [1.4.3] - 2020-01-12 diff --git a/docs/CORS headers.md b/docs/CORS headers.md index 393ef8e8..5d1b9067 100644 --- a/docs/CORS headers.md +++ b/docs/CORS headers.md @@ -15,6 +15,7 @@ When a site wants to send data to a different domain it needs the permissions to Access-Control-Allow-Origin: https://example.com Access-Control-Allow-Methods: GET, POST, PATCH, OPTIONS Access-Control-Allow-Headers: Content-Type +Access-Control-Allow-Credentials: true ``` ### Origin @@ -47,6 +48,16 @@ The `Access-Control-Allow-Headers` header is used in response to a preflight req Access-Control-Allow-Headers: Content-Type ``` +### Credentials + +The `Access-Control-Allow-Credentials` header tells the browser to include the `ackee_ignore` cookie in requests even when you're on a different (sub-)domain. This allows Ackee to ignore your own visits when the [`ignoreOwnVisits` option in ackee-tracker](https://github.com/electerious/ackee-tracker#-options) is enabled and when your browser doesn't block third-party cookies. + +> ℹ️ Some browsers strictly block third-party cookies when Ackee runs on a different domain than the site you're visiting. Therefore, it may happen that your own visits still find their way into your statistics, even when the option `ignoreOwnVisits` is turned on. + +``` +Access-Control-Allow-Credentials: true +``` + ## Heroku or Platforms-As-A-Service configuration If you are running Ackee on a platform which handles SSL for you, you may want a quick solution for setting CORS headers instead of using a [reverse proxy](SSL%20and%20HTTPS.md). diff --git a/docs/SSL and HTTPS.md b/docs/SSL and HTTPS.md index eb5cecc7..763b27c3 100644 --- a/docs/SSL and HTTPS.md +++ b/docs/SSL and HTTPS.md @@ -36,6 +36,7 @@ server { add_header Access-Control-Allow-Origin "*" always; add_header Access-Control-Allow-Methods "GET, POST, PATCH, OPTIONS" always; add_header Access-Control-Allow-Headers "Content-Type" always; + add_header Access-Control-Allow-Credentials "true" always; add_header Strict-Transport-Security "max-age=31536000" always; add_header X-Frame-Options deny; proxy_pass http://localhost:3000; @@ -108,6 +109,7 @@ server { add_header Access-Control-Allow-Origin "$cors_header" always; add_header Access-Control-Allow-Methods "GET, POST, PATCH, OPTIONS" always; add_header Access-Control-Allow-Headers "Content-Type" always; + add_header Access-Control-Allow-Credentials "true" always; add_header Strict-Transport-Security "max-age=31536000" always; add_header X-Frame-Options deny; proxy_pass http://localhost:3000; diff --git a/package.json b/package.json index 3c6e92eb..46cf5596 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "ackee", "private": true, - "version": "2.3.0", + "version": "2.4.0", "authors": [ "Tobias Reich " ], @@ -34,9 +34,10 @@ "lint": "eslint '{functions,src,test}/**/*.js'" }, "dependencies": { - "ackee-tracker": "^4.1.0", + "ackee-tracker": "^4.2.0", "apollo-server-lambda": "^2.19.0", "apollo-server-micro": "^2.19.0", + "apollo-server-plugin-http-headers": "^0.1.3", "classnames": "^2.2.6", "date-fns": "^2.16.1", "date-fns-tz": "^1.0.10", @@ -47,12 +48,11 @@ "graphql-scalars": "^1.4.1", "graphql-tools": "^7.0.1", "human-number": "^1.0.6", - "husky": "^4.3.0", "immer": "^7.0.14", "is-url": "^1.2.4", "micro": "^9.3.4", "microrouter": "^3.1.3", - "mongoose": "^5.10.11", + "mongoose": "^5.10.14", "node-fetch": "^2.6.1", "node-schedule": "^1.3.2", "normalize-url": "^5.0.0", @@ -86,7 +86,9 @@ "eslint-plugin-react": "^7.21.5", "eslint-plugin-react-hooks": "^4.2.0", "eslint-plugin-react-native": "^3.9.1", + "husky": "^4.3.0", "mocked-env": "^1.3.2", + "mongodb-memory-server": "^6.9.2", "nodemon": "^2.0.6", "nyc": "^15.1.0", "test-listen": "^1.1.0" diff --git a/src/resolvers/records.js b/src/resolvers/records.js index f4217340..573d88b7 100644 --- a/src/resolvers/records.js +++ b/src/resolvers/records.js @@ -65,7 +65,17 @@ const polish = (obj) => { module.exports = { Mutation: { - createRecord: async (parent, { domainId, input }, { ip, userAgent }) => { + createRecord: async (parent, { domainId, input }, { ip, userAgent, isIgnored }) => { + + // Ignore your own visit when logged in + if (isIgnored === true) { + return { + success: true, + payload: { + id: '88888888-8888-8888-8888-888888888888' + } + } + } const clientId = identifier(ip, userAgent, domainId) const data = polish({ ...input, clientId, domainId }) @@ -100,7 +110,14 @@ module.exports = { } }, - updateRecord: async (parent, { id }) => { + updateRecord: async (parent, { id }, { isIgnored }) => { + + // Ignore your own visit when logged in + if (isIgnored === true) { + return { + success: true + } + } let entry diff --git a/src/resolvers/tokens.js b/src/resolvers/tokens.js index 31d0d04a..1456e9b7 100644 --- a/src/resolvers/tokens.js +++ b/src/resolvers/tokens.js @@ -2,6 +2,7 @@ const tokens = require('../database/tokens') const KnownError = require('../utils/KnownError') +const ignoreCookie = require('../utils/ignoreCookie') const response = (entry) => ({ id: entry.id, @@ -11,7 +12,7 @@ const response = (entry) => ({ module.exports = { Mutation: { - createToken: async (parent, { input }) => { + createToken: async (parent, { input }, { setCookies }) => { const { username, password } = input @@ -23,16 +24,22 @@ module.exports = { const entry = await tokens.add() + // Set cookie to avoid reporting your own visits + setCookies.push(ignoreCookie.on) + return { success: true, payload: response(entry) } }, - deleteToken: async (parent, { id }) => { + deleteToken: async (parent, { id }, { setCookies }) => { await tokens.del(id) + // Remove cookie to report your own visits, again + setCookies.push(ignoreCookie.off) + return { success: true } diff --git a/src/server.js b/src/server.js index cc3fee25..0caecbdd 100644 --- a/src/server.js +++ b/src/server.js @@ -1,20 +1,18 @@ 'use strict' -const { ApolloServer } = require('apollo-server-micro') -const { UnsignedIntResolver, UnsignedIntTypeDefinition, DateTimeResolver, DateTimeTypeDefinition } = require('graphql-scalars') const micro = require('micro') const { resolve } = require('path') const { readFile } = require('fs').promises const { send, createError } = require('micro') const { router, get, post, put, patch, del } = require('microrouter') +const { ApolloServer } = require('apollo-server-micro') const KnownError = require('./utils/KnownError') const signale = require('./utils/signale') const isDefined = require('./utils/isDefined') -const isDemoMode = require('./utils/isDemoMode') -const isDevelopmentMode = require('./utils/isDevelopmentMode') const findMatchingOrigin = require('./utils/findMatchingOrigin') const customTracker = require('./utils/customTracker') +const createApolloServer = require('./utils/createApolloServer') const { createMicroContext } = require('./utils/createContext') const index = readFile(resolve(__dirname, '../dist/index.html')).catch(signale.fatal) @@ -85,6 +83,7 @@ const attachCorsHeaders = (fn) => async (req, res) => { res.setHeader('Access-Control-Allow-Origin', matchingOrigin) res.setHeader('Access-Control-Allow-Methods', 'GET, POST, PATCH, OPTIONS') res.setHeader('Access-Control-Allow-Headers', 'Content-Type') + res.setHeader('Access-Control-Allow-Credentials', 'true') } return fn(req, res) @@ -99,21 +98,8 @@ const notFound = async (req) => { } -const apolloServer = new ApolloServer({ - introspection: isDemoMode === true || isDevelopmentMode === true, - playground: isDemoMode === true || isDevelopmentMode === true, - debug: isDevelopmentMode === true, +const apolloServer = createApolloServer(ApolloServer, { formatError: handleGraphError, - typeDefs: [ - UnsignedIntTypeDefinition, - DateTimeTypeDefinition, - require('./types') - ], - resolvers: { - UnsignedInt: UnsignedIntResolver, - DateTime: DateTimeResolver, - ...require('./resolvers') - }, context: createMicroContext }) diff --git a/src/serverless.js b/src/serverless.js index 7ee0b4bf..ad0574b1 100644 --- a/src/serverless.js +++ b/src/serverless.js @@ -1,11 +1,9 @@ 'use strict' const { ApolloServer } = require('apollo-server-lambda') -const { UnsignedIntResolver, UnsignedIntTypeDefinition, DateTimeResolver, DateTimeTypeDefinition } = require('graphql-scalars') const connect = require('./utils/connect') -const isDemoMode = require('./utils/isDemoMode') -const isDevelopmentMode = require('./utils/isDevelopmentMode') +const createApolloServer = require('./utils/createApolloServer') const { createServerlessContext } = require('./utils/createContext') const allowOrigin = process.env.ACKEE_ALLOW_ORIGIN || '' @@ -17,20 +15,7 @@ if (dbUrl == null) { connect(dbUrl) -const apolloServer = new ApolloServer({ - introspection: isDemoMode === true || isDevelopmentMode === true, - playground: isDemoMode === true || isDevelopmentMode === true, - debug: isDevelopmentMode === true, - typeDefs: [ - UnsignedIntTypeDefinition, - DateTimeTypeDefinition, - require('./types') - ], - resolvers: { - UnsignedInt: UnsignedIntResolver, - DateTime: DateTimeResolver, - ...require('./resolvers') - }, +const apolloServer = createApolloServer(ApolloServer, { context: createServerlessContext }) diff --git a/src/utils/createApolloServer.js b/src/utils/createApolloServer.js new file mode 100644 index 00000000..6599ed25 --- /dev/null +++ b/src/utils/createApolloServer.js @@ -0,0 +1,27 @@ +'use strict' + +const { UnsignedIntResolver, UnsignedIntTypeDefinition, DateTimeResolver, DateTimeTypeDefinition } = require('graphql-scalars') +const httpHeadersPlugin = require('apollo-server-plugin-http-headers') + +const isDemoMode = require('./isDemoMode') +const isDevelopmentMode = require('./isDevelopmentMode') + +module.exports = (ApolloServer, opts) => new ApolloServer({ + introspection: isDemoMode === true || isDevelopmentMode === true, + playground: isDemoMode === true || isDevelopmentMode === true, + debug: isDevelopmentMode === true, + plugins: [ + httpHeadersPlugin + ], + typeDefs: [ + UnsignedIntTypeDefinition, + DateTimeTypeDefinition, + require('../types') + ], + resolvers: { + UnsignedInt: UnsignedIntResolver, + DateTime: DateTimeResolver, + ...require('../resolvers') + }, + ...opts +}) \ No newline at end of file diff --git a/src/utils/createContext.js b/src/utils/createContext.js index c8e3505f..f7ed24ce 100644 --- a/src/utils/createContext.js +++ b/src/utils/createContext.js @@ -5,6 +5,7 @@ const { getClientIp } = require('request-ip') const isDemoMode = require('./isDemoMode') const isAuthenticated = require('./isAuthenticated') const createDate = require('./createDate') +const ignoreCookie = require('./ignoreCookie') const createServerlessContext = async (integrationContext) => { return createContext(integrationContext.event.headers['client-ip'], integrationContext.event.headers) @@ -18,9 +19,14 @@ const createContext = async (ip, headers) => { return { isDemoMode, isAuthenticated: await isAuthenticated(headers['authorization']), + isIgnored: ignoreCookie.isSet(headers['cookie']), dateDetails: createDate(headers['time-zone']), userAgent: headers['user-agent'], - ip + ip, + // Variables used by apollo-server-plugin-http-headers + // See: https://github.com/b2a3e8/apollo-server-plugin-http-headers + setCookies: [], + setHeaders: [] } } diff --git a/src/utils/ignoreCookie.js b/src/utils/ignoreCookie.js new file mode 100644 index 00000000..d16b7abc --- /dev/null +++ b/src/utils/ignoreCookie.js @@ -0,0 +1,25 @@ +'use static' + +const COOKIE_NAME = 'ackee_ignore' + +module.exports = { + isSet: (cookie = '') => cookie.includes(`${ COOKIE_NAME }=1`), + on: { + name: COOKIE_NAME, + value: '1', + options: { + maxAge: 365 * 24 * 60 * 60, + sameSite: 'none', + secure: true + } + }, + off: { + name: COOKIE_NAME, + value: '0', + options: { + maxAge: -1, + sameSite: 'none', + secure: true + } + } +} \ No newline at end of file diff --git a/test/resolvers/_utils.js b/test/resolvers/_utils.js new file mode 100644 index 00000000..8142ae2f --- /dev/null +++ b/test/resolvers/_utils.js @@ -0,0 +1,95 @@ +'use strict' + +const { MongoMemoryServer } = require('mongodb-memory-server') +const mongoose = require('mongoose') +const fetch = require('node-fetch') + +const Token = require('../../src/models/Token') +const Domain = require('../../src/models/Domain') +const Record = require('../../src/models/Record') +const connect = require('../../src/utils/connect') +const createArray = require('../../src/utils/createArray') +const { day, minute } = require('../../src/utils/times') + +const mongoDb = new MongoMemoryServer() + +const connectToDatabase = async () => { + const dbUrl = await mongoDb.getUri() + return connect(dbUrl) +} + +const fillDatabase = async (t) => { + // Saves to context so tests can access IDs + t.context.token = await Token.create({}) + t.context.domain = await Domain.create({ title: 'Example' }) + + const now = Date.now() + + const records = createArray(14).map((item, i) => ({ + clientId: `client-${ i }`, + domainId: t.context.domain.id, + siteLocation: 'https://example.com/', + siteReferrer: 'https://google.com/', + siteLanguage: 'en', + screenWidth: 414, + screenHeight: 896, + screenColorDepth: 32, + deviceName: 'iPhone', + deviceManufacturer: 'Apple', + osName: 'iOS', + osVersion: i > 7 ? '13.0' : '14.0', + browserName: 'Safari', + browserVersion: i > 7 ? '13.0' : '14.0', + browserWidth: 414, + browserHeight: 719, + // Add fake minute visit per day + created: now - i * day - minute, + updated: now - i * day + })) + + await Record.insertMany(records) +} + +const cleanupDatabase = async (t) => { + await Token.findOneAndDelete({ + id: t.context.token.id + }) + await Domain.findOneAndDelete({ + id: t.context.domain.id + }) +} + +const disconnectFromDatabase = async () => { + mongoose.disconnect() + mongoDb.stop() +} + +const api = async (base, body, token, headers = {}) => { + const url = new URL('/api', await base) + + const defaultHeaders = {} + defaultHeaders['Content-Type'] = 'application/json' + defaultHeaders['Authorization'] = token == null ? undefined : `Bearer ${ token }` + + const res = await fetch(url.href, { + method: 'post', + body: JSON.stringify(body), + headers: { + ...defaultHeaders, + ...headers + } + }) + + return { + headers: res.headers, + json: await res.json() + } +} + +module.exports = { + connectToDatabase, + fillDatabase, + cleanupDatabase, + disconnectFromDatabase, + api +} \ No newline at end of file diff --git a/test/resolvers/domains.js b/test/resolvers/domains.js new file mode 100644 index 00000000..453c69b4 --- /dev/null +++ b/test/resolvers/domains.js @@ -0,0 +1,151 @@ +'use strict' + +const test = require('ava') +const listen = require('test-listen') +const uuid = require('uuid').v4 + +const server = require('../../src/server') +const { connectToDatabase, fillDatabase, cleanupDatabase, disconnectFromDatabase, api } = require('./_utils') + +const base = listen(server) + +let validDomain = null + +const defaultTitle = uuid() +const updatedTitle = uuid() + +test.before(connectToDatabase) +test.beforeEach(fillDatabase) +test.afterEach.always(cleanupDatabase) +test.after.always(disconnectFromDatabase) + +test.serial('create domain', async (t) => { + + const body = { + query: ` + mutation createDomain($input: CreateDomainInput!) { + createDomain(input: $input) { + success, + payload { + id + title + } + } + } + `, + variables: { + input: { + title: defaultTitle + } + } + } + + const { json } = await api(base, body, t.context.token.id) + + t.true(json.data.createDomain.success) + t.is(typeof json.data.createDomain.payload.id, 'string') + t.is(json.data.createDomain.payload.title, defaultTitle) + + // Save domain for the next test + validDomain = json.data.createDomain.payload + +}) + +test.serial('update domain', async (t) => { + + const body = { + query: ` + mutation updateDomain($id: ID!, $input: UpdateDomainInput!) { + updateDomain(id: $id, input: $input) { + success + payload { + id, + title + } + } + } + `, + variables: { + id: validDomain.id, + input: { + title: updatedTitle + } + } + } + + const { json } = await api(base, body, t.context.token.id) + + t.true(json.data.updateDomain.success) + t.is(json.data.updateDomain.payload.id, validDomain.id) + t.is(json.data.updateDomain.payload.title, updatedTitle) + + // Save domain for the next test + validDomain = json.data.updateDomain.payload + +}) + +test.serial('fetch domains', async (t) => { + + const body = { + query: ` + query fetchDomains { + domains { + id + title + } + } + ` + } + + const { json } = await api(base, body, t.context.token.id) + + const domains = json.data.domains + const domain = domains.find((domain) => domain.id === validDomain.id) + + t.is(domain.title, validDomain.title) + +}) + +test.serial('fetch domain', async (t) => { + + const body = { + query: ` + query fetchDomain($id: ID!) { + domain(id: $id) { + id + title + } + } + `, + variables: { + id: validDomain.id + } + } + + const { json } = await api(base, body, t.context.token.id) + + t.is(json.data.domain.id, validDomain.id) + t.is(json.data.domain.title, validDomain.title) + +}) + +test.serial('delete domain', async (t) => { + + const body = { + query: ` + mutation deleteDomain($id: ID!) { + deleteDomain(id: $id) { + success + } + } + `, + variables: { + id: validDomain.id + } + } + + const { json } = await api(base, body, t.context.token.id) + + t.true(json.data.deleteDomain.success) + +}) \ No newline at end of file diff --git a/test/resolvers/facts.js b/test/resolvers/facts.js new file mode 100644 index 00000000..c5f896bb --- /dev/null +++ b/test/resolvers/facts.js @@ -0,0 +1,48 @@ +'use strict' + +const test = require('ava') +const listen = require('test-listen') + +const server = require('../../src/server') +const { connectToDatabase, fillDatabase, cleanupDatabase, disconnectFromDatabase, api } = require('./_utils') + +const base = listen(server) + +test.before(connectToDatabase) +test.beforeEach(fillDatabase) +test.afterEach.always(cleanupDatabase) +test.after.always(disconnectFromDatabase) + +test('fetch facts', async (t) => { + + const body = { + query: ` + query fetchFacts($id: ID!) { + domain(id: $id) { + facts { + activeVisitors + averageViews + averageDuration + viewsToday + viewsMonth + viewsYear + } + } + } + `, + variables: { + id: t.context.domain.id + } + } + + const { json } = await api(base, body, t.context.token.id) + const facts = json.data.domain.facts + + t.is(facts.activeVisitors, 1) + t.is(facts.averageViews, 1) + t.is(facts.averageDuration, 60000) + t.is(typeof facts.viewsToday, 'number') + t.is(typeof facts.viewsMonth, 'number') + t.is(typeof facts.viewsYear, 'number') + +}) \ No newline at end of file diff --git a/test/resolvers/records.js b/test/resolvers/records.js new file mode 100644 index 00000000..a1bec74a --- /dev/null +++ b/test/resolvers/records.js @@ -0,0 +1,125 @@ +'use strict' + +const test = require('ava') +const listen = require('test-listen') + +const server = require('../../src/server') +const { connectToDatabase, fillDatabase, cleanupDatabase, disconnectFromDatabase, api } = require('./_utils') + +const base = listen(server) + +let validRecord = null +let ignoredRecord = null + +test.before(connectToDatabase) +test.beforeEach(fillDatabase) +test.afterEach.always(cleanupDatabase) +test.after.always(disconnectFromDatabase) + +test.serial('create record', async (t) => { + + + const body = { + query: ` + mutation createRecord($domainId: ID!, $input: CreateRecordInput!) { + createRecord(domainId: $domainId, input: $input) { + success + payload { + id + } + } + } + `, + variables: { + domainId: t.context.domain.id, + input: { + siteLocation: 'https://example.com/', + siteReferrer: 'https://google.com/' + } + } + } + + const { json } = await api(base, body, t.context.token.id) + + t.true(json.data.createRecord.success) + t.is(typeof json.data.createRecord.payload.id, 'string') + + // Save record for the next test + validRecord = json.data.createRecord.payload + +}) + +test.serial('update record', async (t) => { + + const body = { + query: ` + mutation updateRecord($id: ID!) { + updateRecord(id: $id) { + success + } + } + `, + variables: { + id: validRecord.id + } + } + + const { json } = await api(base, body, t.context.token.id) + + t.true(json.data.updateRecord.success) + +}) + +test.serial('ignore record creation when logged in', async (t) => { + + const body = { + query: ` + mutation createRecord($domainId: ID!, $input: CreateRecordInput!) { + createRecord(domainId: $domainId, input: $input) { + success + payload { + id + } + } + } + `, + variables: { + domainId: t.context.domain.id, + input: { siteLocation: 'https://example.com/' } + } + } + + const { json } = await api(base, body, t.context.token.id, { + Cookie: 'ackee_ignore=1' + }) + + t.true(json.data.createRecord.success) + t.is(json.data.createRecord.payload.id, '88888888-8888-8888-8888-888888888888') + + // Save record for the next test + ignoredRecord = json.data.createRecord.payload + +}) + +test.serial('ignore record update when logged in', async (t) => { + + const body = { + query: ` + mutation updateRecord($id: ID!) { + updateRecord(id: $id) { + success + } + } + `, + variables: { + id: ignoredRecord.id + } + } + + const { json } = await api(base, body, t.context.token.id, { + Cookie: 'ackee_ignore=1' + }) + + t.true(json.data.updateRecord.success) + +}) \ No newline at end of file diff --git a/test/resolvers/statistics/_utils.js b/test/resolvers/statistics/_utils.js new file mode 100644 index 00000000..392d3e52 --- /dev/null +++ b/test/resolvers/statistics/_utils.js @@ -0,0 +1,30 @@ +'use strict' + +const { api } = require('../_utils') + +const getStats = async ({ base, token, domainId, fragment }) => { + + const body = { + query: ` + query fetchStatistics($id: ID!) { + domain(id: $id) { + statistics { + ${ fragment } + } + } + } + `, + variables: { + id: domainId + } + } + + const { json } = await api(base, body, token) + + return json.data.domain.statistics + +} + +module.exports = { + getStats +} \ No newline at end of file diff --git a/test/resolvers/statistics/browsers.js b/test/resolvers/statistics/browsers.js new file mode 100644 index 00000000..1a5cf804 --- /dev/null +++ b/test/resolvers/statistics/browsers.js @@ -0,0 +1,113 @@ +'use strict' + +const test = require('ava') +const listen = require('test-listen') + +const server = require('../../../src/server') +const { connectToDatabase, fillDatabase, cleanupDatabase, disconnectFromDatabase } = require('../_utils') +const { getStats } = require('./_utils') + +const base = listen(server) + +test.before(connectToDatabase) +test.beforeEach(fillDatabase) +test.afterEach.always(cleanupDatabase) +test.after.always(disconnectFromDatabase) + +const macro = async (t, variables, assertions) => { + const limit = variables.limit == null ? '' : `, limit: ${ variables.limit }` + + const statistics = await getStats({ + base, + token: t.context.token.id, + domainId: t.context.domain.id, + fragment: ` + browsers(sorting: ${ variables.sorting }, type: ${ variables.type }, range: ${ variables.range }${ limit }) { + id + count + created + } + ` + }) + + assertions(t, statistics.browsers) +} + +macro.title = (providedTitle, opts) => `fetch ${ Object.values(opts).join(' and ') } pages` + +test(macro, { + sorting: 'TOP', + type: 'NO_VERSION', + range: 'LAST_6_MONTHS' +}, (t, browsers) => { + t.is(browsers.length, 1) + t.is(browsers[0].id, 'Safari') +}) + +test(macro, { + sorting: 'RECENT', + type: 'NO_VERSION', + range: 'LAST_6_MONTHS' +}, (t, browsers) => { + t.is(browsers.length, 14) + t.is(browsers[0].id, 'Safari') +}) + +test(macro, { + sorting: 'RECENT', + type: 'NO_VERSION', + range: 'LAST_6_MONTHS', + limit: 1 +}, (t, browsers) => { + t.is(browsers.length, 1) + t.is(browsers[0].id, 'Safari') +}) + +test(macro, { + sorting: 'NEW', + type: 'NO_VERSION', + range: 'LAST_6_MONTHS' +}, (t, browsers) => { + t.is(browsers.length, 1) + t.is(browsers[0].id, 'Safari') +}) + +test(macro, { + sorting: 'TOP', + type: 'WITH_VERSION', + range: 'LAST_6_MONTHS' +}, (t, browsers) => { + t.is(browsers.length, 2) + t.is(browsers[0].id, 'Safari 14.0') + t.is(browsers[1].id, 'Safari 13.0') +}) + +test(macro, { + sorting: 'RECENT', + type: 'WITH_VERSION', + range: 'LAST_6_MONTHS' +}, (t, browsers) => { + t.is(browsers.length, 14) + t.is(browsers[0].id, 'Safari 14.0') + t.is(browsers[8].id, 'Safari 13.0') +}) + +test(macro, { + sorting: 'RECENT', + type: 'WITH_VERSION', + range: 'LAST_6_MONTHS', + limit: 1 +}, (t, browsers) => { + t.is(browsers.length, 1) + t.is(browsers[0].id, 'Safari 14.0') +}) + +test(macro, { + sorting: 'NEW', + type: 'WITH_VERSION', + range: 'LAST_6_MONTHS' +}, (t, browsers) => { + t.is(browsers.length, 2) + t.is(browsers[0].id, 'Safari 14.0') + t.is(browsers[1].id, 'Safari 13.0') +}) \ No newline at end of file diff --git a/test/resolvers/statistics/devices.js b/test/resolvers/statistics/devices.js new file mode 100644 index 00000000..8655068f --- /dev/null +++ b/test/resolvers/statistics/devices.js @@ -0,0 +1,110 @@ +'use strict' + +const test = require('ava') +const listen = require('test-listen') + +const server = require('../../../src/server') +const { connectToDatabase, fillDatabase, cleanupDatabase, disconnectFromDatabase } = require('../_utils') +const { getStats } = require('./_utils') + +const base = listen(server) + +test.before(connectToDatabase) +test.beforeEach(fillDatabase) +test.afterEach.always(cleanupDatabase) +test.after.always(disconnectFromDatabase) + +const macro = async (t, variables, assertions) => { + const limit = variables.limit == null ? '' : `, limit: ${ variables.limit }` + + const statistics = await getStats({ + base, + token: t.context.token.id, + domainId: t.context.domain.id, + fragment: ` + devices(sorting: ${ variables.sorting }, type: ${ variables.type }, range: ${ variables.range }${ limit }) { + id + count + created + } + ` + }) + + assertions(t, statistics.devices) +} + +macro.title = (providedTitle, opts) => `fetch ${ Object.values(opts).join(' and ') } devices` + +test(macro, { + sorting: 'TOP', + type: 'NO_MODEL', + range: 'LAST_6_MONTHS' +}, (t, devices) => { + t.is(devices.length, 1) + t.is(devices[0].id, 'Apple') +}) + +test(macro, { + sorting: 'RECENT', + type: 'NO_MODEL', + range: 'LAST_6_MONTHS' +}, (t, devices) => { + t.is(devices.length, 14) + t.is(devices[0].id, 'Apple') +}) + +test(macro, { + sorting: 'RECENT', + type: 'NO_MODEL', + range: 'LAST_6_MONTHS', + limit: 1 +}, (t, devices) => { + t.is(devices.length, 1) + t.is(devices[0].id, 'Apple') +}) + +test(macro, { + sorting: 'NEW', + type: 'NO_MODEL', + range: 'LAST_6_MONTHS' +}, (t, devices) => { + t.is(devices.length, 1) + t.is(devices[0].id, 'Apple') +}) + +test(macro, { + sorting: 'TOP', + type: 'WITH_MODEL', + range: 'LAST_6_MONTHS' +}, (t, devices) => { + t.is(devices.length, 1) + t.is(devices[0].id, 'Apple iPhone') +}) + +test(macro, { + sorting: 'RECENT', + type: 'WITH_MODEL', + range: 'LAST_6_MONTHS' +}, (t, devices) => { + t.is(devices.length, 14) + t.is(devices[0].id, 'Apple iPhone') +}) + +test(macro, { + sorting: 'RECENT', + type: 'WITH_MODEL', + range: 'LAST_6_MONTHS', + limit: 1 +}, (t, devices) => { + t.is(devices.length, 1) + t.is(devices[0].id, 'Apple iPhone') +}) + +test(macro, { + sorting: 'NEW', + type: 'WITH_MODEL', + range: 'LAST_6_MONTHS' +}, (t, devices) => { + t.is(devices.length, 1) + t.is(devices[0].id, 'Apple iPhone') +}) \ No newline at end of file diff --git a/test/resolvers/statistics/durations.js b/test/resolvers/statistics/durations.js new file mode 100644 index 00000000..1c4fd971 --- /dev/null +++ b/test/resolvers/statistics/durations.js @@ -0,0 +1,81 @@ +'use strict' + +const test = require('ava') +const listen = require('test-listen') + +const server = require('../../../src/server') +const { minute } = require('../../../src/utils/times') +const { connectToDatabase, fillDatabase, cleanupDatabase, disconnectFromDatabase } = require('../_utils') +const { getStats } = require('./_utils') + +const base = listen(server) + +test.before(connectToDatabase) +test.beforeEach(fillDatabase) +test.afterEach.always(cleanupDatabase) +test.after.always(disconnectFromDatabase) + +const macro = async (t, variables, assertions) => { + const limit = variables.limit == null ? '' : `, limit: ${ variables.limit }` + + const statistics = await getStats({ + base, + token: t.context.token.id, + domainId: t.context.domain.id, + fragment: ` + durations(interval: ${ variables.interval }${ limit }) { + id + count + } + ` + }) + + assertions(t, statistics.durations) +} + +macro.title = (providedTitle, opts) => `fetch ${ Object.values(opts).join(' and ') } durations` + +test(macro, { + interval: 'DAILY' +}, (t, durations) => { + t.is(durations.length, 14) + t.is(durations[0].count, minute) +}) + +test(macro, { + interval: 'DAILY', + limit: 1 +}, (t, durations) => { + t.is(durations.length, 1) + t.is(durations[0].count, minute) +}) + +test(macro, { + interval: 'MONTHLY' +}, (t, durations) => { + t.is(durations.length, 14) + t.is(durations[0].count, minute) +}) + +test(macro, { + interval: 'MONTHLY', + limit: 1 +}, (t, durations) => { + t.is(durations.length, 1) + t.is(durations[0].count, minute) +}) + +test(macro, { + interval: 'YEARLY' +}, (t, durations) => { + t.is(durations.length, 14) + t.is(durations[0].count, minute) +}) + +test(macro, { + interval: 'YEARLY', + limit: 1 +}, (t, durations) => { + t.is(durations.length, 1) + t.is(durations[0].count, minute) +}) \ No newline at end of file diff --git a/test/resolvers/statistics/languages.js b/test/resolvers/statistics/languages.js new file mode 100644 index 00000000..520871e9 --- /dev/null +++ b/test/resolvers/statistics/languages.js @@ -0,0 +1,69 @@ +'use strict' + +const test = require('ava') +const listen = require('test-listen') + +const server = require('../../../src/server') +const { connectToDatabase, fillDatabase, cleanupDatabase, disconnectFromDatabase } = require('../_utils') +const { getStats } = require('./_utils') + +const base = listen(server) + +test.before(connectToDatabase) +test.beforeEach(fillDatabase) +test.afterEach.always(cleanupDatabase) +test.after.always(disconnectFromDatabase) + +const macro = async (t, variables, assertions) => { + const limit = variables.limit == null ? '' : `, limit: ${ variables.limit }` + + const statistics = await getStats({ + base, + token: t.context.token.id, + domainId: t.context.domain.id, + fragment: ` + languages(sorting: ${ variables.sorting }, range: ${ variables.range }${ limit }) { + id + count + created + } + ` + }) + + assertions(t, statistics.languages) +} + +macro.title = (providedTitle, opts) => `fetch ${ Object.values(opts).join(' and ') } languages` + +test(macro, { + sorting: 'TOP', + range: 'LAST_6_MONTHS' +}, (t, languages) => { + t.is(languages.length, 1) + t.is(languages[0].id, 'English') +}) + +test(macro, { + sorting: 'RECENT', + range: 'LAST_6_MONTHS' +}, (t, languages) => { + t.is(languages.length, 14) + t.is(languages[0].id, 'English') +}) + +test(macro, { + sorting: 'RECENT', + range: 'LAST_6_MONTHS', + limit: 1 +}, (t, languages) => { + t.is(languages.length, 1) + t.is(languages[0].id, 'English') +}) + +test(macro, { + sorting: 'NEW', + range: 'LAST_6_MONTHS' +}, (t, languages) => { + t.is(languages.length, 1) + t.is(languages[0].id, 'English') +}) \ No newline at end of file diff --git a/test/resolvers/statistics/pages.js b/test/resolvers/statistics/pages.js new file mode 100644 index 00000000..88594be9 --- /dev/null +++ b/test/resolvers/statistics/pages.js @@ -0,0 +1,69 @@ +'use strict' + +const test = require('ava') +const listen = require('test-listen') + +const server = require('../../../src/server') +const { connectToDatabase, fillDatabase, cleanupDatabase, disconnectFromDatabase } = require('../_utils') +const { getStats } = require('./_utils') + +const base = listen(server) + +test.before(connectToDatabase) +test.beforeEach(fillDatabase) +test.afterEach.always(cleanupDatabase) +test.after.always(disconnectFromDatabase) + +const macro = async (t, variables, assertions) => { + const limit = variables.limit == null ? '' : `, limit: ${ variables.limit }` + + const statistics = await getStats({ + base, + token: t.context.token.id, + domainId: t.context.domain.id, + fragment: ` + pages(sorting: ${ variables.sorting }, range: ${ variables.range }${ limit }) { + id + count + created + } + ` + }) + + assertions(t, statistics.pages) +} + +macro.title = (providedTitle, opts) => `fetch ${ Object.values(opts).join(' and ') } pages` + +test(macro, { + sorting: 'TOP', + range: 'LAST_6_MONTHS' +}, (t, pages) => { + t.is(pages.length, 1) + t.is(pages[0].id, 'https://example.com/') +}) + +test(macro, { + sorting: 'RECENT', + range: 'LAST_6_MONTHS' +}, (t, pages) => { + t.is(pages.length, 14) + t.is(pages[0].id, 'https://example.com/') +}) + +test(macro, { + sorting: 'RECENT', + range: 'LAST_6_MONTHS', + limit: 1 +}, (t, pages) => { + t.is(pages.length, 1) + t.is(pages[0].id, 'https://example.com/') +}) + +test(macro, { + sorting: 'NEW', + range: 'LAST_6_MONTHS' +}, (t, pages) => { + t.is(pages.length, 1) + t.is(pages[0].id, 'https://example.com/') +}) \ No newline at end of file diff --git a/test/resolvers/statistics/referrers.js b/test/resolvers/statistics/referrers.js new file mode 100644 index 00000000..6b4c47bc --- /dev/null +++ b/test/resolvers/statistics/referrers.js @@ -0,0 +1,69 @@ +'use strict' + +const test = require('ava') +const listen = require('test-listen') + +const server = require('../../../src/server') +const { connectToDatabase, fillDatabase, cleanupDatabase, disconnectFromDatabase } = require('../_utils') +const { getStats } = require('./_utils') + +const base = listen(server) + +test.before(connectToDatabase) +test.beforeEach(fillDatabase) +test.afterEach.always(cleanupDatabase) +test.after.always(disconnectFromDatabase) + +const macro = async (t, variables, assertions) => { + const limit = variables.limit == null ? '' : `, limit: ${ variables.limit }` + + const statistics = await getStats({ + base, + token: t.context.token.id, + domainId: t.context.domain.id, + fragment: ` + referrers(sorting: ${ variables.sorting }, range: ${ variables.range }${ limit }) { + id + count + created + } + ` + }) + + assertions(t, statistics.referrers) +} + +macro.title = (providedTitle, opts) => `fetch ${ Object.values(opts).join(' and ') } referrers` + +test(macro, { + sorting: 'TOP', + range: 'LAST_6_MONTHS' +}, (t, referrers) => { + t.is(referrers.length, 1) + t.is(referrers[0].id, 'https://google.com/') +}) + +test(macro, { + sorting: 'RECENT', + range: 'LAST_6_MONTHS' +}, (t, referrers) => { + t.is(referrers.length, 14) + t.is(referrers[0].id, 'https://google.com/') +}) + +test(macro, { + sorting: 'RECENT', + range: 'LAST_6_MONTHS', + limit: 1 +}, (t, referrers) => { + t.is(referrers.length, 1) + t.is(referrers[0].id, 'https://google.com/') +}) + +test(macro, { + sorting: 'NEW', + range: 'LAST_6_MONTHS' +}, (t, referrers) => { + t.is(referrers.length, 1) + t.is(referrers[0].id, 'https://google.com/') +}) \ No newline at end of file diff --git a/test/resolvers/statistics/sizes.js b/test/resolvers/statistics/sizes.js new file mode 100644 index 00000000..57f31755 --- /dev/null +++ b/test/resolvers/statistics/sizes.js @@ -0,0 +1,218 @@ +'use strict' + +const test = require('ava') +const listen = require('test-listen') + +const server = require('../../../src/server') +const { connectToDatabase, fillDatabase, cleanupDatabase, disconnectFromDatabase } = require('../_utils') +const { getStats } = require('./_utils') + +const base = listen(server) + +test.before(connectToDatabase) +test.beforeEach(fillDatabase) +test.afterEach.always(cleanupDatabase) +test.after.always(disconnectFromDatabase) + +const macro = async (t, variables, assertions) => { + const limit = variables.limit == null ? '' : `, limit: ${ variables.limit }` + + const statistics = await getStats({ + base, + token: t.context.token.id, + domainId: t.context.domain.id, + fragment: ` + sizes(sorting: ${ variables.sorting }, type: ${ variables.type }, range: ${ variables.range }${ limit }) { + id + count + created + } + ` + }) + + assertions(t, statistics.sizes) +} + +macro.title = (providedTitle, opts) => `fetch ${ Object.values(opts).join(' and ') } sizes` + +test(macro, { + sorting: 'TOP', + type: 'BROWSER_WIDTH', + range: 'LAST_6_MONTHS' +}, (t, sizes) => { + t.is(sizes.length, 1) + t.is(sizes[0].id, '414px') +}) + +test(macro, { + sorting: 'TOP', + type: 'BROWSER_HEIGHT', + range: 'LAST_6_MONTHS' +}, (t, sizes) => { + t.is(sizes.length, 1) + t.is(sizes[0].id, '719px') +}) + +test(macro, { + sorting: 'TOP', + type: 'BROWSER_RESOLUTION', + range: 'LAST_6_MONTHS' +}, (t, sizes) => { + t.is(sizes.length, 1) + t.is(sizes[0].id, '414px x 719px') +}) + +test(macro, { + sorting: 'RECENT', + type: 'BROWSER_WIDTH', + range: 'LAST_6_MONTHS' +}, (t, sizes) => { + t.is(sizes.length, 14) + t.is(sizes[0].id, '414px') +}) + +test(macro, { + sorting: 'RECENT', + type: 'BROWSER_HEIGHT', + range: 'LAST_6_MONTHS' +}, (t, sizes) => { + t.is(sizes.length, 14) + t.is(sizes[0].id, '719px') +}) + +test(macro, { + sorting: 'RECENT', + type: 'BROWSER_RESOLUTION', + range: 'LAST_6_MONTHS' +}, (t, sizes) => { + t.is(sizes.length, 14) + t.is(sizes[0].id, '414px x 719px') +}) + +test(macro, { + sorting: 'RECENT', + type: 'BROWSER_RESOLUTION', + range: 'LAST_6_MONTHS', + limit: 1 +}, (t, sizes) => { + t.is(sizes.length, 1) + t.is(sizes[0].id, '414px x 719px') +}) + +test(macro, { + sorting: 'NEW', + type: 'BROWSER_WIDTH', + range: 'LAST_6_MONTHS' +}, (t, sizes) => { + t.is(sizes.length, 1) + t.is(sizes[0].id, '414px') +}) + +test(macro, { + sorting: 'NEW', + type: 'BROWSER_HEIGHT', + range: 'LAST_6_MONTHS' +}, (t, sizes) => { + t.is(sizes.length, 1) + t.is(sizes[0].id, '719px') +}) + +test(macro, { + sorting: 'NEW', + type: 'BROWSER_RESOLUTION', + range: 'LAST_6_MONTHS' +}, (t, sizes) => { + t.is(sizes.length, 1) + t.is(sizes[0].id, '414px x 719px') +}) + +test(macro, { + sorting: 'TOP', + type: 'SCREEN_WIDTH', + range: 'LAST_6_MONTHS' +}, (t, sizes) => { + t.is(sizes.length, 1) + t.is(sizes[0].id, '414px') +}) + +test(macro, { + sorting: 'TOP', + type: 'SCREEN_HEIGHT', + range: 'LAST_6_MONTHS' +}, (t, sizes) => { + t.is(sizes.length, 1) + t.is(sizes[0].id, '896px') +}) + +test(macro, { + sorting: 'TOP', + type: 'SCREEN_RESOLUTION', + range: 'LAST_6_MONTHS' +}, (t, sizes) => { + t.is(sizes.length, 1) + t.is(sizes[0].id, '414px x 896px') +}) + +test(macro, { + sorting: 'RECENT', + type: 'SCREEN_WIDTH', + range: 'LAST_6_MONTHS' +}, (t, sizes) => { + t.is(sizes.length, 14) + t.is(sizes[0].id, '414px') +}) + +test(macro, { + sorting: 'RECENT', + type: 'SCREEN_HEIGHT', + range: 'LAST_6_MONTHS' +}, (t, sizes) => { + t.is(sizes.length, 14) + t.is(sizes[0].id, '896px') +}) + +test(macro, { + sorting: 'RECENT', + type: 'SCREEN_RESOLUTION', + range: 'LAST_6_MONTHS' +}, (t, sizes) => { + t.is(sizes.length, 14) + t.is(sizes[0].id, '414px x 896px') +}) + +test(macro, { + sorting: 'RECENT', + type: 'SCREEN_RESOLUTION', + range: 'LAST_6_MONTHS', + limit: 1 +}, (t, sizes) => { + t.is(sizes.length, 1) + t.is(sizes[0].id, '414px x 896px') +}) + +test(macro, { + sorting: 'NEW', + type: 'SCREEN_WIDTH', + range: 'LAST_6_MONTHS' +}, (t, sizes) => { + t.is(sizes.length, 1) + t.is(sizes[0].id, '414px') +}) + +test(macro, { + sorting: 'NEW', + type: 'SCREEN_HEIGHT', + range: 'LAST_6_MONTHS' +}, (t, sizes) => { + t.is(sizes.length, 1) + t.is(sizes[0].id, '896px') +}) + +test(macro, { + sorting: 'NEW', + type: 'SCREEN_RESOLUTION', + range: 'LAST_6_MONTHS' +}, (t, sizes) => { + t.is(sizes.length, 1) + t.is(sizes[0].id, '414px x 896px') +}) \ No newline at end of file diff --git a/test/resolvers/statistics/systems.js b/test/resolvers/statistics/systems.js new file mode 100644 index 00000000..bc2d121f --- /dev/null +++ b/test/resolvers/statistics/systems.js @@ -0,0 +1,113 @@ +'use strict' + +const test = require('ava') +const listen = require('test-listen') + +const server = require('../../../src/server') +const { connectToDatabase, fillDatabase, cleanupDatabase, disconnectFromDatabase } = require('../_utils') +const { getStats } = require('./_utils') + +const base = listen(server) + +test.before(connectToDatabase) +test.beforeEach(fillDatabase) +test.afterEach.always(cleanupDatabase) +test.after.always(disconnectFromDatabase) + +const macro = async (t, variables, assertions) => { + const limit = variables.limit == null ? '' : `, limit: ${ variables.limit }` + + const statistics = await getStats({ + base, + token: t.context.token.id, + domainId: t.context.domain.id, + fragment: ` + systems(sorting: ${ variables.sorting }, type: ${ variables.type }, range: ${ variables.range }${ limit }) { + id + count + created + } + ` + }) + + assertions(t, statistics.systems) +} + +macro.title = (providedTitle, opts) => `fetch ${ Object.values(opts).join(' and ') } systems` + +test(macro, { + sorting: 'TOP', + type: 'NO_VERSION', + range: 'LAST_6_MONTHS' +}, (t, systems) => { + t.is(systems.length, 1) + t.is(systems[0].id, 'iOS') +}) + +test(macro, { + sorting: 'RECENT', + type: 'NO_VERSION', + range: 'LAST_6_MONTHS' +}, (t, systems) => { + t.is(systems.length, 14) + t.is(systems[0].id, 'iOS') +}) + +test(macro, { + sorting: 'RECENT', + type: 'NO_VERSION', + range: 'LAST_6_MONTHS', + limit: 1 +}, (t, systems) => { + t.is(systems.length, 1) + t.is(systems[0].id, 'iOS') +}) + +test(macro, { + sorting: 'NEW', + type: 'NO_VERSION', + range: 'LAST_6_MONTHS' +}, (t, systems) => { + t.is(systems.length, 1) + t.is(systems[0].id, 'iOS') +}) + +test(macro, { + sorting: 'TOP', + type: 'WITH_VERSION', + range: 'LAST_6_MONTHS' +}, (t, systems) => { + t.is(systems.length, 2) + t.is(systems[0].id, 'iOS 14.0') + t.is(systems[1].id, 'iOS 13.0') +}) + +test(macro, { + sorting: 'RECENT', + type: 'WITH_VERSION', + range: 'LAST_6_MONTHS' +}, (t, systems) => { + t.is(systems.length, 14) + t.is(systems[0].id, 'iOS 14.0') + t.is(systems[8].id, 'iOS 13.0') +}) + +test(macro, { + sorting: 'RECENT', + type: 'WITH_VERSION', + range: 'LAST_6_MONTHS', + limit: 1 +}, (t, systems) => { + t.is(systems.length, 1) + t.is(systems[0].id, 'iOS 14.0') +}) + +test(macro, { + sorting: 'NEW', + type: 'WITH_VERSION', + range: 'LAST_6_MONTHS' +}, (t, systems) => { + t.is(systems.length, 2) + t.is(systems[0].id, 'iOS 14.0') + t.is(systems[1].id, 'iOS 13.0') +}) \ No newline at end of file diff --git a/test/resolvers/statistics/views.js b/test/resolvers/statistics/views.js new file mode 100644 index 00000000..abd1ef8f --- /dev/null +++ b/test/resolvers/statistics/views.js @@ -0,0 +1,128 @@ +'use strict' + +const test = require('ava') +const listen = require('test-listen') + +const server = require('../../../src/server') +const { connectToDatabase, fillDatabase, cleanupDatabase, disconnectFromDatabase } = require('../_utils') +const { getStats } = require('./_utils') + +const base = listen(server) + +test.before(connectToDatabase) +test.beforeEach(fillDatabase) +test.afterEach.always(cleanupDatabase) +test.after.always(disconnectFromDatabase) + +const macro = async (t, variables, assertions) => { + const limit = variables.limit == null ? '' : `, limit: ${ variables.limit }` + + const statistics = await getStats({ + base, + token: t.context.token.id, + domainId: t.context.domain.id, + fragment: ` + views(interval: ${ variables.interval }, type: ${ variables.type }${ limit }) { + id + count + } + ` + }) + + assertions(t, statistics.views) +} + +macro.title = (providedTitle, opts) => `fetch ${ Object.values(opts).join(' and ') } views` + +test(macro, { + interval: 'DAILY', + type: 'UNIQUE' +}, (t, views) => { + t.is(views.length, 14) + t.is(views[0].count, 1) +}) + +test(macro, { + interval: 'DAILY', + type: 'UNIQUE', + limit: 1 +}, (t, views) => { + t.is(views.length, 1) + t.is(views[0].count, 1) +}) + +test(macro, { + interval: 'MONTHLY', + type: 'UNIQUE' +}, (t, views) => { + t.is(views.length, 14) + t.is(typeof views[0].count, 'number') +}) + +test(macro, { + interval: 'MONTHLY', + type: 'UNIQUE', + limit: 1 +}, (t, views) => { + t.is(views.length, 1) + t.is(typeof views[0].count, 'number') +}) + +test(macro, { + interval: 'YEARLY', + type: 'UNIQUE' +}, (t, views) => { + t.is(views.length, 14) + t.is(typeof views[0].count, 'number') +}) + +test(macro, { + interval: 'DAILY', + type: 'TOTAL' +}, (t, views) => { + t.is(views.length, 14) + t.is(views[0].count, 1) +}) + +test(macro, { + interval: 'DAILY', + type: 'TOTAL', + limit: 1 +}, (t, views) => { + t.is(views.length, 1) + t.is(views[0].count, 1) +}) + +test(macro, { + interval: 'MONTHLY', + type: 'TOTAL' +}, (t, views) => { + t.is(views.length, 14) + t.is(typeof views[0].count, 'number') +}) + +test(macro, { + interval: 'MONTHLY', + type: 'TOTAL', + limit: 1 +}, (t, views) => { + t.is(views.length, 1) + t.is(typeof views[0].count, 'number') +}) + +test(macro, { + interval: 'YEARLY', + type: 'TOTAL' +}, (t, views) => { + t.is(views.length, 14) + t.is(typeof views[0].count, 'number') +}) + +test(macro, { + interval: 'YEARLY', + type: 'TOTAL', + limit: 1 +}, (t, views) => { + t.is(views.length, 1) + t.is(typeof views[0].count, 'number') +}) \ No newline at end of file diff --git a/test/resolvers/tokens.js b/test/resolvers/tokens.js new file mode 100644 index 00000000..5d0a9912 --- /dev/null +++ b/test/resolvers/tokens.js @@ -0,0 +1,87 @@ +'use strict' + +const test = require('ava') +const listen = require('test-listen') +const mockedEnv = require('mocked-env') + +const { connectToDatabase, fillDatabase, cleanupDatabase, disconnectFromDatabase, api } = require('./_utils') +const server = require('../../src/server') + +const base = listen(server) + +let validToken = null + +test.before(connectToDatabase) +test.beforeEach(fillDatabase) +test.afterEach.always(cleanupDatabase) +test.after.always(disconnectFromDatabase) + +test.serial('return token and cookie after successful login', async (t) => { + + + const username = 'admin' + const password = '123456' + + const body = { + query: ` + mutation createToken($input: CreateTokenInput!) { + createToken(input: $input) { + success + payload { + id + } + } + } + `, + variables: { + input: { + username, + password + } + } + } + + const restore = mockedEnv({ + ACKEE_USERNAME: username, + ACKEE_PASSWORD: password, + ACKEE_ALLOW_ORIGIN: 'https://badexample.com,https://bad.example.com,https://example.com' + }) + + const { headers, json } = await api(base, body, undefined, { + Host: 'ackee.example.com' + }) + + t.true(headers.get('Set-Cookie').includes('ackee_ignore=1')) + t.true(json.data.createToken.success) + t.is(typeof json.data.createToken.payload.id, 'string') + + // Save token for the next test + validToken = json.data.createToken.payload + + restore() + +}) + +test.serial('clear login cookie after successful logout', async (t) => { + + const body = { + query: ` + mutation deleteToken($id: ID!) { + deleteToken(id: $id) { + success + } + } + `, + variables: { + id: validToken.id + } + } + + const { json, headers } = await api(base, body, undefined, { + Host: 'ackee.example.com' + }) + + t.true(headers.get('Set-Cookie').includes('ackee_ignore=0')) + t.true(json.data.deleteToken.success) + +}) \ No newline at end of file diff --git a/test/server-with-cors.js b/test/server-with-cors.js index 26bd28d5..d5695215 100644 --- a/test/server-with-cors.js +++ b/test/server-with-cors.js @@ -22,6 +22,7 @@ test('return cors headers if env var specifies one', async (t) => { t.is(headers.get('Access-Control-Allow-Origin'), url.origin) t.is(headers.get('Access-Control-Allow-Methods'), 'GET, POST, PATCH, OPTIONS') t.is(headers.get('Access-Control-Allow-Headers'), 'Content-Type') + t.is(headers.get('Access-Control-Allow-Credentials'), 'true') restore() diff --git a/test/server-with-multiple-cors.js b/test/server-with-multiple-cors.js index 71c629b8..3fe1430f 100644 --- a/test/server-with-multiple-cors.js +++ b/test/server-with-multiple-cors.js @@ -22,6 +22,7 @@ test('return cors headers with corresponding origin if env var specifies multipl t.is(headers.get('Access-Control-Allow-Origin'), url.origin) t.is(headers.get('Access-Control-Allow-Methods'), 'GET, POST, PATCH, OPTIONS') t.is(headers.get('Access-Control-Allow-Headers'), 'Content-Type') + t.is(headers.get('Access-Control-Allow-Credentials'), 'true') restore() diff --git a/test/server-with-unlisted-cors.js b/test/server-with-unlisted-cors.js index 4b31ccc0..9af1247d 100644 --- a/test/server-with-unlisted-cors.js +++ b/test/server-with-unlisted-cors.js @@ -22,6 +22,7 @@ test('return cors headers with no origin if hostname not whitelisted in env var' t.is(headers.get('Access-Control-Allow-Origin'), null) t.is(headers.get('Access-Control-Allow-Methods'), null) t.is(headers.get('Access-Control-Allow-Headers'), null) + t.is(headers.get('Access-Control-Allow-Credentials'), null) restore() diff --git a/test/server-with-wildcard-cors.js b/test/server-with-wildcard-cors.js index cc74baab..f3c7f567 100644 --- a/test/server-with-wildcard-cors.js +++ b/test/server-with-wildcard-cors.js @@ -22,6 +22,7 @@ test('return cors headers if env vars specify wildcard', async (t) => { t.is(headers.get('Access-Control-Allow-Origin'), '*') t.is(headers.get('Access-Control-Allow-Methods'), 'GET, POST, PATCH, OPTIONS') t.is(headers.get('Access-Control-Allow-Headers'), 'Content-Type') + t.is(headers.get('Access-Control-Allow-Credentials'), 'true') restore() diff --git a/test/server-without-cors.js b/test/server-without-cors.js index c52a3db6..612d9574 100644 --- a/test/server-without-cors.js +++ b/test/server-without-cors.js @@ -22,6 +22,7 @@ test('return no cors headers if env var specifies none', async (t) => { t.is(headers.get('Access-Control-Allow-Origin'), null) t.is(headers.get('Access-Control-Allow-Methods'), null) t.is(headers.get('Access-Control-Allow-Headers'), null) + t.is(headers.get('Access-Control-Allow-Credentials'), null) restore() diff --git a/yarn.lock b/yarn.lock index 51a67810..fb68f28e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3,9 +3,9 @@ "@apollo/client@^3.1.5": - version "3.2.4" - resolved "https://registry.yarnpkg.com/@apollo/client/-/client-3.2.4.tgz#d9a308a900bd9e7053348367f66f3962804ed385" - integrity sha512-lfsxKINoc11+g4NQFyKFuxszc/GlecHrxkJYvx/oWkdpscSU5bm/c+BwI/yvk1/E3yfbR7Afi9XIYrt212xrtA== + version "3.2.5" + resolved "https://registry.yarnpkg.com/@apollo/client/-/client-3.2.5.tgz#24e0a6faa1d231ab44807af237c6227410c75c4d" + integrity sha512-zpruxnFMz6K94gs2pqc3sidzFDbQpKT5D6P/J/I9s8ekHZ5eczgnRp6pqXC86Bh7+44j/btpmOT0kwiboyqTnA== dependencies: "@graphql-typed-document-node/core" "^3.0.0" "@types/zen-observable" "^0.8.0" @@ -17,7 +17,6 @@ optimism "^0.13.0" prop-types "^15.7.2" symbol-observable "^2.0.0" - terser "^5.2.0" ts-invariant "^0.4.4" tslib "^1.10.0" zen-observable "^0.8.14" @@ -69,10 +68,10 @@ dependencies: "@babel/highlight" "^7.10.4" -"@babel/compat-data@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.12.1.tgz#d7386a689aa0ddf06255005b4b991988021101a0" - integrity sha512-725AQupWJZ8ba0jbKceeFblZTY90McUBWMwHhkFQ9q1zKPJ95GUktljFcgcsIVwRnTnRKlcYzfiNImg5G9m6ZQ== +"@babel/compat-data@^7.12.1", "@babel/compat-data@^7.12.5": + version "7.12.5" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.12.5.tgz#f56db0c4bb1bbbf221b4e81345aab4141e7cb0e9" + integrity sha512-DTsS7cxrsH3by8nqQSpFSyjSfSYl57D6Cf4q8dW3LK83tBKBDCkfcay1nYkXq1nIHXnpX8WMMb/O25HOy3h1zg== "@babel/core@^7.0.0", "@babel/core@^7.7.5", "@babel/core@^7.8.4": version "7.12.3" @@ -96,12 +95,12 @@ semver "^5.4.1" source-map "^0.5.0" -"@babel/generator@^7.12.1", "@babel/generator@^7.5.0": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.12.1.tgz#0d70be32bdaa03d7c51c8597dda76e0df1f15468" - integrity sha512-DB+6rafIdc9o72Yc3/Ph5h+6hUjeOp66pF0naQBgUFFuPqzQwIlPTm3xZR7YNvduIMtkDIj2t21LSQwnbCrXvg== +"@babel/generator@^7.12.1", "@babel/generator@^7.12.5", "@babel/generator@^7.5.0": + version "7.12.5" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.12.5.tgz#a2c50de5c8b6d708ab95be5e6053936c1884a4de" + integrity sha512-m16TQQJ8hPt7E+OS/XVQg/7U184MLXtvuGbCdA7na61vha+ImkyyNM/9DDA0unYCVZn3ZOhng+qz48/KBOT96A== dependencies: - "@babel/types" "^7.12.1" + "@babel/types" "^7.12.5" jsesc "^2.5.1" source-map "^0.5.0" @@ -121,9 +120,9 @@ "@babel/types" "^7.10.4" "@babel/helper-builder-react-jsx-experimental@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-react-jsx-experimental/-/helper-builder-react-jsx-experimental-7.12.1.tgz#1f1ad4c95f1d059856d2fdbc0763489d020cd02d" - integrity sha512-82to8lR7TofZWbTd3IEZT1xNHfeU/Ef4rDm/GLXddzqDh+yQ19QuGSzqww51aNxVH8rwfRIzL0EUQsvODVhtyw== + version "7.12.4" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-react-jsx-experimental/-/helper-builder-react-jsx-experimental-7.12.4.tgz#55fc1ead5242caa0ca2875dcb8eed6d311e50f48" + integrity sha512-AjEa0jrQqNk7eDQOo0pTfUOwQBMF+xVqrausQwT9/rTKy0g04ggFNaJpaE09IQMn9yExluigWMJcj0WC7bq+Og== dependencies: "@babel/helper-annotate-as-pure" "^7.10.4" "@babel/helper-module-imports" "^7.12.1" @@ -138,13 +137,13 @@ "@babel/types" "^7.10.4" "@babel/helper-compilation-targets@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.12.1.tgz#310e352888fbdbdd8577be8dfdd2afb9e7adcf50" - integrity sha512-jtBEif7jsPwP27GPHs06v4WBV0KrE8a/P7n0N0sSvHn2hwUCYnolP/CLmz51IzAW4NlN+HuoBtb9QcwnRo9F/g== + version "7.12.5" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.12.5.tgz#cb470c76198db6a24e9dbc8987275631e5d29831" + integrity sha512-+qH6NrscMolUlzOYngSBMIOQpKUGPPsc61Bu5W10mg84LxZ7cmvnBHzARKbDoFxVvqqAbj6Tg6N7bSrWSPXMyw== dependencies: - "@babel/compat-data" "^7.12.1" + "@babel/compat-data" "^7.12.5" "@babel/helper-validator-option" "^7.12.1" - browserslist "^4.12.0" + browserslist "^4.14.5" semver "^5.5.0" "@babel/helper-create-class-features-plugin@^7.12.1": @@ -214,11 +213,11 @@ "@babel/types" "^7.12.1" "@babel/helper-module-imports@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.12.1.tgz#1644c01591a15a2f084dd6d092d9430eb1d1216c" - integrity sha512-ZeC1TlMSvikvJNy1v/wPIazCu3NdOwgYZLIkmIyAsGhqkNpiDoQQRmaCK8YP4Pq3GPTLPV9WXaPCJKvx06JxKA== + version "7.12.5" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.12.5.tgz#1bfc0229f794988f76ed0a4d4e90860850b54dfb" + integrity sha512-SR713Ogqg6++uexFRORf/+nPXMmWIn80TALu0uaFb+iQIUoR7bOC7zBWyzBs5b3tBBJXuyD0cRu1F15GyzjOWA== dependencies: - "@babel/types" "^7.12.1" + "@babel/types" "^7.12.5" "@babel/helper-module-transforms@^7.12.1": version "7.12.1" @@ -264,14 +263,14 @@ "@babel/types" "^7.12.1" "@babel/helper-replace-supers@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.12.1.tgz#f15c9cc897439281891e11d5ce12562ac0cf3fa9" - integrity sha512-zJjTvtNJnCFsCXVi5rUInstLd/EIVNmIKA1Q9ynESmMBWPWd+7sdR+G4/wdu+Mppfep0XLyG2m7EBPvjCeFyrw== + version "7.12.5" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.12.5.tgz#f009a17543bbbbce16b06206ae73b63d3fca68d9" + integrity sha512-5YILoed0ZyIpF4gKcpZitEnXEJ9UoDRki1Ey6xz46rxOzfNMAhVIJMoune1hmPVxh40LRv1+oafz7UsWX+vyWA== dependencies: "@babel/helper-member-expression-to-functions" "^7.12.1" "@babel/helper-optimise-call-expression" "^7.10.4" - "@babel/traverse" "^7.12.1" - "@babel/types" "^7.12.1" + "@babel/traverse" "^7.12.5" + "@babel/types" "^7.12.5" "@babel/helper-simple-access@^7.12.1": version "7.12.1" @@ -315,13 +314,13 @@ "@babel/types" "^7.10.4" "@babel/helpers@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.12.1.tgz#8a8261c1d438ec18cb890434df4ec768734c1e79" - integrity sha512-9JoDSBGoWtmbay98efmT2+mySkwjzeFeAL9BuWNoVQpkPFQF8SIIFUfY5os9u8wVzglzoiPRSW7cuJmBDUt43g== + version "7.12.5" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.12.5.tgz#1a1ba4a768d9b58310eda516c449913fe647116e" + integrity sha512-lgKGMQlKqA8meJqKsW6rUnc4MdUk35Ln0ATDqdM1a/UpARODdI4j5Y5lVfUScnSNkJcdCRAaWkspykNoFg9sJA== dependencies: "@babel/template" "^7.10.4" - "@babel/traverse" "^7.12.1" - "@babel/types" "^7.12.1" + "@babel/traverse" "^7.12.5" + "@babel/types" "^7.12.5" "@babel/highlight@^7.10.4": version "7.10.4" @@ -337,10 +336,10 @@ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.11.5.tgz#c7ff6303df71080ec7a4f5b8c003c58f1cf51037" integrity sha512-X9rD8qqm695vgmeaQ4fvz/o3+Wk4ZzQvSHkDBgpYKxpD4qTAUm88ZKtHkVqIOsYFFbIQ6wQYhC6q7pjqVK0E0Q== -"@babel/parser@^7.0.0", "@babel/parser@^7.10.4", "@babel/parser@^7.12.1", "@babel/parser@^7.12.3": - version "7.12.3" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.12.3.tgz#a305415ebe7a6c7023b40b5122a0662d928334cd" - integrity sha512-kFsOS0IbsuhO5ojF8Hc8z/8vEIOkylVBrjiZUbLTE3XFe0Qi+uu6HjzQixkFaqr0ZPAMZcBVxEwmsnsLPZ2Xsw== +"@babel/parser@^7.0.0", "@babel/parser@^7.10.4", "@babel/parser@^7.12.1", "@babel/parser@^7.12.3", "@babel/parser@^7.12.5": + version "7.12.5" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.12.5.tgz#b4af32ddd473c0bfa643bd7ff0728b8e71b81ea0" + integrity sha512-FVM6RZQ0mn2KCf1VUED7KepYeUWoVShczewOCfm3nzoBybaih51h+sYVVGthW9M6lPByEPTQf+xm27PBdlpwmQ== "@babel/plugin-proposal-async-generator-functions@^7.12.1": version "7.12.1" @@ -400,9 +399,9 @@ "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0" "@babel/plugin-proposal-numeric-separator@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.12.1.tgz#0e2c6774c4ce48be412119b4d693ac777f7685a6" - integrity sha512-MR7Ok+Af3OhNTCxYVjJZHS0t97ydnJZt/DbR4WISO39iDnhiD8XHrY12xuSJ90FFEGjir0Fzyyn7g/zY6hxbxA== + version "7.12.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.12.5.tgz#b1ce757156d40ed79d59d467cb2b154a5c4149ba" + integrity sha512-UiAnkKuOrCyjZ3sYNHlRlfuZJbBHknMQ9VMwVeX97Ofwx7RpD6gS2HfqTCh8KNUQgcOm8IKt103oR4KIjh7Q8g== dependencies: "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-numeric-separator" "^7.10.4" @@ -746,10 +745,10 @@ dependencies: "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-react-jsx-development@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.12.1.tgz#0b8f8cd531dcf7991f1e5f2c10a2a4f1cfc78e36" - integrity sha512-IilcGWdN1yNgEGOrB96jbTplRh+V2Pz1EoEwsKsHfX1a/L40cUYuD71Zepa7C+ujv7kJIxnDftWeZbKNEqZjCQ== +"@babel/plugin-transform-react-jsx-development@^7.12.5": + version "7.12.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.12.5.tgz#677de5b96da310430d6cfb7fee16a1603afa3d56" + integrity sha512-1JJusg3iPgsZDthyWiCr3KQiGs31ikU/mSf2N2dSYEAO0GEImmVUbWf0VoSDGDFTAn5Dj4DUiR6SdIXHY7tELA== dependencies: "@babel/helper-builder-react-jsx-experimental" "^7.12.1" "@babel/helper-plugin-utils" "^7.10.4" @@ -769,10 +768,10 @@ dependencies: "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-react-jsx@^7.0.0", "@babel/plugin-transform-react-jsx@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.12.1.tgz#c2d96c77c2b0e4362cc4e77a43ce7c2539d478cb" - integrity sha512-RmKejwnT0T0QzQUzcbP5p1VWlpnP8QHtdhEtLG55ZDQnJNalbF3eeDyu3dnGKvGzFIQiBzFhBYTwvv435p9Xpw== +"@babel/plugin-transform-react-jsx@^7.0.0", "@babel/plugin-transform-react-jsx@^7.12.5": + version "7.12.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.12.5.tgz#39ede0e30159770561b6963be143e40af3bde00c" + integrity sha512-2xkcPqqrYiOQgSlM/iwto1paPijjsDbUynN13tI6bosDz/jOW3CRzYguIE8wKX32h+msbBM22Dv5fwrFkUOZjQ== dependencies: "@babel/helper-builder-react-jsx" "^7.10.4" "@babel/helper-builder-react-jsx-experimental" "^7.12.1" @@ -937,22 +936,22 @@ esutils "^2.0.2" "@babel/preset-react@^7.8.3": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.12.1.tgz#7f022b13f55b6dd82f00f16d1c599ae62985358c" - integrity sha512-euCExymHCi0qB9u5fKw7rvlw7AZSjw/NaB9h7EkdTt5+yHRrXdiRTh7fkG3uBPpJg82CqLfp1LHLqWGSCrab+g== + version "7.12.5" + resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.12.5.tgz#d45625f65d53612078a43867c5c6750e78772c56" + integrity sha512-jcs++VPrgyFehkMezHtezS2BpnUlR7tQFAyesJn1vGTO9aTFZrgIQrA5YydlTwxbcjMwkFY6i04flCigRRr3GA== dependencies: "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-transform-react-display-name" "^7.12.1" - "@babel/plugin-transform-react-jsx" "^7.12.1" - "@babel/plugin-transform-react-jsx-development" "^7.12.1" + "@babel/plugin-transform-react-jsx" "^7.12.5" + "@babel/plugin-transform-react-jsx-development" "^7.12.5" "@babel/plugin-transform-react-jsx-self" "^7.12.1" "@babel/plugin-transform-react-jsx-source" "^7.12.1" "@babel/plugin-transform-react-pure-annotations" "^7.12.1" "@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2", "@babel/runtime@^7.11.2", "@babel/runtime@^7.12.1", "@babel/runtime@^7.8.4": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.12.1.tgz#b4116a6b6711d010b2dad3b7b6e43bf1b9954740" - integrity sha512-J5AIf3vPj3UwXaAzb5j1xM4WAQDX3EMgemF8rjCP3SoW09LfRKAXQKt6CoVYl230P6iWdRcBbnLDDdnqWxZSCA== + version "7.12.5" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.12.5.tgz#410e7e487441e1b360c29be715d870d9b985882e" + integrity sha512-plcc+hbExy3McchJCEQG3knOsuh3HH+Prx1P6cLIkET/0dLuQDEnrT+s27Axgc9bqfsmNUNHfscgMUdBpC9xfg== dependencies: regenerator-runtime "^0.13.4" @@ -965,7 +964,7 @@ "@babel/parser" "^7.10.4" "@babel/types" "^7.10.4" -"@babel/traverse@7.12.1", "@babel/traverse@^7.0.0", "@babel/traverse@^7.10.4", "@babel/traverse@^7.12.1", "@babel/traverse@^7.7.4": +"@babel/traverse@7.12.1": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.12.1.tgz#941395e0c5cc86d5d3e75caa095d3924526f0c1e" integrity sha512-MA3WPoRt1ZHo2ZmoGKNqi20YnPt0B1S0GTZEPhhd+hw2KGUzBlHuVunj6K4sNuK+reEvyiPwtp0cpaqLzJDmAw== @@ -980,7 +979,22 @@ globals "^11.1.0" lodash "^4.17.19" -"@babel/types@7.12.1", "@babel/types@^7.0.0", "@babel/types@^7.10.4", "@babel/types@^7.10.5", "@babel/types@^7.11.0", "@babel/types@^7.12.1", "@babel/types@^7.4.4": +"@babel/traverse@^7.0.0", "@babel/traverse@^7.10.4", "@babel/traverse@^7.12.1", "@babel/traverse@^7.12.5", "@babel/traverse@^7.7.4": + version "7.12.5" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.12.5.tgz#78a0c68c8e8a35e4cacfd31db8bb303d5606f095" + integrity sha512-xa15FbQnias7z9a62LwYAA5SZZPkHIXpd42C6uW68o8uTuua96FHZy1y61Va5P/i83FAAcMpW8+A/QayntzuqA== + dependencies: + "@babel/code-frame" "^7.10.4" + "@babel/generator" "^7.12.5" + "@babel/helper-function-name" "^7.10.4" + "@babel/helper-split-export-declaration" "^7.11.0" + "@babel/parser" "^7.12.5" + "@babel/types" "^7.12.5" + debug "^4.1.0" + globals "^11.1.0" + lodash "^4.17.19" + +"@babel/types@7.12.1": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.12.1.tgz#e109d9ab99a8de735be287ee3d6a9947a190c4ae" integrity sha512-BzSY3NJBKM4kyatSOWh3D/JJ2O3CVzBybHWxtgxnggaxEuaSTTDqeiSb/xk9lrkw2Tbqyivw5ZU4rT+EfznQsA== @@ -989,6 +1003,15 @@ lodash "^4.17.19" to-fast-properties "^2.0.0" +"@babel/types@^7.0.0", "@babel/types@^7.10.4", "@babel/types@^7.10.5", "@babel/types@^7.11.0", "@babel/types@^7.12.1", "@babel/types@^7.12.5", "@babel/types@^7.4.4": + version "7.12.6" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.12.6.tgz#ae0e55ef1cce1fbc881cd26f8234eb3e657edc96" + integrity sha512-hwyjw6GvjBLiyy3W0YQf0Z5Zf4NpYejUnKFcfcUhZCSffoBBp30w6wP2Wn6pk31jMYZvcOrB/1b7cGXvEoKogA== + dependencies: + "@babel/helper-validator-identifier" "^7.10.4" + lodash "^4.17.19" + to-fast-properties "^2.0.0" + "@concordance/react@^2.0.0": version "2.0.0" resolved "https://registry.yarnpkg.com/@concordance/react/-/react-2.0.0.tgz#aef913f27474c53731f4fd79cc2f54897de90fde" @@ -1046,15 +1069,15 @@ fs-extra "9.0.1" tslib "~2.0.1" -"@graphql-tools/delegate@7.0.2", "@graphql-tools/delegate@^7.0.0", "@graphql-tools/delegate@^7.0.1", "@graphql-tools/delegate@^7.0.2": - version "7.0.2" - resolved "https://registry.yarnpkg.com/@graphql-tools/delegate/-/delegate-7.0.2.tgz#f933254727173bab4f6e0e13b2d8d4500eadf426" - integrity sha512-AkNkg8w966+cHEVNddYUPeuPybNvbnkL+iFA8rrW5V3F8e6LHRep5MnFwNKD4JTae9HeKEs9Jx0UQDwnuCsZng== +"@graphql-tools/delegate@^7.0.0", "@graphql-tools/delegate@^7.0.1", "@graphql-tools/delegate@^7.0.2", "@graphql-tools/delegate@^7.0.3": + version "7.0.4" + resolved "https://registry.yarnpkg.com/@graphql-tools/delegate/-/delegate-7.0.4.tgz#9afaef44d39bb7a7bf37dd2e853fd2e85b4b1e96" + integrity sha512-6/qL9V31FgECNPwc5As1359hpsAt4ASWsiYBSYWL+Iq9/K0YRcNeEmSseXIyCP4oh8k/9HS/w/m2lkMk/YSUpQ== dependencies: "@ardatan/aggregate-error" "0.0.6" "@graphql-tools/batch-execute" "^7.0.0" "@graphql-tools/schema" "^7.0.0" - "@graphql-tools/utils" "^7.0.1" + "@graphql-tools/utils" "^7.0.2" dataloader "2.0.0" is-promise "4.0.0" tslib "~2.0.1" @@ -1120,12 +1143,12 @@ tslib "~2.0.1" "@graphql-tools/links@^7.0.0": - version "7.0.2" - resolved "https://registry.yarnpkg.com/@graphql-tools/links/-/links-7.0.2.tgz#3b4f4128b87853f7823ead78b31c1121af85a73e" - integrity sha512-o4F67+CY+DNlZB2v+z353phgZy2s7fwtf7SBG6OMlsru6eEVK+nAqZJbLPUxpDprwwduy56lSLH1ul9qL+V73Q== + version "7.0.3" + resolved "https://registry.yarnpkg.com/@graphql-tools/links/-/links-7.0.3.tgz#e734d02b48038f3cfd80ecee0da28378ce699831" + integrity sha512-if/o6H6Gjk7Ph2hZsBaUL1z95jeAMDdgAIA8RFxepXJAHLIcyufFvCoKxReeXhuG6C20FfLIVhDXeXdsQkezmQ== dependencies: - "@graphql-tools/delegate" "7.0.2" - "@graphql-tools/utils" "7.0.1" + "@graphql-tools/delegate" "^7.0.3" + "@graphql-tools/utils" "^7.0.2" apollo-upload-client "14.1.2" cross-fetch "3.0.6" form-data "3.0.0" @@ -1224,9 +1247,9 @@ tslib "~2.0.1" "@graphql-tools/url-loader@^6.3.2": - version "6.3.2" - resolved "https://registry.yarnpkg.com/@graphql-tools/url-loader/-/url-loader-6.3.2.tgz#ed4e9dafcd83bda94ba7114629e712fc81a6a3ef" - integrity sha512-nrrZD33T7lFeOjIufCrwk2PAHYqFtdFcb1pe1ULWnvuFmFuhZnRCgIsfCsoy+WOMwmZHQ/eXBem//I/bewXlgw== + version "6.4.0" + resolved "https://registry.yarnpkg.com/@graphql-tools/url-loader/-/url-loader-6.4.0.tgz#e13aa701f334aaaa73975ccf25336f1bd5fae35e" + integrity sha512-M3mS/VH6vpnai3b3Fa33kYcdCgZvhFh7RqFE1R3NMfhYjphQ10EWwgf31P+VQcBNB2zz+ubxttI6UcJLiGqwuQ== dependencies: "@graphql-tools/delegate" "^7.0.1" "@graphql-tools/utils" "^7.0.1" @@ -1234,14 +1257,15 @@ "@types/websocket" "1.0.1" cross-fetch "3.0.6" subscriptions-transport-ws "0.9.18" + sync-fetch "0.3.0" tslib "~2.0.1" valid-url "1.0.9" websocket "1.0.32" -"@graphql-tools/utils@7.0.1", "@graphql-tools/utils@^7.0.0", "@graphql-tools/utils@^7.0.1": - version "7.0.1" - resolved "https://registry.yarnpkg.com/@graphql-tools/utils/-/utils-7.0.1.tgz#8bf54676de65878d2b1ba34fcd58ef4d8ae0b589" - integrity sha512-DsV7XfEJE6rPQ3Ysusf28MPun/YL+pc7L0hiBOph/F8+/H1pW1ndRqRrnmX3Owrq9xW1EHSw2WU8qvdjn8kOjw== +"@graphql-tools/utils@^7.0.0", "@graphql-tools/utils@^7.0.1", "@graphql-tools/utils@^7.0.2": + version "7.0.2" + resolved "https://registry.yarnpkg.com/@graphql-tools/utils/-/utils-7.0.2.tgz#1977d3277158bf32df792a5ff76d3fdc04647a64" + integrity sha512-VQQ7krHeoXO0FS3qbWsb/vZb8c8oyiCYPIH4RSgeK9SKOUpatWYt3DW4jmLmyHZLVVMk0yjUbsOhKTBEMejKSA== dependencies: "@ardatan/aggregate-error" "0.0.6" camel-case "4.1.1" @@ -1398,9 +1422,9 @@ integrity sha512-P1bffQfhD3O4LW0ioENXUhZ9OIa0Zn+P7M+pWgkCKaT53wVLSq0mrKksCID/FGHpFhRSxRGhgrQmfhRuzwtKdg== "@types/cookies@*": - version "0.7.4" - resolved "https://registry.yarnpkg.com/@types/cookies/-/cookies-0.7.4.tgz#26dedf791701abc0e36b5b79a5722f40e455f87b" - integrity sha512-oTGtMzZZAVuEjTwCjIh8T8FrC8n/uwy+PG0yTvQcdZ7etoel7C7/3MSd7qrukENTgQtotG7gvBlBojuVs7X5rw== + version "0.7.5" + resolved "https://registry.yarnpkg.com/@types/cookies/-/cookies-0.7.5.tgz#aa42c9a9834724bffee597028da5319b38e85e84" + integrity sha512-3+TAFSm78O7/bAeYdB8FoYGntuT87vVP9JKuQRL8sRhv9313LP2SpHHL50VeFtnyjIcb3UELddMk5Yt0eOSOkg== dependencies: "@types/connect" "*" "@types/express" "*" @@ -1484,9 +1508,9 @@ "@types/koa" "*" "@types/koa@*": - version "2.11.5" - resolved "https://registry.yarnpkg.com/@types/koa/-/koa-2.11.5.tgz#a2b81382bf65d72bdc3bd906abdee259fefdebc2" - integrity sha512-egP+ceD3+v9PnFW+DLTFO8mt6wa5sDqfGOBIwOAZ61Wzsq4bGZc5kMpJgcCwq7ARGIBfHBY+KkK/1RsMftV/qQ== + version "2.11.6" + resolved "https://registry.yarnpkg.com/@types/koa/-/koa-2.11.6.tgz#b7030caa6b44af801c2aea13ba77d74aff7484d5" + integrity sha512-BhyrMj06eQkk04C97fovEDQMpLpd2IxCB4ecitaXwOKGq78Wi2tooaDOWOFGajPk8IkQOAtMppApgSVkYe1F/A== dependencies: "@types/accepts" "*" "@types/content-disposition" "*" @@ -1521,14 +1545,14 @@ form-data "^3.0.0" "@types/node@*": - version "14.11.10" - resolved "https://registry.yarnpkg.com/@types/node/-/node-14.11.10.tgz#8c102aba13bf5253f35146affbf8b26275069bef" - integrity sha512-yV1nWZPlMFpoXyoknm4S56y2nlTAuFYaJuQtYRAOU7xA/FJ9RY0Xm7QOkaYMMmr8ESdHIuUb6oQgR/0+2NqlyA== + version "14.14.6" + resolved "https://registry.yarnpkg.com/@types/node/-/node-14.14.6.tgz#146d3da57b3c636cc0d1769396ce1cfa8991147f" + integrity sha512-6QlRuqsQ/Ox/aJEQWBEJG7A9+u7oSYl3mem/K8IzxXG/kAGbV1YPD9Bg9Zw3vyxC/YP+zONKwy8hGkSt1jxFMw== "@types/node@^10.1.0": - version "10.17.40" - resolved "https://registry.yarnpkg.com/@types/node/-/node-10.17.40.tgz#8a50e47daff15fd4a89dc56f5221b3729e506be6" - integrity sha512-3hZT2z2/531A5pc8hYhn1gU5Qb1SIRSgMLQ6zuHA5xtt16lWAxUGprtr8lJuc9zNJMXEIIBWfSnzqBP/4mglpA== + version "10.17.44" + resolved "https://registry.yarnpkg.com/@types/node/-/node-10.17.44.tgz#3945e6b702cb6403f22b779c8ea9e5c3f44ead40" + integrity sha512-vHPAyBX1ffLcy4fQHmDyIUMUb42gHZjPHU66nhvbMzAWJqHnySGZ6STwN3rwrnSd1FHB0DI/RWgGELgKSYRDmw== "@types/normalize-package-data@^2.4.0": version "2.4.0" @@ -1556,12 +1580,17 @@ integrity sha512-ewFXqrQHlFsgc09MK5jP5iR7vumV/BYayNC6PgJO2LPe8vrnNFyjQjSppfEngITi0qvfKtzFvgKymGheFM9UOA== "@types/serve-static@*": - version "1.13.5" - resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.13.5.tgz#3d25d941a18415d3ab092def846e135a08bbcf53" - integrity sha512-6M64P58N+OXjU432WoLLBQxbA0LRGBCRm7aAGQJ+SMC1IMl0dgRVi9EFfoDcS2a7Xogygk/eGN94CfwU9UF7UQ== + version "1.13.6" + resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.13.6.tgz#866b1b8dec41c36e28c7be40ac725b88be43c5c1" + integrity sha512-nuRJmv7jW7VmCVTn+IgYDkkbbDGyIINOeu/G0d74X3lm6E5KfMeQPJhxIt1ayQeQB3cSxvYs1RA/wipYoFB4EA== dependencies: - "@types/express-serve-static-core" "*" "@types/mime" "*" + "@types/node" "*" + +"@types/tmp@^0.2.0": + version "0.2.0" + resolved "https://registry.yarnpkg.com/@types/tmp/-/tmp-0.2.0.tgz#e3f52b4d7397eaa9193592ef3fdd44dc0af4298c" + integrity sha512-flgpHJjntpBAdJD43ShRosQvNC0ME97DCfGvZEDlAThQmnerRXrLbX6YgzRBQCZTthET9eAWFAMaYP0m0Y4HzQ== "@types/websocket@1.0.1": version "1.0.1" @@ -1571,9 +1600,9 @@ "@types/node" "*" "@types/ws@^7.0.0": - version "7.2.7" - resolved "https://registry.yarnpkg.com/@types/ws/-/ws-7.2.7.tgz#362ad1a1d62721bdb725e72c8cccf357078cf5a3" - integrity sha512-UUFC/xxqFLP17hTva8/lVT0SybLUrfSD9c+iapKb0fEiC8uoDbA+xuZ3pAN603eW+bY8ebSMLm9jXdIPnD0ZgA== + version "7.2.9" + resolved "https://registry.yarnpkg.com/@types/ws/-/ws-7.2.9.tgz#cadfac473acfab192678a487c3ecbb13a503547f" + integrity sha512-gmXYAXr7G4BrRMnkGQGkGonc3ArVro9VZd//C1uns/qqsJyl2dxaJdlPMhZbcq5MTxFFC+ttFWtHSfVW5+hlRA== dependencies: "@types/node" "*" @@ -1629,10 +1658,10 @@ accept@^3.0.2: boom "7.x.x" hoek "6.x.x" -ackee-tracker@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/ackee-tracker/-/ackee-tracker-4.1.0.tgz#775ba71164df84e83adfff88c0a08fd1be1768a6" - integrity sha512-0WVWU0acUf03s+1tUtjpUt1/dawI/0vetdH3eWfxKmuLlYPnnHbZrRgFBg2Aj26TpLUGnWbgnkerc0Yq/w7LJw== +ackee-tracker@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/ackee-tracker/-/ackee-tracker-4.2.0.tgz#6bae008eabdaac358c3da79b568e5e2694bed765" + integrity sha512-SEEr7c+6l1+leLmjf61Abkjux+NnFQON3dpoXgbnmYj/MdYcOF2qiaT8Y8jpMspNJ94CN1TKTD9uLcGrmPvBHA== dependencies: platform "^1.3.6" @@ -1670,6 +1699,13 @@ acorn@^8.0.1: resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.0.4.tgz#7a3ae4191466a6984eee0fe3407a4f3aa9db8354" integrity sha512-XNP0PqF1XD19ZlLKvB7cMmnZswW4C/03pRHgirB30uSJTaS3A3V1/P4sS3HPvFmjoriPCJQs+JDSbm4bL1TxGQ== +agent-base@6: + version "6.0.2" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" + integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== + dependencies: + debug "4" + aggregate-error@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" @@ -1890,6 +1926,13 @@ apollo-server-plugin-base@^0.10.2: dependencies: apollo-server-types "^0.6.1" +apollo-server-plugin-http-headers@^0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/apollo-server-plugin-http-headers/-/apollo-server-plugin-http-headers-0.1.3.tgz#e351e40ad851bed6000f784930f7ed3050daec92" + integrity sha512-n+OykgfkJbxhvz93fU6xo81Fa3eDlUrHLORcg0aPcgCU8X6pVgnpODy7g/8CofZvC3dDdre4juVim8knd2/5Rg== + dependencies: + cookie "^0.4.0" + apollo-server-types@^0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/apollo-server-types/-/apollo-server-types-0.6.1.tgz#61486980b44cacee2cb4939f0b369a0eb661a098" @@ -2179,9 +2222,9 @@ aws-sign2@~0.7.0: integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= aws4@^1.8.0: - version "1.10.1" - resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.10.1.tgz#e1e82e4f3e999e2cfd61b161280d16a111f86428" - integrity sha512-zg7Hz2k5lI8kb7U32998pRRFin7zJlkfezGJjUc2heaD4Pw2wObakCDVzkKztTm/Ln7eiVvYsjqak0Ed4LkMDA== + version "1.11.0" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.11.0.tgz#d61f46d83b2519250e2784daf5b09479a8b41c59" + integrity sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA== babel-plugin-dynamic-import-node@^2.3.3: version "2.3.3" @@ -2243,7 +2286,7 @@ balanced-match@^1.0.0: resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= -base64-js@^1.0.2: +base64-js@^1.0.2, base64-js@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.1.tgz#58ece8cb75dd07e71ed08c736abc5fac4dbf8df1" integrity sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g== @@ -2268,6 +2311,15 @@ bl@^2.2.1: readable-stream "^2.3.5" safe-buffer "^5.1.1" +bl@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/bl/-/bl-4.0.3.tgz#12d6287adc29080e22a705e5764b2a9522cdc489" + integrity sha512-fs4G6/Hu4/EE+F75J8DuN/0IpQqNjAdC7aEQv7Qt8MHGUH7Ckv2MwTEEeN9QehD0pfIDkMI1bkHYkKy7xHyKIg== + dependencies: + buffer "^5.5.0" + inherits "^2.0.4" + readable-stream "^3.4.0" + block-stream@*: version "0.0.9" resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a" @@ -2480,15 +2532,15 @@ browserify@^17.0.0: vm-browserify "^1.0.0" xtend "^4.0.0" -browserslist@^4.0.0, browserslist@^4.12.0, browserslist@^4.8.5: - version "4.14.5" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.14.5.tgz#1c751461a102ddc60e40993639b709be7f2c4015" - integrity sha512-Z+vsCZIvCBvqLoYkBFTwEYH3v5MCQbsAjp50ERycpOjnPmolg1Gjy4+KaWWpm8QOJt9GHkhdqAl14NpCX73CWA== +browserslist@^4.0.0, browserslist@^4.12.0, browserslist@^4.14.5, browserslist@^4.14.6: + version "4.14.6" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.14.6.tgz#97702a9c212e0c6b6afefad913d3a1538e348457" + integrity sha512-zeFYcUo85ENhc/zxHbiIp0LGzzTrE2Pv2JhxvS7kpUb9Q9D38kUX6Bie7pGutJ/5iF5rOxE7CepAuWD56xJ33A== dependencies: - caniuse-lite "^1.0.30001135" - electron-to-chromium "^1.3.571" - escalade "^3.1.0" - node-releases "^1.1.61" + caniuse-lite "^1.0.30001154" + electron-to-chromium "^1.3.585" + escalade "^3.1.1" + node-releases "^1.1.65" bser@2.1.1: version "2.1.1" @@ -2502,6 +2554,11 @@ bson@^1.1.4: resolved "https://registry.yarnpkg.com/bson/-/bson-1.1.5.tgz#2aaae98fcdf6750c0848b0cba1ddec3c73060a34" integrity sha512-kDuEzldR21lHciPQAIulLs1LZlCXdLziXI6Mb/TDkwXhb//UORJNPXgcRs2CuO4H0DcMkpfT3/ySsP3unoZjBg== +buffer-crc32@~0.2.3: + version "0.2.13" + resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" + integrity sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI= + buffer-from@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" @@ -2512,6 +2569,14 @@ buffer-xor@^1.0.3: resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" integrity sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk= +buffer@^5.5.0, buffer@^5.7.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" + integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.1.13" + buffer@~5.2.1: version "5.2.1" resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.2.1.tgz#dd57fa0f109ac59c602479044dca7b8b3d0b71d6" @@ -2521,11 +2586,11 @@ buffer@~5.2.1: ieee754 "^1.1.4" bufferutil@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/bufferutil/-/bufferutil-4.0.1.tgz#3a177e8e5819a1243fe16b63a199951a7ad8d4a7" - integrity sha512-xowrxvpxojqkagPcWRQVXZl0YXhRhAtBEIq3VoER1NH5Mw1n1o0ojdspp+GS2J//2gCVyrzQDApQ4unGF+QOoA== + version "4.0.2" + resolved "https://registry.yarnpkg.com/bufferutil/-/bufferutil-4.0.2.tgz#79f68631910f6b993d870fc77dc0a2894eb96cd5" + integrity sha512-AtnG3W6M8B2n4xDQ5R+70EXvOpnXsFYg/AK2yTZd+HQ/oxAdz+GI+DvjmhBw3L0ole+LJ0ngqY4JMbDzkfNzhA== dependencies: - node-gyp-build "~3.7.0" + node-gyp-build "^4.2.0" builtin-status-codes@^3.0.0: version "3.0.0" @@ -2572,6 +2637,14 @@ caching-transform@^4.0.0: package-hash "^4.0.0" write-file-atomic "^3.0.0" +call-bind@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.0.tgz#24127054bb3f9bdcb4b1fb82418186072f77b8ce" + integrity sha512-AEXsYIyyDY3MCzbwdhzG3Jx1R0J2wetQyUynn6dYHAO+bg8l1k7jwZtRv4ryryFs7EP+NDlikJlVe59jr0cM2w== + dependencies: + function-bind "^1.1.1" + get-intrinsic "^1.0.0" + caller-callsite@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/caller-callsite/-/caller-callsite-2.0.0.tgz#847e0fce0a223750a9a027c54b33731ad3154134" @@ -2622,6 +2695,11 @@ camelcase@^5.0.0, camelcase@^5.3.1: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== +camelcase@^6.0.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.2.0.tgz#924af881c9d525ac9d87f40d964e5cea982a1809" + integrity sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg== + caniuse-api@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/caniuse-api/-/caniuse-api-3.0.0.tgz#5e4d90e2274961d46291997df599e3ed008ee4c0" @@ -2632,10 +2710,10 @@ caniuse-api@^3.0.0: lodash.memoize "^4.1.2" lodash.uniq "^4.5.0" -caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001109, caniuse-lite@^1.0.30001135: - version "1.0.30001151" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001151.tgz#1ddfde5e6fff02aad7940b4edb7d3ac76b0cb00b" - integrity sha512-Zh3sHqskX6mHNrqUerh+fkf0N72cMxrmflzje/JyVImfpknscMnkeJrlFGJcqTmaa0iszdYptGpWMJCRQDkBVw== +caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001109, caniuse-lite@^1.0.30001154: + version "1.0.30001156" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001156.tgz#75c20937b6012fe2b02ab58b30d475bf0718de97" + integrity sha512-z7qztybA2eFZTB6Z3yvaQBIoJpQtsewRD74adw2UbRWwsRq3jIPvgrQGawBMbfafekQaD21FWuXNcywtTDGGCw== caseless@~0.12.0: version "0.12.0" @@ -2986,6 +3064,11 @@ convert-to-spaces@^1.0.1: resolved "https://registry.yarnpkg.com/convert-to-spaces/-/convert-to-spaces-1.0.2.tgz#7e3e48bbe6d997b1417ddca2868204b4d3d85715" integrity sha1-fj5Iu+bZl7FBfdyihoIEtNPYVxU= +cookie@^0.4.0: + version "0.4.1" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.1.tgz#afd713fe26ebd21ba95ceb61f9a8116e50a537d1" + integrity sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA== + copy-to-clipboard@^3.2.0: version "3.3.1" resolved "https://registry.yarnpkg.com/copy-to-clipboard/-/copy-to-clipboard-3.3.1.tgz#115aa1a9998ffab6196f93076ad6da3b913662ae" @@ -2994,11 +3077,11 @@ copy-to-clipboard@^3.2.0: toggle-selection "^1.0.6" core-js-compat@^3.6.2: - version "3.6.5" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.6.5.tgz#2a51d9a4e25dfd6e690251aa81f99e3c05481f1c" - integrity sha512-7ItTKOhOZbznhXAQ2g/slGg1PJV5zDO/WdkTwi7UEOJmkvsE32PWvx6mKtDjiMpjnR2CNf6BAD6sSxIlv7ptng== + version "3.7.0" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.7.0.tgz#8479c5d3d672d83f1f5ab94cf353e57113e065ed" + integrity sha512-V8yBI3+ZLDVomoWICO6kq/CD28Y4r1M7CWeO4AGpMdMfseu8bkSubBmUPySMGKRTS+su4XQ07zUkAsiu9FCWTg== dependencies: - browserslist "^4.8.5" + browserslist "^4.14.6" semver "7.0.0" core-js@^2.4.1: @@ -3007,9 +3090,9 @@ core-js@^2.4.1: integrity sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg== core-js@^3.0.1: - version "3.6.5" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.6.5.tgz#7395dc273af37fb2e50e9bd3d9fe841285231d1a" - integrity sha512-vZVEEwZoIsI+vPEuoF9Iqf5H7/M3eeQqWlQnYa8FSKKePuYTf5MWnxb5SDAzCa60b3JBRS5g9b+Dq7b1y/RCrA== + version "3.7.0" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.7.0.tgz#b0a761a02488577afbf97179e4681bf49568520f" + integrity sha512-NwS7fI5M5B85EwpWuIwJN4i/fbisQUwLwiSNUWeXlkAZ0sbBjLEvLvFLf1uzAUV66PcEPt4xCGCmOZSxVf3xzA== core-util-is@1.0.2, core-util-is@~1.0.0: version "1.0.2" @@ -3080,9 +3163,9 @@ create-hmac@^1.1.0, create-hmac@^1.1.4, create-hmac@^1.1.7: sha.js "^2.4.8" cron-parser@^2.7.3: - version "2.16.3" - resolved "https://registry.yarnpkg.com/cron-parser/-/cron-parser-2.16.3.tgz#acb8e405eed1733aac542fdf604cb7c1daf0204a" - integrity sha512-XNJBD1QLFeAMUkZtZQuncAAOgJFWNhBdIbwgD22hZxrcWOImBFMKgPC66GzaXpyoJs7UvYLLgPH/8BRk/7gbZg== + version "2.17.0" + resolved "https://registry.yarnpkg.com/cron-parser/-/cron-parser-2.17.0.tgz#5707421a7e0a73ee74675d1c032a2f14123f2cf8" + integrity sha512-oTmzVEwlurRe51HqTm4afshVr8Rkxy9kFiWxh5e6SmrY2o9NDYU4S6SduanBZYXLgkLy0skA98y7/tztW/DmjQ== dependencies: is-nan "^1.3.0" moment-timezone "^0.5.31" @@ -3102,7 +3185,7 @@ cross-spawn@^3.0.0: lru-cache "^4.0.1" which "^1.2.9" -cross-spawn@^7.0.0, cross-spawn@^7.0.2: +cross-spawn@^7.0.0, cross-spawn@^7.0.2, cross-spawn@^7.0.3: version "7.0.3" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== @@ -3177,7 +3260,7 @@ css-tree@1.0.0-alpha.37: mdn-data "2.0.4" source-map "^0.6.1" -css-tree@^1.0.0: +css-tree@^1.0.0, css-tree@^1.0.0-alpha.28: version "1.0.0" resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.0.0.tgz#21993fa270d742642a90409a2c0cb3ac0298adf6" integrity sha512-CdVYz/Yuqw0VdKhXPBIgi8DO3NicJVYZNWeX9XcIuSp9ZoFT5IcleVRW07O5rMjdcx1mb+MEJPknTTEW7DdsYw== @@ -3185,14 +3268,6 @@ css-tree@^1.0.0: mdn-data "2.0.12" source-map "^0.6.1" -css-tree@^1.0.0-alpha.28: - version "1.0.0-alpha.39" - resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.0.0-alpha.39.tgz#2bff3ffe1bb3f776cf7eefd91ee5cba77a149eeb" - integrity sha512-7UvkEYgBAHRG9Nt980lYxjsTrCyHFN53ky3wVsDkiMdVqylqRt+Zc+jm5qw7/qyOvN2dHSYtX0e4MbCCExSvnA== - dependencies: - mdn-data "2.0.6" - source-map "^0.6.1" - css-what@^3.2.1: version "3.4.2" resolved "https://registry.yarnpkg.com/css-what/-/css-what-3.4.2.tgz#ea7026fcb01777edbde52124e21f327e7ae950e4" @@ -3354,6 +3429,13 @@ debug@3.1.0: dependencies: ms "2.0.0" +debug@4, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.2.0.tgz#7f150f93920e94c58f5574c2fd01a3110effe7f1" + integrity sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg== + dependencies: + ms "2.1.2" + debug@4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" @@ -3375,13 +3457,6 @@ debug@^3.2.6: dependencies: ms "^2.1.1" -debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.2.0.tgz#7f150f93920e94c58f5574c2fd01a3110effe7f1" - integrity sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg== - dependencies: - ms "2.1.2" - decamelize@^1.1.2, decamelize@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" @@ -3628,10 +3703,10 @@ ecc-jsbn@~0.1.1: jsbn "~0.1.0" safer-buffer "^2.1.0" -electron-to-chromium@^1.3.571: - version "1.3.584" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.584.tgz#506cf7ba5895aafa8241876ab028654b61fd9ceb" - integrity sha512-NB3DzrTzJFhWkUp+nl2KtUtoFzrfGXTir2S+BU4tXGyXH9vlluPuFpE3pTKeH7+PY460tHLjKzh6K2+TWwW+Ww== +electron-to-chromium@^1.3.585: + version "1.3.591" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.591.tgz#a18892bf1acb93f7b6e4da402705d564bc235017" + integrity sha512-ol/0WzjL4NS4Kqy9VD6xXQON91xIihDT36sYCew/G/bnd1v0/4D+kahp26JauQhgFUjrdva3kRSo7URcUmQ+qw== elliptic@^6.5.3: version "6.5.3" @@ -3668,7 +3743,7 @@ encoding@^0.1.11: dependencies: iconv-lite "^0.6.2" -end-of-stream@^1.1.0: +end-of-stream@^1.1.0, end-of-stream@^1.4.1: version "1.4.4" resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== @@ -3723,7 +3798,7 @@ es-abstract@^1.17.0, es-abstract@^1.17.0-next.1, es-abstract@^1.17.2, es-abstrac string.prototype.trimend "^1.0.1" string.prototype.trimstart "^1.0.1" -es-abstract@^1.18.0-next.0: +es-abstract@^1.18.0-next.0, es-abstract@^1.18.0-next.1: version "1.18.0-next.1" resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.18.0-next.1.tgz#6e3a0a4bda717e5023ab3b8e90bec36108d22c68" integrity sha512-I4UGspA0wpZXWENrdA0uHbnhte683t3qT/1VFH9aX2dA5PPSf6QW5HHXf5HImaqPmjXaVeVk4RGWnaylmV7uAA== @@ -3781,7 +3856,7 @@ es6-symbol@^3.1.1, es6-symbol@~3.1.3: d "^1.0.1" ext "^1.1.2" -escalade@^3.1.0, escalade@^3.1.1: +escalade@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== @@ -3902,9 +3977,9 @@ eslint-visitor-keys@^2.0.0: integrity sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ== eslint@^7.12.1: - version "7.12.1" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.12.1.tgz#bd9a81fa67a6cfd51656cdb88812ce49ccec5801" - integrity sha512-HlMTEdr/LicJfN08LB3nM1rRYliDXOmfoO4vj39xN6BLpFzF00hbwBoqHk8UcJ2M/3nlARZWy/mslvGEuZFvsg== + version "7.13.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.13.0.tgz#7f180126c0dcdef327bfb54b211d7802decc08da" + integrity sha512-uCORMuOO8tUzJmsdRtrvcGq5qposf7Rw0LwkTJkoDbOycVQtQjmnhZSuLQnozLE4TmAzlMVV45eCHmQ1OpDKUQ== dependencies: "@babel/code-frame" "^7.0.0" "@eslint/eslintrc" "^0.2.1" @@ -4080,9 +4155,9 @@ fastest-stable-stringify@^1.0.1: integrity sha1-kSLUBtTJ2YvqZEpraFPVh0uHsCg= fastq@^1.6.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.8.0.tgz#550e1f9f59bbc65fe185cb6a9b4d95357107f481" - integrity sha512-SMIZoZdLh/fgofivvIkmknUXyPnvxRE3DhtZ5Me3Mrsk5gyPL42F0xr51TdRXskBxHfMp+07bcYzfsYEsSQA9Q== + version "1.9.0" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.9.0.tgz#e16a72f338eaca48e91b5c23593bcc2ef66b7947" + integrity sha512-i7FVWL8HhVY+CTkwFxkN2mk3h+787ixS5S63eb78diVRc1MCssarHq3W5cj0av7YDSwmaV928RNag+U1etRQ7w== dependencies: reusify "^1.0.4" @@ -4112,6 +4187,13 @@ fbjs@^1.0.0: setimmediate "^1.0.5" ua-parser-js "^0.7.18" +fd-slicer@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.1.0.tgz#25c7c89cb1f9077f8891bbe61d8f390eae256f1e" + integrity sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4= + dependencies: + pend "~1.2.0" + figures@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" @@ -4140,7 +4222,7 @@ fill-range@^7.0.1: dependencies: to-regex-range "^5.0.1" -find-cache-dir@^3.2.0: +find-cache-dir@^3.2.0, find-cache-dir@^3.3.1: version "3.3.1" resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.3.1.tgz#89b33fad4a4670daa94f855f7fbe31d6d84fe880" integrity sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ== @@ -4149,6 +4231,11 @@ find-cache-dir@^3.2.0: make-dir "^3.0.2" pkg-dir "^4.1.0" +find-package-json@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/find-package-json/-/find-package-json-1.2.0.tgz#4057d1b943f82d8445fe52dc9cf456f6b8b58083" + integrity sha512-+SOGcLGYDJHtyqHd87ysBhmaeQ95oWspDKnMXBrnQ9Eq4OkLNqejgoaD8xVWu6GPa0B6roa6KinCMEMcVeqONw== + find-up@^1.0.0: version "1.1.2" resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" @@ -4242,15 +4329,20 @@ formbase@^12.0.1: integrity sha512-BuvRQhEKtJBMc1I3gcwkh/kSXWIOReNzFgD04l5fhnCOOblu39TA6rQpYNDr8ETY5mVBxsXi2QoqMzRLjmVCqA== fromentries@^1.2.0: - version "1.2.1" - resolved "https://registry.yarnpkg.com/fromentries/-/fromentries-1.2.1.tgz#64c31665630479bc993cd800d53387920dc61b4d" - integrity sha512-Xu2Qh8yqYuDhQGOhD5iJGninErSfI9A3FrriD3tjUgV5VbJFeH8vfgZ9HnC6jWN80QDVNQK5vmxRAmEAp7Mevw== + version "1.3.2" + resolved "https://registry.yarnpkg.com/fromentries/-/fromentries-1.3.2.tgz#e4bca6808816bf8f93b52750f1127f5a6fd86e3a" + integrity sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg== fs-capacitor@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/fs-capacitor/-/fs-capacitor-2.0.4.tgz#5a22e72d40ae5078b4fe64fe4d08c0d3fc88ad3c" integrity sha512-8S4f4WsCryNw2mJJchi46YgB6CR5Ze+4L1h8ewl9tEpL4SJ3ZO+c/bS4BWhB8bK+O3TMqhuZarTitd0S0eh2pA== +fs-constants@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" + integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== + fs-extra@9.0.1: version "9.0.1" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.0.1.tgz#910da0062437ba4c39fedd863f1675ccfefcb9fc" @@ -4323,9 +4415,9 @@ gaze@^1.0.0: globule "^1.0.0" gensync@^1.0.0-beta.1: - version "1.0.0-beta.1" - resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.1.tgz#58f4361ff987e5ff6e1e7a210827aa371eaac269" - integrity sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg== + 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== get-assigned-identifiers@^1.2.0: version "1.2.0" @@ -4337,11 +4429,25 @@ get-caller-file@^2.0.1, get-caller-file@^2.0.5: resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== +get-intrinsic@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.0.1.tgz#94a9768fcbdd0595a1c9273aacf4c89d075631be" + integrity sha512-ZnWP+AmS1VUaLgTRy47+zKtjTxz+0xMpx3I52i+aalBK1QP19ggLF3Db89KJX7kjfOfP2eoa01qc++GwPgufPg== + dependencies: + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.1" + get-package-type@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== +get-port@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/get-port/-/get-port-5.1.1.tgz#0469ed07563479de6efb986baf053dcd7d4e3193" + integrity sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ== + get-stdin@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe" @@ -4533,12 +4639,7 @@ graphql-upload@^8.0.2: http-errors "^1.7.3" object-path "^0.11.4" -graphql@^15.3.0: - version "15.3.0" - resolved "https://registry.yarnpkg.com/graphql/-/graphql-15.3.0.tgz#3ad2b0caab0d110e3be4a5a9b2aa281e362b5278" - integrity sha512-GTCJtzJmkFLWRfFJuoo9RWWa/FfamUHgiFosxi/X1Ani4AVWbeyBenZTNX6dM+7WSbbFfTo/25eh0LLkwHMw2w== - -graphql@^15.4.0: +graphql@^15.3.0, graphql@^15.4.0: version "15.4.0" resolved "https://registry.yarnpkg.com/graphql/-/graphql-15.4.0.tgz#e459dea1150da5a106486ba7276518b5295a4347" integrity sha512-EB3zgGchcabbsU9cFe1j+yxdzKQKAbGUWRb13DsrsMN1yyfmmIq+2+L5MqVWcDCE4V89R5AyUOi7sMOGxdsYtA== @@ -4726,6 +4827,14 @@ https-browserify@^1.0.0: resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" integrity sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM= +https-proxy-agent@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz#e2a90542abb68a762e0a0850f6c9edadfd8506b2" + integrity sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA== + dependencies: + agent-base "6" + debug "4" + human-number@^1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/human-number/-/human-number-1.0.6.tgz#d41a783432072fa2bfdf16efa0781f86edef6674" @@ -4766,7 +4875,7 @@ iconv-lite@^0.6.2: dependencies: safer-buffer ">= 2.1.2 < 3.0.0" -ieee754@^1.1.4: +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== @@ -4810,9 +4919,9 @@ import-fresh@^2.0.0: resolve-from "^3.0.0" import-fresh@^3.0.0, import-fresh@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.2.1.tgz#633ff618506e793af5ac91bf48b72677e15cbe66" - integrity sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ== + version "3.2.2" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.2.2.tgz#fc129c160c5d68235507f4331a6baad186bdbc3e" + integrity sha512-cTPNrlvJT6twpYy+YmKUKrTSjWFs3bjYjAhCwm+z4EOCubZxAuO+hHpRN64TqjEaYSHs7tJAE0w1CKMGmsG/lw== dependencies: parent-module "^1.0.0" resolve-from "^4.0.0" @@ -4999,9 +5108,9 @@ is-color-stop@^1.0.0: rgba-regex "^1.0.0" is-core-module@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.0.0.tgz#58531b70aed1db7c0e8d4eb1a0a2d1ddd64bd12d" - integrity sha512-jq1AH6C8MuteOoBPwkxHafmByhL9j5q4OaPGdbuD+ZtQJVzH+i6E3BJDQcBA09k57i2Hh2yQbEG8yObZ0jdlWw== + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.1.0.tgz#a4cc031d9b1aca63eecbd18a650e13cb4eeab946" + integrity sha512-YcV7BgVMRFRua2FqQzKtTDMz8iCuLEyGKjr70q8Zm1yy2qKcurbFEd79PAdHV77oL3NrAaOVQIbMmiHQCHB7ZA== dependencies: has "^1.0.3" @@ -5392,11 +5501,11 @@ json5@^2.1.2: minimist "^1.2.5" jsonfile@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.0.1.tgz#98966cba214378c8c84b82e085907b40bf614179" - integrity sha512-jR2b5v7d2vIOust+w3wtFKZIfpC2pnRmFAhAC/BuweZFQR8qZzxH1OyrQ10HmdVYiXWkYUqPVsz91cG7EL2FBg== + version "6.1.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" + integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== dependencies: - universalify "^1.0.0" + universalify "^2.0.0" optionalDependencies: graceful-fs "^4.1.6" @@ -5538,6 +5647,13 @@ locate-path@^5.0.0: dependencies: p-locate "^4.1.0" +lockfile@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/lockfile/-/lockfile-1.0.4.tgz#07f819d25ae48f87e538e6578b6964a4981a5609" + integrity sha512-cvbTwETRfsFh4nHsL1eGWapU1XFi5Ot9E85sWAwia7Y7EgB7vfqcZhTKZ+l7hCGxSPoushMv5GKhT5PdLv03WA== + dependencies: + signal-exit "^3.0.2" + lodash.flattendeep@^4.4.0: version "4.4.0" resolved "https://registry.yarnpkg.com/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz#fb030917f86a3134e5bc9bec0d69e0013ddfedb2" @@ -5668,6 +5784,11 @@ matcher@^3.0.0: dependencies: escape-string-regexp "^4.0.0" +md5-file@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/md5-file/-/md5-file-5.0.0.tgz#e519f631feca9c39e7f9ea1780b63c4745012e20" + integrity sha512-xbEFXCYVWrSx/gEKS1VPlg84h/4L20znVIulKw6kMfmBUAZNAnF00eczz9ICMl+/hjQGo5KSXRxbL/47X3rmMw== + md5-hex@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/md5-hex/-/md5-hex-3.0.1.tgz#be3741b510591434b2784d79e556eefc2c9a8e5c" @@ -5694,11 +5815,6 @@ mdn-data@2.0.4: resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.4.tgz#699b3c38ac6f1d728091a64650b65d388502fd5b" integrity sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA== -mdn-data@2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.6.tgz#852dc60fcaa5daa2e8cf6c9189c440ed3e042978" - integrity sha512-rQvjv71olwNHgiTbfPZFkJtjNMciWgswYeciZhtvWLO8bmX3TnhyA62I6sTWOyZssWHJJjY6/KiWwqQsWWsqOA== - mem@^6.1.1: version "6.1.1" resolved "https://registry.yarnpkg.com/mem/-/mem-6.1.1.tgz#ea110c2ebc079eca3022e6b08c85a795e77f6318" @@ -5827,6 +5943,11 @@ mkdirp-classic@^0.5.2: dependencies: minimist "^1.2.5" +mkdirp@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" + integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== + mocked-env@^1.3.2: version "1.3.2" resolved "https://registry.yarnpkg.com/mocked-env/-/mocked-env-1.3.2.tgz#548eb2fde141d083de70dc6b231cd9f3210d8731" @@ -5870,6 +5991,37 @@ moment-timezone@^0.5.31: resolved "https://registry.yarnpkg.com/moment/-/moment-2.29.1.tgz#b2be769fa31940be9eeea6469c075e35006fa3d3" integrity sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ== +mongodb-memory-server-core@6.9.2: + version "6.9.2" + resolved "https://registry.yarnpkg.com/mongodb-memory-server-core/-/mongodb-memory-server-core-6.9.2.tgz#a064602e85c065c63776cef20ec7311d2b2da206" + integrity sha512-0naMEESKsJNBg4/djN9qc+Argmg5UElJ/EFP9M4opTH//GZ1Rn6SI5S43NFHJrizOPGojAAp21gn7rNOru7Ypw== + dependencies: + "@types/tmp" "^0.2.0" + camelcase "^6.0.0" + cross-spawn "^7.0.3" + debug "^4.2.0" + find-cache-dir "^3.3.1" + find-package-json "^1.2.0" + get-port "^5.1.1" + https-proxy-agent "^5.0.0" + lockfile "^1.0.4" + md5-file "^5.0.0" + mkdirp "^1.0.4" + semver "^7.3.2" + tar-stream "^2.1.4" + tmp "^0.2.1" + uuid "8.3.0" + yauzl "^2.10.0" + optionalDependencies: + mongodb "3.6.2" + +mongodb-memory-server@^6.9.2: + version "6.9.2" + resolved "https://registry.yarnpkg.com/mongodb-memory-server/-/mongodb-memory-server-6.9.2.tgz#75880bf5f485deceba2d7df20659b2796ff703cf" + integrity sha512-+8axA5PlO+C3H+kgsxt6+6edcKAaY56YjYt+MWj9t1ZiKsEr+7SPsQfJcEoX+Kiz802jt1BOOIbYQVLX+08Hag== + dependencies: + mongodb-memory-server-core "6.9.2" + mongodb@3.6.2: version "3.6.2" resolved "https://registry.yarnpkg.com/mongodb/-/mongodb-3.6.2.tgz#1154a4ac107bf1375112d83a29c5cf97704e96b6" @@ -5883,19 +6035,32 @@ mongodb@3.6.2: optionalDependencies: saslprep "^1.0.0" +mongodb@3.6.3: + version "3.6.3" + resolved "https://registry.yarnpkg.com/mongodb/-/mongodb-3.6.3.tgz#eddaed0cc3598474d7a15f0f2a5b04848489fd05" + integrity sha512-rOZuR0QkodZiM+UbQE5kDsJykBqWi0CL4Ec2i1nrGrUI3KO11r6Fbxskqmq3JK2NH7aW4dcccBuUujAP0ERl5w== + dependencies: + bl "^2.2.1" + bson "^1.1.4" + denque "^1.4.1" + require_optional "^1.0.1" + safe-buffer "^5.1.2" + optionalDependencies: + saslprep "^1.0.0" + mongoose-legacy-pluralize@1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/mongoose-legacy-pluralize/-/mongoose-legacy-pluralize-1.0.2.tgz#3ba9f91fa507b5186d399fb40854bff18fb563e4" integrity sha512-Yo/7qQU4/EyIS8YDFSeenIvXxZN+ld7YdV9LqFVQJzTLye8unujAWPZ4NWKfFA+RNjh+wvTWKY9Z3E5XM6ZZiQ== -mongoose@^5.10.11: - version "5.10.11" - resolved "https://registry.yarnpkg.com/mongoose/-/mongoose-5.10.11.tgz#4bef4a85d35f38eb45a0af27b276d2bfd2196b5c" - integrity sha512-R5BFitKW94/S/Z48w+X+qi/eto66jWBcVEVA8nYVkBoBAPFGq7JSYP/0uso+ZHs+7XjSzTuui+SUllzxIrf9yA== +mongoose@^5.10.14: + version "5.10.14" + resolved "https://registry.yarnpkg.com/mongoose/-/mongoose-5.10.14.tgz#2f245ea578c008939599356ff6a8ba7e7643f987" + integrity sha512-lG7TCyjGjVPM4R1HWCyWZbdK7hC4MdWRG7P95hDENXSvaLkGLiP7WZbGT83KzLY8+400x1p6C53UALD3MqpsCA== dependencies: bson "^1.1.4" kareem "2.3.1" - mongodb "3.6.2" + mongodb "3.6.3" mongoose-legacy-pluralize "1.0.2" mpath "0.7.0" mquery "3.2.2" @@ -5991,10 +6156,10 @@ node-fetch@^1.0.1: encoding "^0.1.11" is-stream "^1.0.1" -node-gyp-build@~3.7.0: - version "3.7.0" - resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-3.7.0.tgz#daa77a4f547b9aed3e2aac779eaf151afd60ec8d" - integrity sha512-L/Eg02Epx6Si2NXmedx+Okg+4UHqmaf3TNcxd50SF9NQGcJaON3AtU++kax69XV7YWz4tUspqZSAsVofhFKG2w== +node-gyp-build@^4.2.0: + version "4.2.3" + resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.2.3.tgz#ce6277f853835f718829efb47db20f3e4d9c4739" + integrity sha512-MN6ZpzmfNCRM+3t57PTJHgHyw/h4OWnZ6mR8P5j/uZtqQr46RRuDE/P+g3n0YR/AiYXeWixZZzaip77gdICfRg== node-gyp@^3.8.0: version "3.8.0" @@ -6026,10 +6191,10 @@ node-preload@^0.2.1: dependencies: process-on-spawn "^1.0.0" -node-releases@^1.1.61: - version "1.1.64" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.64.tgz#71b4ae988e9b1dd7c1ffce58dd9e561752dfebc5" - integrity sha512-Iec8O9166/x2HRMJyLLLWkd0sFFLrFNy+Xf+JQfSQsdBJzPcHpNl3JQ9gD4j+aJxmCa25jNsIbM4bmACtSbkSg== +node-releases@^1.1.65: + version "1.1.66" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.66.tgz#609bd0dc069381015cd982300bae51ab4f1b1814" + integrity sha512-JHEQ1iWPGK+38VLB2H9ef2otU4l8s3yAMt9Xf934r6+ojCYDMHPMqvCc9TnzfeFSP1QEOeU6YZEd3+De0LTCgg== node-sass@^4.11.0: version "4.14.1" @@ -6231,12 +6396,12 @@ object-path@^0.11.4: integrity sha512-jgSbThcoR/s+XumvGMTMf81QVBmah+/Q7K7YduKeKVWL7N111unR2d6pZZarSk6kY/caeNxUDyxOvMWyzoU2eg== object.assign@^4.1.0, object.assign@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.1.tgz#303867a666cdd41936ecdedfb1f8f3e32a478cdd" - integrity sha512-VT/cxmx5yaoHSOTSyrCygIDFco+RsibY2NM0a4RdEeY/4KgqezwFtK1yr3U67xYhqJSlASm2pKhLVzPj2lr4bA== + version "4.1.2" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.2.tgz#0ed54a342eceb37b38ff76eb831a0e788cb63940" + integrity sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ== dependencies: + call-bind "^1.0.0" define-properties "^1.1.3" - es-abstract "^1.18.0-next.0" has-symbols "^1.0.1" object-keys "^1.1.1" @@ -6609,6 +6774,11 @@ pbkdf2@^3.0.3: safe-buffer "^5.0.1" sha.js "^2.4.8" +pend@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" + integrity sha1-elfrVQpng/kRUzH89GY9XI4AelA= + performance-now@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" @@ -7086,9 +7256,9 @@ punycode@^2.1.0, punycode@^2.1.1: integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== pupa@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/pupa/-/pupa-2.0.1.tgz#dbdc9ff48ffbea4a26a069b6f9f7abb051008726" - integrity sha512-hEJH0s8PXLY/cdXh66tNEQGndDrIKNqNC5xmrysZy3i5C3oEoLna7YAOad+7u125+zH1HNXUmGEkrhb3c2VriA== + version "2.1.1" + resolved "https://registry.yarnpkg.com/pupa/-/pupa-2.1.1.tgz#f5e8fd4afc2c5d97828faa523549ed8744a20d62" + integrity sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A== dependencies: escape-goat "^2.0.0" @@ -7293,7 +7463,7 @@ readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.6, readable string_decoder "~1.1.1" util-deprecate "~1.0.1" -readable-stream@^3.5.0, readable-stream@^3.6.0: +readable-stream@^3.1.1, readable-stream@^3.4.0, readable-stream@^3.5.0, readable-stream@^3.6.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== @@ -7343,9 +7513,9 @@ regenerate-unicode-properties@^8.2.0: regenerate "^1.4.0" regenerate@^1.4.0: - version "1.4.1" - resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.1.tgz#cad92ad8e6b591773485fbe05a485caf4f457e6f" - integrity sha512-j2+C8+NtXQgEKWk49MMP5P/u2GhnahTtVkRIHr5R5lVRlbKvmQ+oS+A5aLKWp2ma5VkT8sh6v+v4hbH0YHR66A== + version "1.4.2" + resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a" + integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A== regenerator-runtime@^0.13.4: version "0.13.7" @@ -7547,7 +7717,7 @@ resolve-from@^4.0.0: resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== -resolve@^1.1.4, resolve@^1.18.1, resolve@^1.4.0: +resolve@^1.1.4, resolve@^1.10.0, resolve@^1.13.1, resolve@^1.17.0, resolve@^1.18.1, resolve@^1.3.2, resolve@^1.4.0: version "1.18.1" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.18.1.tgz#018fcb2c5b207d2a6424aee361c5a266da8f4130" integrity sha512-lDfCPaMKfOJXjy0dPayzPdF1phampNWr3qFCjAu+rw/qbQmr5jWH5xN2hwh9QKfw9E5v4hwV7A+jrCmL8yjjqA== @@ -7555,13 +7725,6 @@ resolve@^1.1.4, resolve@^1.18.1, resolve@^1.4.0: is-core-module "^2.0.0" path-parse "^1.0.6" -resolve@^1.10.0, resolve@^1.13.1, resolve@^1.17.0, resolve@^1.3.2: - version "1.17.0" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.17.0.tgz#b25941b54968231cc2d1bb76a79cb7f2c0bf8444" - integrity sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w== - dependencies: - path-parse "^1.0.6" - responselike@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/responselike/-/responselike-1.0.2.tgz#918720ef3b631c5642be068f15ade5a46f4ba1e7" @@ -7664,9 +7827,9 @@ rtl-css-js@^1.9.0: "@babel/runtime" "^7.1.2" run-parallel@^1.1.9: - version "1.1.9" - resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.1.9.tgz#c9dd3a7cf9f4b2c4b6244e173a6ed866e61dd679" - integrity sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q== + version "1.1.10" + resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.1.10.tgz#60a51b2ae836636c81377df16cb107351bcd13ef" + integrity sha512-zb/1OuZ6flOlH6tQyMPUrE3x3Ulxjlo9WIVXR4yVYi4H9UXQaeIsPbLn2R3O3vQCnDKkAl2qHiuocKKX4Tz/Sw== s-ago@^2.2.0: version "2.2.0" @@ -8171,20 +8334,20 @@ string.prototype.matchall@^4.0.2: side-channel "^1.0.2" string.prototype.trimend@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz#85812a6b847ac002270f5808146064c995fb6913" - integrity sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g== + version "1.0.2" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.2.tgz#6ddd9a8796bc714b489a3ae22246a208f37bfa46" + integrity sha512-8oAG/hi14Z4nOVP0z6mdiVZ/wqjDtWSLygMigTzAb+7aPEDTleeFf+WrF+alzecxIRkckkJVn+dTlwzJXORATw== dependencies: define-properties "^1.1.3" - es-abstract "^1.17.5" + es-abstract "^1.18.0-next.1" string.prototype.trimstart@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz#14af6d9f34b053f7cfc89b72f8f2ee14b9039a54" - integrity sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw== + version "1.0.2" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.2.tgz#22d45da81015309cd0cdd79787e8919fc5c613e7" + integrity sha512-7F6CdBTl5zyu30BJFdzSTlSlLPwODC23Od+iLoVH8X6+3fvDPPuBVVj9iaB1GOsSTSIgVfsfm27R2FGrAPznWg== dependencies: define-properties "^1.1.3" - es-abstract "^1.17.5" + es-abstract "^1.18.0-next.1" string_decoder@^1.1.1: version "1.3.0" @@ -8360,6 +8523,14 @@ symbol-observable@^2.0.0: resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-2.0.3.tgz#5b521d3d07a43c351055fa43b8355b62d33fd16a" integrity sha512-sQV7phh2WCYAn81oAkakC5qjq2Ml0g8ozqz03wOGnx9dDlG1de6yrF+0RAzSJD8fPUow3PTSMf2SAbOGxb93BA== +sync-fetch@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/sync-fetch/-/sync-fetch-0.3.0.tgz#77246da949389310ad978ab26790bb05f88d1335" + integrity sha512-dJp4qg+x4JwSEW1HibAuMi0IIrBI3wuQr2GimmqB7OXR50wmwzfdusG+p39R9w3R6aFtZ2mzvxvWKQ3Bd/vx3g== + dependencies: + buffer "^5.7.0" + node-fetch "^2.6.1" + syntax-error@^1.1.1: version "1.4.0" resolved "https://registry.yarnpkg.com/syntax-error/-/syntax-error-1.4.0.tgz#2d9d4ff5c064acb711594a3e3b95054ad51d907c" @@ -8377,6 +8548,17 @@ table@^5.2.3: slice-ansi "^2.1.0" string-width "^3.0.0" +tar-stream@^2.1.4: + version "2.1.4" + resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.1.4.tgz#c4fb1a11eb0da29b893a5b25476397ba2d053bfa" + integrity sha512-o3pS2zlG4gxr67GmFYBLlq+dM8gyRGUOvsrHclSkvtVtQbjV0s/+ZE8OpICbaj8clrX3tjeHngYGP7rweaBnuw== + dependencies: + bl "^4.0.3" + end-of-stream "^1.4.1" + fs-constants "^1.0.0" + inherits "^2.0.3" + readable-stream "^3.1.1" + tar@^2.0.0: version "2.2.2" resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.2.tgz#0ca8848562c7299b8b446ff6a4d60cdbb23edc40" @@ -8392,18 +8574,9 @@ temp-dir@^2.0.0: integrity sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg== term-size@^2.1.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/term-size/-/term-size-2.2.0.tgz#1f16adedfe9bdc18800e1776821734086fcc6753" - integrity sha512-a6sumDlzyHVJWb8+YofY4TW112G6p2FCPEAFk+59gIYHv3XHRhm9ltVQ9kli4hNWeQBwSpe8cRN25x0ROunMOw== - -terser@^5.2.0: - version "5.3.5" - resolved "https://registry.yarnpkg.com/terser/-/terser-5.3.5.tgz#9e080baa0568f96654621b20eb9effa440b1484e" - integrity sha512-Qw3CZAMmmfU824AoGKalx+riwocSI5Cs0PoGp9RdSLfmxkmJgyBxqLBP/isDNtFyhHnitikvRMZzyVgeq+U+Tg== - dependencies: - commander "^2.20.0" - source-map "~0.7.2" - source-map-support "~0.5.19" + version "2.2.1" + resolved "https://registry.yarnpkg.com/term-size/-/term-size-2.2.1.tgz#2a6a54840432c2fb6320fea0f415531e90189f54" + integrity sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg== terser@^5.3.5: version "5.3.8" @@ -8468,6 +8641,13 @@ timsort@^0.3.0: resolved "https://registry.yarnpkg.com/timsort/-/timsort-0.3.0.tgz#405411a8e7e6339fe64db9a234de11dc31e02bd4" integrity sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q= +tmp@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.1.tgz#8457fc3037dcf4719c251367a1af6500ee1ccf14" + integrity sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ== + dependencies: + rimraf "^3.0.0" + to-fast-properties@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" @@ -8700,6 +8880,11 @@ universalify@^1.0.0: resolved "https://registry.yarnpkg.com/universalify/-/universalify-1.0.0.tgz#b61a1da173e8435b2fe3c67d29b9adf8594bd16d" integrity sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug== +universalify@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" + integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== + unixify@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unixify/-/unixify-1.0.0.tgz#3a641c8c2ffbce4da683a5c70f03a462940c2090" @@ -8764,11 +8949,11 @@ url@~0.11.0: querystring "0.2.0" utf-8-validate@^5.0.2: - version "5.0.2" - resolved "https://registry.yarnpkg.com/utf-8-validate/-/utf-8-validate-5.0.2.tgz#63cfbccd85dc1f2b66cf7a1d0eebc08ed056bfb3" - integrity sha512-SwV++i2gTD5qh2XqaPzBnNX88N6HdyhQrNNRykvcS0QKvItV9u3vPEJr+X5Hhfb1JC0r0e1alL0iB09rY8+nmw== + version "5.0.3" + resolved "https://registry.yarnpkg.com/utf-8-validate/-/utf-8-validate-5.0.3.tgz#3b64e418ad2ff829809025fdfef595eab2f03a27" + integrity sha512-jtJM6fpGv8C1SoH4PtG22pGto6x+Y8uPprW0tw3//gGFhDDTiuksgradgFN6yRayDP4SyZZa6ZMGHLIa17+M8A== dependencies: - node-gyp-build "~3.7.0" + node-gyp-build "^4.2.0" utf8-byte-length@^1.0.1: version "1.0.4" @@ -8809,6 +8994,11 @@ util@~0.12.0: safe-buffer "^5.1.2" which-typed-array "^1.1.2" +uuid@8.3.0: + version "8.3.0" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.0.tgz#ab738085ca22dc9a8c92725e459b1d507df5d6ea" + integrity sha512-fX6Z5o4m6XsXBdli9g7DtWgAx+osMsRRZFKma1mIUsLCz6vRvv+pz5VNbyu9UEDzpMWulZfvpgb/cmDXVulYFQ== + uuid@^3.1.0, uuid@^3.3.2, uuid@^3.3.3: version "3.4.0" resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" @@ -8820,9 +9010,9 @@ uuid@^8.0.0, uuid@^8.3.0: integrity sha512-FOmRr+FmWEIG8uhZv6C2bTgEVXsHk08kE7mPlrBbEe+c3r9pjceVPgupIfNIhc4yx55H69OXANrUaSuu9eInKg== v8-compile-cache@^2.0.3: - version "2.1.1" - resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.1.1.tgz#54bc3cdd43317bca91e35dcaf305b1a7237de745" - integrity sha512-8OQ9CL+VWyt3JStj7HX7/ciTL2V3Rl1Wf5OL+SNTm0yK1KvtReVulksyeRnCANHHuUxHlQig+JJDlUhBt1NQDQ== + version "2.2.0" + resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.2.0.tgz#9471efa3ef9128d2f7c6a7ca39c4dd6b5055b132" + integrity sha512-gTpR5XQNKFwOd4clxfnhaqvfqMpqEwr4tOtCyz4MtYZX2JYhfr1JvBFKdS+7K/9rfpZR3VLX+YWBbKoxCgS43Q== valid-url@1.0.9: version "1.0.9" @@ -8889,9 +9079,9 @@ well-known-symbols@^2.0.0: integrity sha512-ZMjC3ho+KXo0BfJb7JgtQ5IBuvnShdlACNkKkdsqBmYw3bPAaJfPeYUo6tLUaT5tG/Gkh7xkpBhKRQ9e7pyg9Q== whatwg-fetch@>=0.10.0: - version "3.4.1" - resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.4.1.tgz#e5f871572d6879663fa5674c8f833f15a8425ab3" - integrity sha512-sofZVzE1wKwO+EYPbWfiwzaKovWiZXf4coEzjGP9b2GBVgQRLQUZ2QcuPpQExGDAW5GItpEm6Tl4OU5mywnAoQ== + version "3.5.0" + resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.5.0.tgz#605a2cd0a7146e5db141e29d1c62ab84c0c4c868" + integrity sha512-jXkLtsR42xhXg7akoDKvKWE40eJeI+2KZqcp2h3NsOrRnDvtWX36KcKl30dy+hxECivdk2BVUHVNrPtoMBUx6A== which-module@^2.0.0: version "2.0.0" @@ -9035,9 +9225,9 @@ y18n@^4.0.0: integrity sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w== y18n@^5.0.2: - version "5.0.4" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.4.tgz#0ab2db89dd5873b5ec4682d8e703e833373ea897" - integrity sha512-deLOfD+RvFgrpAmSZgfGdWYE+OKyHcVHaRQ7NphG/63scpRvTHHeQMAxGGvaLVGJ+HYVcCXlzcTK0ZehFf+eHQ== + version "5.0.5" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.5.tgz#8769ec08d03b1ea2df2500acef561743bbb9ab18" + integrity sha512-hsRUr4FFrvhhRH12wOdfs38Gy7k2FFzB9qgN9v3aLykRq0dRcdcpz5C9FxdS2NuhOrI/628b/KSTJ3rwHysYSg== yaeti@^0.0.6: version "0.0.6" @@ -9126,6 +9316,14 @@ yargs@^16.0.3: y18n "^5.0.2" yargs-parser "^20.2.2" +yauzl@^2.10.0: + version "2.10.0" + resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.10.0.tgz#c7eb17c93e112cb1086fa6d8e51fb0667b79a5f9" + integrity sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk= + dependencies: + buffer-crc32 "~0.2.3" + fd-slicer "~1.1.0" + zen-observable-ts@^0.8.21: version "0.8.21" resolved "https://registry.yarnpkg.com/zen-observable-ts/-/zen-observable-ts-0.8.21.tgz#85d0031fbbde1eba3cd07d3ba90da241215f421d"