From 0bbf9de963724c9cf918ac0541796e2ca374cccd Mon Sep 17 00:00:00 2001 From: Hardikkumar Nai <80053762+hardiknai-techm@users.noreply.github.com> Date: Thu, 15 Jul 2021 19:23:07 +0530 Subject: [PATCH 1/4] Resolve ESLint Errors (#934) --- .eslintignore | 4 -- src/Explorer/ContextMenuButtonFactory.tsx | 2 +- src/Explorer/Tree/Collection.ts | 4 +- src/Explorer/Tree/UserDefinedFunction.ts | 6 ++- src/GitHub/GitHubContentProvider.test.ts | 52 ++++++++++--------- src/GitHub/GitHubContentProvider.ts | 22 ++++---- .../Helpers/ConnectionStringParser.test.ts | 4 +- 7 files changed, 47 insertions(+), 47 deletions(-) diff --git a/.eslintignore b/.eslintignore index cd598d58b..15d8762b6 100644 --- a/.eslintignore +++ b/.eslintignore @@ -143,19 +143,15 @@ src/Explorer/Tree/ResourceTokenCollection.ts src/Explorer/Tree/StoredProcedure.ts src/Explorer/Tree/TreeComponents.ts src/Explorer/Tree/Trigger.ts -src/Explorer/Tree/UserDefinedFunction.ts src/Explorer/WaitsForTemplateViewModel.ts src/GitHub/GitHubClient.test.ts src/GitHub/GitHubClient.ts src/GitHub/GitHubConnector.ts -src/GitHub/GitHubContentProvider.test.ts -src/GitHub/GitHubContentProvider.ts src/GitHub/GitHubOAuthService.ts src/Index.ts src/Juno/JunoClient.test.ts src/Juno/JunoClient.ts src/Platform/Hosted/Authorization.ts -src/Platform/Hosted/Helpers/ConnectionStringParser.test.ts src/ReactDevTools.ts src/Shared/Constants.ts src/Shared/DefaultExperienceUtility.test.ts diff --git a/src/Explorer/ContextMenuButtonFactory.tsx b/src/Explorer/ContextMenuButtonFactory.tsx index ece39b07d..70d02e5aa 100644 --- a/src/Explorer/ContextMenuButtonFactory.tsx +++ b/src/Explorer/ContextMenuButtonFactory.tsx @@ -109,7 +109,7 @@ export const createCollectionContextMenuButton = ( iconSrc: AddUdfIcon, onClick: () => { const selectedCollection: ViewModels.Collection = useSelectedNode.getState().findSelectedCollection(); - selectedCollection && selectedCollection.onNewUserDefinedFunctionClick(selectedCollection, undefined); + selectedCollection && selectedCollection.onNewUserDefinedFunctionClick(selectedCollection); }, label: "New UDF", }); diff --git a/src/Explorer/Tree/Collection.ts b/src/Explorer/Tree/Collection.ts index d2ceb8deb..c486da03e 100644 --- a/src/Explorer/Tree/Collection.ts +++ b/src/Explorer/Tree/Collection.ts @@ -744,8 +744,8 @@ export default class Collection implements ViewModels.Collection { StoredProcedure.create(source, event); } - public onNewUserDefinedFunctionClick(source: ViewModels.Collection, event: MouseEvent) { - UserDefinedFunction.create(source, event); + public onNewUserDefinedFunctionClick(source: ViewModels.Collection) { + UserDefinedFunction.create(source); } public onNewTriggerClick(source: ViewModels.Collection, event: MouseEvent) { diff --git a/src/Explorer/Tree/UserDefinedFunction.ts b/src/Explorer/Tree/UserDefinedFunction.ts index 2d2b64889..4264c0954 100644 --- a/src/Explorer/Tree/UserDefinedFunction.ts +++ b/src/Explorer/Tree/UserDefinedFunction.ts @@ -30,7 +30,7 @@ export default class UserDefinedFunction { this.body = ko.observable(data.body as string); } - public static create(source: ViewModels.Collection, event: MouseEvent) { + public static create(source: ViewModels.Collection) { const id = useTabs.getState().getTabs(ViewModels.CollectionTabKind.UserDefinedFunctions).length + 1; const userDefinedFunction = { id: "", @@ -104,7 +104,9 @@ export default class UserDefinedFunction { useTabs.getState().closeTabsByComparator((tab) => tab.node && tab.node.rid === this.rid); this.collection.children.remove(this); }, - (reason) => {} + () => { + /**/ + } ); } } diff --git a/src/GitHub/GitHubContentProvider.test.ts b/src/GitHub/GitHubContentProvider.test.ts index c7311bbf6..129863df3 100644 --- a/src/GitHub/GitHubContentProvider.test.ts +++ b/src/GitHub/GitHubContentProvider.test.ts @@ -1,11 +1,13 @@ import { IContent } from "@nteract/core"; import { fixture } from "@nteract/fixtures"; import { HttpStatusCodes } from "../Common/Constants"; +import * as GitHubUtils from "../Utils/GitHubUtils"; import { GitHubClient, IGitHubCommit, IGitHubFile } from "./GitHubClient"; import { GitHubContentProvider } from "./GitHubContentProvider"; -import * as GitHubUtils from "../Utils/GitHubUtils"; -const gitHubClient = new GitHubClient(() => {}); +const gitHubClient = new GitHubClient(() => { + /**/ +}); const gitHubContentProvider = new GitHubContentProvider({ gitHubClient, promptForCommitMsg: () => Promise.resolve("commit msg"), @@ -46,7 +48,7 @@ const sampleNotebookModel: IContent<"notebook"> = { created: "", last_modified: "date", mimetype: "application/x-ipynb+json", - content: sampleFile.content ? JSON.parse(sampleFile.content) : null, + content: sampleFile.content ? JSON.parse(sampleFile.content) : undefined, format: "json", }; @@ -54,7 +56,7 @@ describe("GitHubContentProvider remove", () => { it("errors on invalid path", async () => { spyOn(GitHubClient.prototype, "getContentsAsync"); - const response = await gitHubContentProvider.remove(null, "invalid path").toPromise(); + const response = await gitHubContentProvider.remove(undefined, "invalid path").toPromise(); expect(response).toBeDefined(); expect(response.status).toBe(GitHubContentProvider.SelfErrorCode); expect(gitHubClient.getContentsAsync).not.toBeCalled(); @@ -63,7 +65,7 @@ describe("GitHubContentProvider remove", () => { it("errors on failed read", async () => { spyOn(GitHubClient.prototype, "getContentsAsync").and.returnValue(Promise.resolve({ status: 888 })); - const response = await gitHubContentProvider.remove(null, sampleGitHubUri).toPromise(); + const response = await gitHubContentProvider.remove(undefined, sampleGitHubUri).toPromise(); expect(response).toBeDefined(); expect(response.status).toBe(888); expect(gitHubClient.getContentsAsync).toBeCalled(); @@ -75,7 +77,7 @@ describe("GitHubContentProvider remove", () => { ); spyOn(GitHubClient.prototype, "deleteFileAsync").and.returnValue(Promise.resolve({ status: 888 })); - const response = await gitHubContentProvider.remove(null, sampleGitHubUri).toPromise(); + const response = await gitHubContentProvider.remove(undefined, sampleGitHubUri).toPromise(); expect(response).toBeDefined(); expect(response.status).toBe(888); expect(gitHubClient.getContentsAsync).toBeCalled(); @@ -90,7 +92,7 @@ describe("GitHubContentProvider remove", () => { Promise.resolve({ status: HttpStatusCodes.OK, data: gitHubCommit }) ); - const response = await gitHubContentProvider.remove(null, sampleGitHubUri).toPromise(); + const response = await gitHubContentProvider.remove(undefined, sampleGitHubUri).toPromise(); expect(response).toBeDefined(); expect(response.status).toBe(HttpStatusCodes.NoContent); expect(gitHubClient.deleteFileAsync).toBeCalled(); @@ -102,7 +104,7 @@ describe("GitHubContentProvider get", () => { it("errors on invalid path", async () => { spyOn(GitHubClient.prototype, "getContentsAsync"); - const response = await gitHubContentProvider.get(null, "invalid path", null).toPromise(); + const response = await gitHubContentProvider.get(undefined, "invalid path", undefined).toPromise(); expect(response).toBeDefined(); expect(response.status).toBe(GitHubContentProvider.SelfErrorCode); expect(gitHubClient.getContentsAsync).not.toBeCalled(); @@ -111,7 +113,7 @@ describe("GitHubContentProvider get", () => { it("errors on failed read", async () => { spyOn(GitHubClient.prototype, "getContentsAsync").and.returnValue(Promise.resolve({ status: 888 })); - const response = await gitHubContentProvider.get(null, sampleGitHubUri, null).toPromise(); + const response = await gitHubContentProvider.get(undefined, sampleGitHubUri, undefined).toPromise(); expect(response).toBeDefined(); expect(response.status).toBe(888); expect(gitHubClient.getContentsAsync).toBeCalled(); @@ -122,7 +124,7 @@ describe("GitHubContentProvider get", () => { Promise.resolve({ status: HttpStatusCodes.OK, data: sampleFile }) ); - const response = await gitHubContentProvider.get(null, sampleGitHubUri, {}).toPromise(); + const response = await gitHubContentProvider.get(undefined, sampleGitHubUri, {}).toPromise(); expect(response).toBeDefined(); expect(response.status).toBe(HttpStatusCodes.OK); expect(gitHubClient.getContentsAsync).toBeCalled(); @@ -134,7 +136,7 @@ describe("GitHubContentProvider update", () => { it("errors on invalid path", async () => { spyOn(GitHubClient.prototype, "getContentsAsync"); - const response = await gitHubContentProvider.update(null, "invalid path", null).toPromise(); + const response = await gitHubContentProvider.update(undefined, "invalid path", undefined).toPromise(); expect(response).toBeDefined(); expect(response.status).toBe(GitHubContentProvider.SelfErrorCode); expect(gitHubClient.getContentsAsync).not.toBeCalled(); @@ -143,7 +145,7 @@ describe("GitHubContentProvider update", () => { it("errors on failed read", async () => { spyOn(GitHubClient.prototype, "getContentsAsync").and.returnValue(Promise.resolve({ status: 888 })); - const response = await gitHubContentProvider.update(null, sampleGitHubUri, null).toPromise(); + const response = await gitHubContentProvider.update(undefined, sampleGitHubUri, undefined).toPromise(); expect(response).toBeDefined(); expect(response.status).toBe(888); expect(gitHubClient.getContentsAsync).toBeCalled(); @@ -155,7 +157,7 @@ describe("GitHubContentProvider update", () => { ); spyOn(GitHubClient.prototype, "renameFileAsync").and.returnValue(Promise.resolve({ status: 888 })); - const response = await gitHubContentProvider.update(null, sampleGitHubUri, sampleNotebookModel).toPromise(); + const response = await gitHubContentProvider.update(undefined, sampleGitHubUri, sampleNotebookModel).toPromise(); expect(response).toBeDefined(); expect(response.status).toBe(888); expect(gitHubClient.getContentsAsync).toBeCalled(); @@ -170,7 +172,7 @@ describe("GitHubContentProvider update", () => { Promise.resolve({ status: HttpStatusCodes.OK, data: gitHubCommit }) ); - const response = await gitHubContentProvider.update(null, sampleGitHubUri, sampleNotebookModel).toPromise(); + const response = await gitHubContentProvider.update(undefined, sampleGitHubUri, sampleNotebookModel).toPromise(); expect(response).toBeDefined(); expect(response.status).toBe(HttpStatusCodes.OK); expect(gitHubClient.getContentsAsync).toBeCalled(); @@ -186,7 +188,7 @@ describe("GitHubContentProvider create", () => { it("errors on invalid path", async () => { spyOn(GitHubClient.prototype, "createOrUpdateFileAsync"); - const response = await gitHubContentProvider.create(null, "invalid path", sampleNotebookModel).toPromise(); + const response = await gitHubContentProvider.create(undefined, "invalid path", sampleNotebookModel).toPromise(); expect(response).toBeDefined(); expect(response.status).toBe(GitHubContentProvider.SelfErrorCode); expect(gitHubClient.createOrUpdateFileAsync).not.toBeCalled(); @@ -195,7 +197,7 @@ describe("GitHubContentProvider create", () => { it("errors on failed create", async () => { spyOn(GitHubClient.prototype, "createOrUpdateFileAsync").and.returnValue(Promise.resolve({ status: 888 })); - const response = await gitHubContentProvider.create(null, sampleGitHubUri, sampleNotebookModel).toPromise(); + const response = await gitHubContentProvider.create(undefined, sampleGitHubUri, sampleNotebookModel).toPromise(); expect(response).toBeDefined(); expect(response.status).toBe(888); expect(gitHubClient.createOrUpdateFileAsync).toBeCalled(); @@ -206,7 +208,7 @@ describe("GitHubContentProvider create", () => { Promise.resolve({ status: HttpStatusCodes.Created, data: gitHubCommit }) ); - const response = await gitHubContentProvider.create(null, sampleGitHubUri, sampleNotebookModel).toPromise(); + const response = await gitHubContentProvider.create(undefined, sampleGitHubUri, sampleNotebookModel).toPromise(); expect(response).toBeDefined(); expect(response.status).toBe(HttpStatusCodes.Created); expect(gitHubClient.createOrUpdateFileAsync).toBeCalled(); @@ -221,7 +223,7 @@ describe("GitHubContentProvider save", () => { it("errors on invalid path", async () => { spyOn(GitHubClient.prototype, "getContentsAsync"); - const response = await gitHubContentProvider.save(null, "invalid path", null).toPromise(); + const response = await gitHubContentProvider.save(undefined, "invalid path", undefined).toPromise(); expect(response).toBeDefined(); expect(response.status).toBe(GitHubContentProvider.SelfErrorCode); expect(gitHubClient.getContentsAsync).not.toBeCalled(); @@ -230,7 +232,7 @@ describe("GitHubContentProvider save", () => { it("errors on failed read", async () => { spyOn(GitHubClient.prototype, "getContentsAsync").and.returnValue(Promise.resolve({ status: 888 })); - const response = await gitHubContentProvider.save(null, sampleGitHubUri, null).toPromise(); + const response = await gitHubContentProvider.save(undefined, sampleGitHubUri, undefined).toPromise(); expect(response).toBeDefined(); expect(response.status).toBe(888); expect(gitHubClient.getContentsAsync).toBeCalled(); @@ -242,7 +244,7 @@ describe("GitHubContentProvider save", () => { ); spyOn(GitHubClient.prototype, "createOrUpdateFileAsync").and.returnValue(Promise.resolve({ status: 888 })); - const response = await gitHubContentProvider.save(null, sampleGitHubUri, sampleNotebookModel).toPromise(); + const response = await gitHubContentProvider.save(undefined, sampleGitHubUri, sampleNotebookModel).toPromise(); expect(response).toBeDefined(); expect(response.status).toBe(888); expect(gitHubClient.getContentsAsync).toBeCalled(); @@ -257,7 +259,7 @@ describe("GitHubContentProvider save", () => { Promise.resolve({ status: HttpStatusCodes.OK, data: gitHubCommit }) ); - const response = await gitHubContentProvider.save(null, sampleGitHubUri, sampleNotebookModel).toPromise(); + const response = await gitHubContentProvider.save(undefined, sampleGitHubUri, sampleNotebookModel).toPromise(); expect(response).toBeDefined(); expect(response.status).toBe(HttpStatusCodes.OK); expect(gitHubClient.getContentsAsync).toBeCalled(); @@ -271,7 +273,7 @@ describe("GitHubContentProvider save", () => { describe("GitHubContentProvider listCheckpoints", () => { it("errors for everything", async () => { - const response = await gitHubContentProvider.listCheckpoints(null, null).toPromise(); + const response = await gitHubContentProvider.listCheckpoints().toPromise(); expect(response).toBeDefined(); expect(response.status).toBe(GitHubContentProvider.SelfErrorCode); }); @@ -279,7 +281,7 @@ describe("GitHubContentProvider listCheckpoints", () => { describe("GitHubContentProvider createCheckpoint", () => { it("errors for everything", async () => { - const response = await gitHubContentProvider.createCheckpoint(null, null).toPromise(); + const response = await gitHubContentProvider.createCheckpoint().toPromise(); expect(response).toBeDefined(); expect(response.status).toBe(GitHubContentProvider.SelfErrorCode); }); @@ -287,7 +289,7 @@ describe("GitHubContentProvider createCheckpoint", () => { describe("GitHubContentProvider deleteCheckpoint", () => { it("errors for everything", async () => { - const response = await gitHubContentProvider.deleteCheckpoint(null, null, null).toPromise(); + const response = await gitHubContentProvider.deleteCheckpoint().toPromise(); expect(response).toBeDefined(); expect(response.status).toBe(GitHubContentProvider.SelfErrorCode); }); @@ -295,7 +297,7 @@ describe("GitHubContentProvider deleteCheckpoint", () => { describe("GitHubContentProvider restoreFromCheckpoint", () => { it("errors for everything", async () => { - const response = await gitHubContentProvider.restoreFromCheckpoint(null, null, null).toPromise(); + const response = await gitHubContentProvider.restoreFromCheckpoint().toPromise(); expect(response).toBeDefined(); expect(response.status).toBe(GitHubContentProvider.SelfErrorCode); }); diff --git a/src/GitHub/GitHubContentProvider.ts b/src/GitHub/GitHubContentProvider.ts index ac45ce9de..57c4d0a7c 100644 --- a/src/GitHub/GitHubContentProvider.ts +++ b/src/GitHub/GitHubContentProvider.ts @@ -1,15 +1,15 @@ -import { Notebook, stringifyNotebook, makeNotebookRecord, toJS } from "@nteract/commutable"; +import { makeNotebookRecord, Notebook, stringifyNotebook, toJS } from "@nteract/commutable"; import { FileType, IContent, IContentProvider, IEmptyContent, IGetParams, ServerConfig } from "@nteract/core"; import { from, Observable, of } from "rxjs"; import { AjaxResponse } from "rxjs/ajax"; -import * as Base64Utils from "../Utils/Base64Utils"; import { HttpStatusCodes } from "../Common/Constants"; -import * as Logger from "../Common/Logger"; -import { NotebookUtil } from "../Explorer/Notebook/NotebookUtil"; -import { GitHubClient, IGitHubFile, IGitHubResponse } from "./GitHubClient"; -import * as GitHubUtils from "../Utils/GitHubUtils"; -import * as UrlUtility from "../Common/UrlUtility"; import { getErrorMessage } from "../Common/ErrorHandlingUtils"; +import * as Logger from "../Common/Logger"; +import * as UrlUtility from "../Common/UrlUtility"; +import { NotebookUtil } from "../Explorer/Notebook/NotebookUtil"; +import * as Base64Utils from "../Utils/Base64Utils"; +import * as GitHubUtils from "../Utils/GitHubUtils"; +import { GitHubClient, IGitHubFile, IGitHubResponse } from "./GitHubClient"; export interface GitHubContentProviderParams { gitHubClient: GitHubClient; @@ -267,25 +267,25 @@ export class GitHubContentProvider implements IContentProvider { ); } - public listCheckpoints(_: ServerConfig, path: string): Observable { + public listCheckpoints(): Observable { const error = new GitHubContentProviderError("Not implemented"); Logger.logError(error.message, "GitHubContentProvider/listCheckpoints", error.errno); return of(this.createErrorAjaxResponse(error)); } - public createCheckpoint(_: ServerConfig, path: string): Observable { + public createCheckpoint(): Observable { const error = new GitHubContentProviderError("Not implemented"); Logger.logError(error.message, "GitHubContentProvider/createCheckpoint", error.errno); return of(this.createErrorAjaxResponse(error)); } - public deleteCheckpoint(_: ServerConfig, path: string, checkpointID: string): Observable { + public deleteCheckpoint(): Observable { const error = new GitHubContentProviderError("Not implemented"); Logger.logError(error.message, "GitHubContentProvider/deleteCheckpoint", error.errno); return of(this.createErrorAjaxResponse(error)); } - public restoreFromCheckpoint(_: ServerConfig, path: string, checkpointID: string): Observable { + public restoreFromCheckpoint(): Observable { const error = new GitHubContentProviderError("Not implemented"); Logger.logError(error.message, "GitHubContentProvider/restoreFromCheckpoint", error.errno); return of(this.createErrorAjaxResponse(error)); diff --git a/src/Platform/Hosted/Helpers/ConnectionStringParser.test.ts b/src/Platform/Hosted/Helpers/ConnectionStringParser.test.ts index 8762171e7..bd1447891 100644 --- a/src/Platform/Hosted/Helpers/ConnectionStringParser.test.ts +++ b/src/Platform/Hosted/Helpers/ConnectionStringParser.test.ts @@ -2,8 +2,8 @@ import * as DataModels from "../../../Contracts/DataModels"; import { parseConnectionString } from "./ConnectionStringParser"; describe("ConnectionStringParser", () => { - const mockAccountName: string = "Test"; - const mockMasterKey: string = "some-key"; + const mockAccountName = "Test"; + const mockMasterKey = "some-key"; it("should parse a valid sql account connection string", () => { const metadata = parseConnectionString( From 397231dca2ea26a3c46bdcc6966597d6bfa801bd Mon Sep 17 00:00:00 2001 From: Sunil Kumar Yadav <79906609+sunilyadav840@users.noreply.github.com> Date: Thu, 15 Jul 2021 20:05:51 +0530 Subject: [PATCH 2/4] Fixed typescript strict issue of Statusbar, hostedUtils, StringUtils etc (#785) --- src/Explorer/Notebook/NotebookRenderer/StatusBar.tsx | 2 +- src/Platform/Hosted/HostedUtils.ts | 2 +- src/Shared/DefaultExperienceUtility.test.ts | 2 +- src/Utils/StringUtils.test.ts | 10 +++++----- src/Utils/StringUtils.ts | 2 +- src/hooks/useNotebookSnapshotStore.ts | 4 ++-- src/hooks/usePortalAccessToken.tsx | 4 ++-- tsconfig.strict.json | 8 +++++++- 8 files changed, 20 insertions(+), 14 deletions(-) diff --git a/src/Explorer/Notebook/NotebookRenderer/StatusBar.tsx b/src/Explorer/Notebook/NotebookRenderer/StatusBar.tsx index 86b4fb51b..3b00a20a0 100644 --- a/src/Explorer/Notebook/NotebookRenderer/StatusBar.tsx +++ b/src/Explorer/Notebook/NotebookRenderer/StatusBar.tsx @@ -79,7 +79,7 @@ interface InitialProps { contentRef: ContentRef; } -const makeMapStateToProps = (initialState: AppState, initialProps: InitialProps): ((state: AppState) => Props) => { +const makeMapStateToProps = (_initialState: AppState, initialProps: InitialProps): ((state: AppState) => Props) => { const { contentRef } = initialProps; const mapStateToProps = (state: AppState) => { diff --git a/src/Platform/Hosted/HostedUtils.ts b/src/Platform/Hosted/HostedUtils.ts index 8cc59daa4..f39e318b1 100644 --- a/src/Platform/Hosted/HostedUtils.ts +++ b/src/Platform/Hosted/HostedUtils.ts @@ -40,7 +40,7 @@ export function getDatabaseAccountKindFromExperience(apiExperience: typeof userC return AccountKind.GlobalDocumentDB; } -export function extractMasterKeyfromConnectionString(connectionString: string): string { +export function extractMasterKeyfromConnectionString(connectionString: string): string | undefined { // Only Gremlin uses the actual master key for connection to cosmos const matchedParts = connectionString.match("AccountKey=(.*);ApiKind=Gremlin;$"); return (matchedParts && matchedParts.length > 1 && matchedParts[1]) || undefined; diff --git a/src/Shared/DefaultExperienceUtility.test.ts b/src/Shared/DefaultExperienceUtility.test.ts index c72b46823..2d23af40a 100644 --- a/src/Shared/DefaultExperienceUtility.test.ts +++ b/src/Shared/DefaultExperienceUtility.test.ts @@ -35,7 +35,7 @@ describe("Default Experience Utility", () => { }); describe("getApiKindFromDefaultExperience()", () => { - function runScenario(defaultExperience: typeof userContext.apiType, expectedApiKind: number): void { + function runScenario(defaultExperience: typeof userContext.apiType | null, expectedApiKind: number): void { const resolvedApiKind = DefaultExperienceUtility.getApiKindFromDefaultExperience(defaultExperience); expect(resolvedApiKind).toEqual(expectedApiKind); } diff --git a/src/Utils/StringUtils.test.ts b/src/Utils/StringUtils.test.ts index f725e9428..bd626f492 100644 --- a/src/Utils/StringUtils.test.ts +++ b/src/Utils/StringUtils.test.ts @@ -3,27 +3,27 @@ import * as StringUtils from "./StringUtils"; describe("StringUtils", () => { describe("stripSpacesFromString()", () => { it("should strip all spaces from input string", () => { - const transformedString: string = StringUtils.stripSpacesFromString("a b c"); + const transformedString: string | undefined = StringUtils.stripSpacesFromString("a b c"); expect(transformedString).toBe("abc"); }); it("should return original string if input string has no spaces", () => { - const transformedString: string = StringUtils.stripSpacesFromString("abc"); + const transformedString: string | undefined = StringUtils.stripSpacesFromString("abc"); expect(transformedString).toBe("abc"); }); it("should return undefined if input is undefined", () => { - const transformedString: string = StringUtils.stripSpacesFromString(undefined); + const transformedString: string | undefined = StringUtils.stripSpacesFromString(undefined); expect(transformedString).toBeUndefined(); }); it("should return undefined if input is undefiend", () => { - const transformedString: string = StringUtils.stripSpacesFromString(undefined); + const transformedString: string | undefined = StringUtils.stripSpacesFromString(undefined); expect(transformedString).toBe(undefined); }); it("should return empty string if input is an empty string", () => { - const transformedString: string = StringUtils.stripSpacesFromString(""); + const transformedString: string | undefined = StringUtils.stripSpacesFromString(""); expect(transformedString).toBe(""); }); }); diff --git a/src/Utils/StringUtils.ts b/src/Utils/StringUtils.ts index 2618544c3..02ceba5f2 100644 --- a/src/Utils/StringUtils.ts +++ b/src/Utils/StringUtils.ts @@ -1,4 +1,4 @@ -export function stripSpacesFromString(inputString: string): string { +export function stripSpacesFromString(inputString?: string): string | undefined { if (inputString === undefined || typeof inputString !== "string") { return inputString; } diff --git a/src/hooks/useNotebookSnapshotStore.ts b/src/hooks/useNotebookSnapshotStore.ts index a40657d0d..841f6b5d1 100644 --- a/src/hooks/useNotebookSnapshotStore.ts +++ b/src/hooks/useNotebookSnapshotStore.ts @@ -1,8 +1,8 @@ import create, { UseStore } from "zustand"; export interface NotebookSnapshotHooks { - snapshot: string; - error: string; + snapshot?: string; + error?: string; setSnapshot: (imageSrc: string) => void; setError: (error: string) => void; } diff --git a/src/hooks/usePortalAccessToken.tsx b/src/hooks/usePortalAccessToken.tsx index da5cbe2f8..fdccc84a7 100644 --- a/src/hooks/usePortalAccessToken.tsx +++ b/src/hooks/usePortalAccessToken.tsx @@ -24,8 +24,8 @@ export async function fetchAccessData(portalToken: string): Promise(); +export function useTokenMetadata(token: string): AccessInputMetadata | undefined { + const [state, setState] = useState(); useEffect(() => { if (token) { diff --git a/tsconfig.strict.json b/tsconfig.strict.json index a385c5b7d..ade4b2017 100644 --- a/tsconfig.strict.json +++ b/tsconfig.strict.json @@ -58,6 +58,7 @@ "./src/Explorer/Notebook/NotebookRenderer/AzureTheme.tsx", "./src/Explorer/Notebook/NotebookRenderer/Prompt.tsx", "./src/Explorer/Notebook/NotebookRenderer/PromptContent.tsx", + "./src/Explorer/Notebook/NotebookRenderer/StatusBar.tsx", "./src/Explorer/Notebook/NotebookRenderer/decorators/CellCreator.tsx", "./src/Explorer/Notebook/NotebookRenderer/decorators/CellLabeler.tsx", "./src/Explorer/Notebook/NotebookUtil.ts", @@ -88,6 +89,8 @@ "./src/Platform/Hosted/Components/MeControl.test.tsx", "./src/Platform/Hosted/Components/MeControl.tsx", "./src/Platform/Hosted/Components/SignInButton.tsx", + "./src/Platform/Hosted/HostedUtils.test.ts", + "./src/Platform/Hosted/HostedUtils.ts", "./src/Platform/Hosted/extractFeatures.test.ts", "./src/Platform/Hosted/extractFeatures.ts", "./src/ReactDevTools.ts", @@ -119,6 +122,7 @@ "./src/Utils/MessageValidation.ts", "./src/Utils/NotificationConsoleUtils.ts", "./src/Utils/PricingUtils.ts", + "./src/Utils/StringUtils.test.ts", "./src/Utils/StringUtils.ts", "./src/Utils/StyleUtils.ts", "./src/Utils/WindowUtils.test.ts", @@ -127,6 +131,8 @@ "./src/hooks/useDirectories.tsx", "./src/hooks/useFullScreenURLs.tsx", "./src/hooks/useGraphPhoto.tsx", + "./src/hooks/useNotebookSnapshotStore.ts", + "./src/hooks/usePortalAccessToken.tsx", "./src/hooks/useNotificationConsole.ts", "./src/hooks/useObservable.ts", "./src/hooks/useSidePanel.ts", @@ -160,4 +166,4 @@ "src/Terminal/**/*", "src/Utils/arm/**/*" ] -} +} \ No newline at end of file From b115bb34ca7fd81619f82f1c0ece8a13e08428e1 Mon Sep 17 00:00:00 2001 From: vaidankarswapnil <81285216+vaidankarswapnil@users.noreply.github.com> Date: Thu, 15 Jul 2021 20:14:25 +0530 Subject: [PATCH 3/4] Fix GitHub repos panel issues (#875) Co-authored-by: Steve Faulkner Co-authored-by: Tanuj Mittal --- .../Controls/GitHub/GitHubReposComponent.tsx | 2 +- .../SettingsComponent.test.tsx.snap | 18 +++++ .../CommandBarComponentButtonFactory.tsx | 8 ++- src/Explorer/Notebook/NotebookManager.tsx | 23 +++--- .../GitHubReposPanel/GitHubReposPanel.tsx | 70 ++++++++----------- .../GitHubReposPanel.test.tsx.snap | 9 +++ .../StringInputPane.test.tsx.snap | 9 +++ src/Explorer/Tree/ResourceTreeAdapter.tsx | 8 ++- 8 files changed, 94 insertions(+), 53 deletions(-) diff --git a/src/Explorer/Controls/GitHub/GitHubReposComponent.tsx b/src/Explorer/Controls/GitHub/GitHubReposComponent.tsx index 29e1a2900..d6b28775d 100644 --- a/src/Explorer/Controls/GitHub/GitHubReposComponent.tsx +++ b/src/Explorer/Controls/GitHub/GitHubReposComponent.tsx @@ -56,7 +56,7 @@ export class GitHubReposComponent extends React.Component -
{content}
+
{content}
{!this.props.showAuthorizeAccess && ( <>
diff --git a/src/Explorer/Controls/Settings/__snapshots__/SettingsComponent.test.tsx.snap b/src/Explorer/Controls/Settings/__snapshots__/SettingsComponent.test.tsx.snap index cb8ecbfaf..edb2e91db 100644 --- a/src/Explorer/Controls/Settings/__snapshots__/SettingsComponent.test.tsx.snap +++ b/src/Explorer/Controls/Settings/__snapshots__/SettingsComponent.test.tsx.snap @@ -42,6 +42,15 @@ exports[`SettingsComponent renders 1`] = ` "resourceTree": ResourceTreeAdapter { "container": [Circular], "copyNotebook": [Function], + "gitHubOAuthService": GitHubOAuthService { + "junoClient": JunoClient { + "cachedPinnedRepos": [Function], + }, + "token": [Function], + }, + "junoClient": JunoClient { + "cachedPinnedRepos": [Function], + }, "parameters": [Function], }, "resourceTreeForResourceToken": ResourceTreeAdapterForResourceToken { @@ -113,6 +122,15 @@ exports[`SettingsComponent renders 1`] = ` "resourceTree": ResourceTreeAdapter { "container": [Circular], "copyNotebook": [Function], + "gitHubOAuthService": GitHubOAuthService { + "junoClient": JunoClient { + "cachedPinnedRepos": [Function], + }, + "token": [Function], + }, + "junoClient": JunoClient { + "cachedPinnedRepos": [Function], + }, "parameters": [Function], }, "resourceTreeForResourceToken": ResourceTreeAdapterForResourceToken { diff --git a/src/Explorer/Menus/CommandBar/CommandBarComponentButtonFactory.tsx b/src/Explorer/Menus/CommandBar/CommandBarComponentButtonFactory.tsx index 73e085aac..305c5e899 100644 --- a/src/Explorer/Menus/CommandBar/CommandBarComponentButtonFactory.tsx +++ b/src/Explorer/Menus/CommandBar/CommandBarComponentButtonFactory.tsx @@ -22,6 +22,7 @@ import * as Constants from "../../../Common/Constants"; import { configContext, Platform } from "../../../ConfigContext"; import * as ViewModels from "../../../Contracts/ViewModels"; import { useSidePanel } from "../../../hooks/useSidePanel"; +import { JunoClient } from "../../../Juno/JunoClient"; import { userContext } from "../../../UserContext"; import { getCollectionName, getDatabaseName } from "../../../Utils/APITypeUtils"; import { isServerlessAccount } from "../../../Utils/CapabilityUtils"; @@ -560,6 +561,7 @@ function createNotebookWorkspaceResetButton(container: Explorer): CommandButtonC function createManageGitHubAccountButton(container: Explorer): CommandButtonComponentProps { const connectedToGitHub: boolean = container.notebookManager?.gitHubOAuthService.isLoggedIn(); const label = connectedToGitHub ? "Manage GitHub settings" : "Connect to GitHub"; + const junoClient = new JunoClient(); return { iconSrc: GitHubIcon, iconAlt: label, @@ -568,7 +570,11 @@ function createManageGitHubAccountButton(container: Explorer): CommandButtonComp .getState() .openSidePanel( label, - + ), commandButtonLabel: label, hasPopup: false, diff --git a/src/Explorer/Notebook/NotebookManager.tsx b/src/Explorer/Notebook/NotebookManager.tsx index 22e384276..989cd39d1 100644 --- a/src/Explorer/Notebook/NotebookManager.tsx +++ b/src/Explorer/Notebook/NotebookManager.tsx @@ -89,16 +89,18 @@ export default class NotebookManager { this.gitHubClient.setToken(token?.access_token); if (this?.gitHubOAuthService.isLoggedIn()) { useSidePanel.getState().closeSidePanel(); - useSidePanel - .getState() - .openSidePanel( - "Manage GitHub settings", - - ); + setTimeout(() => { + useSidePanel + .getState() + .openSidePanel( + "Manage GitHub settings", + + ); + }, 200); } this.params.refreshCommandBarButtons(); @@ -179,6 +181,7 @@ export default class NotebookManager { ), "Cancel", diff --git a/src/Explorer/Panes/GitHubReposPanel/GitHubReposPanel.tsx b/src/Explorer/Panes/GitHubReposPanel/GitHubReposPanel.tsx index d2d3acac7..dfa8667db 100644 --- a/src/Explorer/Panes/GitHubReposPanel/GitHubReposPanel.tsx +++ b/src/Explorer/Panes/GitHubReposPanel/GitHubReposPanel.tsx @@ -23,7 +23,7 @@ import { PanelLoadingScreen } from "../PanelLoadingScreen"; interface IGitHubReposPanelProps { explorer: Explorer; gitHubClientProp: GitHubClient; - junoClientProp?: JunoClient; + junoClientProp: JunoClient; } interface IGitHubReposPanelState { @@ -120,6 +120,7 @@ export class GitHubReposPanel extends React.Component => this.loadMoreBranches(item.repo), }; - this.setState({ - gitHubReposState: { - ...this.state.gitHubReposState, - reposListProps: { - ...this.state.gitHubReposState.reposListProps, - branchesProps: { - ...this.state.gitHubReposState.reposListProps.branchesProps, - [GitHubUtils.toRepoFullName(item.repo.owner, item.repo.name)]: this.branchesProps[item.key], - }, - pinnedReposProps: { - repos: this.pinnedReposProps.repos, - }, - unpinnedReposProps: { - ...this.state.gitHubReposState.reposListProps.unpinnedReposProps, - repos: this.unpinnedReposProps.repos, - }, - }, - }, - }); this.loadMoreBranches(item.repo); - } else { - if (this.isAddedRepo === false) { - this.setState({ - gitHubReposState: { - ...this.state.gitHubReposState, - reposListProps: { - ...this.state.gitHubReposState.reposListProps, - pinnedReposProps: { - repos: this.pinnedReposProps.repos, - }, - unpinnedReposProps: { - ...this.state.gitHubReposState.reposListProps.unpinnedReposProps, - repos: this.unpinnedReposProps.repos, - }, - }, - }, - }); - } } }); + + this.setState({ + gitHubReposState: { + ...this.state.gitHubReposState, + reposListProps: { + ...this.state.gitHubReposState.reposListProps, + branchesProps: { + ...this.branchesProps, + }, + pinnedReposProps: { + repos: this.pinnedReposProps.repos, + }, + unpinnedReposProps: { + ...this.state.gitHubReposState.reposListProps.unpinnedReposProps, + repos: this.unpinnedReposProps.repos, + }, + }, + }, + }); this.isAddedRepo = false; } diff --git a/src/Explorer/Panes/GitHubReposPanel/__snapshots__/GitHubReposPanel.test.tsx.snap b/src/Explorer/Panes/GitHubReposPanel/__snapshots__/GitHubReposPanel.test.tsx.snap index 9d1b8cc0c..f1c03499b 100644 --- a/src/Explorer/Panes/GitHubReposPanel/__snapshots__/GitHubReposPanel.test.tsx.snap +++ b/src/Explorer/Panes/GitHubReposPanel/__snapshots__/GitHubReposPanel.test.tsx.snap @@ -31,6 +31,15 @@ exports[`GitHub Repos Panel should render Default properly 1`] = ` "resourceTree": ResourceTreeAdapter { "container": [Circular], "copyNotebook": [Function], + "gitHubOAuthService": GitHubOAuthService { + "junoClient": JunoClient { + "cachedPinnedRepos": [Function], + }, + "token": [Function], + }, + "junoClient": JunoClient { + "cachedPinnedRepos": [Function], + }, "parameters": [Function], }, "resourceTreeForResourceToken": ResourceTreeAdapterForResourceToken { diff --git a/src/Explorer/Panes/StringInputPane/__snapshots__/StringInputPane.test.tsx.snap b/src/Explorer/Panes/StringInputPane/__snapshots__/StringInputPane.test.tsx.snap index 27f1f941d..e159e0052 100644 --- a/src/Explorer/Panes/StringInputPane/__snapshots__/StringInputPane.test.tsx.snap +++ b/src/Explorer/Panes/StringInputPane/__snapshots__/StringInputPane.test.tsx.snap @@ -21,6 +21,15 @@ exports[`StringInput Pane should render Create new directory properly 1`] = ` "resourceTree": ResourceTreeAdapter { "container": [Circular], "copyNotebook": [Function], + "gitHubOAuthService": GitHubOAuthService { + "junoClient": JunoClient { + "cachedPinnedRepos": [Function], + }, + "token": [Function], + }, + "junoClient": JunoClient { + "cachedPinnedRepos": [Function], + }, "parameters": [Function], }, "resourceTreeForResourceToken": ResourceTreeAdapterForResourceToken { diff --git a/src/Explorer/Tree/ResourceTreeAdapter.tsx b/src/Explorer/Tree/ResourceTreeAdapter.tsx index 2513a23be..85b6f4a53 100644 --- a/src/Explorer/Tree/ResourceTreeAdapter.tsx +++ b/src/Explorer/Tree/ResourceTreeAdapter.tsx @@ -16,9 +16,10 @@ import { Areas } from "../../Common/Constants"; import { isPublicInternetAccessAllowed } from "../../Common/DatabaseAccountUtility"; import * as DataModels from "../../Contracts/DataModels"; import * as ViewModels from "../../Contracts/ViewModels"; +import { GitHubOAuthService } from "../../GitHub/GitHubOAuthService"; import { useSidePanel } from "../../hooks/useSidePanel"; import { useTabs } from "../../hooks/useTabs"; -import { IPinnedRepo } from "../../Juno/JunoClient"; +import { IPinnedRepo, JunoClient } from "../../Juno/JunoClient"; import { LocalStorageUtility, StorageKey } from "../../Shared/StorageUtility"; import { Action, ActionModifiers, Source } from "../../Shared/Telemetry/TelemetryConstants"; import * as TelemetryProcessor from "../../Shared/Telemetry/TelemetryProcessor"; @@ -55,6 +56,8 @@ export class ResourceTreeAdapter implements ReactAdapter { public galleryContentRoot: NotebookContentItem; public myNotebooksContentRoot: NotebookContentItem; public gitHubNotebooksContentRoot: NotebookContentItem; + public junoClient: JunoClient; + public gitHubOAuthService: GitHubOAuthService; public constructor(private container: Explorer) { this.parameters = ko.observable(Date.now()); @@ -71,6 +74,8 @@ export class ResourceTreeAdapter implements ReactAdapter { useDatabases.subscribe(() => this.triggerRender()); this.triggerRender(); + this.junoClient = new JunoClient(); + this.gitHubOAuthService = new GitHubOAuthService(this.junoClient); } private traceMyNotebookTreeInfo() { @@ -634,6 +639,7 @@ export class ResourceTreeAdapter implements ReactAdapter { ), }, From 8a3929775b5ce99436642f6238046fef1099ec46 Mon Sep 17 00:00:00 2001 From: vaidankarswapnil <81285216+vaidankarswapnil@users.noreply.github.com> Date: Thu, 15 Jul 2021 21:24:07 +0530 Subject: [PATCH 4/4] Strict mode SwitchAccount and SwitchSubscription files (#940) --- src/Platform/Hosted/Components/SwitchAccount.tsx | 2 +- src/Platform/Hosted/Components/SwitchSubscription.tsx | 2 +- tsconfig.strict.json | 4 +++- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/Platform/Hosted/Components/SwitchAccount.tsx b/src/Platform/Hosted/Components/SwitchAccount.tsx index 0462f2188..ef195ee07 100644 --- a/src/Platform/Hosted/Components/SwitchAccount.tsx +++ b/src/Platform/Hosted/Components/SwitchAccount.tsx @@ -26,7 +26,7 @@ export const SwitchAccount: FunctionComponent = ({ data: account, }))} onChange={(_, option) => { - setSelectedAccountName(String(option.key)); + setSelectedAccountName(String(option?.key)); dismissMenu(); }} defaultSelectedKey={selectedAccount?.name} diff --git a/src/Platform/Hosted/Components/SwitchSubscription.tsx b/src/Platform/Hosted/Components/SwitchSubscription.tsx index 9ec98fc27..c784c5f5b 100644 --- a/src/Platform/Hosted/Components/SwitchSubscription.tsx +++ b/src/Platform/Hosted/Components/SwitchSubscription.tsx @@ -26,7 +26,7 @@ export const SwitchSubscription: FunctionComponent = ({ }; })} onChange={(_, option) => { - setSelectedSubscriptionId(String(option.key)); + setSelectedSubscriptionId(String(option?.key)); }} defaultSelectedKey={selectedSubscription?.subscriptionId} placeholder={subscriptions && subscriptions.length === 0 ? "No Subscriptions Found" : "Select a Subscription"} diff --git a/tsconfig.strict.json b/tsconfig.strict.json index ade4b2017..6a9a6e78a 100644 --- a/tsconfig.strict.json +++ b/tsconfig.strict.json @@ -140,7 +140,9 @@ "./src/quickstart.ts", "./src/setupTests.ts", "./src/userContext.test.ts", - "src/Common/EntityValue.tsx" + "src/Common/EntityValue.tsx", + "./src/Platform/Hosted/Components/SwitchAccount.tsx", + "./src/Platform/Hosted/Components/SwitchSubscription.tsx", ], "include": [ "src/CellOutputViewer/transforms/**/*",