Merge pull request #35 from ente-io/sentry-integration

integrated sentry
This commit is contained in:
Abhinav-grd 2021-03-12 13:59:47 +05:30 committed by GitHub
commit 28be38947e
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
15 changed files with 352 additions and 55 deletions

View file

@ -1,19 +1,67 @@
// Use the SentryWebpack plugin to upload the source maps during build step
const SentryWebpackPlugin = require('@sentry/webpack-plugin');
const WorkerPlugin = require('worker-plugin');
const withBundleAnalyzer = require('@next/bundle-analyzer')({
enabled: process.env.ANALYZE === 'true',
});
const {
NEXT_PUBLIC_SENTRY_DSN: SENTRY_DSN,
SENTRY_ORG,
SENTRY_PROJECT,
SENTRY_AUTH_TOKEN,
NODE_ENV,
GITHUB_COMMIT_SHA: COMMIT_SHA,
} = process.env;
process.env.SENTRY_DSN = SENTRY_DSN;
const basePath = '';
module.exports = withBundleAnalyzer({
target: 'serverless',
productionBrowserSourceMaps: true,
env: {
// Make the COMMIT_SHA available to the client so that Sentry events can be
// marked for the release they belong to. It may be undefined if running
// outside of Vercel
NEXT_PUBLIC_COMMIT_SHA: COMMIT_SHA,
},
webpack: (config, { buildId, dev, isServer, defaultLoaders, webpack }) => {
if (!isServer) {
config.plugins.push(
new WorkerPlugin({
// use "self" as the global object when receiving hot updates.
globalObject: 'self',
})
)
config.plugins.push(
new WorkerPlugin({
// use "self" as the global object when receiving hot updates.
globalObject: 'self',
})
);
config.resolve.alias['@sentry/node'] = '@sentry/browser';
}
return config
// Define an environment variable so source code can check whether or not
// it's running on the server so we can correctly initialize Sentry
config.plugins.push(
new webpack.DefinePlugin({
'process.env.NEXT_IS_SERVER': JSON.stringify(
isServer.toString()
),
})
);
if (
false &&
SENTRY_DSN &&
SENTRY_ORG &&
SENTRY_PROJECT &&
SENTRY_AUTH_TOKEN &&
NODE_ENV === 'production'
) {
config.plugins.push(
new SentryWebpackPlugin({
include: '.next',
ignore: ['node_modules'],
stripPrefix: ['webpack://_N_E/'],
urlPrefix: `~${basePath}/_next`,
})
);
}
return config;
},
});

View file

