mirror of
https://github.com/Azure/cosmos-explorer.git
synced 2025-12-30 06:11:38 +00:00
Resolved conflicts
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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",
|
||||
});
|
||||
|
||||
@@ -56,7 +56,7 @@ export class GitHubReposComponent extends React.Component<GitHubReposComponentPr
|
||||
|
||||
return (
|
||||
<>
|
||||
<div className={"paneMainContent"}>{content}</div>
|
||||
<div>{content}</div>
|
||||
{!this.props.showAuthorizeAccess && (
|
||||
<>
|
||||
<div className={"paneFooter"} style={ContentFooterStyle}>
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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,
|
||||
<GitHubReposPanel explorer={container} gitHubClientProp={container.notebookManager.gitHubClient} />
|
||||
<GitHubReposPanel
|
||||
explorer={container}
|
||||
gitHubClientProp={container.notebookManager.gitHubClient}
|
||||
junoClientProp={junoClient}
|
||||
/>
|
||||
),
|
||||
commandButtonLabel: label,
|
||||
hasPopup: false,
|
||||
|
||||
@@ -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",
|
||||
<GitHubReposPanel
|
||||
explorer={this.params.container}
|
||||
gitHubClientProp={this.params.container.notebookManager.gitHubClient}
|
||||
junoClientProp={this.junoClient}
|
||||
/>
|
||||
);
|
||||
setTimeout(() => {
|
||||
useSidePanel
|
||||
.getState()
|
||||
.openSidePanel(
|
||||
"Manage GitHub settings",
|
||||
<GitHubReposPanel
|
||||
explorer={this.params.container}
|
||||
gitHubClientProp={this.params.container.notebookManager.gitHubClient}
|
||||
junoClientProp={this.junoClient}
|
||||
/>
|
||||
);
|
||||
}, 200);
|
||||
}
|
||||
|
||||
this.params.refreshCommandBarButtons();
|
||||
@@ -179,6 +181,7 @@ export default class NotebookManager {
|
||||
<GitHubReposPanel
|
||||
explorer={this.params.container}
|
||||
gitHubClientProp={this.params.container.notebookManager.gitHubClient}
|
||||
junoClientProp={this.junoClient}
|
||||
/>
|
||||
),
|
||||
"Cancel",
|
||||
|
||||
@@ -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) => {
|
||||
|
||||
@@ -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<IGitHubReposPanelProps, IG
|
||||
handleError(error, "GitHubReposPane/submit", "Failed to save pinned repos");
|
||||
}
|
||||
}
|
||||
useSidePanel.getState().closeSidePanel();
|
||||
}
|
||||
|
||||
public resetData(): void {
|
||||
@@ -144,11 +145,18 @@ export class GitHubReposPanel extends React.Component<IGitHubReposPanelProps, IG
|
||||
|
||||
private setup(forceShowConnectToGitHub = false): void {
|
||||
forceShowConnectToGitHub || !this.props.explorer.notebookManager?.gitHubOAuthService.isLoggedIn()
|
||||
? this.setupForConnectToGitHub()
|
||||
? this.setupForConnectToGitHub(forceShowConnectToGitHub)
|
||||
: this.setupForManageRepos();
|
||||
}
|
||||
|
||||
private setupForConnectToGitHub(): void {
|
||||
private setupForConnectToGitHub(forceShowConnectToGitHub: boolean): void {
|
||||
if (forceShowConnectToGitHub) {
|
||||
const newState = { ...this.state.gitHubReposState };
|
||||
newState.showAuthorizeAccess = forceShowConnectToGitHub;
|
||||
this.setState({
|
||||
gitHubReposState: newState,
|
||||
});
|
||||
}
|
||||
this.setState({
|
||||
isExecuting: false,
|
||||
});
|
||||
@@ -368,46 +376,28 @@ export class GitHubReposPanel extends React.Component<IGitHubReposPanelProps, IG
|
||||
isLoading: true,
|
||||
loadMore: (): Promise<void> => 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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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 {
|
||||
<GitHubReposPanel
|
||||
explorer={this.container}
|
||||
gitHubClientProp={this.container.notebookManager.gitHubClient}
|
||||
junoClientProp={this.junoClient}
|
||||
/>
|
||||
),
|
||||
},
|
||||
|
||||
@@ -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) => {}
|
||||
() => {
|
||||
/**/
|
||||
}
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
});
|
||||
|
||||
@@ -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<AjaxResponse> {
|
||||
public listCheckpoints(): Observable<AjaxResponse> {
|
||||
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<AjaxResponse> {
|
||||
public createCheckpoint(): Observable<AjaxResponse> {
|
||||
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<AjaxResponse> {
|
||||
public deleteCheckpoint(): Observable<AjaxResponse> {
|
||||
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<AjaxResponse> {
|
||||
public restoreFromCheckpoint(): Observable<AjaxResponse> {
|
||||
const error = new GitHubContentProviderError("Not implemented");
|
||||
Logger.logError(error.message, "GitHubContentProvider/restoreFromCheckpoint", error.errno);
|
||||
return of(this.createErrorAjaxResponse(error));
|
||||
|
||||
@@ -26,7 +26,7 @@ export const SwitchAccount: FunctionComponent<Props> = ({
|
||||
data: account,
|
||||
}))}
|
||||
onChange={(_, option) => {
|
||||
setSelectedAccountName(String(option.key));
|
||||
setSelectedAccountName(String(option?.key));
|
||||
dismissMenu();
|
||||
}}
|
||||
defaultSelectedKey={selectedAccount?.name}
|
||||
|
||||
@@ -26,7 +26,7 @@ export const SwitchSubscription: FunctionComponent<Props> = ({
|
||||
};
|
||||
})}
|
||||
onChange={(_, option) => {
|
||||
setSelectedSubscriptionId(String(option.key));
|
||||
setSelectedSubscriptionId(String(option?.key));
|
||||
}}
|
||||
defaultSelectedKey={selectedSubscription?.subscriptionId}
|
||||
placeholder={subscriptions && subscriptions.length === 0 ? "No Subscriptions Found" : "Select a Subscription"}
|
||||
|
||||
@@ -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(
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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("");
|
||||
});
|
||||
});
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -24,8 +24,8 @@ export async function fetchAccessData(portalToken: string): Promise<AccessInputM
|
||||
);
|
||||
}
|
||||
|
||||
export function useTokenMetadata(token: string): AccessInputMetadata {
|
||||
const [state, setState] = useState<AccessInputMetadata>();
|
||||
export function useTokenMetadata(token: string): AccessInputMetadata | undefined {
|
||||
const [state, setState] = useState<AccessInputMetadata | undefined>();
|
||||
|
||||
useEffect(() => {
|
||||
if (token) {
|
||||
|
||||
@@ -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",
|
||||
@@ -135,6 +141,8 @@
|
||||
"./src/setupTests.ts",
|
||||
"./src/userContext.test.ts",
|
||||
"src/Common/EntityValue.tsx",
|
||||
"./src/Platform/Hosted/Components/SwitchAccount.tsx",
|
||||
"./src/Platform/Hosted/Components/SwitchSubscription.tsx",
|
||||
"./src/Platform/Hosted/Components/DirectoryPickerPanel.tsx",
|
||||
"./src/Explorer/Menus/NotificationConsole/NotificationConsoleComponent.tsx"
|
||||
],
|
||||
@@ -162,4 +170,4 @@
|
||||
"src/Terminal/**/*",
|
||||
"src/Utils/arm/**/*"
|
||||
]
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user