From 1320ad80160fd8ea19f61214efb9c2b331d5ddf8 Mon Sep 17 00:00:00 2001 From: Felix Becker Date: Sun, 8 Sep 2019 20:22:53 -0700 Subject: [PATCH] Publish native integration to npm (#5382) --- browser/package.json | 1 + browser/scripts/publish-npm.ts | 48 ++++++++ browser/src/extension/scripts/inject.tsx | 8 +- browser/src/globals.d.ts | 7 +- browser/src/integration/integration.tsx | 17 ++- .../code_intelligence/ extensions.test.tsx | 7 +- .../code_intelligence/code_intelligence.tsx | 17 +-- .../src/libs/code_intelligence/extensions.tsx | 6 +- browser/src/libs/code_intelligence/inject.ts | 5 +- browser/src/libs/phabricator/extension.tsx | 24 ++-- browser/src/platform/context.test.tsx | 7 +- browser/src/platform/context.ts | 20 +++- browser/src/platform/extensionHost.ts | 12 +- browser/src/shared/util/context.tsx | 1 + enterprise/dev/ci/ci/pipeline-steps.go | 10 +- package.json | 2 + yarn.lock | 103 +++++++++++++++++- 17 files changed, 242 insertions(+), 53 deletions(-) create mode 100644 browser/scripts/publish-npm.ts diff --git a/browser/package.json b/browser/package.json index 2b252b1443e..ab6a47ce3f1 100644 --- a/browser/package.json +++ b/browser/package.json @@ -13,6 +13,7 @@ "release": "yarn release:chrome", "release:chrome": "webstore upload --auto-publish --source build/bundles/chrome-bundle.zip --extension-id dgjhfomjieaadpoljlnidmbgkdffpack --client-id $GOOGLE_CLIENT_ID --client-secret $GOOGLE_CLIENT_SECRET --refresh-token $GOOGLE_REFRESH_TOKEN", "release:ff": "./scripts/release-ff.sh", + "release:npm": "TS_NODE_COMPILER_OPTIONS=\"{\\\"module\\\":\\\"commonjs\\\"}\" ts-node ./scripts/publish-npm.ts", "lint": "yarn run tslint && yarn run eslint && yarn run stylelint", "tslint": "tslint -t stylish -c tslint.json -p tsconfig.json './**/*.ts?(x)'", "eslint": "eslint '**/*.[jt]s?(x)'", diff --git a/browser/scripts/publish-npm.ts b/browser/scripts/publish-npm.ts new file mode 100644 index 00000000000..a1440daf898 --- /dev/null +++ b/browser/scripts/publish-npm.ts @@ -0,0 +1,48 @@ +import { writeFile } from 'mz/fs' +import latestVersion from 'latest-version' +import signale from 'signale' +import * as semver from 'semver' +import execa from 'execa' + +// Publish the native integration to npm + +async function main(): Promise { + const name = '@sourcegraph/code-host-integration' + // Bump version + let version: string + try { + const currentVersion = await latestVersion(name) + signale.info(`Current version is ${currentVersion}`) + version = semver.inc(currentVersion, 'patch')! + } catch (err) { + if (err && err.name === 'PackageNotFoundError') { + signale.info('Package is not released yet') + version = '0.0.0' + } else { + throw err + } + } + const packageJson = { + name, + version, + license: 'Apache-2.0', + repository: { + type: 'git', + url: 'https://github.com/sourcegraph/sourcegraph', + directory: 'browser', + }, + } + signale.info(`New version is ${packageJson.version}`) + // Write package.json + await writeFile(__dirname + '/../build/integration/package.json', JSON.stringify(packageJson, null, 2)) + if (!process.env.CI) { + signale.warn('Not running in CI, aborting') + return + } + // Publish + await execa('npm', ['publish', '--access', 'public'], { stdio: 'inherit' }) +} +main().catch(err => { + process.exitCode = 1 + console.error(err) +}) diff --git a/browser/src/extension/scripts/inject.tsx b/browser/src/extension/scripts/inject.tsx index b5dab703400..f95be694bf7 100644 --- a/browser/src/extension/scripts/inject.tsx +++ b/browser/src/extension/scripts/inject.tsx @@ -16,7 +16,7 @@ import { NATIVE_INTEGRATION_ACTIVATED, signalBrowserExtensionInstalled, } from '../../libs/sourcegraph/inject' -import { DEFAULT_SOURCEGRAPH_URL } from '../../shared/util/context' +import { DEFAULT_SOURCEGRAPH_URL, DEFAULT_ASSETS_URL } from '../../shared/util/context' import { featureFlags } from '../../shared/util/featureFlags' import { assertEnv } from '../envAssertion' @@ -70,9 +70,9 @@ async function main(): Promise { return } - const sourcegraphServerUrl = items.sourcegraphURL || DEFAULT_SOURCEGRAPH_URL + const sourcegraphURL = items.sourcegraphURL || DEFAULT_SOURCEGRAPH_URL - const isSourcegraphServer = checkIsSourcegraph(sourcegraphServerUrl) + const isSourcegraphServer = checkIsSourcegraph(sourcegraphURL) if (isSourcegraphServer) { signalBrowserExtensionInstalled() return @@ -100,7 +100,7 @@ async function main(): Promise { }) } - subscriptions.add(await injectCodeIntelligence(IS_EXTENSION)) + subscriptions.add(injectCodeIntelligence({ sourcegraphURL, assetsURL: DEFAULT_ASSETS_URL }, IS_EXTENSION)) // Clean up susbscription if the native integration gets activated // later in the lifetime of the content script. diff --git a/browser/src/globals.d.ts b/browser/src/globals.d.ts index eec2775318a..7e550dcc12b 100644 --- a/browser/src/globals.d.ts +++ b/browser/src/globals.d.ts @@ -1,13 +1,14 @@ interface Window { - SOURCEGRAPH_URL: string | undefined + SOURCEGRAPH_URL?: string + SOURCEGRAPH_ASSETS_URL?: string PHABRICATOR_CALLSIGN_MAPPINGS: | { callsign: string path: string }[] | undefined - SOURCEGRAPH_PHABRICATOR_EXTENSION: boolean | undefined - SOURCEGRAPH_INTEGRATION: undefined | 'phabricator-integration' | 'bitbucket-integration' + SOURCEGRAPH_PHABRICATOR_EXTENSION?: boolean + SOURCEGRAPH_INTEGRATION?: 'phabricator-integration' | 'bitbucket-integration' SG_ENV: 'EXTENSION' | 'PAGE' EXTENSION_ENV: 'CONTENT' | 'BACKGROUND' | 'OPTIONS' | null SOURCEGRAPH_BUNDLE_URL: string | undefined // Bundle Sourcegraph URL is set from the Phabricator extension. diff --git a/browser/src/integration/integration.tsx b/browser/src/integration/integration.tsx index e33059cc334..65d6a796bd4 100644 --- a/browser/src/integration/integration.tsx +++ b/browser/src/integration/integration.tsx @@ -14,12 +14,19 @@ setLinkComponent(({ to, children, ...props }) => ( )) -async function init(): Promise { +function init(): void { console.log('Sourcegraph native integration is running') const sourcegraphURL = window.SOURCEGRAPH_URL if (!sourcegraphURL) { throw new Error('window.SOURCEGRAPH_URL is undefined') } + + // Allow the assetsURL to be configurable for code hosts that self-host the integration bundle + let assetsURL = window.SOURCEGRAPH_ASSETS_URL || new URL('/.assets/extension/', sourcegraphURL).href + if (!assetsURL.endsWith('/')) { + assetsURL += '/' + } + if (document.getElementById(EXTENSION_MARKER_ID) !== null) { // If the extension marker already exists, it means the browser extension is currently executing. // Dispatch a custom event to signal that browser extension resources should be cleaned up. @@ -30,15 +37,13 @@ async function init(): Promise { const link = document.createElement('link') link.setAttribute('rel', 'stylesheet') link.setAttribute('type', 'text/css') - link.setAttribute('href', sourcegraphURL + '/.assets/extension/css/style.bundle.css') + link.setAttribute('href', new URL('css/style.bundle.css', assetsURL).href) link.id = 'sourcegraph-styles' document.getElementsByTagName('head')[0].appendChild(link) window.localStorage.setItem('SOURCEGRAPH_URL', sourcegraphURL) window.SOURCEGRAPH_URL = sourcegraphURL // TODO handle subscription - await injectCodeIntelligence(IS_EXTENSION) + injectCodeIntelligence({ sourcegraphURL, assetsURL }, IS_EXTENSION) } -init().catch(err => { - console.error('Error initializing integration', err) -}) +init() diff --git a/browser/src/libs/code_intelligence/ extensions.test.tsx b/browser/src/libs/code_intelligence/ extensions.test.tsx index 17f27344a49..b8c02d4080d 100644 --- a/browser/src/libs/code_intelligence/ extensions.test.tsx +++ b/browser/src/libs/code_intelligence/ extensions.test.tsx @@ -1,4 +1,4 @@ -import { DEFAULT_SOURCEGRAPH_URL } from '../../shared/util/context' +import { DEFAULT_SOURCEGRAPH_URL, DEFAULT_ASSETS_URL } from '../../shared/util/context' import { initializeExtensions } from './extensions' describe('Extensions controller', () => { @@ -9,7 +9,10 @@ describe('Extensions controller', () => { urlToFile: () => '', getContext: () => ({ rawRepoName: 'foo', privateRepository: true }), }, - DEFAULT_SOURCEGRAPH_URL, + { + sourcegraphURL: DEFAULT_SOURCEGRAPH_URL, + assetsURL: DEFAULT_ASSETS_URL, + }, false ) return expect( diff --git a/browser/src/libs/code_intelligence/code_intelligence.tsx b/browser/src/libs/code_intelligence/code_intelligence.tsx index adf7b23d0c7..34ad37d856f 100644 --- a/browser/src/libs/code_intelligence/code_intelligence.tsx +++ b/browser/src/libs/code_intelligence/code_intelligence.tsx @@ -31,7 +31,6 @@ import { mergeMap, observeOn, switchMap, - take, withLatestFrom, tap, } from 'rxjs/operators' @@ -75,7 +74,6 @@ import { createLSPFromExtensions, toTextDocumentIdentifier } from '../../shared/ import { CodeViewToolbar, CodeViewToolbarClassProps } from '../../shared/components/CodeViewToolbar' import { resolveRev, retryWhenCloneInProgressError } from '../../shared/repo/backend' import { EventLogger } from '../../shared/tracking/eventLogger' -import { observeSourcegraphURL } from '../../shared/util/context' import { MutationRecordLike } from '../../shared/util/dom' import { featureFlags } from '../../shared/util/featureFlags' import { bitbucketServerCodeHost } from '../bitbucket/code_intelligence' @@ -96,6 +94,7 @@ import { import { handleTextFields, TextField } from './text_fields' import { resolveRepoNames } from './util/file_info' import { ViewResolver } from './views' +import { SourcegraphIntegrationURLs } from '../../platform/context' registerHighlightContributions() @@ -849,17 +848,19 @@ const SHOW_DEBUG = (): boolean => localStorage.getItem('debug') !== null const CODE_HOSTS: CodeHost[] = [bitbucketServerCodeHost, githubCodeHost, gitlabCodeHost, phabricatorCodeHost] export const determineCodeHost = (): CodeHost | undefined => CODE_HOSTS.find(codeHost => codeHost.check()) -export async function injectCodeIntelligenceToCodeHost( +export function injectCodeIntelligenceToCodeHost( mutations: Observable, codeHost: CodeHost, + { sourcegraphURL, assetsURL }: SourcegraphIntegrationURLs, isExtension: boolean, showGlobalDebug = SHOW_DEBUG() -): Promise { +): Subscription { const subscriptions = new Subscription() - const sourcegraphURL = await observeSourcegraphURL(isExtension) - .pipe(take(1)) - .toPromise() - const { platformContext, extensionsController } = initializeExtensions(codeHost, sourcegraphURL, isExtension) + const { platformContext, extensionsController } = initializeExtensions( + codeHost, + { sourcegraphURL, assetsURL }, + isExtension + ) const telemetryService = new EventLogger(isExtension, platformContext.requestGraphQL) subscriptions.add(extensionsController) subscriptions.add( diff --git a/browser/src/libs/code_intelligence/extensions.tsx b/browser/src/libs/code_intelligence/extensions.tsx index b4fa53f8590..96603656792 100644 --- a/browser/src/libs/code_intelligence/extensions.tsx +++ b/browser/src/libs/code_intelligence/extensions.tsx @@ -23,7 +23,7 @@ import { } from '../../../../shared/src/extensions/controller' import { PlatformContextProps } from '../../../../shared/src/platform/context' import { TelemetryProps } from '../../../../shared/src/telemetry/telemetryService' -import { createPlatformContext } from '../../platform/context' +import { createPlatformContext, SourcegraphIntegrationURLs } from '../../platform/context' import { GlobalDebug } from '../../shared/components/GlobalDebug' import { ShortcutProvider } from '../../shared/components/ShortcutProvider' import { CodeHost } from './code_intelligence' @@ -35,10 +35,10 @@ import { DOMFunctions } from './code_views' */ export function initializeExtensions( { urlToFile, getContext }: Pick, - sourcegraphURL: string, + urls: SourcegraphIntegrationURLs, isExtension: boolean ): PlatformContextProps & ExtensionsControllerProps { - const platformContext = createPlatformContext({ urlToFile, getContext }, sourcegraphURL, isExtension) + const platformContext = createPlatformContext({ urlToFile, getContext }, urls, isExtension) const extensionsController = createExtensionsController(platformContext) return { platformContext, extensionsController } } diff --git a/browser/src/libs/code_intelligence/inject.ts b/browser/src/libs/code_intelligence/inject.ts index b3129fd23c2..0720d7347d9 100644 --- a/browser/src/libs/code_intelligence/inject.ts +++ b/browser/src/libs/code_intelligence/inject.ts @@ -2,6 +2,7 @@ import { Observable, Subscription } from 'rxjs' import { startWith } from 'rxjs/operators' import { MutationRecordLike, observeMutations } from '../../shared/util/dom' import { determineCodeHost, injectCodeIntelligenceToCodeHost } from './code_intelligence' +import { SourcegraphIntegrationURLs } from '../../platform/context' /** * Checks if the current page is a known code host. If it is, @@ -9,7 +10,7 @@ import { determineCodeHost, injectCodeIntelligenceToCodeHost } from './code_inte * * @param isExtension `true` when executing in the browser extension. */ -export async function injectCodeIntelligence(isExtension: boolean): Promise { +export function injectCodeIntelligence(urls: SourcegraphIntegrationURLs, isExtension: boolean): Subscription { const subscriptions = new Subscription() const codeHost = determineCodeHost() if (codeHost) { @@ -18,7 +19,7 @@ export async function injectCodeIntelligence(isExtension: boolean): Promise { ) return } - // Backwards compat: Support Legacy Phabricator extension. Check that the Phabricator integration - // passed the bundle url. Legacy Phabricator extensions inject CSS via the loader.js script - // so we do not need to do this here. - if (!window.SOURCEGRAPH_BUNDLE_URL && !window.localStorage.getItem('SOURCEGRAPH_BUNDLE_URL')) { - injectExtensionMarker() - await injectCodeIntelligence(IS_EXTENSION) - metaClickOverride() - return - } const sourcegraphURL = window.localStorage.getItem('SOURCEGRAPH_URL') || window.SOURCEGRAPH_URL || (await getSourcegraphURLFromConduit()) + const assetsURL = DEFAULT_ASSETS_URL + + // Backwards compat: Support Legacy Phabricator extension. Check that the Phabricator integration + // passed the bundle url. Legacy Phabricator extensions inject CSS via the loader.js script + // so we do not need to do this here. + if (!window.SOURCEGRAPH_BUNDLE_URL && !window.localStorage.getItem('SOURCEGRAPH_BUNDLE_URL')) { + injectExtensionMarker() + injectCodeIntelligence({ sourcegraphURL, assetsURL }, IS_EXTENSION) + metaClickOverride() + return + } + // eslint-disable-next-line require-atomic-updates window.SOURCEGRAPH_URL = sourcegraphURL const css = await getPhabricatorCSS(sourcegraphURL) @@ -56,7 +60,7 @@ async function init(): Promise { window.localStorage.setItem('SOURCEGRAPH_URL', sourcegraphURL) metaClickOverride() injectExtensionMarker() - await injectCodeIntelligence(IS_EXTENSION) + injectCodeIntelligence({ sourcegraphURL, assetsURL }, IS_EXTENSION) } init().catch(err => console.error('Error initializing Phabricator integration', err)) diff --git a/browser/src/platform/context.test.tsx b/browser/src/platform/context.test.tsx index d99b2037ab1..c7e2e71ac12 100644 --- a/browser/src/platform/context.test.tsx +++ b/browser/src/platform/context.test.tsx @@ -1,5 +1,5 @@ import { gql } from '../../../shared/src/graphql/graphql' -import { DEFAULT_SOURCEGRAPH_URL } from '../shared/util/context' +import { DEFAULT_SOURCEGRAPH_URL, DEFAULT_ASSETS_URL } from '../shared/util/context' import { createPlatformContext } from './context' describe('Platform Context', () => { @@ -11,7 +11,10 @@ describe('Platform Context', () => { urlToFile: () => '', getContext: () => ({ rawRepoName: 'foo', privateRepository: true }), }, - DEFAULT_SOURCEGRAPH_URL, + { + sourcegraphURL: DEFAULT_SOURCEGRAPH_URL, + assetsURL: DEFAULT_ASSETS_URL, + }, false ) return expect( diff --git a/browser/src/platform/context.ts b/browser/src/platform/context.ts index 4fa82157906..958a26296f3 100644 --- a/browser/src/platform/context.ts +++ b/browser/src/platform/context.ts @@ -17,12 +17,28 @@ import { DEFAULT_SOURCEGRAPH_URL, observeSourcegraphURL } from '../shared/util/c import { createExtensionHost } from './extensionHost' import { editClientSettings, fetchViewerSettings, mergeCascades, storageSettingsCascade } from './settings' +export interface SourcegraphIntegrationURLs { + /** + * The URL of the configured Sourcegraph instance. Used for extensions, find-references, ... + */ + sourcegraphURL: string + + /** + * The base URL where assets will be fetched from (CSS, extension host + * worker bundle, ...) + * + * This is the sourcegraph URL in most cases, but may be different for + * native code hosts that self-host the integration bundle. + */ + assetsURL: string +} + /** * Creates the {@link PlatformContext} for the browser extension. */ export function createPlatformContext( { urlToFile, getContext }: Pick, - sourcegraphURL: string, + { sourcegraphURL, assetsURL }: SourcegraphIntegrationURLs, isExtension: boolean ): PlatformContext { const updatedViewerSettings = new ReplaySubject>(1) @@ -120,7 +136,7 @@ export function createPlatformContext( forceUpdateTooltip: () => { // TODO(sqs): implement tooltips on the browser extension }, - createExtensionHost: () => createExtensionHost(sourcegraphURL), + createExtensionHost: () => createExtensionHost({ sourcegraphURL, assetsURL }), getScriptURLForExtension: async bundleURL => { if (isInPage) { return bundleURL diff --git a/browser/src/platform/extensionHost.ts b/browser/src/platform/extensionHost.ts index c31ebca4718..30821a5bccc 100644 --- a/browser/src/platform/extensionHost.ts +++ b/browser/src/platform/extensionHost.ts @@ -3,14 +3,18 @@ import { Observable } from 'rxjs' import uuid from 'uuid' import { EndpointPair } from '../../../shared/src/platform/context' import { isInPage } from '../context' +import { SourcegraphIntegrationURLs } from './context' -function createInPageExtensionHost(sourcegraphURL: string): Observable { +function createInPageExtensionHost({ + sourcegraphURL, + assetsURL, +}: SourcegraphIntegrationURLs): Observable { return new Observable(subscriber => { // Create an iframe pointing to extensionHostFrame.html, // which will load the extension host worker, and forward it // the client endpoints. const frame: HTMLIFrameElement = document.createElement('iframe') - frame.setAttribute('src', `${sourcegraphURL}/.assets/extension/extensionHostFrame.html`) + frame.setAttribute('src', new URL('extensionHostFrame.html', assetsURL).href) frame.setAttribute('style', 'display: none;') document.body.append(frame) const clientAPIChannel = new MessageChannel() @@ -65,9 +69,9 @@ function createInPageExtensionHost(sourcegraphURL: string): Observable { +export function createExtensionHost(urls: SourcegraphIntegrationURLs): Observable { if (isInPage) { - return createInPageExtensionHost(sourcegraphURL) + return createInPageExtensionHost(urls) } const id = uuid.v4() return new Observable(subscriber => { diff --git a/browser/src/shared/util/context.tsx b/browser/src/shared/util/context.tsx index fcbda010383..e30d1d39c46 100644 --- a/browser/src/shared/util/context.tsx +++ b/browser/src/shared/util/context.tsx @@ -3,6 +3,7 @@ import { map } from 'rxjs/operators' import { observeStorageKey } from '../../browser/storage' export const DEFAULT_SOURCEGRAPH_URL = 'https://sourcegraph.com' +export const DEFAULT_ASSETS_URL: string = new URL('/.assets/extension/', DEFAULT_SOURCEGRAPH_URL).href export function observeSourcegraphURL(isExtension: boolean): Observable { if (isExtension) { diff --git a/enterprise/dev/ci/ci/pipeline-steps.go b/enterprise/dev/ci/ci/pipeline-steps.go index cb610a5e455..4c53dda6574 100644 --- a/enterprise/dev/ci/ci/pipeline-steps.go +++ b/enterprise/dev/ci/ci/pipeline-steps.go @@ -159,7 +159,6 @@ func addBrowserExtensionReleaseSteps(pipeline *bk.Pipeline) { // Release to the Chrome Webstore pipeline.AddStep(":rocket::chrome:", - bk.Env("FORCE_COLOR", "1"), bk.Cmd("yarn --frozen-lockfile --network-timeout 60000"), bk.Cmd("pushd browser"), bk.Cmd("yarn -s run build"), @@ -168,11 +167,18 @@ func addBrowserExtensionReleaseSteps(pipeline *bk.Pipeline) { // Build and self sign the FF extension and upload it to ... pipeline.AddStep(":rocket::firefox:", - bk.Env("FORCE_COLOR", "1"), bk.Cmd("yarn --frozen-lockfile --network-timeout 60000"), bk.Cmd("pushd browser"), bk.Cmd("yarn release:ff"), bk.Cmd("popd")) + + // Release to npm + pipeline.AddStep(":rocket::npm:", + bk.Cmd("yarn --frozen-lockfile --network-timeout 60000"), + bk.Cmd("pushd browser"), + bk.Cmd("yarn -s run build"), + bk.Cmd("yarn release:npm"), + bk.Cmd("popd")) } // Adds a Buildkite pipeline "Wait". diff --git a/package.json b/package.json index 83d9e49581d..4a696627253 100644 --- a/package.json +++ b/package.json @@ -145,6 +145,7 @@ "cross-env": "^5.2.0", "css-loader": "^3.2.0", "eslint": "^6.3.0", + "execa": "^2.0.4", "fancy-log": "^1.3.3", "get-port": "^5.0.0", "gql2ts": "^1.10.1", @@ -156,6 +157,7 @@ "jsdom": "^15.1.1", "json-schema-ref-parser": "^7.1.0", "json-schema-to-typescript": "^6.1.0", + "latest-version": "^5.1.0", "message-port-polyfill": "^0.2.0", "mini-css-extract-plugin": "^0.8.0", "mkdirp-promise": "^5.0.1", diff --git a/yarn.lock b/yarn.lock index 354d41cffed..42b01b08841 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1619,7 +1619,8 @@ integrity sha512-Te7F1RQJLBH4C8wQ2xz0nPC2vpe13F80V+Yv+c3GySOoh4DcLNN4P5u51Kh4aZPqeS5DJ7CKvHyX2SM/1EBXNg== "@sourcegraph/extension-api-types@link:packages/@sourcegraph/extension-api-types": - version "2.0.0" + version "0.0.0" + uid "" "@sourcegraph/prettierrc@^3.0.1": version "3.0.1" @@ -7440,6 +7441,21 @@ execa@^1.0.0: signal-exit "^3.0.0" strip-eof "^1.0.0" +execa@^2.0.4: + version "2.0.4" + resolved "https://registry.npmjs.org/execa/-/execa-2.0.4.tgz#2f5cc589c81db316628627004ea4e37b93391d8e" + integrity sha512-VcQfhuGD51vQUQtKIq2fjGDLDbL6N1DTQVpYzxZ7LPIXw3HqTuIz6uxRmpV1qf8i31LHf2kjiaGI+GdHwRgbnQ== + dependencies: + cross-spawn "^6.0.5" + get-stream "^5.0.0" + is-stream "^2.0.0" + merge-stream "^2.0.0" + npm-run-path "^3.0.0" + onetime "^5.1.0" + p-finally "^2.0.0" + signal-exit "^3.0.2" + strip-final-newline "^2.0.0" + execall@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/execall/-/execall-2.0.0.tgz#16a06b5fe5099df7d00be5d9c06eecded1663b45" @@ -8310,7 +8326,7 @@ get-stream@^4.0.0, get-stream@^4.1.0: dependencies: pump "^3.0.0" -get-stream@^5.1.0: +get-stream@^5.0.0, get-stream@^5.1.0: version "5.1.0" resolved "https://registry.npmjs.org/get-stream/-/get-stream-5.1.0.tgz#01203cdc92597f9b909067c3e656cc1f4d3c4dc9" integrity sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw== @@ -9892,6 +9908,11 @@ is-stream@^1.0.0, is-stream@^1.0.1, is-stream@^1.1.0: resolved "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= +is-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz#bde9c32680d6fae04129d6ac9d921ce7815f78e3" + integrity sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw== + is-svg@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/is-svg/-/is-svg-3.0.0.tgz#9321dbd29c212e5ca99c4fa9794c714bcafa2f75" @@ -10834,6 +10855,13 @@ latest-version@^3.0.0: dependencies: package-json "^4.0.0" +latest-version@^5.1.0: + version "5.1.0" + resolved "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz#119dfe908fe38d15dfa43ecd13fa12ec8832face" + integrity sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA== + dependencies: + package-json "^6.3.0" + lazy-cache@^0.2.3: version "0.2.7" resolved "https://registry.npmjs.org/lazy-cache/-/lazy-cache-0.2.7.tgz#7feddf2dcb6edb77d11ef1d117ab5ffdf0ab1b65" @@ -11530,6 +11558,11 @@ merge-stream@^1.0.1: dependencies: readable-stream "^2.0.1" +merge-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" + integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== + merge2@^1.2.3: version "1.2.3" resolved "https://registry.npmjs.org/merge2/-/merge2-1.2.3.tgz#7ee99dbd69bb6481689253f018488a1b902b0ed5" @@ -11612,6 +11645,11 @@ mimic-fn@^1.0.0: resolved "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ== +mimic-fn@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + mimic-response@^1.0.0, mimic-response@^1.0.1: version "1.0.1" resolved "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b" @@ -12222,6 +12260,13 @@ npm-run-path@^2.0.0: dependencies: path-key "^2.0.0" +npm-run-path@^3.0.0: + version "3.1.0" + resolved "https://registry.npmjs.org/npm-run-path/-/npm-run-path-3.1.0.tgz#7f91be317f6a466efed3c9f2980ad8a4ee8b0fa5" + integrity sha512-Dbl4A/VfiVGLgQv29URL9xshU8XDY1GeLy+fsaZ1AA8JDSfjvr5P5+pzRbWqRSBxk6/DW7MIh8lTM/PaGnP2kg== + dependencies: + path-key "^3.0.0" + "npmlog@0 || 1 || 2 || 3 || 4", npmlog@^4.0.0, npmlog@^4.0.1, npmlog@^4.0.2, npmlog@^4.1.2: version "4.1.2" resolved "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" @@ -12427,6 +12472,13 @@ onetime@^2.0.0: dependencies: mimic-fn "^1.0.0" +onetime@^5.1.0: + version "5.1.0" + resolved "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz#fff0f3c91617fe62bb50189636e99ac8a6df7be5" + integrity sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q== + dependencies: + mimic-fn "^2.1.0" + ono@^4.0.10: version "4.0.10" resolved "https://registry.npmjs.org/ono/-/ono-4.0.10.tgz#f7f9c6d1b76270a499d8664c95a740d44175134c" @@ -12583,6 +12635,11 @@ p-finally@^1.0.0: resolved "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= +p-finally@^2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/p-finally/-/p-finally-2.0.1.tgz#bd6fcaa9c559a096b680806f4d657b3f0f240561" + integrity sha512-vpm09aKwq6H9phqRQzecoDpD8TmVyGw70qmWlyq5onxY7tqyTTFVvxMykxQSQKILBSFlbXpypIw2T1Ml7+DDtw== + p-is-promise@^1.1.0: version "1.1.0" resolved "http://registry.npmjs.org/p-is-promise/-/p-is-promise-1.1.0.tgz#9c9456989e9f6588017b0434d56097675c3da05e" @@ -12668,6 +12725,16 @@ package-json@^4.0.0: registry-url "^3.0.3" semver "^5.1.0" +package-json@^6.3.0: + version "6.5.0" + resolved "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz#6feedaca35e75725876d0b0e64974697fed145b0" + integrity sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ== + dependencies: + got "^9.6.0" + registry-auth-token "^4.0.0" + registry-url "^5.0.0" + semver "^6.2.0" + pako@~1.0.2, pako@~1.0.5: version "1.0.10" resolved "https://registry.npmjs.org/pako/-/pako-1.0.10.tgz#4328badb5086a426aa90f541977d4955da5c9732" @@ -12839,6 +12906,11 @@ path-key@^2.0.0, path-key@^2.0.1: resolved "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= +path-key@^3.0.0: + version "3.1.0" + resolved "https://registry.npmjs.org/path-key/-/path-key-3.1.0.tgz#99a10d870a803bdd5ee6f0470e58dfcd2f9a54d3" + integrity sha512-8cChqz0RP6SHJkMt48FW0A7+qUOn+OsnOsVtzI59tZ8m+5bCSk7hzwET0pulwOM2YMn9J1efb07KB9l9f30SGg== + path-parse@^1.0.6: version "1.0.6" resolved "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" @@ -13941,7 +14013,7 @@ raw-loader@^2.0.0: loader-utils "^1.1.0" schema-utils "^1.0.0" -rc@^1.0.1, rc@^1.1.6, rc@^1.2.7: +rc@^1.0.1, rc@^1.1.6, rc@^1.2.7, rc@^1.2.8: version "1.2.8" resolved "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== @@ -14623,6 +14695,14 @@ registry-auth-token@^3.0.1: rc "^1.1.6" safe-buffer "^5.0.1" +registry-auth-token@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.0.0.tgz#30e55961eec77379da551ea5c4cf43cbf03522be" + integrity sha512-lpQkHxd9UL6tb3k/aHAVfnVtn+Bcs9ob5InuFLLEDqSqeq+AljB8GZW9xY0x7F+xYwEcjKe07nyoxzEYz6yvkw== + dependencies: + rc "^1.2.8" + safe-buffer "^5.0.1" + registry-url@^3.0.3: version "3.1.0" resolved "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz#3d4ef870f73dde1d77f0cf9a381432444e174942" @@ -14630,6 +14710,13 @@ registry-url@^3.0.3: dependencies: rc "^1.0.1" +registry-url@^5.0.0: + version "5.1.0" + resolved "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz#e98334b50d5434b81136b44ec638d9c2009c5009" + integrity sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw== + dependencies: + rc "^1.2.8" + regjsgen@^0.5.0: version "0.5.0" resolved "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.0.tgz#a7634dc08f89209c2049adda3525711fb97265dd" @@ -15284,7 +15371,7 @@ semver@5.5.0: resolved "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz#dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab" integrity sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA== -semver@^6.0.0, semver@^6.1.0, semver@^6.1.1, semver@^6.1.2: +semver@^6.0.0, semver@^6.1.0, semver@^6.1.1, semver@^6.1.2, semver@^6.2.0: version "6.3.0" resolved "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== @@ -15781,7 +15868,8 @@ source-map@^0.7.2, source-map@^0.7.3: integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ== "sourcegraph@link:packages/sourcegraph-extension-api": - version "23.0.1" + version "0.0.0" + uid "" space-separated-tokens@^1.0.0: version "1.1.2" @@ -16192,6 +16280,11 @@ strip-eof@^1.0.0: resolved "http://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8= +strip-final-newline@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" + integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== + strip-indent@^1.0.1: version "1.0.1" resolved "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz#0c7962a6adefa7bbd4ac366460a638552ae1a0a2"