@ -9,6 +9,10 @@
"start": "next start"
},
"dependencies": {
"@sentry/browser": "^5.21.3",
"@sentry/integrations": "^5.21.3",
"@sentry/node": "^5.21.3",
"@sentry/webpack-plugin": "^1.12.1",
"axios": "^0.20.0",
"bootstrap": "^4.5.2",
"comlink": "^4.3.0",

6
src/pages/404.js Normal file
View file

@ -0,0 +1,6 @@
import Error from 'next/error'
export default function NotFound() {
// Opinionated: do not record an exception in Sentry for 404
return <Error statusCode={404} />
}

View file

@ -12,19 +12,14 @@ import PowerSettings from 'components/power_settings';
import Head from 'next/head';
import 'bootstrap/dist/css/bootstrap.min.css';
import 'photoswipe/dist/photoswipe.css';
import localForage from 'localforage';
import localForage from 'utils/storage/localForage';
import UploadButton from 'pages/gallery/components/UploadButton';
import FullScreenDropZone from 'components/FullScreenDropZone';
import { sentryInit } from '../utils/sentry';
import ConfirmLogout from 'components/ConfirmLogout';
import { useDropzone } from 'react-dropzone';
localForage.config({
driver: localForage.INDEXEDDB,
name: 'ente-files',
version: 1.0,
storeName: 'files',
});
const GlobalStyles = createGlobalStyle`
html, body {
padding: 0;
@ -165,7 +160,8 @@ const FlexContainer = styled.div`
margin: 16px;
`;
export default function App({ Component, pageProps }) {
sentryInit();
export default function App({ Component, pageProps, err }) {
const router = useRouter();
const [user, setUser] = useState();
const [loading, setLoading] = useState(false);
@ -280,6 +276,7 @@ export default function App({ Component, pageProps }) {
showUploadModal={showUploadModal}
closeUploadModal={closeUploadModal}
setUploadButtonView={setUploadButtonView}
err={err}
/>
)}
</FullScreenDropZone>

60
src/pages/_error.js Normal file
View file

@ -0,0 +1,60 @@
import NextErrorComponent from 'next/error'
import * as Sentry from '@sentry/node'
const MyError = ({ statusCode, hasGetInitialPropsRun, err }) => {
if (!hasGetInitialPropsRun && err) {
// getInitialProps is not called in case of
// https://github.com/vercel/next.js/issues/8592. As a workaround, we pass
// err via _app.js so it can be captured
Sentry.captureException(err)
// Flushing is not required in this case as it only happens on the client
}
return <NextErrorComponent statusCode={statusCode} />
}
MyError.getInitialProps = async ({ res, err, asPath }) => {
const errorInitialProps = await NextErrorComponent.getInitialProps({
res,
err,
})
// Workaround for https://github.com/vercel/next.js/issues/8592, mark when
// getInitialProps has run
errorInitialProps.hasGetInitialPropsRun = true
// Running on the server, the response object (`res`) is available.
//
// Next.js will pass an err on the server if a page's data fetching methods
// threw or returned a Promise that rejected
//
// Running on the client (browser), Next.js will provide an err if:
//
// - a page's `getInitialProps` threw or returned a Promise that rejected
// - an exception was thrown somewhere in the React lifecycle (render,
// componentDidMount, etc) that was caught by Next.js's React Error
// Boundary. Read more about what types of exceptions are caught by Error
// Boundaries: https://reactjs.org/docs/error-boundaries.html
if (err) {
Sentry.captureException(err)
// Flushing before returning is necessary if deploying to Vercel, see
// https://vercel.com/docs/platform/limits#streaming-responses
await Sentry.flush(2000)
return errorInitialProps
}
// If this point is reached, getInitialProps was called without any
// information about what the error might be. This is unexpected and may
// indicate a bug introduced in Next.js, so record it in Sentry
Sentry.captureException(
new Error(`_error.js getInitialProps missing data at path: ${asPath}`)
)
await Sentry.flush(2000)
return errorInitialProps
}
export default MyError

View file

@ -1,7 +1,7 @@
import { getEndpoint } from 'utils/common/apiUtil';
import { getData, LS_KEYS } from 'utils/storage/localStorage';
import { file } from './fileService';
import localForage from 'localforage';
import localForage from 'utils/storage/localForage';
import HTTPService from './HTTPService';
import { B64EncryptionResult } from './uploadService';
@ -104,7 +104,7 @@ const getCollections = async (
);
return await Promise.all(promises);
} catch (e) {
console.log('getCollections failed- ', e.response);
console.error('getCollections failed- ', e.response);
}
};
@ -248,7 +248,7 @@ export const AddCollection = async (
);
return createdCollection;
} catch (e) {
console.log('Add collection failed', e);
console.error('Add collection failed', e);
}
};
@ -265,7 +265,7 @@ const createCollection = async (
);
return response.data.collection;
} catch (e) {
console.log('create Collection failed ', e);
console.error('create Collection failed ', e);
}
};
@ -323,7 +323,7 @@ const addToCollection = async (collection: collection, files: file[]) => {
{ 'X-Auth-Token': token }
);
} catch (e) {
console.log('Add to collection Failed ', e);
console.error('Add to collection Failed ', e);
}
};
const removeFromCollection = async (collection: collection, files: file[]) => {
@ -346,7 +346,7 @@ const removeFromCollection = async (collection: collection, files: file[]) => {
{ 'X-Auth-Token': token }
);
} catch (e) {
console.log('remove from collection failed ', e);
console.error('remove from collection failed ', e);
}
};

View file

@ -2,10 +2,10 @@ import { getToken } from 'utils/common/key';
import { file } from './fileService';
import HTTPService from './HTTPService';
import { getEndpoint, getFileUrl, getThumbnailUrl } from 'utils/common/apiUtil';
import { getFileExtension } from 'utils/common/utilFunctions';
import { getFileExtension, runningInBrowser } from 'utils/common/utilFunctions';
import CryptoWorker from 'utils/crypto/cryptoWorker';
const heic2any = typeof window !== 'undefined' && require('heic2any');
const heic2any = runningInBrowser() && require('heic2any');
const TYPE_HEIC = 'heic';
class DownloadManager {
@ -48,7 +48,7 @@ class DownloadManager {
}
return await this.thumbnailDownloads.get(file.id);
} catch (e) {
console.log('get preview Failed', e);
console.error('get preview Failed', e);
}
}

View file

@ -1,6 +1,7 @@
import { getEndpoint } from 'utils/common/apiUtil';
import HTTPService from './HTTPService';
import localForage from 'localforage';
import localForage from 'utils/storage/localForage';
import { collection } from './collectionService';
import { MetadataObject } from './uploadService';
import CryptoWorker from 'utils/crypto/cryptoWorker';
@ -8,13 +9,6 @@ import CryptoWorker from 'utils/crypto/cryptoWorker';
const ENDPOINT = getEndpoint();
const DIFF_LIMIT: number = 2500;
localForage.config({
driver: localForage.INDEXEDDB,
name: 'ente-files',
version: 1.0,
storeName: 'files',
});
const FILES = 'files';
export interface fileAttribute {
@ -23,7 +17,6 @@ export interface fileAttribute {
decryptionHeader: string;
}
export interface file {
id: number;
collectionID: number;
@ -149,7 +142,7 @@ export const getFiles = async (
} while (resp.data.diff.length === limit);
return await Promise.all(promises);
} catch (e) {
console.log('Get files failed', e);
console.error('Get files failed', e);
}
};

View file

@ -154,7 +154,7 @@ class UploadService {
progressBarProps.setPercentComplete(100);
} catch (e) {
this.filesToBeUploaded = [];
console.log(e);
console.error(e);
throw e;
}
}
@ -265,7 +265,7 @@ class UploadService {
metadata,
};
} catch (e) {
console.log('error reading files ', e);
console.error('error reading files ', e);
throw e;
}
}
@ -308,7 +308,7 @@ class UploadService {
};
return result;
} catch (e) {
console.log('Error encrypting files ', e);
console.error('Error encrypting files ', e);
throw e;
}
}
@ -334,7 +334,7 @@ class UploadService {
return file;
} catch (e) {
console.log('error uploading to bucket ', e);
console.error('error uploading to bucket ', e);
throw e;
}
}
@ -364,7 +364,7 @@ class UploadService {
return response.data;
} catch (e) {
console.log('upload Files Failed ', e);
console.error('upload Files Failed ', e);
throw e;
}
}
@ -502,7 +502,7 @@ class UploadService {
);
return thumbnail;
} catch (e) {
console.log('Error generating thumbnail ', e);
console.error('Error generating thumbnail ', e);
throw e;
}
}
@ -526,7 +526,7 @@ class UploadService {
reader.readAsArrayBuffer(file);
});
} catch (e) {
console.log('error readinf file to bytearray ', e);
console.error('error readinf file to bytearray ', e);
throw e;
}
}
@ -558,7 +558,7 @@ class UploadService {
}
return this.uploadURLFetchInProgress;
} catch (e) {
console.log('fetch upload-url failed ', e);
console.error('fetch upload-url failed ', e);
throw e;
}
}
@ -574,7 +574,7 @@ class UploadService {
});
return fileUploadURL.objectKey;
} catch (e) {
console.log('putFile to dataStore failed ', e);
console.error('putFile to dataStore failed ', e);
throw e;
}
}
@ -595,7 +595,7 @@ class UploadService {
creationTime: this.getUNIXTime(exifData),
};
} catch (e) {
console.log('error reading exif data');
console.error('error reading exif data');
throw e;
}
}

View file

@ -11,3 +11,7 @@ export function checkConnectivity() {
export function getFileExtension(fileName): string {
return fileName.substr(fileName.lastIndexOf('.') + 1).toLowerCase();
}
export function runningInBrowser() {
return typeof window !== 'undefined';
}

View file

@ -1,7 +1,8 @@
import * as Comlink from 'comlink';
import { runningInBrowser } from 'utils/common/utilFunctions';
const CryptoWorker: any =
typeof window !== 'undefined' &&
runningInBrowser() &&
Comlink.wrap(new Worker('worker/crypto.worker.js', { type: 'module' }));
export default CryptoWorker;

44
src/utils/sentry.ts Normal file
View file

@ -0,0 +1,44 @@
import * as Sentry from '@sentry/node';
import { RewriteFrames, CaptureConsole } from '@sentry/integrations';
export const sentryInit = () => {
if (process.env.NEXT_PUBLIC_SENTRY_DSN) {
const integrations = [];
if (
process.env.NEXT_IS_SERVER === 'true' &&
process.env.NEXT_PUBLIC_SENTRY_SERVER_ROOT_DIR
) {
// For Node.js, rewrite Error.stack to use relative paths, so that source
// maps starting with ~/_next map to files in Error.stack with path
// app:///_next
integrations.push(
new RewriteFrames({
iteratee: (frame) => {
frame.filename = frame.filename.replace(
process.env.NEXT_PUBLIC_SENTRY_SERVER_ROOT_DIR,
'app:///'
);
frame.filename = frame.filename.replace(
'.next',
'_next'
);
return frame;
},
})
);
}
integrations.push(
new CaptureConsole({
levels: ['error'],
})
);
Sentry.init({
enabled: process.env.NODE_ENV === 'production',
environment: process.env.NODE_ENV,
integrations,
dsn: process.env.NEXT_PUBLIC_SENTRY_DSN,
attachStacktrace: true,
});
}
};

View file

@ -0,0 +1,12 @@
import { runningInBrowser } from 'utils/common/utilFunctions';
const localForage: LocalForage = runningInBrowser() && require('localforage');
if (runningInBrowser()) {
localForage.config({
driver: localForage.INDEXEDDB,
name: 'ente-files',
version: 1.0,
storeName: 'files',
});
}
export default localForage;

View file

@ -1,3 +1,4 @@
import { runningInBrowser } from 'utils/common/utilFunctions';
import englishConstants from './englishConstants';
/** Enums of supported locale */
@ -62,8 +63,7 @@ const globalConstants: VernacularConstants<typeof englishConstants> = {
* @param localConstants
*/
export function getConstantValue<T>(localConstants?: VernacularConstants<T>) {
const searchParam =
typeof window !== 'undefined' ? window.location.search : '';
const searchParam = runningInBrowser() ? window.location.search : '';
const query = new URLSearchParams(searchParam);
const currLocale = getLocale(query.get('lang'));

142
yarn.lock
View file

@ -2063,6 +2063,112 @@
lodash "^4.17.20"
lodash-es "^4.17.20"
"@sentry/browser@^5.21.3":
version "5.30.0"
resolved "https://registry.yarnpkg.com/@sentry/browser/-/browser-5.30.0.tgz#c28f49d551db3172080caef9f18791a7fd39e3b3"
integrity sha512-rOb58ZNVJWh1VuMuBG1mL9r54nZqKeaIlwSlvzJfc89vyfd7n6tQ1UXMN383QBz/MS5H5z44Hy5eE+7pCrYAfw==
dependencies:
"@sentry/core" "5.30.0"
"@sentry/types" "5.30.0"
"@sentry/utils" "5.30.0"
tslib "^1.9.3"
"@sentry/cli@^1.58.0":
version "1.63.1"
resolved "https://registry.yarnpkg.com/@sentry/cli/-/cli-1.63.1.tgz#306a0591190432574082d4ce4a72363201972461"
integrity sha512-qksIcrnObkGvtubs1FmW4EMXLo7R43Dobgzuxnyoebo1Y5KfRLziiw6H+ux8D4c1Nui4SuvDGDq0ObAfO5oE6Q==
dependencies:
https-proxy-agent "^5.0.0"
mkdirp "^0.5.5"
node-fetch "^2.6.0"
progress "^2.0.3"
proxy-from-env "^1.1.0"
"@sentry/core@5.30.0":
version "5.30.0"
resolved "https://registry.yarnpkg.com/@sentry/core/-/core-5.30.0.tgz#6b203664f69e75106ee8b5a2fe1d717379b331f3"
integrity sha512-TmfrII8w1PQZSZgPpUESqjB+jC6MvZJZdLtE/0hZ+SrnKhW3x5WlYLvTXZpcWePYBku7rl2wn1RZu6uT0qCTeg==
dependencies:
"@sentry/hub" "5.30.0"
"@sentry/minimal" "5.30.0"
"@sentry/types" "5.30.0"
"@sentry/utils" "5.30.0"
tslib "^1.9.3"
"@sentry/hub@5.30.0":
version "5.30.0"
resolved "https://registry.yarnpkg.com/@sentry/hub/-/hub-5.30.0.tgz#2453be9b9cb903404366e198bd30c7ca74cdc100"
integrity sha512-2tYrGnzb1gKz2EkMDQcfLrDTvmGcQPuWxLnJKXJvYTQDGLlEvi2tWz1VIHjunmOvJrB5aIQLhm+dcMRwFZDCqQ==
dependencies:
"@sentry/types" "5.30.0"
"@sentry/utils" "5.30.0"
tslib "^1.9.3"
"@sentry/integrations@^5.21.3":
version "5.30.0"
resolved "https://registry.yarnpkg.com/@sentry/integrations/-/integrations-5.30.0.tgz#2f25fb998cb19c76b3803d84c1a577b3d837010f"
integrity sha512-Fqh4ALLoQWdd+1ih0iBduANWFyNmFWMxwvBu3V/wLDRi8OcquI0lEzWai1InzTJTiNhRHPnhuU++l/vkO0OCww==
dependencies:
"@sentry/types" "5.30.0"
"@sentry/utils" "5.30.0"
localforage "1.8.1"
tslib "^1.9.3"
"@sentry/minimal@5.30.0":
version "5.30.0"
resolved "https://registry.yarnpkg.com/@sentry/minimal/-/minimal-5.30.0.tgz#ce3d3a6a273428e0084adcb800bc12e72d34637b"
integrity sha512-BwWb/owZKtkDX+Sc4zCSTNcvZUq7YcH3uAVlmh/gtR9rmUvbzAA3ewLuB3myi4wWRAMEtny6+J/FN/x+2wn9Xw==
dependencies:
"@sentry/hub" "5.30.0"
"@sentry/types" "5.30.0"
tslib "^1.9.3"
"@sentry/node@^5.21.3":
version "5.30.0"
resolved "https://registry.yarnpkg.com/@sentry/node/-/node-5.30.0.tgz#4ca479e799b1021285d7fe12ac0858951c11cd48"
integrity sha512-Br5oyVBF0fZo6ZS9bxbJZG4ApAjRqAnqFFurMVJJdunNb80brh7a5Qva2kjhm+U6r9NJAB5OmDyPkA1Qnt+QVg==
dependencies:
"@sentry/core" "5.30.0"
"@sentry/hub" "5.30.0"
"@sentry/tracing" "5.30.0"
"@sentry/types" "5.30.0"
"@sentry/utils" "5.30.0"
cookie "^0.4.1"
https-proxy-agent "^5.0.0"
lru_map "^0.3.3"
tslib "^1.9.3"
"@sentry/tracing@5.30.0":
version "5.30.0"
resolved "https://registry.yarnpkg.com/@sentry/tracing/-/tracing-5.30.0.tgz#501d21f00c3f3be7f7635d8710da70d9419d4e1f"
integrity sha512-dUFowCr0AIMwiLD7Fs314Mdzcug+gBVo/+NCMyDw8tFxJkwWAKl7Qa2OZxLQ0ZHjakcj1hNKfCQJ9rhyfOl4Aw==
dependencies:
"@sentry/hub" "5.30.0"
"@sentry/minimal" "5.30.0"
"@sentry/types" "5.30.0"
"@sentry/utils" "5.30.0"
tslib "^1.9.3"
"@sentry/types@5.30.0":
version "5.30.0"
resolved "https://registry.yarnpkg.com/@sentry/types/-/types-5.30.0.tgz#19709bbe12a1a0115bc790b8942917da5636f402"
integrity sha512-R8xOqlSTZ+htqrfteCWU5Nk0CDN5ApUTvrlvBuiH1DyP6czDZ4ktbZB0hAgBlVcK0U+qpD3ag3Tqqpa5Q67rPw==
"@sentry/utils@5.30.0":
version "5.30.0"
resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-5.30.0.tgz#9a5bd7ccff85ccfe7856d493bffa64cabc41e980"
integrity sha512-zaYmoH0NWWtvnJjC9/CBseXMtKHm/tm40sz3YfJRxeQjyzRqNQPgivpd9R/oDJCYj999mzdW382p/qi2ypjLww==
dependencies:
"@sentry/types" "5.30.0"
tslib "^1.9.3"
"@sentry/webpack-plugin@^1.12.1":
version "1.14.1"
resolved "https://registry.yarnpkg.com/@sentry/webpack-plugin/-/webpack-plugin-1.14.1.tgz#f7aceac17820677f6064293d1f5d01ac72012d14"
integrity sha512-Elxs21Z9hHNd+s9dCFVkbr/xLa+7Pb8zfqSCzvPOraHCBseE2onyzM7gostmxLtInboEwO0yRTQ5ohmfhhpa2A==
dependencies:
"@sentry/cli" "^1.58.0"
"@sls-next/lambda-at-edge@^1.5.2":
version "1.7.0"
resolved "https://registry.yarnpkg.com/@sls-next/lambda-at-edge/-/lambda-at-edge-1.7.0.tgz#86b2a4642ef252eb8bb96b8931808d4c18d54082"
@ -3044,9 +3150,9 @@ camelize@^1.0.0:
integrity sha1-FkpUg+Yw+kMh5a8HAg5TGDGyYJs=
caniuse-lite@^1.0.30001093, caniuse-lite@^1.0.30001113, caniuse-lite@^1.0.30001181:
version "1.0.30001192"
resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001192.tgz#b848ebc0ab230cf313d194a4775a30155d50ae40"
integrity sha512-63OrUnwJj5T1rUmoyqYTdRWBqFFxZFlyZnRRjDR8NSUQFB6A+j/uBORU/SyJ5WzDLg4SPiZH40hQCBNdZ/jmAw==
version "1.0.30001197"
resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001197.tgz"
integrity sha512-8aE+sqBqtXz4G8g35Eg/XEaFr2N7rd/VQ6eABGBmNtcB8cN6qNJhMi6oSFy4UWWZgqgL3filHT8Nha4meu3tsw==
chalk@4.0.0:
version "4.0.0"
@ -4507,7 +4613,7 @@ 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:
https-proxy-agent@5.0.0, 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==
@ -5010,6 +5116,13 @@ localforage@*, localforage@^1.9.0:
dependencies:
lie "3.1.1"
localforage@1.8.1:
version "1.8.1"
resolved "https://registry.yarnpkg.com/localforage/-/localforage-1.8.1.tgz#f6c0a24b41ab33b10e4dc84342dd696f6f3e3433"
integrity sha512-azSSJJfc7h4bVpi0PGi+SmLQKJl2/8NErI+LhJsrORNikMZnhaQ7rv9fHj+ofwgSHrKRlsDCL/639a6nECIKuQ==
dependencies:
lie "3.1.1"
locate-path@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e"
@ -5096,6 +5209,11 @@ lru-cache@^5.1.1:
dependencies:
yallist "^3.0.2"
lru_map@^0.3.3:
version "0.3.3"
resolved "https://registry.yarnpkg.com/lru_map/-/lru_map-0.3.3.tgz#b5c8351b9464cbd750335a79650a0ec0e56118dd"
integrity sha1-tcg1G5Rky9dQM1p5ZQoOwOVhGN0=
make-dir@^2.0.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5"
@ -5338,7 +5456,7 @@ mkdirp@0.5.3:
dependencies:
minimist "^1.2.5"
mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@^0.5.3:
mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@^0.5.3, mkdirp@^0.5.5:
version "0.5.5"
resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def"
integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==
@ -5517,7 +5635,7 @@ node-fetch@2.6.0:
resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.0.tgz#e633456386d4aa55863f676a7ab0daa8fdecb0fd"
integrity sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA==
node-fetch@2.6.1:
node-fetch@2.6.1, node-fetch@^2.6.0:
version "2.6.1"
resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.1.tgz#045bd323631f76ed2e2b55573394416b639a0052"
integrity sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==
@ -6064,6 +6182,11 @@ process@0.11.10, process@^0.11.10:
resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182"
integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI=
progress@^2.0.3:
version "2.0.3"
resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8"
integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==
promise-inflight@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3"
@ -6099,6 +6222,11 @@ proxy-addr@~2.0.5:
forwarded "~0.1.2"
ipaddr.js "1.9.1"
proxy-from-env@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2"
integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==
prr@~1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476"
@ -7187,7 +7315,7 @@ ts-pnp@^1.1.6:
resolved "https://registry.yarnpkg.com/ts-pnp/-/ts-pnp-1.2.0.tgz#a500ad084b0798f1c3071af391e65912c86bca92"
integrity sha512-csd+vJOb/gkzvcCHgTGSChYpy5f1/XKNsmvBGO4JXS+z1v2HobugDz4s1IeFXM3wZB44uczs+eazB5Q/ccdhQw==
tslib@^1.10.0, tslib@^1.11.1, tslib@^1.8.0, tslib@^1.9.0:
tslib@^1.10.0, tslib@^1.11.1, tslib@^1.8.0, tslib@^1.9.0, tslib@^1.9.3:
version "1.14.1"
resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00"
integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==