diff --git a/src/tsconfig.strictNullChecks.json b/src/tsconfig.strictNullChecks.json index 47bbea67df0..766b4d9b2eb 100644 --- a/src/tsconfig.strictNullChecks.json +++ b/src/tsconfig.strictNullChecks.json @@ -50,6 +50,7 @@ "./vs/base/node/id.ts", "./vs/base/node/paths.ts", "./vs/base/node/ports.ts", + "./vs/base/node/processes.ts", "./vs/base/node/proxy.ts", "./vs/base/node/request.ts", "./vs/base/node/stats.ts", @@ -62,6 +63,8 @@ "./vs/base/parts/ipc/test/node/testService.ts", "./vs/base/parts/quickopen/common/quickOpen.ts", "./vs/base/test/common/utils.ts", + "./vs/base/test/node/processes/fixtures/fork.ts", + "./vs/base/test/node/processes/fixtures/fork_large.ts", "./vs/base/test/node/uri.test.perf.ts", "./vs/base/worker/defaultWorkerFactory.ts", "./vs/base/worker/workerMain.ts", @@ -240,6 +243,7 @@ "./vs/editor/contrib/comment/comment.ts", "./vs/editor/contrib/comment/lineCommentCommand.ts", "./vs/editor/contrib/cursorUndo/cursorUndo.ts", + "./vs/editor/contrib/dnd/dnd.ts", "./vs/editor/contrib/dnd/dragAndDropCommand.ts", "./vs/editor/contrib/find/findDecorations.ts", "./vs/editor/contrib/find/findModel.ts", @@ -273,10 +277,12 @@ "./vs/editor/contrib/linesOperations/sortLinesCommand.ts", "./vs/editor/contrib/links/getLinks.ts", "./vs/editor/contrib/links/links.ts", + "./vs/editor/contrib/markdown/markdownRenderer.ts", "./vs/editor/contrib/message/messageController.ts", "./vs/editor/contrib/parameterHints/provideSignatureHelp.ts", "./vs/editor/contrib/quickOpen/quickOpen.ts", "./vs/editor/contrib/referenceSearch/referencesModel.ts", + "./vs/editor/contrib/rename/renameInputField.ts", "./vs/editor/contrib/smartSelect/tokenTree.ts", "./vs/editor/contrib/snippet/snippetParser.ts", "./vs/editor/contrib/suggest/suggest.ts", @@ -284,8 +290,10 @@ "./vs/editor/contrib/suggest/wordDistance.ts", "./vs/editor/contrib/toggleTabFocusMode/toggleTabFocusMode.ts", "./vs/editor/contrib/wordHighlighter/wordHighlighter.ts", + "./vs/editor/contrib/wordOperations/test/wordTestUtils.ts", "./vs/editor/contrib/wordOperations/wordOperations.ts", "./vs/editor/contrib/wordPartOperations/wordPartOperations.ts", + "./vs/editor/contrib/zoneWidget/zoneWidget.ts", "./vs/editor/editor.worker.ts", "./vs/editor/standalone/browser/colorizer.ts", "./vs/editor/standalone/browser/iPadShowKeyboard/iPadShowKeyboard.ts", @@ -300,6 +308,7 @@ "./vs/editor/standalone/common/themes.ts", "./vs/editor/test/browser/controller/imeTester.ts", "./vs/editor/test/browser/editorTestServices.ts", + "./vs/editor/test/browser/testCodeEditor.ts", "./vs/editor/test/browser/view/minimapFontCreator.ts", "./vs/editor/test/common/commentMode.ts", "./vs/editor/test/common/core/viewLineToken.ts", @@ -389,6 +398,7 @@ "./vs/platform/state/common/state.ts", "./vs/platform/statusbar/common/statusbar.ts", "./vs/platform/storage/common/storage.ts", + "./vs/platform/storage/common/storageLegacyService.ts", "./vs/platform/telemetry/browser/errorTelemetry.ts", "./vs/platform/telemetry/common/telemetry.ts", "./vs/platform/telemetry/common/telemetryService.ts", diff --git a/src/vs/base/node/processes.ts b/src/vs/base/node/processes.ts index 9274e0947a0..0bd5e672334 100644 --- a/src/vs/base/node/processes.ts +++ b/src/vs/base/node/processes.ts @@ -76,9 +76,9 @@ export abstract class AbstractProcess { private options: CommandOptions | ForkOptions; protected shell: boolean; - private childProcess: cp.ChildProcess; - protected childProcessPromise: TPromise; - private pidResolve: TValueCallback; + private childProcess: cp.ChildProcess | null; + protected childProcessPromise: TPromise | null; + private pidResolve?: TValueCallback; protected terminateRequested: boolean; private static WellKnowCommands: IStringDictionary = { @@ -103,7 +103,7 @@ export abstract class AbstractProcess { }; public constructor(executable: Executable); - public constructor(cmd: string, args: string[], shell: boolean, options: CommandOptions); + public constructor(cmd: string, args: string[] | undefined, shell: boolean, options: CommandOptions | undefined); public constructor(arg1: string | Executable, arg2?: string[], arg3?: boolean, arg4?: CommandOptions) { if (arg2 !== void 0 && arg3 !== void 0 && arg4 !== void 0) { this.cmd = arg1; @@ -124,10 +124,10 @@ export abstract class AbstractProcess { if (this.options.env) { let newEnv: IStringDictionary = Object.create(null); Object.keys(process.env).forEach((key) => { - newEnv[key] = process.env[key]; + newEnv[key] = process.env[key]!; }); Object.keys(this.options.env).forEach((key) => { - newEnv[key] = this.options.env[key]; + newEnv[key] = this.options.env![key]!; }); this.options.env = newEnv; } @@ -146,7 +146,7 @@ export abstract class AbstractProcess { } public start(pp: TProgressCallback): TPromise { - if (Platform.isWindows && ((this.options && this.options.cwd && TPath.isUNC(this.options.cwd)) || !this.options && !this.options.cwd && TPath.isUNC(process.cwd()))) { + if (Platform.isWindows && ((this.options && this.options.cwd && TPath.isUNC(this.options.cwd)) || !this.options && TPath.isUNC(process.cwd()))) { return TPromise.wrapError(new Error(nls.localize('TaskRunner.UNC', 'Can\'t execute a shell command on a UNC drive.'))); } return this.useExec().then((useExec) => { @@ -175,7 +175,7 @@ export abstract class AbstractProcess { } }); } else { - let childProcess: cp.ChildProcess = null; + let childProcess: cp.ChildProcess | null = null; let closeHandler = (data: any) => { this.childProcess = null; this.childProcessPromise = null; @@ -239,7 +239,7 @@ export abstract class AbstractProcess { }); if (childProcess.pid) { this.childProcess.on('close', closeHandler); - this.handleSpawn(childProcess, cc, pp, ee, true); + this.handleSpawn(childProcess, cc!, pp, ee!, true); } } } @@ -247,7 +247,7 @@ export abstract class AbstractProcess { }); } - protected abstract handleExec(cc: TValueCallback, pp: TProgressCallback, error: Error, stdout: Buffer, stderr: Buffer): void; + protected abstract handleExec(cc: TValueCallback, pp: TProgressCallback, error: Error | null, stdout: Buffer, stderr: Buffer): void; protected abstract handleSpawn(childProcess: cp.ChildProcess, cc: TValueCallback, pp: TProgressCallback, ee: ErrorCallback, sync: boolean): void; protected handleClose(data: any, cc: TValueCallback, pp: TProgressCallback, ee: ErrorCallback): void { diff --git a/src/vs/editor/contrib/dnd/dnd.ts b/src/vs/editor/contrib/dnd/dnd.ts index 51951f45c4b..caa3ea75fd4 100644 --- a/src/vs/editor/contrib/dnd/dnd.ts +++ b/src/vs/editor/contrib/dnd/dnd.ts @@ -34,7 +34,7 @@ export class DragAndDropController implements editorCommon.IEditorContribution { private _editor: ICodeEditor; private _toUnhook: IDisposable[]; - private _dragSelection: Selection; + private _dragSelection: Selection | null; private _dndDecorationIds: string[]; private _mouseDown: boolean; private _modiferPressed: boolean; @@ -115,7 +115,8 @@ export class DragAndDropController implements editorCommon.IEditorContribution { let target = mouseEvent.target; if (this._dragSelection === null) { - let possibleSelections = this._editor.getSelections().filter(selection => selection.containsPosition(target.position)); + const selections = this._editor.getSelections() || []; + let possibleSelections = selections.filter(selection => target.position && selection.containsPosition(target.position)); if (possibleSelections.length === 1) { this._dragSelection = possibleSelections[0]; } else { @@ -133,10 +134,12 @@ export class DragAndDropController implements editorCommon.IEditorContribution { }); } - if (this._dragSelection.containsPosition(target.position)) { - this._removeDecoration(); - } else { - this.showAt(target.position); + if (target.position) { + if (this._dragSelection.containsPosition(target.position)) { + this._removeDecoration(); + } else { + this.showAt(target.position); + } } } @@ -148,10 +151,12 @@ export class DragAndDropController implements editorCommon.IEditorContribution { let newSelections: Selection[] | null = null; if (mouseEvent.event.shiftKey) { let primarySelection = this._editor.getSelection(); - let { selectionStartLineNumber, selectionStartColumn } = primarySelection; - newSelections = [new Selection(selectionStartLineNumber, selectionStartColumn, newCursorPosition.lineNumber, newCursorPosition.column)]; + if (primarySelection) { + const { selectionStartLineNumber, selectionStartColumn } = primarySelection; + newSelections = [new Selection(selectionStartLineNumber, selectionStartColumn, newCursorPosition.lineNumber, newCursorPosition.column)]; + } } else { - newSelections = this._editor.getSelections().map(selection => { + newSelections = (this._editor.getSelections() || []).map(selection => { if (selection.containsPosition(newCursorPosition)) { return new Selection(newCursorPosition.lineNumber, newCursorPosition.column, newCursorPosition.lineNumber, newCursorPosition.column); } else { @@ -160,7 +165,7 @@ export class DragAndDropController implements editorCommon.IEditorContribution { }); } // Use `mouse` as the source instead of `api`. - (this._editor).setSelections(newSelections, 'mouse'); + (this._editor).setSelections(newSelections || [], 'mouse'); } else if (!this._dragSelection.containsPosition(newCursorPosition) || ( ( diff --git a/src/vs/editor/contrib/markdown/markdownRenderer.ts b/src/vs/editor/contrib/markdown/markdownRenderer.ts index 561d886ea12..b9f7970cbce 100644 --- a/src/vs/editor/contrib/markdown/markdownRenderer.ts +++ b/src/vs/editor/contrib/markdown/markdownRenderer.ts @@ -38,16 +38,22 @@ export class MarkdownRenderer { // In markdown, // it is possible that we stumble upon language aliases (e.g.js instead of javascript) // it is possible no alias is given in which case we fall back to the current editor lang - const modeId = languageAlias - ? this._modeService.getModeIdForLanguageName(languageAlias) - : this._editor.getModel().getLanguageIdentifier().language; + let modeId: string | null = null; + if (languageAlias) { + modeId = this._modeService.getModeIdForLanguageName(languageAlias); + } else { + const model = this._editor.getModel(); + if (model) { + modeId = model.getLanguageIdentifier().language; + } + } - return this._modeService.getOrCreateMode(modeId).then(_ => { - const promise = TokenizationRegistry.getPromise(modeId); + return this._modeService.getOrCreateMode(modeId || '').then(_ => { + const promise = TokenizationRegistry.getPromise(modeId || ''); if (promise) { return promise.then(support => tokenizeToString(value, support)); } - return tokenizeToString(value, null); + return tokenizeToString(value, undefined); }).then(code => { return `${code}`; }); @@ -55,13 +61,13 @@ export class MarkdownRenderer { codeBlockRenderCallback: () => this._onDidRenderCodeBlock.fire(), actionHandler: { callback: (content) => { - let uri: URI; + let uri: URI | undefined; try { uri = URI.parse(content); - } catch (err) { + } catch { // ignore } - if (uri) { + if (uri && this._openerService) { this._openerService.open(uri).catch(onUnexpectedError); } }, diff --git a/src/vs/editor/contrib/rename/renameInputField.ts b/src/vs/editor/contrib/rename/renameInputField.ts index 91fbe9737de..5c60267db08 100644 --- a/src/vs/editor/contrib/rename/renameInputField.ts +++ b/src/vs/editor/contrib/rename/renameInputField.ts @@ -99,14 +99,14 @@ export default class RenameInputField implements IContentWidget, IDisposable { this._inputField.style.fontSize = `${fontInfo.fontSize}px`; } - public getPosition(): IContentWidgetPosition { + public getPosition(): IContentWidgetPosition | null { return this._visible ? { position: this._position, preference: [ContentWidgetPositionPreference.BELOW, ContentWidgetPositionPreference.ABOVE] } : null; } - private _currentAcceptInput: () => void = null; - private _currentCancelInput: (focusEditor) => void = null; + private _currentAcceptInput: (() => void) | null = null; + private _currentCancelInput: ((focusEditor) => void) | null = null; public acceptInput(): void { if (this._currentAcceptInput) { @@ -158,7 +158,8 @@ export default class RenameInputField implements IContentWidget, IDisposable { }; let onCursorChanged = () => { - if (!Range.containsPosition(where, this._editor.getPosition())) { + const editorPosition = this._editor.getPosition(); + if (!editorPosition || !Range.containsPosition(where, editorPosition)) { this.cancelInput(true); } }; @@ -185,8 +186,8 @@ export default class RenameInputField implements IContentWidget, IDisposable { setTimeout(() => { this._inputField.focus(); this._inputField.setSelectionRange( - parseInt(this._inputField.getAttribute('selectionStart')), - parseInt(this._inputField.getAttribute('selectionEnd'))); + parseInt(this._inputField.getAttribute('selectionStart')!), + parseInt(this._inputField.getAttribute('selectionEnd')!)); }, 100); } diff --git a/src/vs/editor/contrib/zoneWidget/zoneWidget.ts b/src/vs/editor/contrib/zoneWidget/zoneWidget.ts index 7990d5453dd..60905e0d2fa 100644 --- a/src/vs/editor/contrib/zoneWidget/zoneWidget.ts +++ b/src/vs/editor/contrib/zoneWidget/zoneWidget.ts @@ -98,7 +98,7 @@ export class OverlayWidgetDelegate implements IOverlayWidget { return this._domNode; } - public getPosition(): IOverlayWidgetPosition { + public getPosition(): IOverlayWidgetPosition | null { return null; } } @@ -160,11 +160,11 @@ class Arrow { export abstract class ZoneWidget implements IHorizontalSashLayoutProvider { private _arrow: Arrow; - private _overlayWidget: OverlayWidgetDelegate; + private _overlayWidget: OverlayWidgetDelegate | null; private _resizeSash: Sash; private _positionMarkerId: string[] = []; - protected _viewZone: ViewZoneDelegate; + protected _viewZone: ViewZoneDelegate | null; protected _disposables: IDisposable[] = []; public container: HTMLElement; @@ -202,7 +202,9 @@ export abstract class ZoneWidget implements IHorizontalSashLayoutProvider { if (this._viewZone) { this.editor.changeViewZones(accessor => { - accessor.removeZone(this._viewZone.id); + if (this._viewZone) { + accessor.removeZone(this._viewZone.id); + } this._viewZone = null; }); } @@ -214,7 +216,9 @@ export abstract class ZoneWidget implements IHorizontalSashLayoutProvider { public create(): void { dom.addClass(this.domNode, 'zone-widget'); - dom.addClass(this.domNode, this.options.className); + if (this.options.className) { + dom.addClass(this.domNode, this.options.className); + } this.container = document.createElement('div'); dom.addClass(this.container, 'zone-widget-container'); @@ -239,12 +243,12 @@ export abstract class ZoneWidget implements IHorizontalSashLayoutProvider { } protected _applyStyles(): void { - if (this.container) { + if (this.container && this.options.frameColor) { let frameColor = this.options.frameColor.toString(); this.container.style.borderTopColor = frameColor; this.container.style.borderBottomColor = frameColor; } - if (this._arrow) { + if (this._arrow && this.options.arrowColor) { let arrowColor = this.options.arrowColor.toString(); this._arrow.color = arrowColor; } @@ -277,12 +281,18 @@ export abstract class ZoneWidget implements IHorizontalSashLayoutProvider { this._resizeSash.layout(); } - public get position(): Position { + public get position(): Position | undefined { const [id] = this._positionMarkerId; if (!id) { return undefined; } - const range = this.editor.getModel().getDecorationRange(id); + + const model = this.editor.getModel(); + if (!model) { + return undefined; + } + + const range = model.getDecorationRange(id); if (!range) { return undefined; } @@ -305,7 +315,9 @@ export abstract class ZoneWidget implements IHorizontalSashLayoutProvider { public hide(): void { if (this._viewZone) { this.editor.changeViewZones(accessor => { - accessor.removeZone(this._viewZone.id); + if (this._viewZone) { + accessor.removeZone(this._viewZone.id); + } }); this._viewZone = null; } @@ -413,9 +425,12 @@ export abstract class ZoneWidget implements IHorizontalSashLayoutProvider { this.editor.setSelection(where); } - // Reveal the line above or below the zone widget, to get the zone widget in the viewport - const revealLineNumber = Math.min(this.editor.getModel().getLineCount(), Math.max(1, where.endLineNumber + 1)); - this.revealLine(revealLineNumber); + const model = this.editor.getModel(); + if (model) { + // Reveal the line above or below the zone widget, to get the zone widget in the viewport + const revealLineNumber = Math.min(model.getLineCount(), Math.max(1, where.endLineNumber + 1)); + this.revealLine(revealLineNumber); + } } protected revealLine(lineNumber: number) { @@ -442,10 +457,12 @@ export abstract class ZoneWidget implements IHorizontalSashLayoutProvider { } protected _relayout(newHeightInLines: number): void { - if (this._viewZone.heightInLines !== newHeightInLines) { + if (this._viewZone && this._viewZone.heightInLines !== newHeightInLines) { this.editor.changeViewZones(accessor => { - this._viewZone.heightInLines = newHeightInLines; - accessor.layoutZone(this._viewZone.id); + if (this._viewZone) { + this._viewZone.heightInLines = newHeightInLines; + accessor.layoutZone(this._viewZone.id); + } }); } } @@ -460,7 +477,7 @@ export abstract class ZoneWidget implements IHorizontalSashLayoutProvider { this._resizeSash.state = SashState.Disabled; } - let data: { startY: number; heightInLines: number; }; + let data: { startY: number; heightInLines: number; } | undefined; this._disposables.push(this._resizeSash.onDidStart((e: ISashEvent) => { if (this._viewZone) { data = { @@ -492,7 +509,7 @@ export abstract class ZoneWidget implements IHorizontalSashLayoutProvider { } getHorizontalSashTop() { - return parseInt(this.domNode.style.height) - (this._decoratingElementsHeight() / 2); + return (this.domNode.style.height === null ? 0 : parseInt(this.domNode.style.height)) - (this._decoratingElementsHeight() / 2); } getHorizontalSashWidth() { diff --git a/src/vs/editor/test/browser/testCodeEditor.ts b/src/vs/editor/test/browser/testCodeEditor.ts index 7422b8f6ae5..55f94508eda 100644 --- a/src/vs/editor/test/browser/testCodeEditor.ts +++ b/src/vs/editor/test/browser/testCodeEditor.ts @@ -34,13 +34,13 @@ export class TestCodeEditor extends CodeEditorWidget implements editorBrowser.IC } protected _createView(viewModel: ViewModel, cursor: Cursor): [View, boolean] { // Never create a view - return [null, false]; + return [null! as View, false]; } //#endregion //#region Testing utils - public getCursor(): Cursor { - return this._modelData.cursor; + public getCursor(): Cursor | undefined { + return this._modelData ? this._modelData.cursor : undefined; } public registerAndInstantiateContribution(ctor: any): T { let r = this._instantiationService.createInstance(ctor, this); @@ -60,7 +60,7 @@ class TestEditorDomElement { setAttribute(attr: string, value: string): void { } removeAttribute(attr: string): void { } hasAttribute(attr: string): boolean { return false; } - getAttribute(attr: string): string { return undefined; } + getAttribute(attr: string): string | undefined { return undefined; } addEventListener(event: string): void { } removeEventListener(event: string): void { } } @@ -73,7 +73,7 @@ export interface TestCodeEditorCreationOptions extends editorOptions.IEditorOpti serviceCollection?: ServiceCollection; } -export function withTestCodeEditor(text: string | string[], options: TestCodeEditorCreationOptions, callback: (editor: TestCodeEditor, cursor: Cursor) => void): void { +export function withTestCodeEditor(text: string | string[], options: TestCodeEditorCreationOptions, callback: (editor: TestCodeEditor, cursor: Cursor | undefined) => void): void { // create a model if necessary and remember it in order to dispose it. if (!options.model) { if (typeof text === 'string') { diff --git a/src/vs/platform/markers/common/markerService.ts b/src/vs/platform/markers/common/markerService.ts index 929a53ebebd..0453c12fde7 100644 --- a/src/vs/platform/markers/common/markerService.ts +++ b/src/vs/platform/markers/common/markerService.ts @@ -17,7 +17,7 @@ interface MapMap { namespace MapMap { - export function get(map: MapMap, key1: string, key2: string): V { + export function get(map: MapMap, key1: string, key2: string): V | undefined { if (map[key1]) { return map[key1][key2]; } @@ -144,7 +144,7 @@ export class MarkerService implements IMarkerService { remove(owner: string, resources: URI[]): void { if (!isFalsyOrEmpty(resources)) { for (const resource of resources) { - this.changeOne(owner, resource, undefined); + this.changeOne(owner, resource, []); } } } @@ -177,7 +177,7 @@ export class MarkerService implements IMarkerService { } } - private static _toMarker(owner: string, resource: URI, data: IMarkerData): IMarker { + private static _toMarker(owner: string, resource: URI, data: IMarkerData): IMarker | undefined { let { code, severity, message, source, diff --git a/src/vs/platform/storage/common/storageLegacyService.ts b/src/vs/platform/storage/common/storageLegacyService.ts index bdb709fc682..b2a6a795533 100644 --- a/src/vs/platform/storage/common/storageLegacyService.ts +++ b/src/vs/platform/storage/common/storageLegacyService.ts @@ -12,9 +12,9 @@ import { createDecorator } from 'vs/platform/instantiation/common/instantiation' // Browser localStorage interface export interface IStorageLegacy { length: number; - key(index: number): string; + key(index: number): string | null; setItem(key: string, value: any): void; - getItem(key: string): string; + getItem(key: string): string | null; removeItem(key: string): void; } @@ -94,7 +94,7 @@ export class StorageLegacyService implements IStorageLegacyService { private _globalStorage: IStorageLegacy; private workspaceKey: string; - private _workspaceId: string; + private _workspaceId: string | undefined; constructor( globalStorage: IStorageLegacy, @@ -108,11 +108,11 @@ export class StorageLegacyService implements IStorageLegacyService { this.setWorkspaceId(workspaceId, legacyWorkspaceId); } - get workspaceId(): string { + get workspaceId(): string | undefined { return this._workspaceId; } - setWorkspaceId(workspaceId: string, legacyWorkspaceId?: number): void { + setWorkspaceId(workspaceId: string | undefined, legacyWorkspaceId?: number): void { this._workspaceId = workspaceId; // Calculate workspace storage key @@ -163,7 +163,7 @@ export class StorageLegacyService implements IStorageLegacyService { for (let i = 0; i < length; i++) { const key = this._workspaceStorage.key(i); - if (key.indexOf(StorageLegacyService.WORKSPACE_PREFIX) < 0) { + if (!key || key.indexOf(StorageLegacyService.WORKSPACE_PREFIX) < 0) { continue; // ignore stored things that don't belong to storage service or are defined globally } @@ -214,7 +214,7 @@ export class StorageLegacyService implements IStorageLegacyService { return value; } - getInteger(key: string, scope = StorageLegacyScope.GLOBAL, defaultValue?: number): number { + getInteger(key: string, scope = StorageLegacyScope.GLOBAL, defaultValue: number = 0): number { const value = this.get(key, scope, defaultValue); if (types.isUndefinedOrNull(value)) { @@ -224,7 +224,7 @@ export class StorageLegacyService implements IStorageLegacyService { return parseInt(value, 10); } - getBoolean(key: string, scope = StorageLegacyScope.GLOBAL, defaultValue?: boolean): boolean { + getBoolean(key: string, scope = StorageLegacyScope.GLOBAL, defaultValue: boolean = false): boolean { const value = this.get(key, scope, defaultValue); if (types.isUndefinedOrNull(value)) { @@ -266,7 +266,7 @@ export class InMemoryLocalStorage implements IStorageLegacy { return Object.keys(this.store).length; } - key(index: number): string { + key(index: number): string | null { const keys = Object.keys(this.store); if (keys.length > index) { return keys[index]; @@ -279,7 +279,7 @@ export class InMemoryLocalStorage implements IStorageLegacy { this.store[key] = value.toString(); } - getItem(key: string): string { + getItem(key: string): string | null { const item = this.store[key]; if (!types.isUndefinedOrNull(item)) { return item;