From eeeda70ffc0559eb022f5acce1a76b395d0a9614 Mon Sep 17 00:00:00 2001 From: Quinn Slack Date: Sat, 22 Dec 2018 01:25:05 -0800 Subject: [PATCH] pass eventLogger via React context (new 16.3 API) and use it in ActionItem Upgrading reactstrap and react-router was necessary due to: - https://github.com/reactstrap/reactstrap/issues/1201 (see https://github.com/sourcegraph/sourcegraph/issues/1553) - https://github.com/ReactTraining/react-router/pull/5908#issuecomment-423303168 (otherwise `` ignored all context passed from its parent) --- .../code_intelligence/code_intelligence.tsx | 34 +++--- .../src/libs/code_intelligence/extensions.tsx | 20 ++-- client/browser/src/libs/github/inject.tsx | 10 +- .../src/shared/tracking/EventLogger.tsx | 14 ++- package.json | 8 +- shared/src/actions/ActionItem.tsx | 8 ++ shared/src/telemetry/telemetryContext.ts | 7 ++ shared/src/telemetry/telemetryService.ts | 18 +++ web/src/SourcegraphWebApp.tsx | 60 +++++----- web/src/tracking/eventLogger.tsx | 3 +- yarn.lock | 107 ++++++++++++------ 11 files changed, 195 insertions(+), 94 deletions(-) create mode 100644 shared/src/telemetry/telemetryContext.ts create mode 100644 shared/src/telemetry/telemetryService.ts diff --git a/client/browser/src/libs/code_intelligence/code_intelligence.tsx b/client/browser/src/libs/code_intelligence/code_intelligence.tsx index 0410d702d65..667780e8c07 100644 --- a/client/browser/src/libs/code_intelligence/code_intelligence.tsx +++ b/client/browser/src/libs/code_intelligence/code_intelligence.tsx @@ -22,6 +22,7 @@ import { Model, ViewComponentData } from '../../../../../shared/src/api/client/m import { ExtensionsControllerProps } from '../../../../../shared/src/extensions/controller' import { getModeFromPath } from '../../../../../shared/src/languages' import { PlatformContextProps } from '../../../../../shared/src/platform/context' +import { TelemetryContext } from '../../../../../shared/src/telemetry/telemetryContext' import { FileSpec, PositionSpec, @@ -40,7 +41,7 @@ import { toTextDocumentIdentifier, } from '../../shared/backend/lsp' import { ButtonProps, CodeViewToolbar } from '../../shared/components/CodeViewToolbar' -import { sourcegraphUrl, useExtensions } from '../../shared/util/context' +import { eventLogger, sourcegraphUrl, useExtensions } from '../../shared/util/context' import { bitbucketServerCodeHost } from '../bitbucket/code_intelligence' import { githubCodeHost } from '../github/code_intelligence' import { gitlabCodeHost } from '../gitlab/code_intelligence' @@ -380,7 +381,12 @@ function initCodeIntelligence( } } - render(, overlayContainerMount) + render( + + + , + overlayContainerMount + ) return { hoverifier, controllers: { platformContext, extensionsController } } } @@ -538,18 +544,20 @@ function handleCodeHost(codeHost: CodeHost): Subscription { const mount = getToolbarMount(codeView) render( - + , + location={H.createLocation(window.location)} + /> + , mount ) } diff --git a/client/browser/src/libs/code_intelligence/extensions.tsx b/client/browser/src/libs/code_intelligence/extensions.tsx index f6a49ea620e..a65718b2796 100644 --- a/client/browser/src/libs/code_intelligence/extensions.tsx +++ b/client/browser/src/libs/code_intelligence/extensions.tsx @@ -16,9 +16,11 @@ import { ExtensionsControllerProps, } from '../../../../../shared/src/extensions/controller' import { PlatformContextProps } from '../../../../../shared/src/platform/context' +import { TelemetryContext } from '../../../../../shared/src/telemetry/telemetryContext' import { createPlatformContext } from '../../platform/context' import { GlobalDebug } from '../../shared/components/GlobalDebug' import { ShortcutProvider } from '../../shared/components/ShortcutProvider' +import { eventLogger } from '../../shared/util/context' import { getGlobalDebugMount } from '../github/extensions' import { CodeHost } from './code_intelligence' @@ -40,14 +42,16 @@ export function initializeExtensions({ if (getCommandPaletteMount) { render( - - + + + + , getCommandPaletteMount() ) diff --git a/client/browser/src/libs/github/inject.tsx b/client/browser/src/libs/github/inject.tsx index 40aac81250e..b2e68f6c68a 100644 --- a/client/browser/src/libs/github/inject.tsx +++ b/client/browser/src/libs/github/inject.tsx @@ -1,6 +1,7 @@ import mermaid from 'mermaid' import * as React from 'react' import { render } from 'react-dom' +import { TelemetryContext } from '../../../../../shared/src/telemetry/telemetryContext' import storage from '../../browser/storage' import { Alerts } from '../../shared/components/Alerts' import { ConfigureSourcegraphButton } from '../../shared/components/ConfigureSourcegraphButton' @@ -8,7 +9,7 @@ import { ContextualSourcegraphButton } from '../../shared/components/ContextualS import { ServerAuthButton } from '../../shared/components/ServerAuthButton' import { SymbolsDropdownContainer } from '../../shared/components/SymbolsDropdownContainer' import { WithResolvedRev } from '../../shared/components/WithResolvedRev' -import { inlineSymbolSearchEnabled, renderMermaidGraphsEnabled } from '../../shared/util/context' +import { eventLogger, inlineSymbolSearchEnabled, renderMermaidGraphsEnabled } from '../../shared/util/context' import { getFileContainers, parseURL } from './util' async function refreshModules(): Promise { @@ -67,7 +68,12 @@ function injectServerBanner(): void { } container.appendChild(mount) } - render(, mount) + render( + + + , + mount + ) } /** diff --git a/client/browser/src/shared/tracking/EventLogger.tsx b/client/browser/src/shared/tracking/EventLogger.tsx index e71a94fcab0..488f34c54d1 100644 --- a/client/browser/src/shared/tracking/EventLogger.tsx +++ b/client/browser/src/shared/tracking/EventLogger.tsx @@ -1,11 +1,12 @@ import uuid from 'uuid' +import { TelemetryService } from '../../../../../shared/src/telemetry/telemetryService' import storage from '../../browser/storage' import { isInPage } from '../../context' import { logUserEvent } from '../backend/userEvents' const uidKey = 'sourcegraphAnonymousUid' -export class EventLogger { +export class EventLogger implements TelemetryService { private uid: string constructor() { @@ -72,4 +73,15 @@ export class EventLogger { } ) } + + /** + * Implements {@link TelemetryService}. + * + * @todo Use the eventName. It is currently ignored. + * + * @param _eventName This parameter is ignored; see the @todo. + */ + public log(_eventName: string): void { + this.logCodeIntelligenceEvent() + } } diff --git a/package.json b/package.json index 9ee6d1dfef1..c2bc2ac86a3 100644 --- a/package.json +++ b/package.json @@ -76,7 +76,7 @@ "@types/puppeteer": "1.10.0", "@types/react": "16.7.13", "@types/react-dom": "16.0.11", - "@types/react-router": "4.4.1", + "@types/react-router": "4.4.3", "@types/react-router-dom": "4.3.1", "@types/react-stripe-elements": "1.1.9", "@types/react-test-renderer": "16.0.3", @@ -201,11 +201,11 @@ "react": "^16.6.1", "react-dom": "^16.6.1", "react-icon-base": "^2.0.0", - "react-router": "^4.3.1", - "react-router-dom": "^4.3.1", + "react-router": "^4.4.0-beta.6", + "react-router-dom": "^4.4.0-beta.6", "react-stripe-elements": "^2.0.1", "react-visibility-sensor": "^4.0.0", - "reactstrap": "^6.5.0", + "reactstrap": "https://registry.npmjs.org/@sqs/reactstrap/-/reactstrap-6.5.0-tmp1.tgz", "rxjs": "^6.3.3", "sourcegraph": "link:packages/sourcegraph-extension-api", "string-score": "^1.0.1", diff --git a/shared/src/actions/ActionItem.tsx b/shared/src/actions/ActionItem.tsx index 2518b9a1798..f3b4f8db2ba 100644 --- a/shared/src/actions/ActionItem.tsx +++ b/shared/src/actions/ActionItem.tsx @@ -9,6 +9,7 @@ import { urlForOpenPanel } from '../commands/commands' import { LinkOrButton } from '../components/LinkOrButton' import { ExtensionsControllerProps } from '../extensions/controller' import { PlatformContextProps } from '../platform/context' +import { TelemetryContext } from '../telemetry/telemetryContext' import { asError, ErrorLike, isErrorLike } from '../util/errors' export interface ActionItemProps { @@ -76,6 +77,9 @@ interface State { export class ActionItem extends React.PureComponent { public state: State = { actionOrError: null } + public static contextType = TelemetryContext + public context!: React.ContextType + private commandExecutions = new Subject() private subscriptions = new Subscription() @@ -192,6 +196,10 @@ export class ActionItem extends React.PureComponent { public runAction = (e: React.MouseEvent | React.KeyboardEvent) => { const action = (isAltEvent(e) && this.props.altAction) || this.props.action + + // Record action ID (but not args, which might leak sensitive data). + this.context.log(action.id) + if (urlForClientCommandOpen(action, this.props.location)) { if (e.currentTarget.tagName === 'A' && e.currentTarget.hasAttribute('href')) { // Do not execute the command. The 's default event handler will do what we want (which diff --git a/shared/src/telemetry/telemetryContext.ts b/shared/src/telemetry/telemetryContext.ts new file mode 100644 index 00000000000..2f18d21b387 --- /dev/null +++ b/shared/src/telemetry/telemetryContext.ts @@ -0,0 +1,7 @@ +import React from 'react' +import { NOOP_TELEMETRY_SERVICE, TelemetryService } from './telemetryService' + +/** + * A React context that holds the telemetry service (for logging telemetry events). + */ +export const TelemetryContext = React.createContext(NOOP_TELEMETRY_SERVICE) diff --git a/shared/src/telemetry/telemetryService.ts b/shared/src/telemetry/telemetryService.ts new file mode 100644 index 00000000000..490d36c1c6b --- /dev/null +++ b/shared/src/telemetry/telemetryService.ts @@ -0,0 +1,18 @@ +/** + * The telemetry service logs events. + */ +export interface TelemetryService { + /** + * Log an event (by sending it to the server). + */ + log(eventName: string): void +} + +/** + * A noop telemetry service. + */ +export const NOOP_TELEMETRY_SERVICE: TelemetryService = { + log: () => { + /* noop */ + }, +} diff --git a/web/src/SourcegraphWebApp.tsx b/web/src/SourcegraphWebApp.tsx index 3c23292a10b..40803bbb5ff 100644 --- a/web/src/SourcegraphWebApp.tsx +++ b/web/src/SourcegraphWebApp.tsx @@ -15,6 +15,7 @@ import * as GQL from '../../shared/src/graphql/schema' import { Notifications } from '../../shared/src/notifications/Notifications' import { PlatformContextProps } from '../../shared/src/platform/context' import { EMPTY_SETTINGS_CASCADE, SettingsCascadeProps } from '../../shared/src/settings/settings' +import { TelemetryContext } from '../../shared/src/telemetry/telemetryContext' import { isErrorLike } from '../../shared/src/util/errors' import { authenticatedUser } from './auth' import { FeedbackText } from './components/FeedbackText' @@ -35,6 +36,7 @@ import { RepoRevContainerRoute } from './repo/RepoRevContainer' import { LayoutRouteProps } from './routes' import { SiteAdminAreaRoute } from './site-admin/SiteAdminArea' import { SiteAdminSideBarGroups } from './site-admin/SiteAdminSidebar' +import { eventLogger } from './tracking/eventLogger' import { UserAccountAreaRoute } from './user/account/UserAccountArea' import { UserAccountSidebarItems } from './user/account/UserAccountSidebar' import { UserAreaRoute } from './user/area/UserArea' @@ -208,34 +210,36 @@ export class SourcegraphWebApp extends React.Component - - ( - - )} - /> - - - + + + ( + + )} + /> + + + + ) } diff --git a/web/src/tracking/eventLogger.tsx b/web/src/tracking/eventLogger.tsx index 04a99ca9198..9575fe127b6 100644 --- a/web/src/tracking/eventLogger.tsx +++ b/web/src/tracking/eventLogger.tsx @@ -2,6 +2,7 @@ import { matchPath } from 'react-router' import uuid from 'uuid' import * as GQL from '../../../shared/src/graphql/schema' import { getPathExtension } from '../../../shared/src/languages' +import { TelemetryService } from '../../../shared/src/telemetry/telemetryService' import { authenticatedUser } from '../auth' import { repoRevRoute } from '../routes' import { parseBrowserRepoURL } from '../util/url' @@ -11,7 +12,7 @@ import { telligent } from './services/telligentWrapper' const uidKey = 'sourcegraphAnonymousUid' -class EventLogger { +class EventLogger implements TelemetryService { private hasStrippedQueryParameters = false private user?: GQL.IUser | null diff --git a/yarn.lock b/yarn.lock index 79cbca89d07..03fd31b6045 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1824,7 +1824,7 @@ "@types/react" "*" "@types/react-router" "*" -"@types/react-router@*", "@types/react-router@4.4.1": +"@types/react-router@*": version "4.4.1" resolved "https://registry.npmjs.org/@types/react-router/-/react-router-4.4.1.tgz#c875dfd0b6fe00efa463eb8e5de8b5f74644b3f5" integrity sha512-CtQfdcXyMye3vflnQQ2sHU832iDJRoAr4P+7f964KlLYupXU1I5crP1+d/WnCMo6mmtjBjqQvxrtbAbodqerMA== @@ -1832,6 +1832,14 @@ "@types/history" "*" "@types/react" "*" +"@types/react-router@4.4.3": + version "4.4.3" + resolved "https://registry.npmjs.org/@types/react-router/-/react-router-4.4.3.tgz#ea68b4021cb576866f83365b2201411537423d50" + integrity sha512-8GmjakEBFNCLJbpg9jtDp1EDvFP0VkIPPKBpVwmB3Q+9whFoHu8rluMUXUE5SoGkEQvVOtgJzWmUsJojNpFMQQ== + dependencies: + "@types/history" "*" + "@types/react" "*" + "@types/react-stripe-elements@1.1.9": version "1.1.9" resolved "https://registry.npmjs.org/@types/react-stripe-elements/-/react-stripe-elements-1.1.9.tgz#21f951b0c3885584381ad7f87c4b502ecc554765" @@ -5104,6 +5112,14 @@ create-react-class@^15.6.2, create-react-class@^15.6.3: loose-envify "^1.3.1" object-assign "^4.1.1" +create-react-context@^0.2.2: + version "0.2.3" + resolved "https://registry.npmjs.org/create-react-context/-/create-react-context-0.2.3.tgz#9ec140a6914a22ef04b8b09b7771de89567cb6f3" + integrity sha512-CQBmD0+QGgTaxDL3OX1IDXYqjkp2It4RIbcb99jS6AEg27Ga+a9G3JtK6SIu0HBwPLZlmwt9F7UwWA4Bn92Rag== + dependencies: + fbjs "^0.8.0" + gud "^1.0.0" + cross-env@^5.2.0: version "5.2.0" resolved "https://registry.npmjs.org/cross-env/-/cross-env-5.2.0.tgz#6ecd4c015d5773e614039ee529076669b9d126f2" @@ -6781,7 +6797,7 @@ fb-watchman@^2.0.0: dependencies: bser "^2.0.0" -fbjs@^0.8.9: +fbjs@^0.8.0, fbjs@^0.8.9: version "0.8.17" resolved "https://registry.npmjs.org/fbjs/-/fbjs-0.8.17.tgz#c4d598ead6949112653d6588b01a5cdcd9f90fdd" integrity sha1-xNWY6taUkRJlPWWIsBpc3Nn5D90= @@ -7663,6 +7679,11 @@ growly@^1.3.0: resolved "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081" integrity sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE= +gud@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/gud/-/gud-1.0.0.tgz#a489581b17e6a70beca9abe3ae57de7a499852c0" + integrity sha512-zGEOVKFM5sVPPrYs7J5/hYEw2Pof8KCyOwyhG8sAF26mCAeUFAcYPu1mwB7hhpIP29zOIBaDqwuHdLp0jvZXjw== + gulp-cli@^2.0.0: version "2.0.1" resolved "https://registry.npmjs.org/gulp-cli/-/gulp-cli-2.0.1.tgz#7847e220cb3662f2be8a6d572bf14e17be5a994b" @@ -7861,16 +7882,17 @@ highlight.js@^9.0.0, highlight.js@^9.12.0, highlight.js@^9.13.1: resolved "https://registry.npmjs.org/highlight.js/-/highlight.js-9.13.1.tgz#054586d53a6863311168488a0f58d6c505ce641e" integrity sha512-Sc28JNQNDzaH6PORtRLMvif9RSn1mYuOoX3omVjnb0+HbpPygU2ALBI0R/wsiqCb4/fcp07Gdo8g+fhtFrQl6A== -history@^4.7.2: - version "4.7.2" - resolved "https://registry.npmjs.org/history/-/history-4.7.2.tgz#22b5c7f31633c5b8021c7f4a8a954ac139ee8d5b" - integrity sha512-1zkBRWW6XweO0NBcjiphtVJVsIQ+SXF29z9DVkceeaSLVMFXHool+fdCZD4spDCfZJCILPILc3bm7Bc+HRi0nA== +history@^4.8.0-beta.0: + version "4.8.0-beta.0" + resolved "https://registry.npmjs.org/history/-/history-4.8.0-beta.0.tgz#8b48c1354ac290341c0d73dd33c763bd140531f4" + integrity sha512-LDjPtGgAFDO3lZ+bumN67k0R3GWvUBLLgRJpFU2mnJ1w+D5rEbiZC1c37yPla7tx/dUzVfznt5Rmttnz0MvGdA== dependencies: - invariant "^2.2.1" + "@babel/runtime" "^7.1.2" loose-envify "^1.2.0" resolve-pathname "^2.2.0" + tiny-invariant "^1.0.2" + tiny-warning "^1.0.0" value-equal "^0.4.0" - warning "^3.0.0" hmac-drbg@^1.0.0: version "1.0.1" @@ -8297,7 +8319,7 @@ into-stream@^4.0.0: from2 "^2.1.1" p-is-promise "^2.0.0" -invariant@^2.2.1, invariant@^2.2.2, invariant@^2.2.4: +invariant@^2.2.2, invariant@^2.2.4: version "2.2.4" resolved "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== @@ -12505,6 +12527,11 @@ react-inspector@^2.3.0: babel-runtime "^6.26.0" is-dom "^1.0.9" +react-is@^16.5.2: + version "16.7.0" + resolved "https://registry.npmjs.org/react-is/-/react-is-16.7.0.tgz#c1bd21c64f1f1364c6f70695ec02d69392f41bfa" + integrity sha512-Z0VRQdF4NPDoI0tsXVMLkJLiwEBa+RP66g0xDHxgxysxSoCUccSten4RTF/UFvZF1dZvZ9Zu1sx+MDXwcOR34g== + react-is@^16.6.3: version "16.6.3" resolved "https://registry.npmjs.org/react-is/-/react-is-16.6.3.tgz#d2d7462fcfcbe6ec0da56ad69047e47e56e7eac0" @@ -12533,30 +12560,34 @@ react-popper@^0.10.4: popper.js "^1.14.1" prop-types "^15.6.1" -react-router-dom@^4.3.1: - version "4.3.1" - resolved "https://registry.npmjs.org/react-router-dom/-/react-router-dom-4.3.1.tgz#4c2619fc24c4fa87c9fd18f4fb4a43fe63fbd5c6" - integrity sha512-c/MlywfxDdCp7EnB7YfPMOfMD3tOtIjrQlj/CKfNMBxdmpJP8xcz5P/UAFn3JbnQCNUxsHyVVqllF9LhgVyFCA== +react-router-dom@^4.4.0-beta.6: + version "4.4.0-beta.6" + resolved "https://registry.npmjs.org/react-router-dom/-/react-router-dom-4.4.0-beta.6.tgz#0bec50c8a4276a555b5f1159bb94e7b6fbb73699" + integrity sha512-+8N3Z6Ys6NfE6Oge4HbBzyGBWPOtWEAVFKotP2KUdyFsDfhnGgKvSJA+MxRvkTarPG2sBFQiZnyJDawJJyC/qA== dependencies: - history "^4.7.2" - invariant "^2.2.4" + "@babel/runtime" "^7.1.2" + history "^4.8.0-beta.0" loose-envify "^1.3.1" - prop-types "^15.6.1" - react-router "^4.3.1" - warning "^4.0.1" + prop-types "^15.6.2" + react-router "^4.4.0-beta.6" + tiny-invariant "^1.0.2" + tiny-warning "^1.0.0" -react-router@^4.3.1: - version "4.3.1" - resolved "https://registry.npmjs.org/react-router/-/react-router-4.3.1.tgz#aada4aef14c809cb2e686b05cee4742234506c4e" - integrity sha512-yrvL8AogDh2X42Dt9iknk4wF4V8bWREPirFfS9gLU1huk6qK41sg7Z/1S81jjTrGHxa3B8R3J6xIkDAA6CVarg== +react-router@^4.4.0-beta.6: + version "4.4.0-beta.6" + resolved "https://registry.npmjs.org/react-router/-/react-router-4.4.0-beta.6.tgz#37e1d9ce2be93df397cc1feb1dcd6460ea0b236b" + integrity sha512-esR1UHsPpfvehX5Qn7wQrOTFsl4PxiaX3GaYvtFDSEioMsTl0zkASJBm1fXKgR9brUQX9kgiGq6XnCsiJU/82g== dependencies: - history "^4.7.2" + "@babel/runtime" "^7.1.2" + create-react-context "^0.2.2" + history "^4.8.0-beta.0" hoist-non-react-statics "^2.5.0" - invariant "^2.2.4" loose-envify "^1.3.1" path-to-regexp "^1.7.0" - prop-types "^15.6.1" - warning "^4.0.1" + prop-types "^15.6.2" + react-is "^16.5.2" + tiny-invariant "^1.0.2" + tiny-warning "^1.0.0" react-split-pane@^0.1.82: version "0.1.84" @@ -12634,10 +12665,9 @@ react@^16.6.1: prop-types "^15.6.2" scheduler "^0.11.0" -reactstrap@^6.5.0: - version "6.5.0" - resolved "https://registry.npmjs.org/reactstrap/-/reactstrap-6.5.0.tgz#ba655e32646e2621829f61faa033e607ec6624e5" - integrity sha512-dWb3fB/wBAiQloteKlf+j9Nl2VLe6BMZgTEt6hpeTt0t9TwtkeU+2v2NBYONZaF4FZATfMiIKozhWpc2HmLW1g== +"reactstrap@https://registry.npmjs.org/@sqs/reactstrap/-/reactstrap-6.5.0-tmp1.tgz": + version "6.5.0-tmp1" + resolved "https://registry.npmjs.org/@sqs/reactstrap/-/reactstrap-6.5.0-tmp1.tgz#d7bad315bddb1e43bbef00164da77583ec1bd08f" dependencies: classnames "^2.2.3" lodash.isfunction "^3.0.9" @@ -14774,11 +14804,21 @@ timers-ext@^0.1.5: es5-ext "~0.10.46" next-tick "1" +tiny-invariant@^1.0.2: + version "1.0.3" + resolved "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.0.3.tgz#91efaaa0269ccb6271f0296aeedb05fc3e067b7a" + integrity sha512-ytQx8T4DL8PjlX53yYzcIC0WhIZbpR0p1qcYjw2pHu3w6UtgWwFJQ/02cnhOnBBhlFx/edUIfcagCaQSe3KMWg== + tiny-relative-date@^1.3.0: version "1.3.0" resolved "https://registry.npmjs.org/tiny-relative-date/-/tiny-relative-date-1.3.0.tgz#fa08aad501ed730f31cc043181d995c39a935e07" integrity sha512-MOQHpzllWxDCHHaDno30hhLfbouoYlOI8YlMNtvKe1zXbjEVhbcEovQxvZrPvtiYW630GQDoMMarCnjfyfHA+A== +tiny-warning@^1.0.0: + version "1.0.2" + resolved "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.2.tgz#1dfae771ee1a04396bdfde27a3adcebc6b648b28" + integrity sha512-rru86D9CpQRLvsFG5XFdy0KdLAvjdQDyZCsRcuu60WtzFylDM3eAWSxEVz5kzL2Gp544XiUvPbVKtOA/txLi9Q== + tmp@^0.0.33: version "0.0.33" resolved "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" @@ -15685,13 +15725,6 @@ warning@^3.0.0: dependencies: loose-envify "^1.0.0" -warning@^4.0.1: - version "4.0.2" - resolved "https://registry.npmjs.org/warning/-/warning-4.0.2.tgz#aa6876480872116fa3e11d434b0d0d8d91e44607" - integrity sha512-wbTp09q/9C+jJn4KKJfJfoS6VleK/Dti0yqWSm6KMvJ4MRCXFQNapHuJXutJIrWV0Cf4AhTdeIe4qdKHR1+Hug== - dependencies: - loose-envify "^1.0.0" - watch@~0.18.0: version "0.18.0" resolved "https://registry.npmjs.org/watch/-/watch-0.18.0.tgz#28095476c6df7c90c963138990c0a5423eb4b986"