diff --git a/package.json b/package.json index dc87229f1..664ba46e8 100644 --- a/package.json +++ b/package.json @@ -17,11 +17,10 @@ }, "dependencies": { "@amplitude/analytics-browser": "^0.3.1", - "@hawk.so/javascript": "^3.0.0", + "@hawk.so/javascript": "^3.0.6", "@hawk.so/types": "^0.1.18", "@hawk.so/webpack-plugin": "^1.0.1", "@vue/cli-plugin-babel": "^4.1.2", - "@vue/cli-plugin-pwa": "^4.1.2", "@vue/cli-plugin-typescript": "^4.1.2", "@vue/cli-service": "^4.5.15", "axios": "^0.25.0", @@ -40,7 +39,6 @@ "postcss-nested-ancestors": "^2.0.0", "postcss-preset-env": "^6.6.0", "postcss-simple-vars": "^5.0.2", - "register-service-worker": "^1.6.2", "short-number": "^1.0.7", "spa-http-server": "^0.9.0", "svgo": "^1.1.0", diff --git a/public/service-worker.js b/public/service-worker.js deleted file mode 100644 index 4a44653c7..000000000 --- a/public/service-worker.js +++ /dev/null @@ -1,41 +0,0 @@ -/* eslint-disable no-undef */ - -/** - * This file will be post-processed by WORKBOX plugin - */ - -workbox.core.setCacheNameDetails({ prefix: 'hawk.garage' }); - -// Workbox generates precache manifest and write it in self.__precacheManifest -workbox.precaching.precacheAndRoute(self.__precacheManifest); - -// Return a specific response for all navigation requests. -workbox.routing.registerNavigationRoute('/index.html'); - -// Don't wait until old service worker stop -workbox.core.skipWaiting(); - -// Claim any currently available clients once the service worker becomes active -workbox.core.clientsClaim(); - -// Cache all images (such as favicons) -workbox.routing.registerRoute( - /\.(png|jpg|jpeg|svg|gif)$/, - new workbox.strategies.CacheFirst({ - cacheName: 'image-cache', - plugins: [ - new workbox.expiration.Plugin({ - // Cache only 20 images. - maxEntries: 20, - // Cache for a maximum of a week. - maxAgeSeconds: 7 * 24 * 60 * 60 - }) - ] - }) -); - -if (workbox) { - console.log('Hawk worker loaded'); -} else { - console.log('Hawk worker didn\'t load'); -} diff --git a/src/api/index.ts b/src/api/index.ts index a76263da9..ce2a02ac5 100644 --- a/src/api/index.ts +++ b/src/api/index.ts @@ -1,6 +1,7 @@ import axios, { AxiosResponse } from 'axios'; import { prepareFormData } from '@/api/utils'; import { APIResponse } from '../types/api'; +import { useErrorTracker } from '@/hawk'; /** * Hawk API endpoint URL @@ -17,6 +18,11 @@ let blockingRequest: Promise; */ let tokenRefreshingRequest: Promise | null; +/** + * Error tracking composable + */ +const { track } = useErrorTracker(); + /** * Describe format of the GraphQL API error item */ @@ -129,34 +135,56 @@ export async function callOld( let response; - if (initial || force) { - response = await promise; - } else { - response = (await Promise.all([blockingRequest, promise]))[1]; - } + try { // handle axios errors + if (initial || force) { + response = await promise; + } else { + response = (await Promise.all([blockingRequest, promise]))[1]; + } - if (response.data.errors) { - response.data.errors.forEach(error => { - printApiError(error, response.data, request, variables); - }); - } - /** - * For now (Apr 10, 2020) all previous code await to get only data - * so new request will pass allowErrors=true and get both errors and data - * - * @todo refactor old requests same way - */ - if (allowErrors) { - return response.data; - } else { - // console.warn('Api call in old format. Should be refactored to support errors', request); - } + if (response.data.errors) { + response.data.errors.forEach(error => { + /** + * Send error to Hawk + */ + track(new Error(error.message), { + 'Request': request, + 'Error Path': error.path, + 'Variables': variables ?? {}, + 'Response Data': response.data.data, + }); + + printApiError(error, response.data, request, variables); + }); + } - /** - * @deprecated old format. See method jsdoc - */ - return response.data.data; + /** + * For now (Apr 10, 2020) all previous code await to get only data + * so new request will pass allowErrors=true and get both errors and data + * + * @todo refactor old requests same way + */ + if (allowErrors) { + return response.data; + } else { + // console.warn('Api call in old format. Should be refactored to support errors', request); + } + + /** + * @deprecated old format. See method jsdoc + */ + return response.data.data; + } catch (error) { + console.error('API Request Error', error); + + track(error as Error, { + 'Request': request, + 'Variables': variables ?? {}, + 'Response Data': response?.data.data, + }); + throw error; + } } /** @@ -173,7 +201,7 @@ export async function call( // eslint-disable-next-line @typescript-eslint/no-explicit-any variables?: Record, files?: {[name: string]: File | undefined}, - { initial = false, force = false }: ApiCallSettings = {} + { initial = false, force = false, allowErrors = false }: ApiCallSettings = {} // eslint-disable-next-line @typescript-eslint/no-explicit-any ): Promise> { const response = await callOld(request, variables, files, Object.assign({ @@ -186,8 +214,18 @@ export async function call( /** * Response can contain errors. * Throw such errors to the Vue component to display them for user + * + * Note from 2024-04-10: + * - Now we have try-catch block components, since errors are thrown from the API module + * - But it would be more safe to not throw errors from the API module, but return them in the response and then handle them in store or component. + * - Refactoring steps: (@todo) + * 1. Rewrire all requests to use api.call() instead of api.callOld() + * 2. Get rid of allowErrors flag form the api.callOld() method + * 3. Provide a way to handle errors in the store + * 4. Review all try/catch statements in the components and remove them + * - For a temporary solution, we explicitly pass allowErrors=true when method is ready to receive errors as well as data */ - if (response.errors && response.errors.length) { + if (response.errors && response.errors.length && allowErrors === false) { response.errors.forEach(error => { throw new Error(error.message); }); diff --git a/src/api/workspaces/index.ts b/src/api/workspaces/index.ts index 887d1943c..401d06048 100644 --- a/src/api/workspaces/index.ts +++ b/src/api/workspaces/index.ts @@ -57,6 +57,12 @@ export async function leaveWorkspace(workspaceId: string): Promise { export async function getAllWorkspacesWithProjects(): Promise> { return api.call(QUERY_ALL_WORKSPACES_WITH_PROJECTS, undefined, undefined, { initial: true, + + /** + * This request calls on the app start, so we don't want to break app if something goes wrong + * With this flag, errors from the API won't be thrown, but returned in the response for further handling + */ + allowErrors: true, }); } diff --git a/src/api/workspaces/queries.ts b/src/api/workspaces/queries.ts index ae58b72ef..2f536d1a9 100644 --- a/src/api/workspaces/queries.ts +++ b/src/api/workspaces/queries.ts @@ -10,7 +10,7 @@ import { * Query for getting all user's workspaces and project. */ export const QUERY_ALL_WORKSPACES_WITH_PROJECTS = ` - { + query AllWorkspacesWithProjects { workspaces { id name diff --git a/src/components/AppShell.vue b/src/components/AppShell.vue index ee43acb91..8560867cb 100644 --- a/src/components/AppShell.vue +++ b/src/components/AppShell.vue @@ -205,32 +205,37 @@ export default { * Vue hook. Called synchronously after the instance is created */ async created() { - /** - * Fetch user data - */ - await this.$store.dispatch(FETCH_INITIAL_DATA); + try { + /** + * Fetch user data + */ + await this.$store.dispatch(FETCH_INITIAL_DATA); - this.$store.dispatch(RESET_MODAL_DIALOG); + this.$store.dispatch(RESET_MODAL_DIALOG); - /** - * Onboarding. If a user has no workspace, show Create Workspace modal - */ - this.suggestWorkspaceCreation(); + /** + * Onboarding. If a user has no workspace, show Create Workspace modal + */ + this.suggestWorkspaceCreation(); - /** - * Get current workspace - */ - const workspace = this.$store.getters.getWorkspaceById(this.workspaceId); + /** + * Get current workspace + */ + const workspace = this.$store.getters.getWorkspaceById(this.workspaceId); - /** - * Set current workspace - */ - this.$store.dispatch(SET_CURRENT_WORKSPACE, workspace); + /** + * Set current workspace + */ + this.$store.dispatch(SET_CURRENT_WORKSPACE, workspace); - /** - * Fetch current user data - */ - this.$store.dispatch(FETCH_CURRENT_USER); + /** + * Fetch current user data + */ + this.$store.dispatch(FETCH_CURRENT_USER); + } catch (error) { + console.error(error); + this.$sendToHawk(`Error on app initialization!: ${error.message}`); + } }, methods: { onModalClose() { diff --git a/src/hawk.ts b/src/hawk.ts new file mode 100644 index 000000000..cc4d698e8 --- /dev/null +++ b/src/hawk.ts @@ -0,0 +1,75 @@ +import HawkCatcher, { HawkInitialSettings, HawkJavaScriptEvent } from '@hawk.so/javascript' +import type Vue from 'vue'; + +/** + * Current build revision + * passed from Webpack Define Plugin + */ +declare const buildRevision: string; + +/** + * Initial options of error tracking composable + */ +export interface ErrorTrackerInitialOptions { + /** + * Instance of the Vue app + */ + vue: typeof Vue; + + /** + * Current user to be attached to events + */ + user?: HawkJavaScriptEvent['user']; +} + +/** + * Shared instance of Hawk.so + * null if Hawk is not initialized + */ +let hawk: HawkCatcher | null = null; + +/** + * Composable for tracking errors via Hawk.so + */ +export function useErrorTracker(): { + init: (options: ErrorTrackerInitialOptions) => void; + track: (...args: Parameters) => void; + } { + /** + * Initialize Hawk.so + * + * @param options - params to be passed to hawk initialization + */ + function init({ vue, user }: ErrorTrackerInitialOptions): void { + if (process.env.VUE_APP_HAWK_TOKEN) { + const hawkOptions: HawkInitialSettings = { + token: process.env.VUE_APP_HAWK_TOKEN, + release: buildRevision, + vue, + }; + + if (user) { + hawkOptions.user = user; + } + + hawk = new HawkCatcher(hawkOptions); + } + } + + /** + * Method for manual error sending + * + * @param error - error to track + * @param context - additional context + */ + function track(...args: Parameters): void { + if (hawk) { + hawk.send(...args); + } + } + + return { + init, + track, + }; +} diff --git a/src/main.ts b/src/main.ts index 92ca2ef62..f8cc66473 100644 --- a/src/main.ts +++ b/src/main.ts @@ -9,7 +9,6 @@ import router from './router'; import store from './store'; import './filters'; import './directives'; -import './registerServiceWorker'; import i18n from './i18n'; import * as api from './api/index'; import { REFRESH_TOKENS } from './store/modules/user/actionTypes'; @@ -19,44 +18,32 @@ import UniqueId from 'vue-unique-id'; /** * Integrations */ -import HawkCatcher, { HawkInitialSettings, HawkUser } from '@hawk.so/javascript'; import { Analytics } from './analytics'; +import { useErrorTracker, ErrorTrackerInitialOptions } from './hawk'; -/** - * Current build revision - * passed from Webpack Define Plugin - */ -declare const buildRevision: string; - -/** - * Frontend-errors tracking system - * - * @type {HawkCatcher} - */ -let hawk: HawkCatcher; +const { init: initHawk, track } = useErrorTracker(); /** * Enable errors tracking via Hawk.so */ if (process.env.VUE_APP_HAWK_TOKEN) { - const hawkOptions: HawkInitialSettings = { - token: process.env.VUE_APP_HAWK_TOKEN, - release: buildRevision, + const options: ErrorTrackerInitialOptions = { vue: Vue, }; if (store.state.user && store.state.user.data && Object.keys(store.state.user.data).length) { - hawkOptions.user = { + options.user = { id: store.state.user.data.id, name: store.state.user.data.name || store.state.user.data.email, image: store.state.user.data.image, url: '', - } as HawkUser; + }; } - hawk = new HawkCatcher(hawkOptions); + initHawk(options); } + /** * Sends error to the Hawk * @@ -64,9 +51,7 @@ if (process.env.VUE_APP_HAWK_TOKEN) { * @example this.$sendToHawk(new Error('Some error')); */ Vue.prototype.$sendToHawk = function sendToHawk(error: Error): void { - if (hawk) { - hawk.send(error); - } + track(error); }; /** diff --git a/src/registerServiceWorker.ts b/src/registerServiceWorker.ts deleted file mode 100644 index d103aff8d..000000000 --- a/src/registerServiceWorker.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { register } from 'register-service-worker'; -import eventBus from './eventBus'; - -if (process.env.NODE_ENV === 'production') { - register(`${process.env.BASE_URL}service-worker.js`, { - ready() { - console.log( - 'App is being served from cache by a service worker.\n' + - 'For more details, visit https://goo.gl/AFskqB' - ); - }, - registered() { - console.log('Service worker has been registered.'); - }, - cached() { - console.log('Content has been cached for offline use.'); - }, - updatefound() { - console.log('New content is downloading.'); - }, - updated() { - eventBus.$emit('serviceWorkerUpdated'); - console.log('New content is available; please refresh.'); - }, - offline() { - console.log('No internet connection found. App is running in offline mode.'); - }, - error(error) { - console.error('Error during service worker registration:', error); - }, - }); -} diff --git a/src/store/modules/app/index.js b/src/store/modules/app/index.js index 7865ed600..22704dfd4 100644 --- a/src/store/modules/app/index.js +++ b/src/store/modules/app/index.js @@ -92,7 +92,7 @@ const actions = { const recentEvents = {}; projects.forEach(project => { - if (!project.recentEvents || !project.recentEvents.dailyInfo) { + if (!project.recentEvents || !project.recentEvents.dailyInfo || !project.recentEvents.events) { return; } diff --git a/vue.config.js b/vue.config.js index 1213813ef..8d02d2af8 100644 --- a/vue.config.js +++ b/vue.config.js @@ -38,12 +38,19 @@ module.exports = { devServer: { progress: false, }, + output: { + filename: `static/js/[name].[hash:8].${buildRevision}.js`, + chunkFilename: `static/js/[name].[hash:8].${buildRevision}.js`, + }, }, /** * Disable progress to boost bundling speed */ devServer: { progress: false, + headers: { + 'Cache-Control': 'private, no-store, no-cache, must-revalidate, proxy-revalidate, max-age=0', + }, }, chainWebpack: config => { /** @@ -103,18 +110,18 @@ module.exports = { return options; }); }, - pwa: { - name: 'hawk.so', - workboxPluginMode: 'InjectManifest', - workboxOptions: { - swSrc: 'public/service-worker.js', - }, - themeColor: '#242732', - msTileColor: '#000000', - iconPaths: { - msTileImage: 'img/icons/mstile-150x150.png' - } - }, + // pwa: { + // name: 'hawk.so', + // workboxPluginMode: 'InjectManifest', + // workboxOptions: { + // swSrc: 'public/service-worker.js', + // }, + // themeColor: '#242732', + // msTileColor: '#000000', + // iconPaths: { + // msTileImage: 'img/icons/mstile-150x150.png' + // } + // }, assetsDir: 'static', pluginOptions: { storybook: { diff --git a/yarn.lock b/yarn.lock index 726212226..6531007f9 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1041,7 +1041,7 @@ pirates "^4.0.0" source-map-support "^0.5.16" -"@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2", "@babel/runtime@^7.10.2", "@babel/runtime@^7.11.0", "@babel/runtime@^7.12.13", "@babel/runtime@^7.12.5", "@babel/runtime@^7.13.10", "@babel/runtime@^7.14.0", "@babel/runtime@^7.3.1", "@babel/runtime@^7.3.4", "@babel/runtime@^7.4.4", "@babel/runtime@^7.5.0", "@babel/runtime@^7.5.5", "@babel/runtime@^7.7.2", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2": +"@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2", "@babel/runtime@^7.10.2", "@babel/runtime@^7.11.0", "@babel/runtime@^7.12.13", "@babel/runtime@^7.12.5", "@babel/runtime@^7.13.10", "@babel/runtime@^7.14.0", "@babel/runtime@^7.3.1", "@babel/runtime@^7.4.4", "@babel/runtime@^7.5.0", "@babel/runtime@^7.5.5", "@babel/runtime@^7.7.2", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2": version "7.14.8" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.14.8.tgz#7119a56f421018852694290b9f9148097391b446" dependencies: @@ -1265,7 +1265,7 @@ version "9.2.0" resolved "https://registry.yarnpkg.com/@hapi/hoek/-/hoek-9.2.0.tgz#f3933a44e365864f4dad5db94158106d511e8131" -"@hapi/joi@^15.0.0", "@hapi/joi@^15.0.1": +"@hapi/joi@^15.0.1": version "15.1.1" resolved "https://registry.yarnpkg.com/@hapi/joi/-/joi-15.1.1.tgz#c675b8a71296f02833f8d6d243b34c57b8ce19d7" dependencies: @@ -1286,9 +1286,10 @@ dependencies: "@hapi/hoek" "^9.0.0" -"@hawk.so/javascript@^3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@hawk.so/javascript/-/javascript-3.0.0.tgz#2149d57f18c60bb84961b264fab85dbf7391dc3c" +"@hawk.so/javascript@^3.0.6": + version "3.0.6" + resolved "https://registry.yarnpkg.com/@hawk.so/javascript/-/javascript-3.0.6.tgz#4521cef80d99674fbe77a7e1b54b848ecc8a997f" + integrity sha512-/whIk+5JJJ+QalLyXmECnvzWQSh1F543cgK2VD3LcB6qGZzBQB6VDLGDLzU9ZWOfd3GHgV1QAREqthEmRBN8vA== dependencies: "@hawk.so/types" "^0.1.13" error-stack-parser "^2.0.6" @@ -2865,14 +2866,6 @@ thread-loader "^2.1.3" webpack "^4.0.0" -"@vue/cli-plugin-pwa@^4.1.2": - version "4.5.13" - resolved "https://registry.yarnpkg.com/@vue/cli-plugin-pwa/-/cli-plugin-pwa-4.5.13.tgz#a800639814b6f62a38f04198c340cfaee7295c3f" - dependencies: - "@vue/cli-shared-utils" "^4.5.13" - webpack "^4.0.0" - workbox-webpack-plugin "^4.3.1" - "@vue/cli-plugin-router@^4.5.15": version "4.5.15" resolved "https://registry.yarnpkg.com/@vue/cli-plugin-router/-/cli-plugin-router-4.5.15.tgz#1e75c8c89df42c694f143b9f1028de3cf5d61e1e" @@ -3633,12 +3626,6 @@ babel-eslint@^10.0.3: eslint-visitor-keys "^1.0.0" resolve "^1.12.0" -babel-extract-comments@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/babel-extract-comments/-/babel-extract-comments-1.0.0.tgz#0a2aedf81417ed391b85e18b4614e693a0351a21" - dependencies: - babylon "^6.18.0" - babel-loader@^8.1.0, babel-loader@^8.2.2: version "8.2.2" resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.2.2.tgz#9363ce84c10c9a40e6c753748e1441b60c8a0b81" @@ -3740,34 +3727,12 @@ babel-plugin-syntax-jsx@^6.18.0: version "6.18.0" resolved "https://registry.yarnpkg.com/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz#0af32a9a6e13ca7a3fd5069e62d7b0f58d0d8946" -babel-plugin-syntax-object-rest-spread@^6.8.0: - version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz#fd6536f2bce13836ffa3a5458c4903a597bb3bf5" - -babel-plugin-transform-object-rest-spread@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz#0f36692d50fef6b7e2d4b3ac1478137a963b7b06" - dependencies: - babel-plugin-syntax-object-rest-spread "^6.8.0" - babel-runtime "^6.26.0" - -babel-runtime@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" - dependencies: - core-js "^2.4.0" - regenerator-runtime "^0.11.0" - babel-walk@3.0.0-canary-5: version "3.0.0-canary-5" resolved "https://registry.yarnpkg.com/babel-walk/-/babel-walk-3.0.0-canary-5.tgz#f66ecd7298357aee44955f235a6ef54219104b11" dependencies: "@babel/types" "^7.9.6" -babylon@^6.18.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" - bail@^1.0.0: version "1.0.5" resolved "https://registry.yarnpkg.com/bail/-/bail-1.0.5.tgz#b6fa133404a392cbc1f8c4bf63f5953351e7a776" @@ -4783,10 +4748,6 @@ core-js-pure@^3.8.2: version "3.15.2" resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.15.2.tgz#c8e0874822705f3385d3197af9348f7c9ae2e3ce" -core-js@^2.4.0: - version "2.6.12" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.12.tgz#d9333dfa7b065e347cc5682219d6f690859cc2ec" - core-js@^3.0.1, core-js@^3.0.4, core-js@^3.6.5, core-js@^3.8.2: version "3.15.2" resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.15.2.tgz#740660d2ff55ef34ce664d7e2455119c5bdd3d61" @@ -6634,14 +6595,6 @@ fs-extra@^0.30.0: path-is-absolute "^1.0.0" rimraf "^2.2.8" -fs-extra@^4.0.2: - version "4.0.3" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-4.0.3.tgz#0d852122e5bc5beb453fb028e9c0c9bf36340c94" - dependencies: - graceful-fs "^4.1.2" - jsonfile "^4.0.0" - universalify "^0.1.0" - fs-extra@^7.0.1: version "7.0.1" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9" @@ -8265,12 +8218,6 @@ json-stable-stringify-without-jsonify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" -json-stable-stringify@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af" - dependencies: - jsonify "~0.0.0" - json-stringify-safe@~5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" @@ -8315,10 +8262,6 @@ jsonfile@^6.0.1: optionalDependencies: graceful-fs "^4.1.6" -jsonify@~0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" - jsprim@^1.2.2: version "1.4.1" resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" @@ -8539,10 +8482,6 @@ locate-path@^6.0.0: dependencies: p-locate "^5.0.0" -lodash._reinterpolate@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d" - lodash.camelcase@^4.3.0: version "4.3.0" resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" @@ -8583,19 +8522,6 @@ lodash.once@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/lodash.once/-/lodash.once-4.1.1.tgz#0dd3971213c7c56df880977d504c88fb471a97ac" -lodash.template@^4.4.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-4.5.0.tgz#f976195cf3f347d0d5f52483569fe8031ccce8ab" - dependencies: - lodash._reinterpolate "^3.0.0" - lodash.templatesettings "^4.0.0" - -lodash.templatesettings@^4.0.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz#e481310f049d3cf6d47e912ad09313b154f0fb33" - dependencies: - lodash._reinterpolate "^3.0.0" - lodash.throttle@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/lodash.throttle/-/lodash.throttle-4.1.1.tgz#c23e91b710242ac70c37f1e1cda9274cc39bf2f4" @@ -10867,7 +10793,7 @@ prettier@~2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.2.1.tgz#795a1a78dd52f073da0cd42b21f9c91381923ff5" -pretty-bytes@^5.1.0, pretty-bytes@^5.6.0: +pretty-bytes@^5.6.0: version "5.6.0" resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-5.6.0.tgz#356256f643804773c82f64723fe78c92c62beaeb" @@ -11601,10 +11527,6 @@ regenerate@^1.4.0: version "1.4.2" resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a" -regenerator-runtime@^0.11.0: - version "0.11.1" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" - regenerator-runtime@^0.13.4, regenerator-runtime@^0.13.7: version "0.13.9" resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz#8925742a98ffd90814988d7566ad30ca3b263b52" @@ -11648,10 +11570,6 @@ regextras@^0.7.1: version "0.7.1" resolved "https://registry.yarnpkg.com/regextras/-/regextras-0.7.1.tgz#be95719d5f43f9ef0b9fa07ad89b7c606995a3b2" -register-service-worker@^1.6.2: - version "1.7.2" - resolved "https://registry.yarnpkg.com/register-service-worker/-/register-service-worker-1.7.2.tgz#6516983e1ef790a98c4225af1216bc80941a4bd2" - regjsgen@^0.5.1: version "0.5.2" resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.5.2.tgz#92ff295fb1deecbf6ecdab2543d207e91aa33733" @@ -12742,13 +12660,6 @@ strip-bom@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" -strip-comments@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/strip-comments/-/strip-comments-1.0.2.tgz#82b9c45e7f05873bee53f37168af930aa368679d" - dependencies: - babel-extract-comments "^1.0.0" - babel-plugin-transform-object-rest-spread "^6.26.0" - strip-eof@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" @@ -14383,125 +14294,6 @@ wordwrap@~0.0.2: version "0.0.3" resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" -workbox-background-sync@^4.3.1: - version "4.3.1" - resolved "https://registry.yarnpkg.com/workbox-background-sync/-/workbox-background-sync-4.3.1.tgz#26821b9bf16e9e37fd1d640289edddc08afd1950" - dependencies: - workbox-core "^4.3.1" - -workbox-broadcast-update@^4.3.1: - version "4.3.1" - resolved "https://registry.yarnpkg.com/workbox-broadcast-update/-/workbox-broadcast-update-4.3.1.tgz#e2c0280b149e3a504983b757606ad041f332c35b" - dependencies: - workbox-core "^4.3.1" - -workbox-build@^4.3.1: - version "4.3.1" - resolved "https://registry.yarnpkg.com/workbox-build/-/workbox-build-4.3.1.tgz#414f70fb4d6de47f6538608b80ec52412d233e64" - dependencies: - "@babel/runtime" "^7.3.4" - "@hapi/joi" "^15.0.0" - common-tags "^1.8.0" - fs-extra "^4.0.2" - glob "^7.1.3" - lodash.template "^4.4.0" - pretty-bytes "^5.1.0" - stringify-object "^3.3.0" - strip-comments "^1.0.2" - workbox-background-sync "^4.3.1" - workbox-broadcast-update "^4.3.1" - workbox-cacheable-response "^4.3.1" - workbox-core "^4.3.1" - workbox-expiration "^4.3.1" - workbox-google-analytics "^4.3.1" - workbox-navigation-preload "^4.3.1" - workbox-precaching "^4.3.1" - workbox-range-requests "^4.3.1" - workbox-routing "^4.3.1" - workbox-strategies "^4.3.1" - workbox-streams "^4.3.1" - workbox-sw "^4.3.1" - workbox-window "^4.3.1" - -workbox-cacheable-response@^4.3.1: - version "4.3.1" - resolved "https://registry.yarnpkg.com/workbox-cacheable-response/-/workbox-cacheable-response-4.3.1.tgz#f53e079179c095a3f19e5313b284975c91428c91" - dependencies: - workbox-core "^4.3.1" - -workbox-core@^4.3.1: - version "4.3.1" - resolved "https://registry.yarnpkg.com/workbox-core/-/workbox-core-4.3.1.tgz#005d2c6a06a171437afd6ca2904a5727ecd73be6" - -workbox-expiration@^4.3.1: - version "4.3.1" - resolved "https://registry.yarnpkg.com/workbox-expiration/-/workbox-expiration-4.3.1.tgz#d790433562029e56837f341d7f553c4a78ebe921" - dependencies: - workbox-core "^4.3.1" - -workbox-google-analytics@^4.3.1: - version "4.3.1" - resolved "https://registry.yarnpkg.com/workbox-google-analytics/-/workbox-google-analytics-4.3.1.tgz#9eda0183b103890b5c256e6f4ea15a1f1548519a" - dependencies: - workbox-background-sync "^4.3.1" - workbox-core "^4.3.1" - workbox-routing "^4.3.1" - workbox-strategies "^4.3.1" - -workbox-navigation-preload@^4.3.1: - version "4.3.1" - resolved "https://registry.yarnpkg.com/workbox-navigation-preload/-/workbox-navigation-preload-4.3.1.tgz#29c8e4db5843803b34cd96dc155f9ebd9afa453d" - dependencies: - workbox-core "^4.3.1" - -workbox-precaching@^4.3.1: - version "4.3.1" - resolved "https://registry.yarnpkg.com/workbox-precaching/-/workbox-precaching-4.3.1.tgz#9fc45ed122d94bbe1f0ea9584ff5940960771cba" - dependencies: - workbox-core "^4.3.1" - -workbox-range-requests@^4.3.1: - version "4.3.1" - resolved "https://registry.yarnpkg.com/workbox-range-requests/-/workbox-range-requests-4.3.1.tgz#f8a470188922145cbf0c09a9a2d5e35645244e74" - dependencies: - workbox-core "^4.3.1" - -workbox-routing@^4.3.1: - version "4.3.1" - resolved "https://registry.yarnpkg.com/workbox-routing/-/workbox-routing-4.3.1.tgz#a675841af623e0bb0c67ce4ed8e724ac0bed0cda" - dependencies: - workbox-core "^4.3.1" - -workbox-strategies@^4.3.1: - version "4.3.1" - resolved "https://registry.yarnpkg.com/workbox-strategies/-/workbox-strategies-4.3.1.tgz#d2be03c4ef214c115e1ab29c9c759c9fe3e9e646" - dependencies: - workbox-core "^4.3.1" - -workbox-streams@^4.3.1: - version "4.3.1" - resolved "https://registry.yarnpkg.com/workbox-streams/-/workbox-streams-4.3.1.tgz#0b57da70e982572de09c8742dd0cb40a6b7c2cc3" - dependencies: - workbox-core "^4.3.1" - -workbox-sw@^4.3.1: - version "4.3.1" - resolved "https://registry.yarnpkg.com/workbox-sw/-/workbox-sw-4.3.1.tgz#df69e395c479ef4d14499372bcd84c0f5e246164" - -workbox-webpack-plugin@^4.3.1: - version "4.3.1" - resolved "https://registry.yarnpkg.com/workbox-webpack-plugin/-/workbox-webpack-plugin-4.3.1.tgz#47ff5ea1cc074b6c40fb5a86108863a24120d4bd" - dependencies: - "@babel/runtime" "^7.0.0" - json-stable-stringify "^1.0.1" - workbox-build "^4.3.1" - -workbox-window@^4.3.1: - version "4.3.1" - resolved "https://registry.yarnpkg.com/workbox-window/-/workbox-window-4.3.1.tgz#ee6051bf10f06afa5483c9b8dfa0531994ede0f3" - dependencies: - workbox-core "^4.3.1" - worker-farm@^1.7.0: version "1.7.0" resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.7.0.tgz#26a94c5391bbca926152002f69b84a4bf772e5a8"