From 765884306e2f11508e1be94fe8ea942ccfa9fbc0 Mon Sep 17 00:00:00 2001 From: Felix Becker Date: Wed, 27 Nov 2019 16:20:11 +0100 Subject: [PATCH] More optional chaining (#6891) * More optional chaining * Set target in tsconfig to transpile optional chaining --- .storybook/webpack.config.ts | 2 +- browser/config/webpack/utils.ts | 2 +- browser/src/extension/scripts/inject.tsx | 27 ++++++++++--------- browser/src/libs/github/code_intelligence.ts | 2 +- browser/src/libs/github/dom_functions.ts | 2 +- browser/src/libs/github/file_info.ts | 2 +- lsif/src/server/routes/dumps.ts | 4 +-- shared/src/api/client/context/context.ts | 6 ++--- shared/src/extensions/extension.ts | 2 +- shared/src/extensions/helpers.ts | 7 +---- tsconfig.json | 2 +- .../enterprise/extensions/registry/backend.ts | 14 ++-------- web/src/platform/context.ts | 2 +- web/src/regression/search.test.ts | 2 +- web/src/regression/util/api.ts | 15 +++-------- web/src/repo/backend.ts | 20 +++----------- 16 files changed, 40 insertions(+), 71 deletions(-) diff --git a/.storybook/webpack.config.ts b/.storybook/webpack.config.ts index 445245c8bd6..526b7cd1f50 100644 --- a/.storybook/webpack.config.ts +++ b/.storybook/webpack.config.ts @@ -2,7 +2,7 @@ import path from 'path' import webpack from 'webpack' export default ({ config }: { config: webpack.Configuration }) => { - if (!config.module || !config.resolve || !config.resolve.extensions) { + if (!config.module || !config.resolve?.extensions) { throw new Error('unexpected config') } diff --git a/browser/config/webpack/utils.ts b/browser/config/webpack/utils.ts index 1e7c236d400..949ba5c1cf9 100644 --- a/browser/config/webpack/utils.ts +++ b/browser/config/webpack/utils.ts @@ -7,7 +7,7 @@ import extensionInfo from '../../src/extension/manifest.spec.json' * @returns The current extension version from extension.info.json. */ export function generateBundleUID(): string { - if (!extensionInfo || !extensionInfo.version) { + if (!extensionInfo?.version) { throw new Error('Could not resolve extension version from manifest.') } return extensionInfo.version diff --git a/browser/src/extension/scripts/inject.tsx b/browser/src/extension/scripts/inject.tsx index 69f88156df4..7ef7eb8ee06 100644 --- a/browser/src/extension/scripts/inject.tsx +++ b/browser/src/extension/scripts/inject.tsx @@ -76,22 +76,25 @@ async function main(): Promise { // Add style sheet and wait for it to load to avoid rendering unstyled elements (which causes an // annoying flash/jitter when the stylesheet loads shortly thereafter). - let styleSheet = document.getElementById('ext-style-sheet') as HTMLLinkElement | null - // If does not exist, create - if (!styleSheet) { - styleSheet = document.createElement('link') - styleSheet.id = 'ext-style-sheet' - styleSheet.rel = 'stylesheet' - styleSheet.type = 'text/css' - styleSheet.href = browser.extension.getURL('css/style.bundle.css') - } + const styleSheet = (() => { + let styleSheet = document.getElementById('ext-style-sheet') as HTMLLinkElement | null + // If does not exist, create + if (!styleSheet) { + styleSheet = document.createElement('link') + styleSheet.id = 'ext-style-sheet' + styleSheet.rel = 'stylesheet' + styleSheet.type = 'text/css' + styleSheet.href = browser.extension.getURL('css/style.bundle.css') + } + return styleSheet + })() // If not loaded yet, wait for it to load if (!styleSheet.sheet) { await new Promise(resolve => { - styleSheet!.addEventListener('load', resolve, { once: true }) + styleSheet.addEventListener('load', resolve, { once: true }) // If not appended yet, append to - if (!styleSheet!.parentNode) { - document.head.appendChild(styleSheet!) + if (!styleSheet.parentNode) { + document.head.appendChild(styleSheet) } }) } diff --git a/browser/src/libs/github/code_intelligence.ts b/browser/src/libs/github/code_intelligence.ts index 242d39d0e5f..3939bbd1bbe 100644 --- a/browser/src/libs/github/code_intelligence.ts +++ b/browser/src/libs/github/code_intelligence.ts @@ -147,7 +147,7 @@ export const createFileLineContainerToolbarMount: NonNullable { const getCodeCellFromTarget = (target: HTMLElement): HTMLTableCellElement | null => { const cell = target.closest('td.blob-code') as HTMLTableCellElement // Handle rows with the [ ↕ ] button that expands collapsed unchanged lines - if (!cell || cell.parentElement!.classList.contains('js-expandable-line')) { + if (!cell?.parentElement?.classList.contains('js-expandable-line')) { return null } return cell diff --git a/browser/src/libs/github/file_info.ts b/browser/src/libs/github/file_info.ts index 5d5750d2c93..92d170f34ec 100644 --- a/browser/src/libs/github/file_info.ts +++ b/browser/src/libs/github/file_info.ts @@ -63,7 +63,7 @@ export const resolveSnippetFileInfo = (codeView: HTMLElement): Observable => { const { repository, id } = req.params const dump = await backend.dump(parseInt(id, 10)) - if (!dump || dump.repository !== decodeURIComponent(repository)) { + if (dump?.repository !== decodeURIComponent(repository)) { throw Object.assign(new Error('LSIF dump not found'), { status: 404 }) } @@ -71,7 +71,7 @@ export function createDumpRouter(backend: Backend): express.Router { async (req: express.Request, res: express.Response): Promise => { const { repository, id } = req.params const dump = await backend.dump(parseInt(id, 10)) - if (!dump || dump.repository !== decodeURIComponent(repository)) { + if (dump?.repository !== decodeURIComponent(repository)) { throw Object.assign(new Error('LSIF dump not found'), { status: 404 }) } diff --git a/shared/src/api/client/context/context.ts b/shared/src/api/client/context/context.ts index 56ed8650fa2..d3b118bcdd5 100644 --- a/shared/src/api/client/context/context.ts +++ b/shared/src/api/client/context/context.ts @@ -50,7 +50,7 @@ export function getComputedContextProperty( return !!component } if (key.startsWith('resource.')) { - if (!component || component.type !== 'CodeEditor') { + if (component?.type !== 'CodeEditor') { return null } // TODO(sqs): Define these precisely. If the resource is in a repository, what is the "path"? Is it the @@ -73,7 +73,7 @@ export function getComputedContextProperty( } } if (key.startsWith('component.')) { - if (!component || component.type !== 'CodeEditor') { + if (component?.type !== 'CodeEditor') { return null } const prop = key.slice('component.'.length) @@ -99,7 +99,7 @@ export function getComputedContextProperty( } } if (key.startsWith('panel.activeView.')) { - if (!component || component.type !== 'panelView') { + if (component?.type !== 'panelView') { return null } const prop = key.slice('panel.activeView.'.length) diff --git a/shared/src/extensions/extension.ts b/shared/src/extensions/extension.ts index 995d49682d3..0e2e7843cc6 100644 --- a/shared/src/extensions/extension.ts +++ b/shared/src/extensions/extension.ts @@ -90,7 +90,7 @@ export function extensionIDsFromSettings(settings: SettingsCascadeOrError): stri if (isErrorLike(settings.final)) { throw asError(settings.final) } - if (!settings.final || !settings.final.extensions) { + if (!settings.final?.extensions) { return [] } return Object.keys(settings.final.extensions) diff --git a/shared/src/extensions/helpers.ts b/shared/src/extensions/helpers.ts index fae93924394..b081a5f4134 100644 --- a/shared/src/extensions/helpers.ts +++ b/shared/src/extensions/helpers.ts @@ -65,12 +65,7 @@ export function queryConfiguredRegistryExtensions( }) ).pipe( map(({ data, errors }) => { - if ( - !data || - !data.extensionRegistry || - !data.extensionRegistry.extensions || - !data.extensionRegistry.extensions.nodes - ) { + if (!data?.extensionRegistry?.extensions?.nodes) { throw createAggregateError(errors) } return data.extensionRegistry.extensions.nodes.map( diff --git a/tsconfig.json b/tsconfig.json index 2d525ec9da7..516b40a62a7 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -12,7 +12,7 @@ { "path": "dev/release" }, ], "compilerOptions": { - "target": "esnext", + "target": "es2019", "module": "commonjs", "allowJs": false, "moduleResolution": "node", diff --git a/web/src/enterprise/extensions/registry/backend.ts b/web/src/enterprise/extensions/registry/backend.ts index 595b718264a..9633ba85e1c 100644 --- a/web/src/enterprise/extensions/registry/backend.ts +++ b/web/src/enterprise/extensions/registry/backend.ts @@ -24,12 +24,7 @@ export function deleteRegistryExtensionWithConfirmation(extension: GQL.ID): Obse { extension } ).pipe( map(({ data, errors }) => { - if ( - !data || - !data.extensionRegistry || - !data.extensionRegistry.deleteExtension || - (errors && errors.length > 0) - ) { + if (!data?.extensionRegistry?.deleteExtension || (errors && errors.length > 0)) { throw createAggregateError(errors) } }), @@ -59,12 +54,7 @@ export function queryViewerRegistryPublishers(): Observable { - if ( - !data || - !data.extensionRegistry || - !data.extensionRegistry.viewerPublishers || - (errors && errors.length > 0) - ) { + if (!data?.extensionRegistry?.viewerPublishers || (errors && errors.length > 0)) { throw createAggregateError(errors) } return data.extensionRegistry.viewerPublishers.map(p => ({ diff --git a/web/src/platform/context.ts b/web/src/platform/context.ts index 3cc7150f93b..0675af7a276 100644 --- a/web/src/platform/context.ts +++ b/web/src/platform/context.ts @@ -116,7 +116,7 @@ function fetchViewerSettings(): Observable { ${settingsCascadeFragment} `).pipe( map(({ data, errors }) => { - if (!data || !data.viewerSettings) { + if (!data?.viewerSettings) { throw createAggregateError(errors) } return data.viewerSettings diff --git a/web/src/regression/search.test.ts b/web/src/regression/search.test.ts index eeefd696bd8..7c50e2ff549 100644 --- a/web/src/regression/search.test.ts +++ b/web/src/regression/search.test.ts @@ -299,7 +299,7 @@ describe('Search regression test suite', () => { Array.from(document.querySelectorAll('.e2e-search-result')) .map(el => { const header = el.querySelector('[data-testid="result-container-header"') - if (!header || !header.textContent) { + if (!header?.textContent) { return null } const components = header.textContent.split(/\s/) diff --git a/web/src/regression/util/api.ts b/web/src/regression/util/api.ts index 3d68d4001ef..fddaa900fbd 100644 --- a/web/src/regression/util/api.ts +++ b/web/src/regression/util/api.ts @@ -126,17 +126,10 @@ export function waitForRepo( // and we have no guarantee that all the repositories from that external service // will exist when the add-external-service endpoint returns. tap(({ repository }) => { - if (!repository || !repository.mirrorInfo || !repository.mirrorInfo.cloned) { + if (!repository?.mirrorInfo?.cloned) { throw new CloneInProgressError(repoName) } - if ( - mustBeIndexed && - !( - repository.textSearchIndex && - repository.textSearchIndex.status && - repository.textSearchIndex.status.updatedAt - ) - ) { + if (mustBeIndexed && !repository?.textSearchIndex?.status?.updatedAt) { throw new CloneInProgressError(repoName) } }), @@ -602,7 +595,7 @@ export function createOrganization( mightContainPrivateInfo: false, }).pipe( mergeMap(({ data, errors }) => { - if (!data || !data.createOrganization) { + if (!data?.createOrganization) { eventLogger.log('NewOrgFailed') throw createAggregateError(errors) } @@ -723,7 +716,7 @@ export function addExternalService( mightContainPrivateInfo: true, }).pipe( map(({ data, errors }) => { - if (!data || !data.addExternalService || (errors && errors.length > 0)) { + if (!data?.addExternalService || (errors && errors.length > 0)) { eventLogger.log('AddExternalServiceFailed') throw createAggregateError(errors) } diff --git a/web/src/repo/backend.ts b/web/src/repo/backend.ts index 69418415aaf..cdc99b0c524 100644 --- a/web/src/repo/backend.ts +++ b/web/src/repo/backend.ts @@ -163,13 +163,7 @@ const fetchHighlightedFile = memoizeObservable( ctx ).pipe( map(({ data, errors }) => { - if ( - !data || - !data.repository || - !data.repository.commit || - !data.repository.commit.file || - !data.repository.commit.file.highlight - ) { + if (!data?.repository?.commit?.file?.highlight) { throw createAggregateError(errors) } const file = data.repository.commit.file @@ -221,13 +215,7 @@ export const fetchFileExternalLinks = memoizeObservable( ctx ).pipe( map(({ data, errors }) => { - if ( - !data || - !data.repository || - !data.repository.commit || - !data.repository.commit.file || - !data.repository.commit.file.externalURLs - ) { + if (!data?.repository?.commit?.file?.externalURLs) { throw createAggregateError(errors) } return data.repository.commit.file.externalURLs @@ -260,7 +248,7 @@ export const fetchTree = memoizeObservable( args ).pipe( map(({ data, errors }) => { - if (!data || errors || !data.repository || !data.repository.commit || !data.repository.commit.tree) { + if (errors || !data?.repository?.commit?.tree) { throw createAggregateError(errors) } return data.repository.commit.tree @@ -296,7 +284,7 @@ export const fetchTreeEntries = memoizeObservable( args ).pipe( map(({ data, errors }) => { - if (!data || errors || !data.repository || !data.repository.commit || !data.repository.commit.tree) { + if (errors || !data?.repository?.commit?.tree) { throw createAggregateError(errors) } return data.repository.commit.tree