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 `<BrowserRouter>` ignored all context passed from its parent)
This commit is contained in:
Quinn Slack 2018-12-22 01:25:05 -08:00
parent 48930b7c8b
commit eeeda70ffc
11 changed files with 195 additions and 94 deletions

View File

@ -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(<HoverOverlayContainer />, overlayContainerMount)
render(
<TelemetryContext.Provider value={eventLogger}>
<HoverOverlayContainer />
</TelemetryContext.Provider>,
overlayContainerMount
)
return { hoverifier, controllers: { platformContext, extensionsController } }
}
@ -538,18 +544,20 @@ function handleCodeHost(codeHost: CodeHost): Subscription {
const mount = getToolbarMount(codeView)
render(
<CodeViewToolbar
{...info}
platformContext={platformContext}
extensionsController={extensionsController}
buttonProps={
toolbarButtonProps || {
className: '',
style: {},
<TelemetryContext.Provider value={eventLogger}>
<CodeViewToolbar
{...info}
platformContext={platformContext}
extensionsController={extensionsController}
buttonProps={
toolbarButtonProps || {
className: '',
style: {},
}
}
}
location={H.createLocation(window.location)}
/>,
location={H.createLocation(window.location)}
/>
</TelemetryContext.Provider>,
mount
)
}

View File

@ -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(
<ShortcutProvider>
<CommandListPopoverButton
extensionsController={extensionsController}
menu={ContributableMenu.CommandPalette}
platformContext={platformContext}
autoFocus={false}
location={history.location}
/>
<Notifications extensionsController={extensionsController} />
<TelemetryContext.Provider value={eventLogger}>
<CommandListPopoverButton
extensionsController={extensionsController}
menu={ContributableMenu.CommandPalette}
platformContext={platformContext}
autoFocus={false}
location={history.location}
/>
<Notifications extensionsController={extensionsController} />
</TelemetryContext.Provider>
</ShortcutProvider>,
getCommandPaletteMount()
)

View File

@ -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<void> {
@ -67,7 +68,12 @@ function injectServerBanner(): void {
}
container.appendChild(mount)
}
render(<Alerts repoName={repoName} />, mount)
render(
<TelemetryContext.Provider value={eventLogger}>
<Alerts repoName={repoName} />
</TelemetryContext.Provider>,
mount
)
}
/**

View File

@ -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()
}
}

View File

@ -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",

View File

@ -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<Props, State> {
public state: State = { actionOrError: null }
public static contextType = TelemetryContext
public context!: React.ContextType<typeof TelemetryContext>
private commandExecutions = new Subject<ExecuteCommandParams>()
private subscriptions = new Subscription()
@ -192,6 +196,10 @@ export class ActionItem extends React.PureComponent<Props, State> {
public runAction = (e: React.MouseEvent<HTMLElement> | React.KeyboardEvent<HTMLElement>) => {
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 <LinkOrButton>'s default event handler will do what we want (which

View File

@ -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<TelemetryService>(NOOP_TELEMETRY_SERVICE)

View File

@ -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 */
},
}

View File

@ -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<SourcegraphWebAppProps, S
return (
<ShortcutProvider>
<BrowserRouter key={0}>
<Route
path="/"
// tslint:disable-next-line:jsx-no-lambda RouteProps.render is an exception
render={routeComponentProps => (
<Layout
{...props}
{...routeComponentProps}
authenticatedUser={authenticatedUser}
viewerSubject={this.state.viewerSubject}
settingsCascade={this.state.settingsCascade}
// Theme
isLightTheme={this.state.isLightTheme}
onThemeChange={this.onThemeChange}
isMainPage={this.state.isMainPage}
onMainPage={this.onMainPage}
// Search query
navbarSearchQuery={this.state.navbarSearchQuery}
onNavbarQueryChange={this.onNavbarQueryChange}
// Extensions
platformContext={this.state.platformContext}
extensionsController={this.state.extensionsController}
/>
)}
/>
</BrowserRouter>
<Tooltip key={1} />
<Notifications key={2} extensionsController={this.state.extensionsController} />
<TelemetryContext.Provider value={eventLogger}>
<BrowserRouter key={0}>
<Route
path="/"
// tslint:disable-next-line:jsx-no-lambda RouteProps.render is an exception
render={routeComponentProps => (
<Layout
{...props}
{...routeComponentProps}
authenticatedUser={authenticatedUser}
viewerSubject={this.state.viewerSubject}
settingsCascade={this.state.settingsCascade}
// Theme
isLightTheme={this.state.isLightTheme}
onThemeChange={this.onThemeChange}
isMainPage={this.state.isMainPage}
onMainPage={this.onMainPage}
// Search query
navbarSearchQuery={this.state.navbarSearchQuery}
onNavbarQueryChange={this.onNavbarQueryChange}
// Extensions
platformContext={this.state.platformContext}
extensionsController={this.state.extensionsController}
/>
)}
/>
</BrowserRouter>
<Tooltip key={1} />
<Notifications key={2} extensionsController={this.state.extensionsController} />
</TelemetryContext.Provider>
</ShortcutProvider>
)
}

View File

@ -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

107
yarn.lock
View File

@ -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"