mirror of
https://github.com/Azure/cosmos-explorer.git
synced 2025-02-21 11:47:14 +00:00
upgrade cosmos sdk to 4.0.0
This commit is contained in:
parent
f36fccd3ef
commit
282004b09b
@ -39,7 +39,6 @@ module.exports = {
|
|||||||
"@typescript-eslint/switch-exhaustiveness-check": "error",
|
"@typescript-eslint/switch-exhaustiveness-check": "error",
|
||||||
"@typescript-eslint/no-unused-vars": "error",
|
"@typescript-eslint/no-unused-vars": "error",
|
||||||
"@typescript-eslint/no-extraneous-class": "error",
|
"@typescript-eslint/no-extraneous-class": "error",
|
||||||
"@typescript-eslint/no-explicit-any": "error",
|
|
||||||
"prefer-arrow/prefer-arrow-functions": ["error", { allowStandaloneDeclarations: true }],
|
"prefer-arrow/prefer-arrow-functions": ["error", { allowStandaloneDeclarations: true }],
|
||||||
eqeqeq: "error",
|
eqeqeq: "error",
|
||||||
"react/display-name": "off",
|
"react/display-name": "off",
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
"main": "index.js",
|
"main": "index.js",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@azure/arm-cosmosdb": "9.1.0",
|
"@azure/arm-cosmosdb": "9.1.0",
|
||||||
"@azure/cosmos": "3.16.2",
|
"@azure/cosmos": "4.0.0",
|
||||||
"@azure/cosmos-language-service": "0.0.5",
|
"@azure/cosmos-language-service": "0.0.5",
|
||||||
"@azure/identity": "1.2.1",
|
"@azure/identity": "1.2.1",
|
||||||
"@azure/ms-rest-nodeauth": "3.0.7",
|
"@azure/ms-rest-nodeauth": "3.0.7",
|
||||||
|
@ -125,7 +125,7 @@ describe("requestPlugin", () => {
|
|||||||
const headers = {};
|
const headers = {};
|
||||||
const endpoint = "https://docs.azure.com";
|
const endpoint = "https://docs.azure.com";
|
||||||
const path = "/dbs/foo";
|
const path = "/dbs/foo";
|
||||||
requestPlugin({ endpoint, headers, path } as any, next as any);
|
requestPlugin({ endpoint, headers, path } as any, undefined, next as any);
|
||||||
expect(next.mock.calls[0][0]).toMatchSnapshot();
|
expect(next.mock.calls[0][0]).toMatchSnapshot();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
@ -137,7 +137,7 @@ describe("requestPlugin", () => {
|
|||||||
const headers = {};
|
const headers = {};
|
||||||
const endpoint = "";
|
const endpoint = "";
|
||||||
const path = "/dbs/foo";
|
const path = "/dbs/foo";
|
||||||
requestPlugin({ endpoint, headers, path } as any, next as any);
|
requestPlugin({ endpoint, headers, path } as any, undefined, next as any);
|
||||||
expect(next.mock.calls[0][0]).toMatchSnapshot();
|
expect(next.mock.calls[0][0]).toMatchSnapshot();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
@ -1,13 +1,12 @@
|
|||||||
import * as Cosmos from "@azure/cosmos";
|
import * as Cosmos from "@azure/cosmos";
|
||||||
|
import { AuthType } from "../AuthType";
|
||||||
|
import { PriorityLevel } from "../Common/Constants";
|
||||||
import { configContext, Platform } from "../ConfigContext";
|
import { configContext, Platform } from "../ConfigContext";
|
||||||
import { userContext } from "../UserContext";
|
import { userContext } from "../UserContext";
|
||||||
import { logConsoleError } from "../Utils/NotificationConsoleUtils";
|
import { logConsoleError } from "../Utils/NotificationConsoleUtils";
|
||||||
|
import * as PriorityBasedExecutionUtils from "../Utils/PriorityBasedExecutionUtils";
|
||||||
import { EmulatorMasterKey, HttpHeaders } from "./Constants";
|
import { EmulatorMasterKey, HttpHeaders } from "./Constants";
|
||||||
import { getErrorMessage } from "./ErrorHandlingUtils";
|
import { getErrorMessage } from "./ErrorHandlingUtils";
|
||||||
import { LocalStorageUtility, StorageKey } from "Shared/StorageUtility";
|
|
||||||
import { PriorityLevel } from "../Common/Constants";
|
|
||||||
import * as PriorityBasedExecutionUtils from "../Utils/PriorityBasedExecutionUtils";
|
|
||||||
import { AuthType } from "../AuthType";
|
|
||||||
|
|
||||||
const _global = typeof self === "undefined" ? window : self;
|
const _global = typeof self === "undefined" ? window : self;
|
||||||
|
|
||||||
@ -41,7 +40,7 @@ export const tokenProvider = async (requestInfo: Cosmos.RequestInfo) => {
|
|||||||
return decodeURIComponent(result.PrimaryReadWriteToken);
|
return decodeURIComponent(result.PrimaryReadWriteToken);
|
||||||
};
|
};
|
||||||
|
|
||||||
export const requestPlugin: Cosmos.Plugin<any> = async (requestContext, next) => {
|
export const requestPlugin: Cosmos.Plugin<any> = async (requestContext, diagnosticNode, next) => {
|
||||||
requestContext.endpoint = new URL(configContext.PROXY_PATH, window.location.href).href;
|
requestContext.endpoint = new URL(configContext.PROXY_PATH, window.location.href).href;
|
||||||
requestContext.headers["x-ms-proxy-target"] = endpoint();
|
requestContext.headers["x-ms-proxy-target"] = endpoint();
|
||||||
return next(requestContext);
|
return next(requestContext);
|
||||||
|
@ -1,12 +1,12 @@
|
|||||||
import { extractPartitionKey, ItemDefinition, PartitionKeyDefinition, QueryIterator, Resource } from "@azure/cosmos";
|
import { ItemDefinition, PartitionKey, PartitionKeyDefinition, QueryIterator, Resource } from "@azure/cosmos";
|
||||||
import { querySampleDocuments, readSampleDocument } from "Explorer/QueryCopilot/QueryCopilotUtilities";
|
import { querySampleDocuments, readSampleDocument } from "Explorer/QueryCopilot/QueryCopilotUtilities";
|
||||||
import * as ko from "knockout";
|
import * as ko from "knockout";
|
||||||
import Q from "q";
|
import Q from "q";
|
||||||
import DeleteDocumentIcon from "../../../images/DeleteDocument.svg";
|
import DeleteDocumentIcon from "../../../images/DeleteDocument.svg";
|
||||||
import DiscardIcon from "../../../images/discard.svg";
|
|
||||||
import NewDocumentIcon from "../../../images/NewDocument.svg";
|
import NewDocumentIcon from "../../../images/NewDocument.svg";
|
||||||
import SaveIcon from "../../../images/save-cosmos.svg";
|
|
||||||
import UploadIcon from "../../../images/Upload_16x16.svg";
|
import UploadIcon from "../../../images/Upload_16x16.svg";
|
||||||
|
import DiscardIcon from "../../../images/discard.svg";
|
||||||
|
import SaveIcon from "../../../images/save-cosmos.svg";
|
||||||
import * as Constants from "../../Common/Constants";
|
import * as Constants from "../../Common/Constants";
|
||||||
import {
|
import {
|
||||||
DocumentsGridMetrics,
|
DocumentsGridMetrics,
|
||||||
@ -14,15 +14,15 @@ import {
|
|||||||
QueryCopilotSampleContainerId,
|
QueryCopilotSampleContainerId,
|
||||||
QueryCopilotSampleDatabaseId,
|
QueryCopilotSampleDatabaseId,
|
||||||
} from "../../Common/Constants";
|
} from "../../Common/Constants";
|
||||||
|
import editable from "../../Common/EditableUtility";
|
||||||
|
import { getErrorMessage, getErrorStack } from "../../Common/ErrorHandlingUtils";
|
||||||
|
import * as HeadersUtility from "../../Common/HeadersUtility";
|
||||||
|
import { Splitter, SplitterBounds, SplitterDirection } from "../../Common/Splitter";
|
||||||
import { createDocument } from "../../Common/dataAccess/createDocument";
|
import { createDocument } from "../../Common/dataAccess/createDocument";
|
||||||
import { deleteDocument } from "../../Common/dataAccess/deleteDocument";
|
import { deleteDocument } from "../../Common/dataAccess/deleteDocument";
|
||||||
import { queryDocuments } from "../../Common/dataAccess/queryDocuments";
|
import { queryDocuments } from "../../Common/dataAccess/queryDocuments";
|
||||||
import { readDocument } from "../../Common/dataAccess/readDocument";
|
import { readDocument } from "../../Common/dataAccess/readDocument";
|
||||||
import { updateDocument } from "../../Common/dataAccess/updateDocument";
|
import { updateDocument } from "../../Common/dataAccess/updateDocument";
|
||||||
import editable from "../../Common/EditableUtility";
|
|
||||||
import { getErrorMessage, getErrorStack } from "../../Common/ErrorHandlingUtils";
|
|
||||||
import * as HeadersUtility from "../../Common/HeadersUtility";
|
|
||||||
import { Splitter, SplitterBounds, SplitterDirection } from "../../Common/Splitter";
|
|
||||||
import * as DataModels from "../../Contracts/DataModels";
|
import * as DataModels from "../../Contracts/DataModels";
|
||||||
import * as ViewModels from "../../Contracts/ViewModels";
|
import * as ViewModels from "../../Contracts/ViewModels";
|
||||||
import { Action } from "../../Shared/Telemetry/TelemetryConstants";
|
import { Action } from "../../Shared/Telemetry/TelemetryConstants";
|
||||||
@ -30,6 +30,7 @@ import * as TelemetryProcessor from "../../Shared/Telemetry/TelemetryProcessor";
|
|||||||
import { userContext } from "../../UserContext";
|
import { userContext } from "../../UserContext";
|
||||||
import { logConsoleError } from "../../Utils/NotificationConsoleUtils";
|
import { logConsoleError } from "../../Utils/NotificationConsoleUtils";
|
||||||
import * as QueryUtils from "../../Utils/QueryUtils";
|
import * as QueryUtils from "../../Utils/QueryUtils";
|
||||||
|
import { extractPartitionKeyValues } from "../../Utils/QueryUtils";
|
||||||
import { CommandButtonComponentProps } from "../Controls/CommandButton/CommandButtonComponent";
|
import { CommandButtonComponentProps } from "../Controls/CommandButton/CommandButtonComponent";
|
||||||
import { useDialog } from "../Controls/Dialog";
|
import { useDialog } from "../Controls/Dialog";
|
||||||
import Explorer from "../Explorer";
|
import Explorer from "../Explorer";
|
||||||
@ -473,7 +474,7 @@ export default class DocumentsTab extends TabsBase {
|
|||||||
const value: string = this.renderObjectForEditor(savedDocument || {}, null, 4);
|
const value: string = this.renderObjectForEditor(savedDocument || {}, null, 4);
|
||||||
this.selectedDocumentContent.setBaseline(value);
|
this.selectedDocumentContent.setBaseline(value);
|
||||||
this.initialDocumentContent(value);
|
this.initialDocumentContent(value);
|
||||||
const partitionKeyValueArray = extractPartitionKey(
|
const partitionKeyValueArray: PartitionKey[] = extractPartitionKeyValues(
|
||||||
savedDocument,
|
savedDocument,
|
||||||
this.partitionKey as PartitionKeyDefinition,
|
this.partitionKey as PartitionKeyDefinition,
|
||||||
);
|
);
|
||||||
@ -524,7 +525,10 @@ export default class DocumentsTab extends TabsBase {
|
|||||||
const selectedDocumentId = this.selectedDocumentId();
|
const selectedDocumentId = this.selectedDocumentId();
|
||||||
const documentContent = JSON.parse(this.selectedDocumentContent());
|
const documentContent = JSON.parse(this.selectedDocumentContent());
|
||||||
|
|
||||||
const partitionKeyValueArray = extractPartitionKey(documentContent, this.partitionKey as PartitionKeyDefinition);
|
const partitionKeyValueArray: PartitionKey[] = extractPartitionKeyValues(
|
||||||
|
documentContent,
|
||||||
|
this.partitionKey as PartitionKeyDefinition,
|
||||||
|
);
|
||||||
selectedDocumentId.partitionKeyValue = partitionKeyValueArray;
|
selectedDocumentId.partitionKeyValue = partitionKeyValueArray;
|
||||||
|
|
||||||
this.isExecutionError(false);
|
this.isExecutionError(false);
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
import { extractPartitionKey, PartitionKeyDefinition } from "@azure/cosmos";
|
import { PartitionKey, PartitionKeyDefinition } from "@azure/cosmos";
|
||||||
|
import { extractPartitionKeyValues } from "Utils/QueryUtils";
|
||||||
import * as ko from "knockout";
|
import * as ko from "knockout";
|
||||||
import Q from "q";
|
import Q from "q";
|
||||||
import * as Constants from "../../Common/Constants";
|
import * as Constants from "../../Common/Constants";
|
||||||
@ -88,7 +89,7 @@ export default class MongoDocumentsTab extends DocumentsTab {
|
|||||||
)
|
)
|
||||||
.then(
|
.then(
|
||||||
(savedDocument: any) => {
|
(savedDocument: any) => {
|
||||||
let partitionKeyArray = extractPartitionKey(
|
const partitionKeyArray: PartitionKey[] = extractPartitionKeyValues(
|
||||||
savedDocument,
|
savedDocument,
|
||||||
this._getPartitionKeyDefinition() as PartitionKeyDefinition,
|
this._getPartitionKeyDefinition() as PartitionKeyDefinition,
|
||||||
);
|
);
|
||||||
@ -150,7 +151,7 @@ export default class MongoDocumentsTab extends DocumentsTab {
|
|||||||
|
|
||||||
this.documentIds().forEach((documentId: DocumentId) => {
|
this.documentIds().forEach((documentId: DocumentId) => {
|
||||||
if (documentId.rid === updatedDocument._rid) {
|
if (documentId.rid === updatedDocument._rid) {
|
||||||
const partitionKeyArray = extractPartitionKey(
|
const partitionKeyArray: PartitionKey[] = extractPartitionKeyValues(
|
||||||
updatedDocument,
|
updatedDocument,
|
||||||
this._getPartitionKeyDefinition() as PartitionKeyDefinition,
|
this._getPartitionKeyDefinition() as PartitionKeyDefinition,
|
||||||
);
|
);
|
||||||
@ -289,7 +290,7 @@ export default class MongoDocumentsTab extends DocumentsTab {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private _hasShardKeySpecified(document: any): boolean {
|
private _hasShardKeySpecified(document: any): boolean {
|
||||||
return Boolean(extractPartitionKey(document, this._getPartitionKeyDefinition() as PartitionKeyDefinition));
|
return Boolean(extractPartitionKeyValues(document, this._getPartitionKeyDefinition() as PartitionKeyDefinition));
|
||||||
}
|
}
|
||||||
|
|
||||||
private _getPartitionKeyDefinition(): DataModels.PartitionKey {
|
private _getPartitionKeyDefinition(): DataModels.PartitionKey {
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
import { extractPartitionKey } from "@azure/cosmos";
|
import { extractPartitionKeyValues } from "Utils/QueryUtils";
|
||||||
import * as ko from "knockout";
|
import * as ko from "knockout";
|
||||||
import * as Constants from "../../Common/Constants";
|
import * as Constants from "../../Common/Constants";
|
||||||
import { readDocument } from "../../Common/dataAccess/readDocument";
|
import { readDocument } from "../../Common/dataAccess/readDocument";
|
||||||
@ -42,7 +42,7 @@ export default class ConflictId {
|
|||||||
}
|
}
|
||||||
this.partitionKeyProperty = container && container.partitionKeyProperty;
|
this.partitionKeyProperty = container && container.partitionKeyProperty;
|
||||||
this.partitionKey = container && container.partitionKey;
|
this.partitionKey = container && container.partitionKey;
|
||||||
this.partitionKeyValue = extractPartitionKey(this.parsedContent, this.partitionKey as any);
|
this.partitionKeyValue = extractPartitionKeyValues(this.parsedContent, this.partitionKey as any);
|
||||||
this.stringPartitionKeyValue = this.getPartitionKeyValueAsString();
|
this.stringPartitionKeyValue = this.getPartitionKeyValueAsString();
|
||||||
this.id = ko.observable(data.id);
|
this.id = ko.observable(data.id);
|
||||||
this.isDirty = ko.observable(false);
|
this.isDirty = ko.observable(false);
|
||||||
|
@ -29,7 +29,7 @@ export function getPriorityLevel(): PriorityLevel {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export const requestPlugin: Cosmos.Plugin<any> = async (requestContext, next) => {
|
export const requestPlugin: Cosmos.Plugin<any> = async (requestContext, undefined, next) => {
|
||||||
if (isRelevantRequest(requestContext)) {
|
if (isRelevantRequest(requestContext)) {
|
||||||
const priorityLevel: PriorityLevel = getPriorityLevel();
|
const priorityLevel: PriorityLevel = getPriorityLevel();
|
||||||
requestContext.headers["x-ms-cosmos-priority-level"] = priorityLevel as string;
|
requestContext.headers["x-ms-cosmos-priority-level"] = priorityLevel as string;
|
||||||
|
@ -1,8 +1,10 @@
|
|||||||
|
import { PartitionKey, PartitionKeyDefinition, PartitionKeyKind } from "@azure/cosmos";
|
||||||
import * as Q from "q";
|
import * as Q from "q";
|
||||||
import * as sinon from "sinon";
|
import * as sinon from "sinon";
|
||||||
import * as DataModels from "../Contracts/DataModels";
|
import * as DataModels from "../Contracts/DataModels";
|
||||||
import * as ViewModels from "../Contracts/ViewModels";
|
import * as ViewModels from "../Contracts/ViewModels";
|
||||||
import * as QueryUtils from "./QueryUtils";
|
import * as QueryUtils from "./QueryUtils";
|
||||||
|
import { extractPartitionKeyValues } from "./QueryUtils";
|
||||||
|
|
||||||
describe("Query Utils", () => {
|
describe("Query Utils", () => {
|
||||||
const generatePartitionKeyForPath = (path: string): DataModels.PartitionKey => {
|
const generatePartitionKeyForPath = (path: string): DataModels.PartitionKey => {
|
||||||
@ -94,4 +96,69 @@ describe("Query Utils", () => {
|
|||||||
expect(queryStub.getCall(0).args[0]).toBe(0);
|
expect(queryStub.getCall(0).args[0]).toBe(0);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
describe("extractPartitionKey", () => {
|
||||||
|
const documentContent = {
|
||||||
|
"Volcano Name": "Adams",
|
||||||
|
Country: "United States",
|
||||||
|
Region: "US-Washington",
|
||||||
|
Location: {
|
||||||
|
type: "Point",
|
||||||
|
coordinates: [-121.49, 46.206],
|
||||||
|
},
|
||||||
|
Elevation: 3742,
|
||||||
|
Type: "Stratovolcano",
|
||||||
|
Status: "Tephrochronology",
|
||||||
|
"Last Known Eruption": "Last known eruption from A.D. 1-1499, inclusive",
|
||||||
|
id: "9e3c494e-8367-3f50-1f56-8c6fcb961363",
|
||||||
|
_rid: "xzo0AJRYUxUFAAAAAAAAAA==",
|
||||||
|
_self: "dbs/xzo0AA==/colls/xzo0AJRYUxU=/docs/xzo0AJRYUxUFAAAAAAAAAA==/",
|
||||||
|
_etag: '"ce00fa43-0000-0100-0000-652840440000"',
|
||||||
|
_attachments: "attachments/",
|
||||||
|
_ts: 1697136708,
|
||||||
|
};
|
||||||
|
it("should extract single partition key value", () => {
|
||||||
|
const singlePartitionKeyDefinition: PartitionKeyDefinition = {
|
||||||
|
kind: PartitionKeyKind.Hash,
|
||||||
|
paths: ["/Elevation"],
|
||||||
|
};
|
||||||
|
|
||||||
|
const partitionKeyValues: PartitionKey[] = extractPartitionKeyValues(
|
||||||
|
documentContent,
|
||||||
|
singlePartitionKeyDefinition,
|
||||||
|
);
|
||||||
|
expect(partitionKeyValues.length).toBe(1);
|
||||||
|
expect(partitionKeyValues[0]).toEqual(3742);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("should extract two partition key values", () => {
|
||||||
|
const singlePartitionKeyDefinition: PartitionKeyDefinition = {
|
||||||
|
kind: PartitionKeyKind.MultiHash,
|
||||||
|
paths: ["/Type", "/Status"],
|
||||||
|
};
|
||||||
|
// const validPartitionKeyValues: Set<string> = new Set(["Stratovolcano", "Tephrochronology"]);
|
||||||
|
const validPartitionKeyValues: string[] = ["Stratovolcano", "Tephrochronology"];
|
||||||
|
const partitionKeyValues: PartitionKey[] = extractPartitionKeyValues(
|
||||||
|
documentContent,
|
||||||
|
singlePartitionKeyDefinition,
|
||||||
|
);
|
||||||
|
expect(partitionKeyValues.length).toBe(2);
|
||||||
|
expect(validPartitionKeyValues).toContain(documentContent["Type"]);
|
||||||
|
expect(validPartitionKeyValues).toContain(documentContent["Status"]);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("should extract no partition key values", () => {
|
||||||
|
const singlePartitionKeyDefinition: PartitionKeyDefinition = {
|
||||||
|
kind: PartitionKeyKind.Hash,
|
||||||
|
paths: ["/InvalidPartitionKeyPath"],
|
||||||
|
};
|
||||||
|
|
||||||
|
const partitionKeyValues: PartitionKey[] = extractPartitionKeyValues(
|
||||||
|
documentContent,
|
||||||
|
singlePartitionKeyDefinition,
|
||||||
|
);
|
||||||
|
|
||||||
|
expect(partitionKeyValues.length).toBe(0);
|
||||||
|
});
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
@ -1,3 +1,4 @@
|
|||||||
|
import { PartitionKey, PartitionKeyDefinition } from "@azure/cosmos";
|
||||||
import * as DataModels from "../Contracts/DataModels";
|
import * as DataModels from "../Contracts/DataModels";
|
||||||
import * as ViewModels from "../Contracts/ViewModels";
|
import * as ViewModels from "../Contracts/ViewModels";
|
||||||
|
|
||||||
@ -82,3 +83,19 @@ export const queryPagesUntilContentPresent = async (
|
|||||||
|
|
||||||
return await doRequest(firstItemIndex);
|
return await doRequest(firstItemIndex);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export const extractPartitionKeyValues = (
|
||||||
|
documentContent: any,
|
||||||
|
partitionKeyDefinition: PartitionKeyDefinition,
|
||||||
|
): PartitionKey[] => {
|
||||||
|
if (!partitionKeyDefinition.paths || partitionKeyDefinition.paths.length === 0) {
|
||||||
|
return undefined;
|
||||||
|
}
|
||||||
|
|
||||||
|
const partitionKeyValues: PartitionKey[] = [];
|
||||||
|
partitionKeyDefinition.paths.forEach((partitionKeyPath: string) => {
|
||||||
|
const partitionKeyPathWithoutSlash: string = partitionKeyPath.substring(1);
|
||||||
|
partitionKeyValues.push(documentContent[partitionKeyPathWithoutSlash]);
|
||||||
|
});
|
||||||
|
return partitionKeyValues;
|
||||||
|
};
|
||||||
|
Loading…
x
Reference in New Issue
Block a user